From e9a5c3d19ce9cd6c68b4dc288215464d06868e3b Mon Sep 17 00:00:00 2001
From: Ettore Perazzoli <ettore@src.gnome.org>
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 <libgnome/gnome-i18n.h>
+#include <libgnome/gnome-util.h>
+
+#include <gtk/gtksignal.h>
+
 #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