[evolution] Require a parent window when creating an EMFolderSelector.



commit 881792fadc8a200acd193369f842e46aef0e56e5
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Sep 10 11:58:00 2009 -0500

    Require a parent window when creating an EMFolderSelector.

 mail/Makefile.am                         |    2 -
 mail/e-mail-reader.c                     |    8 ++-
 mail/em-composer-utils.c                 |    6 ++-
 mail/em-folder-selection-button.c        |    6 ++-
 mail/em-folder-selection.c               |   77 ------------------------------
 mail/em-folder-selection.h               |   40 ---------------
 mail/em-folder-selector.c                |   25 +++++++---
 mail/em-folder-selector.h                |   52 +++++++++++++-------
 mail/em-folder-tree.c                    |    1 -
 mail/em-folder-utils.c                   |   45 ++++++++++++-----
 mail/em-folder-utils.h                   |    3 +-
 mail/em-vfolder-rule.c                   |   10 +++-
 modules/mail/e-mail-shell-view-actions.c |   16 +++++-
 13 files changed, 120 insertions(+), 171 deletions(-)
---
diff --git a/mail/Makefile.am b/mail/Makefile.am
index 043ffee..9bcc6ef 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -58,7 +58,6 @@ mailinclude_HEADERS =					\
 	em-filter-rule.h				\
 	em-filter-source-element.h			\
 	em-folder-properties.h				\
-	em-folder-selection.h				\
 	em-folder-selector.h				\
 	em-folder-selection-button.h			\
 	em-folder-tree.h				\
@@ -116,7 +115,6 @@ libevolution_mail_la_SOURCES =				\
 	em-filter-rule.c				\
 	em-filter-source-element.c			\
 	em-folder-properties.c				\
-	em-folder-selection.c				\
 	em-folder-selector.c				\
 	em-folder-selection-button.c			\
 	em-folder-tree.c				\
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 175a01e..eb3fe06 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -192,9 +192,11 @@ action_mail_copy_cb (GtkAction *action,
 	CamelFolder *folder;
 	GtkWidget *folder_tree;
 	GtkWidget *dialog;
+	GtkWindow *parent;
 	GPtrArray *selected;
 	const gchar *uri;
 
+	parent = e_mail_reader_get_window (reader);
 	message_list = e_mail_reader_get_message_list (reader);
 
 	folder_tree = em_folder_tree_new ();
@@ -208,7 +210,7 @@ action_mail_copy_cb (GtkAction *action,
 		EMFT_EXCLUDE_VTRASH);
 
 	dialog = em_folder_selector_new (
-		EM_FOLDER_TREE (folder_tree),
+		parent, EM_FOLDER_TREE (folder_tree),
 		EM_FOLDER_SELECTOR_CAN_CREATE,
 		_("Select Folder"), NULL, _("C_opy"));
 
@@ -579,9 +581,11 @@ action_mail_move_cb (GtkAction *action,
 	CamelFolder *folder;
 	GtkWidget *folder_tree;
 	GtkWidget *dialog;
+	GtkWindow *parent;
 	GPtrArray *selected;
 	const gchar *uri;
 
+	parent = e_mail_reader_get_window (reader);
 	message_list = e_mail_reader_get_message_list (reader);
 
 	folder_tree = em_folder_tree_new ();
@@ -595,7 +599,7 @@ action_mail_move_cb (GtkAction *action,
 		EMFT_EXCLUDE_VTRASH);
 
 	dialog = em_folder_selector_new (
-		EM_FOLDER_TREE (folder_tree),
+		parent, EM_FOLDER_TREE (folder_tree),
 		EM_FOLDER_SELECTOR_CAN_CREATE,
 		_("Select Folder"), NULL, _("_Move"));
 
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index f268b14..739297f 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -2405,7 +2405,8 @@ em_utils_reply_to_message(CamelFolder *folder, const gchar *uid, CamelMimeMessag
 }
 
 static void
-post_header_clicked_cb (EComposerPostHeader *header)
+post_header_clicked_cb (EComposerPostHeader *header,
+                        EMsgComposer *composer)
 {
 	GtkTreeSelection *selection;
 	GtkWidget *folder_tree;
@@ -2424,6 +2425,7 @@ post_header_clicked_cb (EComposerPostHeader *header)
 		EMFT_EXCLUDE_VTRASH);
 
 	dialog = em_folder_selector_new (
+		GTK_WINDOW (composer),
 		EM_FOLDER_TREE (folder_tree),
 		EM_FOLDER_SELECTOR_CAN_CREATE,
 		_("Posting destination"),
@@ -2503,5 +2505,5 @@ em_configure_new_composer (EMsgComposer *composer)
 	 *       the folder selector dialog.  See the handler function. */
 	g_signal_connect (
 		header, "clicked",
-		G_CALLBACK (post_header_clicked_cb), NULL);
+		G_CALLBACK (post_header_clicked_cb), composer);
 }
diff --git a/mail/em-folder-selection-button.c b/mail/em-folder-selection-button.c
index ec81822..d3d44e5 100644
--- a/mail/em-folder-selection-button.c
+++ b/mail/em-folder-selection-button.c
@@ -208,9 +208,13 @@ folder_selection_button_clicked (GtkButton *button)
 	GtkWidget *dialog;
 	GtkTreeSelection *selection;
 	GtkSelectionMode mode;
+	gpointer parent;
 
 	priv = EM_FOLDER_SELECTION_BUTTON_GET_PRIVATE (button);
 
+	parent = gtk_widget_get_toplevel (GTK_WIDGET (button));
+	parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
+
 	emft = (EMFolderTree *) em_folder_tree_new ();
 
 	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (emft));
@@ -225,7 +229,7 @@ folder_selection_button_clicked (GtkButton *button)
 		EMFT_EXCLUDE_VIRTUAL | EMFT_EXCLUDE_VTRASH);
 
 	dialog = em_folder_selector_new (
-		emft, EM_FOLDER_SELECTOR_CAN_CREATE,
+		parent, emft, EM_FOLDER_SELECTOR_CAN_CREATE,
 		priv->title, priv->caption, NULL);
 
 	if (priv->multiple_select)
diff --git a/mail/em-folder-selector.c b/mail/em-folder-selector.c
index 198264e..693c096 100644
--- a/mail/em-folder-selector.c
+++ b/mail/em-folder-selector.c
@@ -124,8 +124,7 @@ emfs_response (GtkWidget *dialog, gint response, EMFolderSelector *emfs)
 
 	g_object_set_data ((GObject *)emfs->emft, "select", GUINT_TO_POINTER (1));
 
-	/* FIXME Pass a parent window. */
-	em_folder_utils_create_folder (NULL, emfs->emft, NULL);
+	em_folder_utils_create_folder (NULL, emfs->emft, GTK_WINDOW (dialog));
 
 	g_signal_stop_emission_by_name (emfs, "response");
 }
@@ -167,7 +166,6 @@ em_folder_selector_construct (EMFolderSelector *emfs, EMFolderTree *emft, guint3
 {
 	GtkWidget *widget;
 
-	gtk_window_set_modal (GTK_WINDOW (emfs), FALSE);
 	gtk_window_set_default_size (GTK_WINDOW (emfs), 350, 300);
 	gtk_window_set_title (GTK_WINDOW (emfs), title);
 	gtk_container_set_border_width (GTK_CONTAINER (emfs), 6);
@@ -216,11 +214,18 @@ em_folder_selector_construct (EMFolderSelector *emfs, EMFolderTree *emft, guint3
 }
 
 GtkWidget *
-em_folder_selector_new (EMFolderTree *emft, guint32 flags, const gchar *title, const gchar *text, const gchar *oklabel)
+em_folder_selector_new (GtkWindow *parent,
+                        EMFolderTree *emft,
+                        guint32 flags,
+                        const gchar *title,
+                        const gchar *text,
+                        const gchar *oklabel)
 {
 	EMFolderSelector *emfs;
 
-	emfs = g_object_new (em_folder_selector_get_type (), NULL);
+	emfs = g_object_new (
+		EM_TYPE_FOLDER_SELECTOR,
+		"transient-for", parent, NULL);
 	em_folder_selector_construct (emfs, emft, flags, title, text, oklabel);
 
 	return (GtkWidget *) emfs;
@@ -243,7 +248,11 @@ emfs_create_name_activate (GtkEntry *entry, EMFolderSelector *emfs)
 }
 
 GtkWidget *
-em_folder_selector_create_new (EMFolderTree *emft, guint32 flags, const gchar *title, const gchar *text)
+em_folder_selector_create_new (GtkWindow *parent,
+                               EMFolderTree *emft,
+                               guint32 flags,
+                               const gchar *title,
+                               const gchar *text)
 {
 	EMFolderSelector *emfs;
 	GtkWidget *hbox, *w;
@@ -252,7 +261,9 @@ em_folder_selector_create_new (EMFolderTree *emft, guint32 flags, const gchar *t
 	 * whole purpose of this dialog */
 	flags &= ~EM_FOLDER_SELECTOR_CAN_CREATE;
 
-	emfs = g_object_new (em_folder_selector_get_type (), NULL);
+	emfs = g_object_new (
+		EM_TYPE_FOLDER_SELECTOR,
+		"transient-for", parent, NULL);
 	em_folder_selector_construct (emfs, emft, flags, title, text, _("C_reate"));
 	em_folder_tree_set_excluded(emft, EMFT_EXCLUDE_NOINFERIORS);
 
diff --git a/mail/em-folder-selector.h b/mail/em-folder-selector.h
index 131c4a4..ca31d21 100644
--- a/mail/em-folder-selector.h
+++ b/mail/em-folder-selector.h
@@ -25,6 +25,7 @@
 #define EM_FOLDER_SELECTOR_H
 
 #include <gtk/gtk.h>
+#include <mail/em-folder-tree.h>
 
 /* Standard GObject macros */
 #define EM_TYPE_FOLDER_SELECTOR \
@@ -55,7 +56,7 @@ struct _EMFolderSelector {
 	GtkDialog parent;
 
 	guint32 flags;
-	struct _EMFolderTree *emft;
+	EMFolderTree *emft;
 
 	GtkEntry *name_entry;
 	gchar *selected_path;
@@ -78,24 +79,37 @@ enum {
 	EM_FOLDER_SELECTOR_RESPONSE_NEW = 1
 };
 
-GType em_folder_selector_get_type (void);
-
-void em_folder_selector_construct (EMFolderSelector *emfs, struct _EMFolderTree *emft, guint32 flags, const gchar *title, const gchar *text, const gchar *oklabel);
-
-/* for selecting folders */
-GtkWidget *em_folder_selector_new (struct _EMFolderTree *emft, guint32 flags, const gchar *title, const gchar *text, const gchar *oklabel);
-
-/* for creating folders */
-GtkWidget *em_folder_selector_create_new (struct _EMFolderTree *emft, guint32 flags, const gchar *title, const gchar *text);
-
-void em_folder_selector_set_selected (EMFolderSelector *emfs, const gchar *uri);
-void em_folder_selector_set_selected_list (EMFolderSelector *emfs, GList *list);
-
-const gchar *em_folder_selector_get_selected_uri (EMFolderSelector *emfs);
-const gchar *em_folder_selector_get_selected_path (EMFolderSelector *emfs);
-
-GList *em_folder_selector_get_selected_uris (EMFolderSelector *emfs);
-GList *em_folder_selector_get_selected_paths (EMFolderSelector *emfs);
+GType		em_folder_selector_get_type	(void);
+void		em_folder_selector_construct	(EMFolderSelector *emfs,
+						 EMFolderTree *emft,
+						 guint32 flags,
+						 const gchar *title,
+						 const gchar *text,
+						 const gchar *oklabel);
+GtkWidget *	em_folder_selector_new		(GtkWindow *parent,
+						 EMFolderTree *emft,
+						 guint32 flags,
+						 const gchar *title,
+						 const gchar *text,
+						 const gchar *oklabel);
+GtkWidget *	em_folder_selector_create_new	(GtkWindow *parent,
+						 EMFolderTree *emft,
+						 guint32 flags,
+						 const gchar *title,
+						 const gchar *text);
+void		em_folder_selector_set_selected	(EMFolderSelector *emfs,
+						 const gchar *uri);
+void		em_folder_selector_set_selected_list
+						(EMFolderSelector *emfs,
+						 GList *list);
+const gchar *	em_folder_selector_get_selected_uri
+						(EMFolderSelector *emfs);
+const gchar *	em_folder_selector_get_selected_path
+						(EMFolderSelector *emfs);
+GList *		em_folder_selector_get_selected_uris
+						(EMFolderSelector *emfs);
+GList *		em_folder_selector_get_selected_paths
+						(EMFolderSelector *emfs);
 
 G_END_DECLS
 
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 568bf49..5772378 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -68,7 +68,6 @@
 #include "em-folder-tree.h"
 #include "em-folder-utils.h"
 #include "em-folder-selector.h"
-#include "em-folder-selection.h"
 #include "em-folder-properties.h"
 #include "em-event.h"
 
diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c
index 0379607..3a4636a 100644
--- a/mail/em-folder-utils.c
+++ b/mail/em-folder-utils.c
@@ -65,7 +65,6 @@
 #include "em-folder-tree-model.h"
 #include "em-folder-utils.h"
 #include "em-folder-selector.h"
-#include "em-folder-selection.h"
 #include "em-folder-properties.h"
 
 #include "e-mail-local.h"
@@ -365,9 +364,13 @@ emfu_copy_folder_exclude(EMFolderTree *tree, GtkTreeModel *model, GtkTreeIter *i
 /* FIXME: this interface references the folderinfo without copying it  */
 /* FIXME: these functions must be documented */
 void
-em_folder_utils_copy_folder (CamelFolderInfo *folderinfo,
+em_folder_utils_copy_folder (GtkWindow *parent,
+                             CamelFolderInfo *folderinfo,
                              gint delete)
 {
+	GtkWidget *dialog;
+	EMFolderTree *emft;
+	const gchar *label;
 	struct _copy_folder_data *cfd;
 
 	g_return_if_fail (folderinfo != NULL);
@@ -376,11 +379,28 @@ em_folder_utils_copy_folder (CamelFolderInfo *folderinfo,
 	cfd->fi = folderinfo;
 	cfd->delete = delete;
 
-	em_select_folder (
-		_("Select folder"),
-		delete ? _("_Move") : _("C_opy"),
-		NULL, emfu_copy_folder_exclude,
-		emfu_copy_folder_selected, cfd);
+	/* XXX Do we leak this reference. */
+	emft = (EMFolderTree *) em_folder_tree_new ();
+
+	em_folder_tree_set_excluded_func (
+		emft, emfu_copy_folder_exclude, cfd);
+
+	label = delete ? _("_Move") : _("C_opy");
+
+	dialog = em_folder_selector_new (
+		parent, emft,
+		EM_FOLDER_SELECTOR_CAN_CREATE,
+		_("Select Folder"), NULL, label);
+
+	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
+		const gchar *uri;
+
+		uri = em_folder_selector_get_selected_uri (
+			EM_FOLDER_SELECTOR (dialog));
+		emfu_copy_folder_selected (uri, cfd);
+	}
+
+	gtk_widget_destroy (dialog);
 }
 
 static void
@@ -732,15 +752,12 @@ em_folder_utils_create_folder (CamelFolderInfo *folderinfo, EMFolderTree *emft,
 
 	folder_tree = (EMFolderTree *) em_folder_tree_new ();
 
-	dialog = em_folder_selector_create_new (folder_tree, 0, _("Create Folder"), _("Specify where to create the folder:"));
+	dialog = em_folder_selector_create_new (
+		parent, folder_tree, 0,
+		_("Create Folder"),
+		_("Specify where to create the folder:"));
 	if (folderinfo != NULL)
 		em_folder_selector_set_selected ((EMFolderSelector *) dialog, folderinfo->uri);
-	if (parent) {
-		gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
-		gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
-		if (gtk_window_get_modal (parent))
-			gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-	}
 	g_signal_connect (dialog, "response", G_CALLBACK (emfu_popup_new_folder_response), emft);
 	gtk_widget_show (dialog);
 }
diff --git a/mail/em-folder-utils.h b/mail/em-folder-utils.h
index d0db789..78c2f81 100644
--- a/mail/em-folder-utils.h
+++ b/mail/em-folder-utils.h
@@ -40,7 +40,8 @@ gint		em_folder_utils_copy_folders	(CamelStore *fromstore,
 /* FIXME These API's are really busted.  There is no consistency and
  *       most rely on the wrong data. */
 
-void		em_folder_utils_copy_folder	(CamelFolderInfo *folderinfo,
+void		em_folder_utils_copy_folder	(GtkWindow *parent,
+						 CamelFolderInfo *folderinfo,
 						 gboolean delete);
 void		em_folder_utils_delete_folder	(CamelFolder *folder);
 void		em_folder_utils_rename_folder	(CamelFolder *folder);
diff --git a/mail/em-vfolder-rule.c b/mail/em-vfolder-rule.c
index c357065..5f58c1e 100644
--- a/mail/em-vfolder-rule.c
+++ b/mail/em-vfolder-rule.c
@@ -506,13 +506,17 @@ source_add(GtkWidget *widget, struct _source_data *data)
 {
 	EMFolderTree *emft;
 	GtkWidget *dialog;
+	gpointer parent;
+
+	parent = gtk_widget_get_toplevel (widget);
+	parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
 
 	emft =(EMFolderTree *) em_folder_tree_new ();
 	em_folder_tree_set_excluded (emft, EMFT_EXCLUDE_NOSELECT);
 
-	dialog = em_folder_selector_new(emft, EM_FOLDER_SELECTOR_CAN_CREATE, _("Select Folder"), NULL, _("_Add"));
-	gtk_window_set_transient_for ((GtkWindow *)dialog, (GtkWindow *)gtk_widget_get_toplevel(widget));
-	gtk_window_set_modal((GtkWindow *)dialog, TRUE);
+	dialog = em_folder_selector_new (
+		parent, emft, EM_FOLDER_SELECTOR_CAN_CREATE,
+		_("Select Folder"), NULL, _("_Add"));
 	g_signal_connect(dialog, "response", G_CALLBACK(vfr_folder_response), data);
 	gtk_widget_show(dialog);
 }
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 9c79164..00579ed 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -122,17 +122,23 @@ static void
 action_mail_folder_copy_cb (GtkAction *action,
                             EMailShellView *mail_shell_view)
 {
+	EShellView *shell_view;
+	EShellWindow *shell_window;
 	EMailShellSidebar *mail_shell_sidebar;
 	CamelFolderInfo *folder_info;
 	EMFolderTree *folder_tree;
 
+	shell_view = E_SHELL_VIEW (mail_shell_view);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+
 	mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
 	folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
 	folder_info = em_folder_tree_get_selected_folder_info (folder_tree);
 	g_return_if_fail (folder_info != NULL);
 
 	/* XXX Leaking folder_info? */
-	em_folder_utils_copy_folder (folder_info, FALSE);
+	em_folder_utils_copy_folder (
+		GTK_WINDOW (shell_window), folder_info, FALSE);
 }
 
 static void
@@ -217,17 +223,23 @@ static void
 action_mail_folder_move_cb (GtkAction *action,
                             EMailShellView *mail_shell_view)
 {
+	EShellView *shell_view;
+	EShellWindow *shell_window;
 	EMailShellSidebar *mail_shell_sidebar;
 	CamelFolderInfo *folder_info;
 	EMFolderTree *folder_tree;
 
+	shell_view = E_SHELL_VIEW (mail_shell_view);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+
 	mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
 	folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
 	folder_info = em_folder_tree_get_selected_folder_info (folder_tree);
 	g_return_if_fail (folder_info != NULL);
 
 	/* XXX Leaking folder_info? */
-	em_folder_utils_copy_folder (folder_info, TRUE);
+	em_folder_utils_copy_folder (
+		GTK_WINDOW (shell_window), folder_info, TRUE);
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]