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.
This commit is contained in:
Matthew Barnes
2011-05-24 11:02:59 -04:00
parent c6d8a03039
commit ff9fcffeca
7 changed files with 112 additions and 11 deletions

View File

@ -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 *

View File

@ -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);

View File

@ -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);

View File

@ -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)
{

View File

@ -25,6 +25,7 @@
#define EM_FOLDER_TREE_H
#include <gtk/gtk.h>
#include <e-util/e-alert-sink.h>
#include <mail/e-mail-backend.h>
#include <mail/em-folder-tree-model.h>
@ -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);

View File

@ -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);

View File

@ -27,6 +27,7 @@
#include "e-shell-sidebar.h"
#include <e-util/e-alert-sink.h>
#include <e-util/e-extensible.h>
#include <e-util/e-unicode.h>
#include <shell/e-shell-view.h>
@ -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)
{