From ff9fcffeca2bdc37a91e0c2f0cb51f871a3cd7a1 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 24 May 2011 11:02:59 -0400 Subject: EMFolderTree: Add an EAlertSink property. Now EMFolderTree has access to both an EShellBackend and an EAlertSink; everything it needs to build and submit EActivity instances. --- mail/e-mail-sidebar.c | 8 +++-- mail/e-mail-sidebar.h | 3 +- mail/em-folder-selector.c | 10 ++++-- mail/em-folder-tree.c | 61 +++++++++++++++++++++++++++++++++++-- mail/em-folder-tree.h | 5 ++- modules/mail/e-mail-shell-sidebar.c | 4 ++- shell/e-shell-sidebar.c | 32 +++++++++++++++++++ 7 files changed, 112 insertions(+), 11 deletions(-) diff --git a/mail/e-mail-sidebar.c b/mail/e-mail-sidebar.c index 80043f035a..45d16a8be1 100644 --- a/mail/e-mail-sidebar.c +++ b/mail/e-mail-sidebar.c @@ -473,12 +473,16 @@ e_mail_sidebar_get_type (void) } GtkWidget * -e_mail_sidebar_new (EMailBackend *backend) +e_mail_sidebar_new (EMailBackend *backend, + EAlertSink *alert_sink) { g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); + g_return_val_if_fail (E_IS_ALERT_SINK (alert_sink), NULL); return g_object_new ( - E_TYPE_MAIL_SIDEBAR, "backend", backend, NULL); + E_TYPE_MAIL_SIDEBAR, + "alert-sink", alert_sink, + "backend", backend, NULL); } GKeyFile * diff --git a/mail/e-mail-sidebar.h b/mail/e-mail-sidebar.h index 8941c99746..84d8183c10 100644 --- a/mail/e-mail-sidebar.h +++ b/mail/e-mail-sidebar.h @@ -76,7 +76,8 @@ struct _EMailSidebarClass { }; GType e_mail_sidebar_get_type (void); -GtkWidget * e_mail_sidebar_new (EMailBackend *backend); +GtkWidget * e_mail_sidebar_new (EMailBackend *backend, + EAlertSink *alert_sink); GKeyFile * e_mail_sidebar_get_key_file (EMailSidebar *sidebar); void e_mail_sidebar_set_key_file (EMailSidebar *sidebar, GKeyFile *key_file); diff --git a/mail/em-folder-selector.c b/mail/em-folder-selector.c index 24f619d78d..2ac1d066fc 100644 --- a/mail/em-folder-selector.c +++ b/mail/em-folder-selector.c @@ -47,10 +47,14 @@ enum { PROP_BACKEND }; -G_DEFINE_TYPE ( +/* XXX EMFolderSelector is an EAlertSink, but it just uses the default + * message dialog implementation. We should do something nicer. */ + +G_DEFINE_TYPE_WITH_CODE ( EMFolderSelector, em_folder_selector, - GTK_TYPE_DIALOG) + GTK_TYPE_DIALOG, + G_IMPLEMENT_INTERFACE (E_TYPE_ALERT_SINK, NULL)) static void folder_selector_set_backend (EMFolderSelector *emfs, @@ -286,7 +290,7 @@ folder_selector_construct (EMFolderSelector *emfs, container = widget; - widget = em_folder_tree_new (backend); + widget = em_folder_tree_new (backend, E_ALERT_SINK (emfs)); emu_restore_folder_tree_state (EM_FOLDER_TREE (widget)); gtk_container_add (GTK_CONTAINER (widget), widget); emfs->priv->folder_tree = EM_FOLDER_TREE (widget); diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index 613f10dc05..8d856c12e5 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -78,6 +78,7 @@ struct _selected_uri { struct _EMFolderTreePrivate { EMailBackend *backend; + EAlertSink *alert_sink; /* selected_uri structures of each path pending selection. */ GSList *select_uris; @@ -119,6 +120,7 @@ struct _EMFolderTreePrivate { enum { PROP_0, + PROP_ALERT_SINK, PROP_BACKEND, PROP_COPY_TARGET_LIST, PROP_ELLIPSIZE, @@ -718,6 +720,16 @@ exit: g_list_free (list); } +static void +folder_tree_set_alert_sink (EMFolderTree *folder_tree, + EAlertSink *alert_sink) +{ + g_return_if_fail (E_IS_ALERT_SINK (alert_sink)); + g_return_if_fail (folder_tree->priv->alert_sink == NULL); + + folder_tree->priv->alert_sink = g_object_ref (alert_sink); +} + static void folder_tree_set_backend (EMFolderTree *folder_tree, EMailBackend *backend) @@ -765,6 +777,12 @@ folder_tree_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { + case PROP_ALERT_SINK: + folder_tree_set_alert_sink ( + EM_FOLDER_TREE (object), + g_value_get_object (value)); + return; + case PROP_BACKEND: folder_tree_set_backend ( EM_FOLDER_TREE (object), @@ -788,6 +806,13 @@ folder_tree_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { + case PROP_ALERT_SINK: + g_value_set_object ( + value, + em_folder_tree_get_alert_sink ( + EM_FOLDER_TREE (object))); + return; + case PROP_BACKEND: g_value_set_object ( value, @@ -847,6 +872,11 @@ folder_tree_dispose (GObject *object) priv->autoexpand_id = 0; } + if (priv->alert_sink != NULL) { + g_object_unref (priv->alert_sink); + priv->alert_sink = NULL; + } + if (priv->backend != NULL) { g_object_unref (priv->backend); priv->backend = NULL; @@ -1105,6 +1135,18 @@ folder_tree_class_init (EMFolderTreeClass *class) tree_view_class->test_collapse_row = folder_tree_test_collapse_row; tree_view_class->row_expanded = folder_tree_row_expanded; + g_object_class_install_property ( + object_class, + PROP_ALERT_SINK, + g_param_spec_object ( + "alert-sink", + NULL, + NULL, + E_TYPE_ALERT_SINK, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property ( object_class, PROP_BACKEND, @@ -1114,7 +1156,8 @@ folder_tree_class_init (EMFolderTreeClass *class) NULL, E_TYPE_MAIL_BACKEND, G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); /* Inherited from ESelectableInterface */ g_object_class_override_property ( @@ -1704,12 +1747,14 @@ em_folder_tree_get_type (void) } GtkWidget * -em_folder_tree_new (EMailBackend *backend) +em_folder_tree_new (EMailBackend *backend, + EAlertSink *alert_sink) { EMailSession *session; const gchar *data_dir; g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); + g_return_val_if_fail (E_IS_ALERT_SINK (alert_sink), NULL); session = e_mail_backend_get_session (backend); data_dir = e_shell_backend_get_data_dir (E_SHELL_BACKEND (backend)); @@ -1717,7 +1762,9 @@ em_folder_tree_new (EMailBackend *backend) e_mail_store_init (session, data_dir); return g_object_new ( - EM_TYPE_FOLDER_TREE, "backend", backend, NULL); + EM_TYPE_FOLDER_TREE, + "alert-sink", alert_sink, + "backend", backend, NULL); } PangoEllipsizeMode @@ -1742,6 +1789,14 @@ em_folder_tree_set_ellipsize (EMFolderTree *folder_tree, g_object_notify (G_OBJECT (folder_tree), "ellipsize"); } +EAlertSink * +em_folder_tree_get_alert_sink (EMFolderTree *folder_tree) +{ + g_return_val_if_fail (EM_IS_FOLDER_TREE (folder_tree), NULL); + + return folder_tree->priv->alert_sink; +} + EMailBackend * em_folder_tree_get_backend (EMFolderTree *folder_tree) { diff --git a/mail/em-folder-tree.h b/mail/em-folder-tree.h index 9b94fe77c4..d2cd643d37 100644 --- a/mail/em-folder-tree.h +++ b/mail/em-folder-tree.h @@ -25,6 +25,7 @@ #define EM_FOLDER_TREE_H #include +#include #include #include @@ -89,11 +90,13 @@ struct _EMFolderTreeClass { }; GType em_folder_tree_get_type (void); -GtkWidget * em_folder_tree_new (EMailBackend *backend); +GtkWidget * em_folder_tree_new (EMailBackend *backend, + EAlertSink *alert_sink); PangoEllipsizeMode em_folder_tree_get_ellipsize (EMFolderTree *folder_tree); void em_folder_tree_set_ellipsize (EMFolderTree *folder_tree, PangoEllipsizeMode ellipsize); +EAlertSink * em_folder_tree_get_alert_sink (EMFolderTree *folder_tree); EMailBackend * em_folder_tree_get_backend (EMFolderTree *folder_tree); void em_folder_tree_enable_drag_and_drop (EMFolderTree *folder_tree); diff --git a/modules/mail/e-mail-shell-sidebar.c b/modules/mail/e-mail-shell-sidebar.c index 760ebb0b2e..643bc6389c 100644 --- a/modules/mail/e-mail-shell-sidebar.c +++ b/modules/mail/e-mail-shell-sidebar.c @@ -149,7 +149,9 @@ mail_shell_sidebar_constructed (GObject *object) container = widget; - widget = e_mail_sidebar_new (E_MAIL_BACKEND (shell_backend)); + widget = e_mail_sidebar_new ( + E_MAIL_BACKEND (shell_backend), + E_ALERT_SINK (shell_sidebar)); gtk_container_add (GTK_CONTAINER (container), widget); mail_shell_sidebar->priv->folder_tree = g_object_ref (widget); gtk_widget_show (widget); diff --git a/shell/e-shell-sidebar.c b/shell/e-shell-sidebar.c index d99e66ac61..b72a210300 100644 --- a/shell/e-shell-sidebar.c +++ b/shell/e-shell-sidebar.c @@ -27,6 +27,7 @@ #include "e-shell-sidebar.h" +#include #include #include #include @@ -50,10 +51,16 @@ enum { PROP_SHELL_VIEW }; +/* Forward Declarations */ +static void e_shell_sidebar_alert_sink_init + (EAlertSinkInterface *interface); + G_DEFINE_TYPE_WITH_CODE ( EShellSidebar, e_shell_sidebar, GTK_TYPE_BIN, + G_IMPLEMENT_INTERFACE ( + E_TYPE_ALERT_SINK, e_shell_sidebar_alert_sink_init) G_IMPLEMENT_INTERFACE ( E_TYPE_EXTENSIBLE, NULL)) @@ -299,6 +306,25 @@ shell_sidebar_forall (GtkContainer *container, container, include_internals, callback, callback_data); } +static void +shell_sidebar_submit_alert (EAlertSink *alert_sink, + EAlert *alert) +{ + EShellView *shell_view; + EShellContent *shell_content; + EShellSidebar *shell_sidebar; + + /* EShellSidebar is a proxy alert sink. Forward the alert + * to the EShellContent widget for display to the user. */ + + shell_sidebar = E_SHELL_SIDEBAR (alert_sink); + shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); + shell_content = e_shell_view_get_shell_content (shell_view); + + alert_sink = E_ALERT_SINK (shell_content); + e_alert_sink_submit_alert (alert_sink, alert); +} + static void e_shell_sidebar_class_init (EShellSidebarClass *class) { @@ -386,6 +412,12 @@ e_shell_sidebar_class_init (EShellSidebarClass *class) G_PARAM_CONSTRUCT_ONLY)); } +static void +e_shell_sidebar_alert_sink_init (EAlertSinkInterface *interface) +{ + interface->submit_alert = shell_sidebar_submit_alert; +} + static void e_shell_sidebar_init (EShellSidebar *shell_sidebar) { -- cgit v1.2.3