diff options
-rw-r--r-- | mail/ChangeLog | 20 | ||||
-rw-r--r-- | mail/folder-browser.c | 4 | ||||
-rw-r--r-- | mail/mail-callbacks.c | 66 | ||||
-rw-r--r-- | mail/mail-callbacks.h | 1 | ||||
-rw-r--r-- | mail/mail-display.c | 72 |
5 files changed, 128 insertions, 35 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 2192dd0563..bb2fff2ce7 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,23 @@ +2001-06-30 Jon Trowbridge <trow@ximian.com> + + * mail-display.c (make_popup_window): Changed to return the + created window. + (find_socket): Added. Copied from e-shell-view.c. The fact + that I'm copying this bit of code all over isn't cool. + (html_button_press_event): Properly destroy the popup window when + the widget inside the control is destroyed. + + * mail-callbacks.c (addrbook_sender): Added. Implements + the "Add sender to addressbook" right-click. (Bug #3645) + (find_socket): Added. Copied from e-shell-view.c. + + * folder-browser.c: Added "Add sender to addressbook" to + context_menu[]. + + * mail-display.c: (handle_embedded_address_object): Removed. + (on_object_requested): Removed handling for embedded address + objects. (Which was obsolete crap.) + 2001-06-29 Larry Ewing <lewing@ximian.com> * mail-display.c (html_button_press_event): remove redundant diff --git a/mail/folder-browser.c b/mail/folder-browser.c index 1b3de3c3e3..3c5d44cc25 100644 --- a/mail/folder-browser.c +++ b/mail/folder-browser.c @@ -1219,10 +1219,10 @@ static EPopupMenu context_menu[] = { SEPARATOR, - /*{ _("Add Sender to Address Book"), NULL, + { N_("Add Sender to Address Book"), NULL, GTK_SIGNAL_FUNC (addrbook_sender), NULL, 0 }, { "", NULL, - GTK_SIGNAL_FUNC (NULL), NULL, 0 },*/ + GTK_SIGNAL_FUNC (NULL), NULL, 0 }, { N_("Apply Filters"), NULL, GTK_SIGNAL_FUNC (apply_filters), NULL, 0 }, diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 62103fb43d..a4d1647515 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -38,6 +38,8 @@ #include <libgnome/gnome-paper.h> #include <libgnomeprint/gnome-print-master.h> #include <libgnomeprint/gnome-print-master-preview.h> +#include <bonobo/bonobo-widget.h> +#include <bonobo/bonobo-socket.h> #include <gal/e-table/e-table.h> #include <gal/widgets/e-gui-utils.h> #include <filter/filter-editor.h> @@ -996,6 +998,70 @@ copy_msg (GtkWidget *widget, gpointer user_data) transfer_msg (widget, user_data, FALSE); } +/* Copied from e-shell-view.c */ +static GtkWidget * +find_socket (GtkContainer *container) +{ + GList *children, *tmp; + + children = gtk_container_children (container); + while (children) { + if (BONOBO_IS_SOCKET (children->data)) + return children->data; + else if (GTK_IS_CONTAINER (children->data)) { + GtkWidget *socket = find_socket (children->data); + if (socket) + return socket; + } + tmp = children->next; + g_list_free_1 (children); + children = tmp; + } + return NULL; +} + +void +addrbook_sender (GtkWidget *widget, gpointer user_data) +{ + FolderBrowser *fb = FOLDER_BROWSER (user_data); + CamelMimeMessage *msg = NULL; + const CamelInternetAddress *addr; + gchar *addr_str; + GtkWidget *win; + GtkWidget *control; + GtkWidget *socket; + + if (fb && fb->mail_display) + msg = fb->mail_display->current_message; + + if (msg == NULL) + return; + + addr = camel_mime_message_get_from (msg); + if (addr == NULL) + return; + + addr_str = camel_address_format (CAMEL_ADDRESS (addr)); + + win = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (win), _("Sender")); + + control = bonobo_widget_new_control ("OAFIID:GNOME_Evolution_Addressbook_AddressPopup", + CORBA_OBJECT_NIL); + bonobo_widget_set_property (BONOBO_WIDGET (control), + "email", addr_str, + NULL); + + socket = find_socket (GTK_CONTAINER (control)); + gtk_signal_connect_object (GTK_OBJECT (socket), + "destroy", + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (win)); + + gtk_container_add (GTK_CONTAINER (win), control); + gtk_widget_show_all (win); +} + void apply_filters (GtkWidget *widget, gpointer user_data) { diff --git a/mail/mail-callbacks.h b/mail/mail-callbacks.h index e96b5d1ff9..6d37bb4819 100644 --- a/mail/mail-callbacks.h +++ b/mail/mail-callbacks.h @@ -62,6 +62,7 @@ void delete_msg (GtkWidget *widget, gpointer user_data); void undelete_msg (GtkWidget *widget, gpointer user_data); void move_msg (GtkWidget *widget, gpointer user_data); void copy_msg (GtkWidget *widget, gpointer user_data); +void addrbook_sender (GtkWidget *widget, gpointer user_data); void apply_filters (GtkWidget *widget, gpointer user_data); void print_msg (GtkWidget *widget, gpointer user_data); void print_preview_msg (GtkWidget *widget, gpointer user_data); diff --git a/mail/mail-display.c b/mail/mail-display.c index 816e5b49e8..78fe4f2022 100644 --- a/mail/mail-display.c +++ b/mail/mail-display.c @@ -25,6 +25,7 @@ #include <bonobo/bonobo-stream-memory.h> #include <bonobo/bonobo-ui-toolbar-icon.h> #include <bonobo/bonobo-widget.h> +#include <bonobo/bonobo-socket.h> #include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixbuf-loader.h> #include <gal/util/e-util.h> @@ -640,32 +641,6 @@ get_embedded_for_component (const char *iid, MailDisplay *md) return embedded; } -static void -handle_embedded_address_object (GtkHTMLEmbedded *eb) -{ - const gchar *name, *email; - GtkWidget *w; - - w = bonobo_widget_new_control ("OAFIID:GNOME_Evolution_Addressbook_AddressWidget", - CORBA_OBJECT_NIL); - - name = gtk_html_embedded_get_parameter (eb, "name"); - email = gtk_html_embedded_get_parameter (eb, "email"); - - bonobo_widget_set_property (BONOBO_WIDGET (w), - "name", name, - "email", email, - /* Hackish: this is the bg color defined for the HTML table - in mail-format.c. If you change it there, you'd better - change it here as well. */ - "background_rgb", 0xeeeeee, - NULL); - - gtk_widget_show (w); - gtk_container_add (GTK_CONTAINER (eb), w); - - gtk_html_embedded_set_descent (eb, 0); -} static gboolean on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data) @@ -686,11 +661,6 @@ on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data) cid = eb->classid; - if (!strcmp (cid, "address")) { - handle_embedded_address_object (eb); - return TRUE; - } - if (!strncmp (cid, "popup:", 6)) cid += 6; if (strncmp (cid, "cid:", 4) != 0) @@ -1431,7 +1401,7 @@ popup_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer user_d } -static void +static GtkWidget * make_popup_window (GtkWidget *w) { PopupInfo *pop = g_new0 (PopupInfo, 1); @@ -1479,6 +1449,30 @@ make_popup_window (GtkWidget *w) gtk_widget_show (w); gtk_widget_show (fr); gtk_widget_show (pop->win); + + return pop->win; +} + +/* Copied from e-shell-view.c */ +static GtkWidget * +find_socket (GtkContainer *container) +{ + GList *children, *tmp; + + children = gtk_container_children (container); + while (children) { + if (BONOBO_IS_SOCKET (children->data)) + return children->data; + else if (GTK_IS_CONTAINER (children->data)) { + GtkWidget *socket = find_socket (children->data); + if (socket) + return socket; + } + tmp = children->next; + g_list_free_1 (children); + children = tmp; + } + return NULL; } static int @@ -1491,7 +1485,9 @@ html_button_press_event (GtkWidget *widget, GdkEventButton *event, MailDisplay * if (event->button == 3) { HTMLEngine *e; HTMLPoint *point; + GtkWidget *socket; GtkWidget *popup_thing; + GtkWidget *win; e = GTK_HTML (widget)->engine; point = html_engine_get_point_at (e, event->x + e->x_offset, event->y + e->y_offset, FALSE); @@ -1506,10 +1502,20 @@ html_button_press_event (GtkWidget *widget, GdkEventButton *event, MailDisplay * popup_thing = bonobo_widget_new_control ("OAFIID:GNOME_Evolution_Addressbook_AddressPopup", CORBA_OBJECT_NIL); + socket = find_socket (GTK_CONTAINER (popup_thing)); + bonobo_widget_set_property (BONOBO_WIDGET (popup_thing), "email", url+7, NULL); - make_popup_window (popup_thing); + + win = make_popup_window (popup_thing); + gtk_signal_connect_object (GTK_OBJECT (socket), + "destroy", + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (win)); + + + } else if (url) { |