diff options
author | 5 <NotZed@Ximian.com> | 2001-11-06 06:44:56 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2001-11-06 06:44:56 +0800 |
commit | 016bfe6a735a8f5b2b31731795d4812cbdaf8f7a (patch) | |
tree | 0de19924113e73d15d30285d1c3ea0bac7b3755d | |
parent | eb48b8f98bfbfc9633447aa2a6c3360622a2a777 (diff) | |
download | gsoc2013-evolution-016bfe6a735a8f5b2b31731795d4812cbdaf8f7a.tar.gz gsoc2013-evolution-016bfe6a735a8f5b2b31731795d4812cbdaf8f7a.tar.zst gsoc2013-evolution-016bfe6a735a8f5b2b31731795d4812cbdaf8f7a.zip |
Override the Move/Copy handlers setup by the folder_browser_ui code, and
2001-11-05 <NotZed@Ximian.com>
* message-browser.c (set_bonobo_ui): Override the Move/Copy
handlers setup by the folder_browser_ui code, and use our own,
because we need to pass it a live window which we can't.
(transfer_msg): Our own version of mail-callbacks.c:transfer_msg,
so we can properly pass the parent to the user_select_folder.
(transfer_msg_done): Also copy this so we can pass it diff args.
All fix #13919.
* mail-callbacks.c (transfer_msg): Set physical/uri to NULL before
calling, because althought he shell client api call is supposed to
null these out, it doesn't with its stupid assertion checks on
entry. Also free physical to plug a memleak. Bugs exposed by
#13919.
svn path=/trunk/; revision=14597
-rw-r--r-- | mail/ChangeLog | 16 | ||||
-rw-r--r-- | mail/mail-callbacks.c | 3 | ||||
-rw-r--r-- | mail/message-browser.c | 95 |
3 files changed, 113 insertions, 1 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index c063e797b5..6ad2e81963 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,19 @@ +2001-11-05 <NotZed@Ximian.com> + + * message-browser.c (set_bonobo_ui): Override the Move/Copy + handlers setup by the folder_browser_ui code, and use our own, + because we need to pass it a live window which we can't. + (transfer_msg): Our own version of mail-callbacks.c:transfer_msg, + so we can properly pass the parent to the user_select_folder. + (transfer_msg_done): Also copy this so we can pass it diff args. + All fix #13919. + + * mail-callbacks.c (transfer_msg): Set physical/uri to NULL before + calling, because althought he shell client api call is supposed to + null these out, it doesn't with its stupid assertion checks on + entry. Also free physical to plug a memleak. Bugs exposed by + #13919. + 2001-11-01 Jeffrey Stedfast <fejj@ximian.com> * mail-display.h (mail_html_write): Renamed from diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 789e60cad8..527d9d39a5 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -1276,6 +1276,8 @@ transfer_msg (FolderBrowser *fb, gboolean delete_from_source) else desc = _("Copy message(s) to"); + uri = NULL; + physical = NULL; evolution_shell_client_user_select_folder (global_shell_client, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (fb))), desc, last, @@ -1301,6 +1303,7 @@ transfer_msg (FolderBrowser *fb, gboolean delete_from_source) mail_transfer_messages (fb->folder, uids, delete_from_source, physical, 0, NULL, NULL); } + g_free(physical); } void diff --git a/mail/message-browser.c b/mail/message-browser.c index c8f2b7ed85..10ec477e7e 100644 --- a/mail/message-browser.c +++ b/mail/message-browser.c @@ -87,6 +87,81 @@ message_browser_init (GtkObject *object) } +static void +transfer_msg_done (gboolean ok, void *data) +{ + MessageBrowser *mb = data; + int row; + + if (ok && !GTK_OBJECT_DESTROYED (mb)) { + row = e_tree_row_of_node (mb->fb->message_list->tree, + e_tree_get_cursor (mb->fb->message_list->tree)); + + /* If this is the last message and deleted messages + are hidden, select the previous */ + if ((row + 1 == e_tree_row_count (mb->fb->message_list->tree)) + && mail_config_get_hide_deleted ()) + message_list_select (mb->fb->message_list, row, MESSAGE_LIST_SELECT_PREVIOUS, + 0, CAMEL_MESSAGE_DELETED, FALSE); + else + message_list_select (mb->fb->message_list, row, MESSAGE_LIST_SELECT_NEXT, + 0, 0, FALSE); + } + + gtk_object_unref (GTK_OBJECT (mb)); +} + +static void +transfer_msg (MessageBrowser *mb, int del) +{ + const char *allowed_types[] = { "mail", "vtrash", NULL }; + extern EvolutionShellClient *global_shell_client; + char *uri, *physical, *path, *desc; + static char *last = NULL; + GPtrArray *uids; + + if (GTK_OBJECT_DESTROYED(mb)) + return; + + if (last == NULL) + last = g_strdup (""); + + if (del) + desc = _("Move message(s) to"); + else + desc = _("Copy message(s) to"); + + uri = NULL; + physical = NULL; + evolution_shell_client_user_select_folder (global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (mb))), + desc, last, + allowed_types, &uri, &physical); + if (!uri) + return; + + path = strchr (uri, '/'); + if (path && strcmp (last, path) != 0) { + g_free (last); + last = g_strdup_printf ("evolution:%s", path); + } + g_free (uri); + + uids = g_ptr_array_new (); + message_list_foreach (mb->fb->message_list, enumerate_msg, uids); + + if (del) { + gtk_object_ref (GTK_OBJECT (mb)); + mail_transfer_messages (mb->fb->folder, uids, del, + physical, 0, transfer_msg_done, mb); + } else { + mail_transfer_messages (mb->fb->folder, uids, del, + physical, 0, NULL, NULL); + } + g_free(physical); +} + + /* UI callbacks */ static void @@ -95,9 +170,23 @@ message_browser_close (BonoboUIComponent *uih, void *user_data, const char *path gtk_widget_destroy (GTK_WIDGET (user_data)); } +static void +message_browser_move (BonoboUIComponent *uih, void *user_data, const char *path) +{ + transfer_msg(user_data, TRUE); +} + +static void +message_browser_copy (BonoboUIComponent *uih, void *user_data, const char *path) +{ + transfer_msg(user_data, FALSE); +} + static BonoboUIVerb browser_verbs [] = { BONOBO_UI_UNSAFE_VERB ("MessageBrowserClose", message_browser_close), + BONOBO_UI_UNSAFE_VERB ("MessageMove", message_browser_move), + BONOBO_UI_UNSAFE_VERB ("MessageCopy", message_browser_copy), BONOBO_UI_VERB_END }; @@ -200,7 +289,11 @@ set_bonobo_ui (GtkWidget *widget, FolderBrowser *fb) bonobo_exception_get_text (&ev)); CORBA_exception_free (&ev); - /* Add the Close item */ + /* Hack around the move/copy commands api's */ + bonobo_ui_component_remove_listener (uic, "MessageCopy"); + bonobo_ui_component_remove_listener (uic, "MessageMove"); + + /* Add the Close & Move/Copy items */ bonobo_ui_component_add_verb_list_with_data (uic, browser_verbs, widget); |