From e9a5c3d19ce9cd6c68b4dc288215464d06868e3b Mon Sep 17 00:00:00 2001 From: Ettore Perazzoli Date: Sun, 20 May 2001 14:45:47 +0000 Subject: Implemented the "Copy Folder" and "Move Folder" menu items. Untested. svn path=/trunk/; revision=9899 --- shell/e-shell-folder-commands.c | 224 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 212 insertions(+), 12 deletions(-) (limited to 'shell/e-shell-folder-commands.c') diff --git a/shell/e-shell-folder-commands.c b/shell/e-shell-folder-commands.c index 34cb2d0ac3..ab5c22ed0a 100644 --- a/shell/e-shell-folder-commands.c +++ b/shell/e-shell-folder-commands.c @@ -27,8 +27,157 @@ #include "e-shell-folder-commands.h" +#include +#include + +#include + #include "e-shell-constants.h" #include "e-shell-folder-creation-dialog.h" +#include "e-shell-folder-selection-dialog.h" + + +/* Utility functions. */ + +static const char * +get_folder_name (EShell *shell, + const char *path) +{ + EStorageSet *storage_set; + EFolder *folder; + + storage_set = e_shell_get_storage_set (shell); + folder = e_storage_set_get_folder (storage_set, path); + + return e_folder_get_name (folder); +} + + +/* The data passed to the signals handled during the execution of the folder + commands. */ + +enum _FolderCommand { + FOLDER_COMMAND_COPY, + FOLDER_COMMAND_MOVE +}; +typedef enum _FolderCommand FolderCommand; + +struct _FolderCommandData { + EShell *shell; + EShellView *shell_view; + FolderCommand command; + char *source_path; + char *destination_path; +}; +typedef struct _FolderCommandData FolderCommandData; + +static FolderCommandData * +folder_command_data_new (EShell *shell, + EShellView *shell_view, + FolderCommand command, + const char *source_path, + const char *destination_path) +{ + FolderCommandData *new; + + new = g_new (FolderCommandData, 1); + new->shell = shell; + new->shell_view = shell_view; + new->command = command; + new->source_path = g_strdup (source_path); + new->destination_path = g_strdup (destination_path); + + return new; +} + +static void +folder_command_data_free (FolderCommandData *folder_command_data) +{ + g_free (folder_command_data->source_path); + g_free (folder_command_data->destination_path); + + g_free (folder_command_data); +} + + +/* Callback for the storage result. */ + +static void +xfer_result_callback (EStorageSet *storage_set, + EStorageResult result, + void *data) +{ + FolderCommandData *folder_command_data; + + folder_command_data = (FolderCommandData *) data; + + /* FIXME do something. */ + + folder_command_data_free (folder_command_data); +} + + +/* The signals for the folder selection dialog. This used for the copy and + move commands. */ + +static void +folder_selection_dialog_folder_selected_callback (EShellFolderSelectionDialog *folder_selection_dialog, + const char *path, + void *data) +{ + FolderCommandData *folder_command_data; + EStorageSet *storage_set; + gboolean remove_source; + + folder_command_data = (FolderCommandData *) data; + + folder_command_data->destination_path = g_concat_dir_and_file (path, + g_basename (folder_command_data->source_path)); + + switch (folder_command_data->command) { + case FOLDER_COMMAND_COPY: + remove_source = FALSE; + break; + case FOLDER_COMMAND_MOVE: + remove_source = TRUE; + break; + default: + g_assert_not_reached (); + } + + storage_set = e_shell_get_storage_set (folder_command_data->shell); + + e_storage_set_async_xfer_folder (storage_set, + folder_command_data->source_path, + folder_command_data->destination_path, + remove_source, + xfer_result_callback, + folder_command_data); + + gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); +} + +static void +folder_selection_dialog_cancelled_callback (EShellFolderSelectionDialog *folder_selection_dialog, + void *data) +{ + folder_command_data_free ((FolderCommandData *) data); +} + +static void +connect_folder_selection_dialog_signals (EShellFolderSelectionDialog *folder_selection_dialog, + FolderCommandData *folder_command_data) +{ + g_assert (folder_command_data != NULL); + + gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "folder_selected", + GTK_SIGNAL_FUNC (folder_selection_dialog_folder_selected_callback), + folder_command_data); + + gtk_signal_connect (GTK_OBJECT (folder_selection_dialog), "cancelled", + GTK_SIGNAL_FUNC (folder_selection_dialog_cancelled_callback), + folder_command_data); +} /* Create new folder. */ @@ -37,21 +186,13 @@ void e_shell_command_create_new_folder (EShell *shell, EShellView *shell_view) { - const char *current_uri; - const char *default_folder; - g_return_if_fail (shell != NULL); g_return_if_fail (E_IS_SHELL (shell)); g_return_if_fail (shell_view != NULL && E_IS_SHELL_VIEW (shell_view)); - current_uri = e_shell_view_get_current_uri (shell_view); - - if (strncmp (current_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) - default_folder = current_uri + E_SHELL_URI_PREFIX_LEN; - else - default_folder = NULL; - - e_shell_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view), default_folder, + /* FIXME: Should handle the result stuff. */ + e_shell_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view), + e_shell_view_get_current_path (shell_view), NULL /* result_callback */, NULL /* result_callback_data */); } @@ -77,11 +218,40 @@ void e_shell_command_copy_folder (EShell *shell, EShellView *shell_view) { + GtkWidget *folder_selection_dialog; + FolderCommandData *data; + const char *current_path; + const char *current_uri; + char *caption; + g_return_if_fail (shell != NULL); g_return_if_fail (E_IS_SHELL (shell)); g_return_if_fail (shell_view != NULL && E_IS_SHELL_VIEW (shell_view)); - g_warning ("To be implemented"); + current_path = e_shell_view_get_current_path (shell_view); + + if (current_path == NULL) { + g_warning ("Called `e_shell_command_copy_folder()' without a valid displayed folder"); + return; + } + + caption = g_strdup_printf (_("Specify a folder to copy folder \"%s\" into:"), + get_folder_name (shell, current_path)); + + current_uri = e_shell_view_get_current_uri (shell_view); + folder_selection_dialog = e_shell_folder_selection_dialog_new (shell, + _("Copy folder"), + caption, + current_uri, + NULL); + + g_free (caption); + + data = folder_command_data_new (shell, shell_view, FOLDER_COMMAND_COPY, current_path, NULL); + connect_folder_selection_dialog_signals (E_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog), + data); + + gtk_widget_show (folder_selection_dialog); } @@ -91,9 +261,39 @@ void e_shell_command_move_folder (EShell *shell, EShellView *shell_view) { + GtkWidget *folder_selection_dialog; + FolderCommandData *data; + const char *current_path; + const char *current_uri; + char *caption; + g_return_if_fail (shell != NULL); g_return_if_fail (E_IS_SHELL (shell)); g_return_if_fail (shell_view != NULL && E_IS_SHELL_VIEW (shell_view)); + + current_path = e_shell_view_get_current_path (shell_view); + if (current_path == NULL) { + g_warning ("Called `e_shell_command_move_folder()' without a valid displayed folder"); + return; + } + + caption = g_strdup_printf (_("Specify a folder to move folder \"%s\" into:"), + get_folder_name (shell, current_path)); + + current_uri = e_shell_view_get_current_uri (shell_view); + folder_selection_dialog = e_shell_folder_selection_dialog_new (shell, + _("Move folder"), + caption, + current_uri, + NULL); + + g_free (caption); + + data = folder_command_data_new (shell, shell_view, FOLDER_COMMAND_MOVE, current_path, NULL); + connect_folder_selection_dialog_signals (E_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog), + data); + + gtk_widget_show (folder_selection_dialog); } -- cgit v1.2.3