On Tue, 6 Jan 2004, Not Zed wrote:

> Sure, why not?  Why is it any different to preview_active?

whatever you say... (I still think it's stupid to actively _remove_
encapsulation).

Index: mail/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
retrieving revision 1.2965
diff -u -r1.2965 ChangeLog
--- mail/ChangeLog      4 Jan 2004 19:18:19 -0000       1.2965
+++ mail/ChangeLog      6 Jan 2004 12:42:47 -0000
@@ -1,3 +1,18 @@
+2004-01-04  ERDI Gergo  <[EMAIL PROTECTED]>
+
+       * 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  <[EMAIL PROTECTED]>
 
        * em-format-html-display.c: Mail warning grammar typo fix.
Index: mail/em-folder-view.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-folder-view.c,v
retrieving revision 1.19
diff -u -r1.19 em-folder-view.c
--- mail/em-folder-view.c       11 Dec 2003 04:56:12 -0000      1.19
+++ mail/em-folder-view.c       6 Jan 2004 12:42:54 -0000
@@ -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 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 @@
 
 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 @@
 
        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->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 @@
        ((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 @@
                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 @@
        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, 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 == 0 */
+                       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 = 0;
+
+       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);
+}
Index: mail/em-folder-view.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-folder-view.h,v
retrieving revision 1.3
diff -u -r1.3 em-folder-view.h
--- mail/em-folder-view.h       19 Sep 2003 18:54:09 -0000      1.3
+++ mail/em-folder-view.h       6 Jan 2004 12:42:55 -0000
@@ -78,6 +78,7 @@
        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 @@
        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 @@
 /* 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 */
Index: mail/em-format-html-display.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-format-html-display.c,v
retrieving revision 1.16
diff -u -r1.16 em-format-html-display.c
--- mail/em-format-html-display.c       4 Jan 2004 19:18:20 -0000       1.16
+++ mail/em-format-html-display.c       6 Jan 2004 12:42:59 -0000
@@ -105,6 +105,7 @@
 
 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;
@@ -135,6 +136,7 @@
 enum {
        EFHD_LINK_CLICKED,
        EFHD_POPUP_EVENT,
+       EFHD_ON_URL,
        EFHD_LAST_SIGNAL,
 };
 
@@ -283,6 +285,16 @@
                             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);
 }
 
@@ -315,6 +327,7 @@
 
        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;
@@ -584,6 +597,13 @@
 }
 
 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;
Index: mail/em-format-html-display.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-format-html-display.h,v
retrieving revision 1.2
diff -u -r1.2 em-format-html-display.h
--- mail/em-format-html-display.h       17 Sep 2003 21:19:02 -0000      1.2
+++ mail/em-format-html-display.h       6 Jan 2004 12:42:59 -0000
@@ -35,6 +35,8 @@
        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);
Index: mail/mail-component.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-component.c,v
retrieving revision 1.36
diff -u -r1.36 mail-component.c
--- mail/mail-component.c       10 Dec 2003 20:54:21 -0000      1.36
+++ mail/mail-component.c       6 Jan 2004 12:43:02 -0000
@@ -319,6 +319,13 @@
        (* 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 @@
        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));
Index: shell/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/shell/ChangeLog,v
retrieving revision 1.1361
diff -u -r1.1361 ChangeLog
--- shell/ChangeLog     30 Dec 2003 15:09:35 -0000      1.1361
+++ shell/ChangeLog     6 Jan 2004 12:43:07 -0000
@@ -1,3 +1,12 @@
+2004-01-05  ERDI Gergo  <[EMAIL PROTECTED]>
+
+       * 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 <[EMAIL PROTECTED]>
 
        * e-setup.[hc]: these just handle creating the ~/evolution dir and
Index: shell/e-activity-handler.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-activity-handler.c,v
retrieving revision 1.34
diff -u -r1.34 e-activity-handler.c
--- shell/e-activity-handler.c  3 Dec 2003 17:59:27 -0000       1.34
+++ shell/e-activity-handler.c  6 Jan 2004 12:43:08 -0000
@@ -279,6 +279,30 @@
        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,
Index: shell/e-activity-handler.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-activity-handler.h,v
retrieving revision 1.8
diff -u -r1.8 e-activity-handler.h
--- shell/e-activity-handler.h  2 Dec 2003 03:41:33 -0000       1.8
+++ shell/e-activity-handler.h  6 Jan 2004 12:43:08 -0000
@@ -63,6 +63,11 @@
 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,
Index: shell/e-task-bar.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-task-bar.c,v
retrieving revision 1.9
diff -u -r1.9 e-task-bar.c
--- shell/e-task-bar.c  2 Dec 2002 03:23:57 -0000       1.9
+++ shell/e-task-bar.c  6 Jan 2004 12:43:09 -0000
@@ -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 @@
 
        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 @@
 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 @@
 }
 
 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 @@
        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 @@
        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);
 }
Index: shell/e-task-bar.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-task-bar.h,v
retrieving revision 1.3
diff -u -r1.3 e-task-bar.h
--- shell/e-task-bar.h  27 Oct 2001 01:09:28 -0000      1.3
+++ shell/e-task-bar.h  6 Jan 2004 12:43:10 -0000
@@ -44,7 +44,9 @@
 typedef struct _ETaskBarClass   ETaskBarClass;
 
 struct _ETaskBar {
-       GtkHBox parent;
+       GtkHBox          parent;
+       
+       ETaskBarPrivate *priv;
 };
 
 struct _ETaskBarClass {
@@ -56,6 +58,10 @@
 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,

-- 
   .--= ULLA! =---------------------.   `We are not here to give users what
   \     http://cactus.rulez.org     \   they want'  -- RMS, at GUADEC 2001
    `---= [EMAIL PROTECTED] =---'
Gendo : Rei, you're a nude girl in a test tube. I like that.


_______________________________________________
evolution-hackers maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/evolution-hackers

Reply via email to