diff options
-rw-r--r-- | mail/ChangeLog | 15 | ||||
-rw-r--r-- | mail/em-folder-view.c | 70 | ||||
-rw-r--r-- | mail/em-folder-view.h | 6 | ||||
-rw-r--r-- | mail/em-format-html-display.c | 20 | ||||
-rw-r--r-- | mail/em-format-html-display.h | 2 | ||||
-rw-r--r-- | mail/mail-component.c | 10 | ||||
-rw-r--r-- | shell/ChangeLog | 9 | ||||
-rw-r--r-- | shell/e-activity-handler.c | 24 | ||||
-rw-r--r-- | shell/e-activity-handler.h | 5 | ||||
-rw-r--r-- | shell/e-task-bar.c | 50 | ||||
-rw-r--r-- | shell/e-task-bar.h | 8 |
11 files changed, 213 insertions, 6 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 14b58feb70..17bc446c59 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -56,6 +56,21 @@ * em-format.c (em_format_find_handler): make virtual, rename to emf_find_handler. +2004-01-04 ERDI Gergo <cactus@cactus.rulez.org> + + * em-folder-view.c (emfv_on_url_cb): Emit a hover-url signal when + the user mouses over a URL, ... + (emfv_hover_url_impl): ... and use BonoboUI to change the status + bar message... + (em_folder_view_set_statusbar): ... unless we are asked not to, ... + + * mail-component.c (impl_createControls): ... like in the case of + the mail component, ... + (view_hover_url_cb): ... that uses the ActivityHandler to do the + same + + Add these together, and #127536 is neatly solved. + 2004-01-04 David Woodhouse <dwmw2@infradead.org> * em-format-html-display.c: Mail warning grammar typo fix. diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c index 997e64a4c9..ab35e7a090 100644 --- a/mail/em-folder-view.c +++ b/mail/em-folder-view.c @@ -66,6 +66,7 @@ #include "em-message-browser.h" #include "message-list.h" #include "em-utils.h" +#include "em-marshal.h" #include <gtkhtml/gtkhtml.h> #include <gtkhtml/htmlobject.h> @@ -103,6 +104,9 @@ static void filter_type_current (EMFolderView *emfv, int type); static void emfv_setting_setup(EMFolderView *emfv); +static void emfv_on_url_cb(GObject *emitter, const char *url, EMFolderView *emfv); +static void emfv_on_url(EMFolderView *emfv, const char *uri, const char *nice_uri); + static const EMFolderViewEnable emfv_enable_map[]; struct _EMFolderViewPrivate { @@ -119,6 +123,13 @@ struct _EMFolderViewPrivate { static GtkVBoxClass *emfv_parent; +enum { + EMFV_ON_URL, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + static void emfv_selection_get(GtkWidget *widget, GtkSelectionData *data, guint info, guint time_stamp, EMFolderView *emfv); static void emfv_selection_clear_event(GtkWidget *widget, GdkEventSelection *event, EMFolderView *emfv); @@ -132,6 +143,8 @@ emfv_init(GObject *o) p = emfv->priv = g_malloc0(sizeof(struct _EMFolderViewPrivate)); + emfv->statusbar_active = TRUE; + emfv->ui_files = g_slist_append(NULL, EVOLUTION_UIDIR "/evolution-mail-message.xml"); emfv->ui_app_name = "evolution-mail"; @@ -148,6 +161,7 @@ emfv_init(GObject *o) emfv->preview = (EMFormatHTMLDisplay *)em_format_html_display_new(); g_signal_connect(emfv->preview, "link_clicked", G_CALLBACK(emfv_format_link_clicked), emfv); g_signal_connect(emfv->preview, "popup_event", G_CALLBACK(emfv_format_popup_event), emfv); + g_signal_connect (emfv->preview, "on_url", G_CALLBACK (emfv_on_url_cb), emfv); p->invisible = gtk_invisible_new(); g_object_ref(p->invisible); @@ -229,6 +243,17 @@ emfv_class_init(GObjectClass *klass) ((EMFolderViewClass *)klass)->set_folder_uri = emfv_set_folder_uri; ((EMFolderViewClass *)klass)->set_message = emfv_set_message; ((EMFolderViewClass *)klass)->activate = emfv_activate; + + ((EMFolderViewClass *)klass)->on_url = emfv_on_url; + + signals[EMFV_ON_URL] = g_signal_new ("on-url", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EMFolderViewClass, on_url), + NULL, NULL, + em_marshal_VOID__STRING_STRING, + G_TYPE_NONE, + 2, G_TYPE_STRING, G_TYPE_STRING); } GType @@ -1550,6 +1575,8 @@ emfv_activate(EMFolderView *emfv, BonoboUIComponent *uic, int act) e_charset_picker_bonobo_ui_populate (uic, "/menu/View", _("Default"), emfv_charset_changed, emfv); emfv_enable_menus(emfv); + if (emfv->statusbar_active) + bonobo_ui_component_set_translate (uic, "/", "<status><item name=\"main\"/></status>", NULL); } else { const BonoboUIVerb *v; @@ -1628,6 +1655,18 @@ em_folder_view_get_popup_target(EMFolderView *emfv) return t; } +void +em_folder_view_set_statusbar (EMFolderView *emfv, gboolean statusbar) +{ + g_return_if_fail (emfv); + + emfv->statusbar_active = statusbar; + + if (statusbar && emfv->uic) + bonobo_ui_component_set_translate (emfv->uic, "/", + "<status><item name=\"main\"/></status>", NULL); +} + /* ********************************************************************** */ struct mst_t { @@ -2049,3 +2088,34 @@ emfv_setting_setup(EMFolderView *emfv) emfv, NULL, NULL); g_object_unref(gconf); } + +static void +emfv_on_url (EMFolderView *emfv, const char *uri, const char *nice_uri) +{ + if (emfv->statusbar_active) { + if (emfv->uic) { + bonobo_ui_component_set_status (emfv->uic, nice_uri, NULL); + /* Make sure the node keeps existing if nice_url == NULL */ + if (!nice_uri) + bonobo_ui_component_set_translate ( + emfv->uic, "/", "<status><item name=\"main\"/></status>", NULL); + } + } +} + +static void +emfv_on_url_cb (GObject *emitter, const char *url, EMFolderView *emfv) +{ + char *nice_url = NULL; + + if (url) { + if (strncmp (url, "mailto:", 7) == 0) + nice_url = g_strdup_printf (_("Click to mail %s"), url + 7); + else + nice_url = g_strdup_printf (_("Click to open %s"), url); + } + + g_signal_emit (emfv, signals[EMFV_ON_URL], 0, url, nice_url); + + g_free (nice_url); +} diff --git a/mail/em-folder-view.h b/mail/em-folder-view.h index 080b19eb6a..96c7ad97d0 100644 --- a/mail/em-folder-view.h +++ b/mail/em-folder-view.h @@ -78,6 +78,7 @@ struct _EMFolderView { int mark_seen_timeout; /* local copy of gconf stuff */ int mark_seen:1; int preview_active:1; /* is preview being used */ + int statusbar_active:1; /* should we manage the statusbar messages ourselves? */ }; struct _EMFolderViewClass { @@ -89,6 +90,9 @@ struct _EMFolderViewClass { void (*set_folder_uri)(EMFolderView *emfv, const char *uri); void (*set_folder)(EMFolderView *emfv, struct _CamelFolder *folder, const char *uri); void (*set_message)(EMFolderView *emfv, const char *uid); + + /* Signals */ + void (*on_url)(EMFolderView *emfv, const char *uri, const char *nice_uri); }; GType em_folder_view_get_type(void); @@ -110,6 +114,8 @@ int em_folder_view_print(EMFolderView *emfv, int preview); /* this could be on message-list */ guint32 em_folder_view_disable_mask(EMFolderView *emfv); +void em_folder_view_set_statusbar (EMFolderView *emfv, gboolean statusbar); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c index eaccf32e47..2c9b3c513e 100644 --- a/mail/em-format-html-display.c +++ b/mail/em-format-html-display.c @@ -106,6 +106,7 @@ struct _EMFormatHTMLDisplayPrivate { static int efhd_html_button_press_event (GtkWidget *widget, GdkEventButton *event, EMFormatHTMLDisplay *efh); static void efhd_html_link_clicked (GtkHTML *html, const char *url, EMFormatHTMLDisplay *efhd); +static void efhd_html_on_url (GtkHTML *html, const char *url, EMFormatHTMLDisplay *efhd); struct _attach_puri { EMFormatPURI puri; @@ -140,6 +141,7 @@ static void efhd_builtin_init(EMFormatHTMLDisplayClass *efhc); enum { EFHD_LINK_CLICKED, EFHD_POPUP_EVENT, + EFHD_ON_URL, EFHD_LAST_SIGNAL, }; @@ -290,6 +292,16 @@ efhd_class_init(GObjectClass *klass) GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE, G_TYPE_POINTER, G_TYPE_POINTER); + efhd_signals[EFHD_ON_URL] = + g_signal_new("on_url", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(EMFormatHTMLDisplayClass, on_url), + NULL, NULL, + gtk_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + efhd_builtin_init((EMFormatHTMLDisplayClass *)klass); } @@ -324,6 +336,7 @@ EMFormatHTMLDisplay *em_format_html_display_new(void) g_signal_connect(efhd->formathtml.html, "iframe_created", G_CALLBACK(efhd_iframe_created), efhd); g_signal_connect(efhd->formathtml.html, "link_clicked", G_CALLBACK(efhd_html_link_clicked), efhd); + g_signal_connect(efhd->formathtml.html, "on_url", G_CALLBACK(efhd_html_on_url), efhd); g_signal_connect(efhd->formathtml.html, "button_press_event", G_CALLBACK(efhd_html_button_press_event), efhd); return efhd; @@ -593,6 +606,13 @@ efhd_html_link_clicked (GtkHTML *html, const char *url, EMFormatHTMLDisplay *efh } static void +efhd_html_on_url (GtkHTML *html, const char *url, EMFormatHTMLDisplay *efhd) +{ + d(printf("on_url event '%s'\n", url)); + g_signal_emit((GObject *)efhd, efhd_signals[EFHD_ON_URL], 0, url); +} + +static void efhd_complete(EMFormat *emf) { EMFormatHTMLDisplay *efhd = (EMFormatHTMLDisplay *)emf; diff --git a/mail/em-format-html-display.h b/mail/em-format-html-display.h index cf78642112..1bf1b395d8 100644 --- a/mail/em-format-html-display.h +++ b/mail/em-format-html-display.h @@ -35,6 +35,8 @@ struct _EMFormatHTMLDisplayClass { void (*link_clicked)(EMFormatHTMLDisplay *efhd, const char *uri); /* a part or a link button pressed event */ int (*popup_event)(EMFormatHTMLDisplay *efhd, GdkEventButton *event, const char *uri, struct _CamelMimePart *part); + /* the mouse is over a link */ + void (*on_url)(EMFormatHTMLDisplay *efhd, const char *uri); }; GType em_format_html_display_get_type(void); diff --git a/mail/mail-component.c b/mail/mail-component.c index 442b17e9ac..a764e1b7c6 100644 --- a/mail/mail-component.c +++ b/mail/mail-component.c @@ -319,6 +319,13 @@ impl_finalize (GObject *object) (* G_OBJECT_CLASS (parent_class)->finalize) (object); } +static void +view_on_url (GObject *emitter, const char *url, const char *nice_url, MailComponent *mail_component) +{ + MailComponentPrivate *priv = mail_component->priv; + + e_activity_handler_set_message (priv->activity_handler, nice_url); +} /* Evolution::Component CORBA methods. */ @@ -342,6 +349,9 @@ impl_createControls (PortableServer_Servant servant, tree_widget = (GtkWidget *) em_folder_tree_new_with_model (priv->model); em_folder_tree_enable_drag_and_drop ((EMFolderTree *) tree_widget); em_format_set_session ((EMFormat *) ((EMFolderView *) view_widget)->preview, session); + + g_signal_connect (view_widget, "on-url", G_CALLBACK (view_on_url), mail_component); + em_folder_view_set_statusbar ((EMFolderView*)view_widget, FALSE); statusbar_widget = e_task_bar_new (); e_activity_handler_attach_task_bar (priv->activity_handler, E_TASK_BAR (statusbar_widget)); diff --git a/shell/ChangeLog b/shell/ChangeLog index 05c28b39e2..8567caf2ad 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,12 @@ +2004-01-05 ERDI Gergo <cactus@cactus.rulez.org> + + * e-task-bar.c (init): Create a separate label to the left of the + progress messages... + (e_task_bar_message): ...and allow components to set it... + + * e-activity-handler.c (e_activity_handler_message): ...through + this new ActivityHandler method + 2003-12-30 JP Rosevear <jpr@ximian.com> * e-setup.[hc]: these just handle creating the ~/evolution dir and diff --git a/shell/e-activity-handler.c b/shell/e-activity-handler.c index a6900edd93..d64bcd8f6e 100644 --- a/shell/e-activity-handler.c +++ b/shell/e-activity-handler.c @@ -279,6 +279,30 @@ e_activity_handler_new (void) return g_object_new (e_activity_handler_get_type (), 0); } +void +e_activity_handler_set_message (EActivityHandler *activity_handler, + const char *message) +{ + EActivityHandlerPrivate *priv; + GSList *i; + + priv = activity_handler->priv; + + for (i = priv->task_bars; i; i = i->next) + e_task_bar_set_message (E_TASK_BAR (i->data), message); +} + +void +e_activity_handler_unset_message (EActivityHandler *activity_handler) +{ + EActivityHandlerPrivate *priv; + GSList *i; + + priv = activity_handler->priv; + + for (i = priv->task_bars; i; i = i->next) + e_task_bar_unset_message (E_TASK_BAR (i->data)); +} void e_activity_handler_attach_task_bar (EActivityHandler *activity_handler, diff --git a/shell/e-activity-handler.h b/shell/e-activity-handler.h index 46826c8eb3..fca16f4753 100644 --- a/shell/e-activity-handler.h +++ b/shell/e-activity-handler.h @@ -63,6 +63,11 @@ EActivityHandler *e_activity_handler_new (void); void e_activity_handler_attach_task_bar (EActivityHandler *activity_hanlder, ETaskBar *task_bar); +void e_activity_handler_set_message (EActivityHandler *activity_handler, + const char *message); + +void e_activity_handler_unset_message (EActivityHandler *activity_handler); + guint e_activity_handler_operation_started (EActivityHandler *activity_handler, const char *component_id, GdkPixbuf *icon_pixbuf, diff --git a/shell/e-task-bar.c b/shell/e-task-bar.c index 522d473373..7a706fd290 100644 --- a/shell/e-task-bar.c +++ b/shell/e-task-bar.c @@ -27,8 +27,15 @@ #include "e-task-bar.h" #include <gal/util/e-util.h> +#include <gtk/gtklabel.h> +struct _ETaskBarPrivate +{ + GtkLabel *message_label; + GtkHBox *hbox; +}; + #define PARENT_TYPE gtk_hbox_get_type () static GtkHBoxClass *parent_class = NULL; @@ -46,7 +53,7 @@ reduce_displayed_activities_per_component (ETaskBar *task_bar) component_ids_hash = g_hash_table_new (g_str_hash, g_str_equal); - box = GTK_BOX (task_bar); + box = GTK_BOX (task_bar->priv->hbox); for (p = box->children; p != NULL; p = p->next) { GtkBoxChild *child; @@ -90,7 +97,22 @@ class_init (GtkObjectClass *object_class) static void init (ETaskBar *task_bar) { - /* Nothing to do here. */ + GtkWidget *label, *hbox; + + task_bar->priv = g_new (ETaskBarPrivate, 1); + + gtk_box_set_spacing (GTK_BOX (task_bar), 10); + + label = gtk_label_new (""); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (task_bar), label, FALSE, TRUE, 0); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + task_bar->priv->message_label = GTK_LABEL (label); + + hbox = gtk_hbox_new (0, FALSE); + gtk_widget_show (hbox); + gtk_container_add (GTK_CONTAINER (task_bar), hbox); + task_bar->priv->hbox = GTK_HBOX (hbox); } @@ -115,6 +137,24 @@ e_task_bar_new (void) } void +e_task_bar_set_message (ETaskBar *task_bar, + const char *message) +{ + if (message) { + gtk_widget_show (GTK_WIDGET (task_bar->priv->message_label)); + gtk_label_set_text (task_bar->priv->message_label, message); + } else { + e_task_bar_unset_message (task_bar); + } +} + +void +e_task_bar_unset_message (ETaskBar *task_bar) +{ + gtk_widget_hide (GTK_WIDGET (task_bar->priv->message_label)); +} + +void e_task_bar_prepend_task (ETaskBar *task_bar, ETaskWidget *task_widget) { @@ -135,11 +175,11 @@ e_task_bar_prepend_task (ETaskBar *task_bar, child_info->fill = TRUE; child_info->pack = GTK_PACK_START; - box = GTK_BOX (task_bar); + box = GTK_BOX (task_bar->priv->hbox); box->children = g_list_prepend (box->children, child_info); - gtk_widget_set_parent (GTK_WIDGET (task_widget), GTK_WIDGET (task_bar)); + gtk_widget_set_parent (GTK_WIDGET (task_widget), GTK_WIDGET (task_bar->priv->hbox)); if (GTK_WIDGET_REALIZED (task_bar)) gtk_widget_realize (GTK_WIDGET (task_widget)); @@ -178,7 +218,7 @@ e_task_bar_get_task_widget (ETaskBar *task_bar, g_return_val_if_fail (task_bar != NULL, NULL); g_return_val_if_fail (E_IS_TASK_BAR (task_bar), NULL); - child_info = (GtkBoxChild *) g_list_nth (GTK_BOX (task_bar)->children, n)->data; + child_info = (GtkBoxChild *) g_list_nth (GTK_BOX (task_bar->priv->hbox)->children, n)->data; return E_TASK_WIDGET (child_info->widget); } diff --git a/shell/e-task-bar.h b/shell/e-task-bar.h index c20ca1871c..e91e5fab65 100644 --- a/shell/e-task-bar.h +++ b/shell/e-task-bar.h @@ -44,7 +44,9 @@ typedef struct _ETaskBarPrivate ETaskBarPrivate; typedef struct _ETaskBarClass ETaskBarClass; struct _ETaskBar { - GtkHBox parent; + GtkHBox parent; + + ETaskBarPrivate *priv; }; struct _ETaskBarClass { @@ -56,6 +58,10 @@ GtkType e_task_bar_get_type (void); void e_task_bar_construct (ETaskBar *task_bar); GtkWidget *e_task_bar_new (void); +void e_task_bar_set_message (ETaskBar *task_bar, + const char *message); +void e_task_bar_unset_message (ETaskBar *task_bar); + void e_task_bar_prepend_task (ETaskBar *task_bar, ETaskWidget *task_widget); void e_task_bar_remove_task (ETaskBar *task_bar, |