/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Pix
*
* Copyright (C) 2009 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "actions.h"
#include "gth-copy-task.h"
#include "gth-duplicate-task.h"
#include "preferences.h"
#define MAX_HISTORY_LENGTH 10
/* -- gth_browser_activate_create_folder -- */
typedef struct {
GthBrowser *browser;
GFile *parent;
} NewFolderData;
static void
new_folder_data_free (NewFolderData *data)
{
g_object_unref (data->parent);
g_free (data);
}
static void
new_folder_dialog_response_cb (GtkWidget *dialog,
int response_id,
gpointer user_data)
{
NewFolderData *data = user_data;
char *name;
GFile *folder;
GError *error = NULL;
if (response_id != GTK_RESPONSE_OK) {
new_folder_data_free (data);
gtk_widget_destroy (dialog);
return;
}
name = gth_request_dialog_get_normalized_text (GTH_REQUEST_DIALOG (dialog));
if (_g_utf8_all_spaces (name)) {
g_free (name);
gth_request_dialog_set_info_text (GTH_REQUEST_DIALOG (dialog), GTK_MESSAGE_ERROR, _("No name specified"));
return;
}
if (g_regex_match_simple ("/", name, 0, 0)) {
char *message;
message = g_strdup_printf (_("Invalid name. The following characters are not allowed: %s"), "/");
gth_request_dialog_set_info_text (GTH_REQUEST_DIALOG (dialog), GTK_MESSAGE_ERROR, message);
g_free (message);
g_free (name);
return;
}
folder = g_file_get_child_for_display_name (data->parent, name, &error);
if ((folder != NULL) && g_file_make_directory (folder, NULL, &error)) {
GList *list;
GtkWidget *folder_tree;
GtkTreePath *path;
list = g_list_prepend (NULL, folder);
gth_monitor_folder_changed (gth_main_get_default_monitor (),
data->parent,
list,
GTH_MONITOR_EVENT_CREATED);
folder_tree = gth_browser_get_folder_tree (data->browser);
path = gth_folder_tree_get_path (GTH_FOLDER_TREE (folder_tree), data->parent);
gth_folder_tree_expand_row (GTH_FOLDER_TREE (folder_tree), path, FALSE);
gtk_tree_path_free (path);
g_list_free (list);
}
if (error != NULL) {
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
gth_request_dialog_set_info_text (GTH_REQUEST_DIALOG (dialog), GTK_MESSAGE_ERROR, _("Name already used"));
else
gth_request_dialog_set_info_text (GTH_REQUEST_DIALOG (dialog), GTK_MESSAGE_ERROR, error->message);
g_clear_error (&error);
}
else {
gth_browser_load_location (data->browser, folder);
new_folder_data_free (data);
gtk_widget_destroy (dialog);
}
g_object_unref (folder);
}
static void
_gth_browser_create_new_folder (GthBrowser *browser,
GFile *parent)
{
NewFolderData *data;
GtkWidget *dialog;
data = g_new0 (NewFolderData, 1);
data->browser = browser;
data->parent = g_object_ref (parent);
dialog = gth_request_dialog_new (GTK_WINDOW (browser),
GTK_DIALOG_MODAL,
_("New folder"),
_("Enter the folder name:"),
_GTK_LABEL_CANCEL,
_("C_reate"));
g_signal_connect (dialog,
"response",
G_CALLBACK (new_folder_dialog_response_cb),
data);
gtk_widget_show (dialog);
}
void
gth_browser_activate_create_folder (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GFile *parent;
parent = g_object_ref (gth_browser_get_location (browser));
_gth_browser_create_new_folder (browser, parent);
g_object_unref (parent);
}
/* -- gth_browser_activate_edit_cut / gth_browser_activate_edit_copy -- */
typedef struct {
char **uris;
int n_uris;
gboolean cut;
} ClipboardData;
static char *
clipboard_data_convert_to_text (ClipboardData *clipboard_data,
gboolean formatted,
gsize *len)
{
GString *uris;
int i;
if (formatted)
uris = g_string_new (clipboard_data->cut ? "cut" : "copy");
else
uris = g_string_new (NULL);
for (i = 0; i < clipboard_data->n_uris; i++) {
if (formatted) {
g_string_append_c (uris, '\n');
g_string_append (uris, clipboard_data->uris[i]);
}
else {
GFile *file;
char *name;
if (i > 0)
g_string_append_c (uris, '\n');
file = g_file_new_for_uri (clipboard_data->uris[i]);
name = g_file_get_parse_name (file);
g_string_append (uris, name);
g_free (name);
g_object_unref (file);
}
}
if (len != NULL)
*len = uris->len;
return g_string_free (uris, FALSE);
}
static void
clipboard_get_cb (GtkClipboard *clipboard,
GtkSelectionData *selection_data,
guint info,
gpointer user_data_or_owner)
{
ClipboardData *clipboard_data = user_data_or_owner;
GdkAtom targets[1];
int n_targets;
targets[0] = gtk_selection_data_get_target (selection_data);
n_targets = 1;
if (gtk_targets_include_uri (targets, n_targets)) {
gtk_selection_data_set_uris (selection_data, clipboard_data->uris);
}
else if (gtk_targets_include_text (targets, n_targets)) {
char *str;
gsize len;
str = clipboard_data_convert_to_text (clipboard_data, FALSE, &len);
gtk_selection_data_set_text (selection_data, str, len);
g_free (str);
}
else if (gtk_selection_data_get_target (selection_data) == GNOME_COPIED_FILES) {
char *str;
gsize len;
str = clipboard_data_convert_to_text (clipboard_data, TRUE, &len);
gtk_selection_data_set (selection_data, GNOME_COPIED_FILES, 8, (guchar *) str, len);
g_free (str);
}
}
static void
clipboard_clear_cb (GtkClipboard *clipboard,
gpointer user_data_or_owner)
{
ClipboardData *data = user_data_or_owner;
g_strfreev (data->uris);
g_free (data);
}
static void
_gth_browser_clipboard_copy_or_cut (GthBrowser *browser,
GList *file_list,
gboolean cut)
{
ClipboardData *data;
GtkTargetList *target_list;
GtkTargetEntry *targets;
int n_targets;
GList *scan;
int i;
data = g_new0 (ClipboardData, 1);
data->cut = cut;
data->n_uris = g_list_length (file_list);
data->uris = g_new (char *, data->n_uris + 1);
for (scan = file_list, i = 0; scan; scan = scan->next, i++) {
GthFileData *file_data = scan->data;
data->uris[i] = g_file_get_uri (file_data->file);
}
data->uris[data->n_uris] = NULL;
target_list = gtk_target_list_new (NULL, 0);
gtk_target_list_add (target_list, GNOME_COPIED_FILES, 0, 0);
gtk_target_list_add_uri_targets (target_list, 0);
gtk_target_list_add_text_targets (target_list, 0);
targets = gtk_target_table_new_from_list (target_list, &n_targets);
gtk_clipboard_set_with_data (gtk_clipboard_get_for_display (gtk_widget_get_display (GTK_WIDGET (browser)), GDK_SELECTION_CLIPBOARD),
targets,
n_targets,
clipboard_get_cb,
clipboard_clear_cb,
data);
gtk_target_list_unref (target_list);
gtk_target_table_free (targets, n_targets);
}
void
gth_browser_activate_edit_cut (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GtkWidget *focused_widget;
GList *items;
GList *file_list;
focused_widget = gtk_window_get_focus (GTK_WINDOW (browser));
if ((focused_widget != NULL) && GTK_IS_EDITABLE (focused_widget))
return;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
_gth_browser_clipboard_copy_or_cut (browser, file_list, TRUE);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
}
void
gth_browser_activate_edit_copy (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GtkWidget *focused_widget;
GList *items;
GList *file_list;
focused_widget = gtk_window_get_focus (GTK_WINDOW (browser));
if ((focused_widget != NULL) && GTK_IS_EDITABLE (focused_widget))
return;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
_gth_browser_clipboard_copy_or_cut (browser, file_list, FALSE);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
}
/* -- gth_browser_activate_edit_paste -- */
typedef struct {
GthBrowser *browser;
GthFileData *destination;
GthFileSource *file_source;
GList *files;
gboolean cut;
} PasteData;
static void
paste_data_free (PasteData *paste_data)
{
_g_object_list_unref (paste_data->files);
_g_object_unref (paste_data->file_source);
g_object_unref (paste_data->destination);
g_object_unref (paste_data->browser);
g_free (paste_data);
}
static void
clipboard_received_cb (GtkClipboard *clipboard,
GtkSelectionData *selection_data,
gpointer user_data)
{
PasteData *paste_data = user_data;
GthBrowser *browser = paste_data->browser;
const char *raw_data;
char **clipboard_data;
int i;
GdkDragAction actions;
GtkTreePath *path;
int position;
GthTask *task;
raw_data = (const char *) gtk_selection_data_get_data (selection_data);
if (raw_data == NULL) {
paste_data_free (paste_data);
return;
}
clipboard_data = g_strsplit_set (raw_data, "\n\r", -1);
if ((clipboard_data == NULL) || (clipboard_data[0] == NULL)) {
g_strfreev (clipboard_data);
paste_data_free (paste_data);
return;
}
paste_data->cut = strcmp (clipboard_data[0], "cut") == 0;
paste_data->files = NULL;
for (i = 1; clipboard_data[i] != NULL; i++)
if (strcmp (clipboard_data[i], "") != 0)
paste_data->files = g_list_prepend (paste_data->files, g_file_new_for_uri (clipboard_data[i]));
paste_data->files = g_list_reverse (paste_data->files);
paste_data->file_source = gth_main_get_file_source (paste_data->destination->file);
actions = gth_file_source_get_drop_actions (paste_data->file_source,
paste_data->destination->file,
G_FILE (paste_data->files->data));
if (actions == 0) {
_gtk_error_dialog_run (GTK_WINDOW (browser),
"%s",
_("Could not perform the operation"));
g_strfreev (clipboard_data);
paste_data_free (paste_data);
return;
}
if (paste_data->cut && ((actions & GDK_ACTION_MOVE) == 0)) {
GtkWidget *dialog;
int response;
dialog = _gtk_message_dialog_new (GTK_WINDOW (browser),
GTK_DIALOG_MODAL,
_GTK_ICON_NAME_DIALOG_QUESTION,
_("Could not move the files"),
_("Files cannot be moved to the current location, as alternative you can choose to copy them."),
_GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL,
_("Copy"), GTK_RESPONSE_OK,
NULL);
response = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
if (response == GTK_RESPONSE_CANCEL) {
g_strfreev (clipboard_data);
paste_data_free (paste_data);
return;
}
paste_data->cut = FALSE;
}
position = -1;
path = gth_file_selection_get_last_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
if (path != NULL) {
int *indices;
indices = gtk_tree_path_get_indices (path);
if (indices != NULL)
position = indices[0] + 1;
gtk_tree_path_free (path);
}
task = gth_copy_task_new (paste_data->file_source,
paste_data->destination,
paste_data->cut,
paste_data->files,
position);
gth_browser_exec_task (browser, task, GTH_TASK_FLAGS_DEFAULT);
g_object_unref (task);
g_strfreev (clipboard_data);
paste_data_free (paste_data);
}
void
gth_browser_activate_edit_paste (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GtkWidget *focused_widget;
PasteData *paste_data;
focused_widget = gtk_window_get_focus (GTK_WINDOW (browser));
if ((focused_widget != NULL) && GTK_IS_EDITABLE (focused_widget))
return;
paste_data = g_new0 (PasteData, 1);
paste_data->browser = g_object_ref (browser);
paste_data->destination = g_object_ref (gth_browser_get_location_data (browser));
gtk_clipboard_request_contents (gtk_widget_get_clipboard (GTK_WIDGET (browser), GDK_SELECTION_CLIPBOARD),
GNOME_COPIED_FILES,
clipboard_received_cb,
paste_data);
}
void
gth_browser_activate_duplicate (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GList *items;
GList *file_list;
GthTask *task;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
task = gth_duplicate_task_new (file_list);
gth_browser_exec_task (browser, task, GTH_TASK_FLAGS_DEFAULT);
g_object_unref (task);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
}
void
gth_browser_activate_trash (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GList *items;
GList *file_list;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
gth_file_mananger_trash_files (GTK_WINDOW (browser), file_list);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
}
void
gth_browser_activate_delete (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GList *items;
GList *file_list;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
gth_file_mananger_delete_files (GTK_WINDOW (browser), file_list);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
}
static void
remove_from_source (GthBrowser *browser,
gboolean permanently)
{
GthFileSource *source;
GthFileData *location;
GList *items;
GList *file_data_list;
if (permanently) {
/* Use the VFS file source to delete the files from the
* disk. */
source = gth_main_get_file_source_for_uri ("file:///");
location = NULL;
}
else {
/* Removes the files from the current location,
* for example: when viewing a catalog removes
* the files from the catalog; when viewing a
* folder removes the files from the folder. */
source = _g_object_ref (gth_browser_get_location_source (browser));
location = gth_browser_get_location_data (browser);
}
if (source == NULL)
return;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
if (items == NULL)
return;
file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
gth_file_source_remove (source,
location,
file_data_list,
permanently,
GTK_WINDOW (browser));
_g_object_list_unref (file_data_list);
_gtk_tree_path_list_free (items);
_g_object_unref (source);
}
void
gth_browser_activate_remove_from_source (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
remove_from_source (GTH_BROWSER (user_data), FALSE);
}
void
gth_browser_activate_remove_from_source_permanently (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
remove_from_source (GTH_BROWSER (user_data), TRUE);
}
void
gth_browser_activate_rename (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GtkWidget *folder_tree;
GtkWidget *file_list;
folder_tree = gth_browser_get_folder_tree (browser);
if (gtk_widget_has_focus (folder_tree)) {
GthFileData *file_data;
file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
if (file_data == NULL)
return;
if (! g_file_info_get_attribute_boolean (file_data->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME))
return;
gth_folder_tree_start_editing (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), file_data->file);
g_object_unref (file_data);
return;
}
file_list = gth_browser_get_file_list_view (browser);
if (gtk_widget_has_focus (file_list)) {
gth_hook_invoke ("gth-browser-file-list-rename", browser);
return;
}
if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER) {
gth_hook_invoke ("gth-browser-file-list-rename", browser);
return;
}
}
void
gth_browser_activate_file_list_rename (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
gth_hook_invoke ("gth-browser-file-list-rename", browser);
}
/* -- gth_browser_activate_copy_to_folder / gth_browser_activate_move_to_folder -- */
typedef struct {
GthBrowser *browser;
gboolean move;
GFile *destination;
gboolean view_destination;
} CopyToFolderData;
static void
copy_to_folder_data_free (CopyToFolderData *data)
{
g_object_unref (data->destination);
g_object_unref (data->browser);
g_free (data);
}
static void
copy_complete_cb (GthTask *task,
GError *error,
gpointer user_data)
{
CopyToFolderData *data = user_data;
if ((error == NULL) && (data->view_destination))
gth_browser_load_location (data->browser, data->destination);
g_object_unref (task);
copy_to_folder_data_free (data);
}
static void
copy_files_to_folder (GthBrowser *browser,
GList *files,
gboolean move,
char *destination_uri,
gboolean view_destination)
{
GthFileData *destination_data;
GthFileSource *file_source;
CopyToFolderData *data;
GthTask *task;
destination_data = gth_file_data_new_for_uri (destination_uri, NULL);
file_source = gth_main_get_file_source (destination_data->file);
data = g_new0 (CopyToFolderData, 1);
data->browser = g_object_ref (browser);
data->move = move;
data->destination = g_file_dup (destination_data->file);
data->view_destination = view_destination;
task = gth_copy_task_new (file_source, destination_data, move, files, -1);
g_signal_connect (task,
"completed",
G_CALLBACK (copy_complete_cb),
data);
gth_browser_exec_task (browser, task, GTH_TASK_FLAGS_DEFAULT);
g_object_unref (file_source);
}
static void
copy_to_folder_dialog (GthBrowser *browser,
GList *files,
gboolean move)
{
GSettings *settings;
GtkWidget *dialog;
char *start_uri;
GList *history;
GList *scan;
GtkWidget *box;
GtkWidget *view_destination_button;
settings = g_settings_new (PIX_FILE_MANAGER_SCHEMA);
dialog = gtk_file_chooser_dialog_new (move ? _("Move To") : _("Copy To"),
GTK_WINDOW (browser),
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
_GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL,
(move ? _("Move") : _("Copy")), GTK_RESPONSE_ACCEPT,
NULL);
_gtk_dialog_add_class_to_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT, GTK_STYLE_CLASS_SUGGESTED_ACTION);
start_uri = g_settings_get_string (settings, PREF_FILE_MANAGER_COPY_LAST_FOLDER);
if ((start_uri == NULL) || (strcmp (start_uri, "") == 0)) {
g_free (start_uri);
start_uri = g_strdup (_g_uri_get_home ());
}
gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (dialog), start_uri);
g_free(start_uri);
history = _g_settings_get_string_list (settings, PREF_FILE_MANAGER_COPY_HISTORY);
for (scan = history; scan; scan = scan->next) {
char *uri = scan->data;
gtk_file_chooser_add_shortcut_folder_uri (GTK_FILE_CHOOSER (dialog), uri, NULL);
}
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_container_set_border_width (GTK_CONTAINER (box), 6);
gtk_widget_show (box);
view_destination_button = gtk_check_button_new_with_mnemonic (_("_View the destination"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (view_destination_button),
g_settings_get_boolean (settings, PREF_FILE_MANAGER_COPY_VIEW_DESTINATION));
gtk_widget_show (view_destination_button);
gtk_box_pack_start (GTK_BOX (box), view_destination_button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), box, FALSE, FALSE, 0);
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
char *destination_uri;
destination_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
if (destination_uri != NULL) {
gboolean view_destination;
/* save the options */
view_destination = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (view_destination_button));
g_settings_set_boolean (settings, PREF_FILE_MANAGER_COPY_VIEW_DESTINATION, view_destination);
g_settings_set_string (settings, PREF_FILE_MANAGER_COPY_LAST_FOLDER, destination_uri);
/* save the destination in the history list, prevent
* the list from growing without limit. */
history = g_list_prepend (history, g_strdup (destination_uri));
while (g_list_length (history) > MAX_HISTORY_LENGTH) {
GList *link = g_list_last (history);
history = g_list_remove_link (history, link);
_g_string_list_free (link);
}
_g_settings_set_string_list (settings, PREF_FILE_MANAGER_COPY_HISTORY, history);
/* copy / move the files */
copy_files_to_folder (browser, files, move, destination_uri, view_destination);
}
g_free (destination_uri);
}
_g_string_list_free (history);
gtk_widget_destroy (dialog);
g_object_unref (settings);
}
static void
copy_selected_files_to_folder (GthBrowser *browser,
gboolean move)
{
GList *items;
GList *file_list;
GList *files;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
files = gth_file_data_list_to_file_list (file_list);
copy_to_folder_dialog (browser, files, move);
_g_object_list_unref (files);
_g_object_list_unref (file_list);
_gtk_tree_path_list_free (items);
}
void
gth_browser_activate_copy_to_folder (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
copy_selected_files_to_folder (GTH_BROWSER (user_data), FALSE);
}
void
gth_browser_activate_move_to_folder (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
copy_selected_files_to_folder (GTH_BROWSER (user_data), TRUE);
}
void
gth_browser_activate_folder_context_open_in_file_manager (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *file_data;
char *uri;
GError *error = NULL;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
uri = g_file_get_uri (file_data->file);
if (! gtk_show_uri_on_window (GTK_WINDOW (browser),
uri,
GDK_CURRENT_TIME,
&error))
{
_gtk_error_dialog_from_gerror_run (GTK_WINDOW (browser), _("Could not open the location"), error);
g_clear_error (&error);
}
g_free (uri);
g_object_unref (file_data);
}
void
gth_browser_activate_folder_context_create (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *parent;
parent = gth_browser_get_folder_popup_file_data (browser);
if (parent != NULL) {
_gth_browser_create_new_folder (browser, parent->file);
g_object_unref (parent);
}
}
void
gth_browser_activate_folder_context_rename (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *file_data;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
if (! g_file_info_get_attribute_boolean (file_data->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME))
return;
gth_folder_tree_start_editing (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), file_data->file);
g_object_unref (file_data);
}
void
gth_browser_activate_folder_context_cut (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *file_data;
GList *file_list;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
file_list = g_list_prepend (NULL, file_data);
_gth_browser_clipboard_copy_or_cut (browser, file_list, TRUE);
g_list_free (file_list);
}
void
gth_browser_activate_folder_context_copy (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *file_data;
GList *file_list;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
file_list = g_list_prepend (NULL, file_data);
_gth_browser_clipboard_copy_or_cut (browser, file_list, FALSE);
_g_object_list_unref (file_list);
}
void
gth_browser_activate_folder_context_paste_into_folder (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *file_data;
PasteData *paste_data;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
paste_data = g_new0 (PasteData, 1);
paste_data->browser = g_object_ref (browser);
paste_data->destination = gth_file_data_dup (file_data);
gtk_clipboard_request_contents (gtk_widget_get_clipboard (GTK_WIDGET (browser), GDK_SELECTION_CLIPBOARD),
GNOME_COPIED_FILES,
clipboard_received_cb,
paste_data);
g_object_unref (file_data);
}
void
gth_browser_activate_folder_context_trash (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *file_data;
GList *list;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
list = g_list_append (NULL, file_data);
gth_file_mananger_trash_files (GTK_WINDOW (browser), list);
g_list_free (list);
_g_object_unref (file_data);
}
void
gth_browser_activate_folder_context_delete (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = GTH_BROWSER (user_data);
GthFileData *file_data;
GList *list;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
list = g_list_append (NULL, file_data);
gth_file_mananger_delete_files (GTK_WINDOW (browser), list);
g_list_free (list);
}
/* gth_browser_activate_folder_context_copy_to / gth_browser_activate_folder_context_move_to */
static void
copy_folder_to_folder (GthBrowser *browser,
gboolean move)
{
GthFileData *file_data;
GList *files;
file_data = gth_browser_get_folder_popup_file_data (browser);
if (file_data == NULL)
return;
files = g_list_prepend (NULL, g_object_ref (file_data->file));
copy_to_folder_dialog (browser, files, move);
_g_object_list_unref (files);
}
void
gth_browser_activate_folder_context_copy_to (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
copy_folder_to_folder (GTH_BROWSER (user_data), FALSE);
}
void
gth_browser_activate_folder_context_move_to (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
copy_folder_to_folder (GTH_BROWSER (user_data), TRUE);
}
void
gth_browser_activate_open_with_gimp (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GthBrowser *browser = user_data;
GList *items;
GList *file_data_list;
GList *file_list;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
if (items == NULL)
return;
file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
file_list = gth_file_data_list_to_file_list (file_data_list);
_g_launch_command (GTK_WIDGET (browser), "gimp %U", "Gimp", G_APP_INFO_CREATE_SUPPORTS_URIS, file_list);
_g_object_list_unref (file_list);
_g_object_list_unref (file_data_list);
_gtk_tree_path_list_free (items);
}