From 18b4f29daa6f95a318bd5f29aec15448fa2039f2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 23 May 2002 20:22:42 +0000 Subject: If the folder-browser has a parent, reparent it. 2002-05-23 Jeffrey Stedfast * folder-browser-window.c (folder_browser_window_new): If the folder-browser has a parent, reparent it. * message-browser.[c,h]: Revert back to the old broken implementation since that's what users want. They're not happy unless it's broken. svn path=/trunk/; revision=16989 --- mail/ChangeLog | 9 ++ mail/folder-browser-window.c | 28 +++++ mail/folder-browser-window.h | 1 + mail/mail-callbacks.c | 3 +- mail/message-browser.c | 294 ++++++++++++++++++++++++++++++++++++++----- mail/message-browser.h | 19 +-- 6 files changed, 316 insertions(+), 38 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index b50f207c4e..d32be58325 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,12 @@ +2002-05-23 Jeffrey Stedfast + + * folder-browser-window.c (folder_browser_window_new): If the + folder-browser has a parent, reparent it. + + * message-browser.[c,h]: Revert back to the old broken + implementation since that's what users want. They're not happy + unless it's broken. + 2002-05-23 Radek Doulik * mail-composer-prefs.c: be more careful about language_str{_orig} diff --git a/mail/folder-browser-window.c b/mail/folder-browser-window.c index e87a745811..0f8132454a 100644 --- a/mail/folder-browser-window.c +++ b/mail/folder-browser-window.c @@ -77,6 +77,23 @@ folder_browser_window_init (GtkObject *object) } +static gboolean +destroy_cb (GtkWidget *widget) +{ + FolderBrowserWindow *fbw = (FolderBrowserWindow *) widget; + FolderBrowser *fb = fbw->folder_browser; + + if (fbw->fb_parent) { + gtk_widget_ref (GTK_WIDGET (fb)); + gtk_widget_unparent (GTK_WIDGET (fb)); + gtk_container_add (GTK_CONTAINER (fbw->fb_parent), GTK_WIDGET (fb)); + gtk_widget_unref (GTK_WIDGET (fb)); + fbw->folder_browser = NULL; + } + + return FALSE; +} + static void folder_browser_window_size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation) { @@ -110,8 +127,19 @@ folder_browser_window_new (FolderBrowser *fb) set_default_size (GTK_WIDGET (new)); + new->folder_browser = fb; + gtk_widget_ref (GTK_WIDGET (fb)); + if (GTK_WIDGET (fb)->parent) { + new->fb_parent = GTK_WIDGET (fb)->parent; + gtk_widget_unparent (GTK_WIDGET (fb)); + + gtk_signal_connect (GTK_OBJECT (new), "delete_event", + destroy_cb, new); + } + new->folder_browser = fb; bonobo_window_set_contents (BONOBO_WINDOW (new), GTK_WIDGET (fb)); + gtk_widget_unref (GTK_WIDGET (fb)); uicont = bonobo_ui_container_new (); bonobo_ui_container_set_win (uicont, BONOBO_WINDOW (new)); diff --git a/mail/folder-browser-window.h b/mail/folder-browser-window.h index fdd9b1315b..ee00be2236 100644 --- a/mail/folder-browser-window.h +++ b/mail/folder-browser-window.h @@ -45,6 +45,7 @@ typedef struct _FolderBrowserWindow FolderBrowserWindow; struct _FolderBrowserWindow { BonoboWindow parent; + GtkWidget *fb_parent; FolderBrowser *folder_browser; }; diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index ec84ceec06..21c6aea978 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -24,6 +24,7 @@ * USA */ + #ifdef HAVE_CONFIG_H #include #endif @@ -3118,7 +3119,7 @@ do_view_message (CamelFolder *folder, char *uid, CamelMimeMessage *message, void GtkWidget *mb; camel_folder_set_message_flags (folder, uid, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN); - mb = message_browser_new (message); + mb = folder_browser_window_new (fb); gtk_widget_show (mb); } } diff --git a/mail/message-browser.c b/mail/message-browser.c index 4e42bdd35c..ae318f1869 100644 --- a/mail/message-browser.c +++ b/mail/message-browser.c @@ -27,30 +27,58 @@ #include #include +#include +#include +#include +#include + #include "message-browser.h" -#include "mail-display.h" +#include "mail.h" +#include "mail-callbacks.h" +#include "mail-tools.h" +#include "message-list.h" +#include "mail-ops.h" +#include "mail-vfolder.h" +#include "mail-autofilter.h" +#include "mail-mt.h" #include "mail-local.h" #include "mail-config.h" +#include "folder-browser-ui.h" + #define d(x) #define MINIMUM_WIDTH 600 #define MINIMUM_HEIGHT 400 -#define PARENT_TYPE GTK_TYPE_WINDOW +#define PARENT_TYPE BONOBO_TYPE_WINDOW /* Size of the window last time it was changed. */ static GtkAllocation last_allocation = { 0, 0 }; -static GtkWindowClass *parent_class = NULL; +static BonoboWindowClass *message_browser_parent_class; +static void +message_browser_destroy (GtkObject *object) +{ + MessageBrowser *message_browser; + + message_browser = MESSAGE_BROWSER (object); + + gtk_object_unref (GTK_OBJECT (message_browser->fb)); + + if (GTK_OBJECT_CLASS (message_browser_parent_class)->destroy) + (GTK_OBJECT_CLASS (message_browser_parent_class)->destroy) (object); +} static void message_browser_class_init (GtkObjectClass *object_class) { - parent_class = gtk_type_class (PARENT_TYPE); + object_class->destroy = message_browser_destroy; + + message_browser_parent_class = gtk_type_class (PARENT_TYPE); } static void @@ -59,35 +87,161 @@ message_browser_init (GtkObject *object) } -GtkType -message_browser_get_type (void) +static void +transfer_msg_done (gboolean ok, void *data) { - static GtkType type = 0; - - if (!type) { - GtkTypeInfo type_info = { - "MessageBrowser", - sizeof (MessageBrowser), - sizeof (MessageBrowserClass), - (GtkClassInitFunc) message_browser_class_init, - (GtkObjectInitFunc) message_browser_init, - (GtkArgSetFunc) NULL, - (GtkArgGetFunc) NULL - }; + 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)); - type = gtk_type_unique (gtk_window_get_type (), &type_info); + /* 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, MESSAGE_LIST_SELECT_PREVIOUS, + 0, CAMEL_MESSAGE_DELETED, FALSE); + else + message_list_select (mb->fb->message_list, 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; + GNOME_Evolution_Folder *folder; + static char *last_uri = NULL; + GPtrArray *uids; + char *desc; + + if (GTK_OBJECT_DESTROYED(mb)) + return; + + if (last_uri == NULL) + last_uri = g_strdup (""); + + if (del) + desc = _("Move message(s) to"); + else + desc = _("Copy message(s) to"); + + evolution_shell_client_user_select_folder (global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (mb))), + desc, last_uri, allowed_types, &folder); + if (!folder) + return; + + if (strcmp (last_uri, folder->evolutionUri) != 0) { + g_free (last_uri); + last_uri = g_strdup (folder->evolutionUri); } - return type; + 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, + folder->physicalUri, 0, transfer_msg_done, mb); + } else { + mail_transfer_messages (mb->fb->folder, uids, del, + folder->physicalUri, 0, NULL, NULL); + } + + CORBA_free (folder); +} + + +/* UI callbacks */ + +static void +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 +}; + +/* FB message loading hookups */ static void -message_browser_size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation) +message_browser_message_loaded (FolderBrowser *fb, const char *uid, MessageBrowser *mb) +{ + CamelMimeMessage *message; + char *subject = NULL; + char *title; + + folder_browser_ui_message_loaded(fb); + + message = fb->mail_display->current_message; + + if (message) + subject = (char *) camel_mime_message_get_subject (message); + + if (subject != NULL) + subject = e_utf8_to_gtk_string (GTK_WIDGET (mb), subject); + else + subject = g_strdup (_("(No subject)")); + + title = g_strdup_printf (_("%s - Message"), subject); + g_free (subject); + + gtk_window_set_title (GTK_WINDOW (mb), title); + + g_free (title); +} + +static void +message_browser_message_list_built (MessageList *ml, MessageBrowser *mb) +{ + const char *uid = gtk_object_get_data (GTK_OBJECT (mb), "uid"); + + gtk_signal_disconnect_by_func (GTK_OBJECT (ml), message_browser_message_list_built, mb); + + message_list_select_uid (ml, uid); +} + +static void +message_browser_folder_loaded (FolderBrowser *fb, const char *uri, MessageBrowser *mb) +{ + gtk_signal_connect (GTK_OBJECT (fb->message_list), "message_list_built", + message_browser_message_list_built, mb); +} + +static void +message_browser_size_allocate_cb (GtkWidget *widget, + GtkAllocation *allocation) { last_allocation = *allocation; } +/* Construction */ + static void set_default_size (GtkWidget *widget) { @@ -99,22 +253,102 @@ set_default_size (GtkWidget *widget) gtk_window_set_default_size (GTK_WINDOW (widget), width, height); } +static void +set_bonobo_ui (GtkWidget *widget, FolderBrowser *fb) +{ + BonoboUIContainer *uicont; + BonoboUIComponent *uic; + CORBA_Environment ev; + + uicont = bonobo_ui_container_new (); + bonobo_ui_container_set_win (uicont, BONOBO_WINDOW (widget)); + + uic = bonobo_ui_component_new_default (); + bonobo_ui_component_set_container (uic, BONOBO_OBJREF (uicont)); + folder_browser_set_ui_component (fb, uic); + + /* Load our UI */ + + /*bonobo_ui_component_freeze (uic, NULL);*/ + bonobo_ui_util_set_ui (uic, EVOLUTION_DATADIR, "evolution-mail-messagedisplay.xml", "evolution-mail"); + + /* Load the appropriate UI stuff from the folder browser */ + + folder_browser_ui_add_message (fb); + + /* We just opened the message! We don't need to open it again. */ + + CORBA_exception_init (&ev); + bonobo_ui_component_rm (uic, "/menu/File/FileOps/MessageOpen", &ev); + if (BONOBO_EX (&ev)) + g_warning ("Couldn't remove message open item. Weird. Error: %s", + bonobo_exception_get_text (&ev)); + CORBA_exception_free (&ev); + + /* 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); + + /* Done */ + + /*bonobo_ui_component_thaw (uic, NULL);*/ +} + GtkWidget * -message_browser_new (CamelMimeMessage *message) +message_browser_new (const GNOME_Evolution_Shell shell, const char *uri, const char *uid) { - GtkWidget *new, *mail_display; + GtkWidget *vbox; + MessageBrowser *new; + FolderBrowser *fb; + + new = gtk_type_new (MESSAGE_BROWSER_TYPE); + new = (MessageBrowser *) bonobo_window_construct (BONOBO_WINDOW (new), "Ximian Evolution", ""); + if (!new) { + g_warning ("Failed to construct Bonobo window!"); + return NULL; + } + + gtk_object_set_data_full (GTK_OBJECT (new), "uid", g_strdup (uid), g_free); + + fb = FOLDER_BROWSER (folder_browser_new (shell, uri)); + new->fb = fb; + + set_bonobo_ui (GTK_WIDGET (new), fb); + + /* some evil hackery action... */ + vbox = gtk_vbox_new (TRUE, 0); + gtk_widget_ref (GTK_WIDGET (fb->mail_display)); + gtk_widget_reparent (GTK_WIDGET (fb->mail_display), vbox); + /* Note: normally we'd unref the fb->mail_display now, except + that if we do then our refcounts will not be in + harmony... both the fb *and* the message-browser need to + own a ref on the mail_display. */ + gtk_widget_show (GTK_WIDGET (fb->mail_display)); + gtk_widget_show (vbox); - new = gtk_widget_new (message_browser_get_type (), NULL); gtk_signal_connect (GTK_OBJECT (new), "size_allocate", GTK_SIGNAL_FUNC (message_browser_size_allocate_cb), NULL); - mail_display = mail_display_new (); - gtk_container_add (GTK_CONTAINER (new), mail_display); - gtk_widget_show (mail_display); + bonobo_window_set_contents (BONOBO_WINDOW (new), vbox); + gtk_widget_grab_focus (GTK_WIDGET (MAIL_DISPLAY (fb->mail_display)->html)); + + set_default_size (GTK_WIDGET (new)); - mail_display_set_message (MAIL_DISPLAY (mail_display), CAMEL_MEDIUM (message), NULL); + /* more evil hackery... */ + gtk_signal_connect (GTK_OBJECT (fb), "folder_loaded", + message_browser_folder_loaded, new); - set_default_size (new); + gtk_signal_connect (GTK_OBJECT (fb), "message_loaded", + message_browser_message_loaded, new); - return new; + return GTK_WIDGET (new); } + +/* Fin */ + +E_MAKE_TYPE (message_browser, "MessageBrowser", MessageBrowser, message_browser_class_init, + message_browser_init, PARENT_TYPE); diff --git a/mail/message-browser.h b/mail/message-browser.h index ddc9f55292..d9a54b0900 100644 --- a/mail/message-browser.h +++ b/mail/message-browser.h @@ -20,8 +20,8 @@ * */ -#ifndef __MESSAGE_BROWSER_H__ -#define __MESSAGE_BROWSER_H__ +#ifndef _MESSAGE_BROWSER_H_ +#define _MESSAGE_BROWSER_H_ #include #include @@ -38,19 +38,24 @@ #define IS_MESSAGE_BROWSER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MESSAGE_BROWSER_TYPE)) struct _MessageBrowser { - GtkWindow parent; + BonoboWindow parent; + /* + * The current URI being displayed by the MessageBrowser + */ + FolderBrowser *fb; }; typedef struct { - GtkWindowClass parent_class; + BonoboWindowClass parent_class; } MessageBrowserClass; -GtkType message_browser_get_type (void); +GtkType message_browser_get_type (void); -GtkWidget *message_browser_new (CamelMimeMessage *message); +GtkWidget *message_browser_new (const GNOME_Evolution_Shell shell, + const char *uri, const char *uid); -#endif /* __MESSAGE_BROWSER_H__ */ +#endif /* _MESSAGE_BROWSER_H_ */ -- cgit v1.2.3