diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2010-10-16 02:51:13 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2010-10-19 00:32:36 +0800 |
commit | 51ebf20237270a785af0aa0e614db42275a05c62 (patch) | |
tree | 328b2fe9b7aa111f0cb21f23b11bc2eaf6da3ac8 /shell | |
parent | 2197e6401ec8c5e1b77fa51e085ac068daa39e6a (diff) | |
download | gsoc2013-evolution-51ebf20237270a785af0aa0e614db42275a05c62.tar.gz gsoc2013-evolution-51ebf20237270a785af0aa0e614db42275a05c62.tar.zst gsoc2013-evolution-51ebf20237270a785af0aa0e614db42275a05c62.zip |
EAlert: Allow arbitrary actions to be added.
You can now amend the predefined actions in an EAlert by calling
e_alert_add_action(). Useful for adding actions from an existing
GtkUIManager.
Call e_alert_peek_actions() to obtain a combined list of predefined
and custom actions. These will typically serve as "related" actions
for GtkButtons (cf. gtk_activatable_set_related_action()).
Also, both EShellWindow and EShellView now implement EAlertSink. Use
EShellWindow for application-wide alerts, EShellView for view-specific
alerts.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/e-shell-content.c | 34 | ||||
-rw-r--r-- | shell/e-shell-content.h | 3 | ||||
-rw-r--r-- | shell/e-shell-window-actions.c | 2 | ||||
-rw-r--r-- | shell/e-shell-window-private.c | 7 | ||||
-rw-r--r-- | shell/e-shell-window-private.h | 8 | ||||
-rw-r--r-- | shell/e-shell-window.c | 110 | ||||
-rw-r--r-- | shell/e-shell-window.h | 1 |
7 files changed, 130 insertions, 35 deletions
diff --git a/shell/e-shell-content.c b/shell/e-shell-content.c index 2648783831..afd69ffdfa 100644 --- a/shell/e-shell-content.c +++ b/shell/e-shell-content.c @@ -36,6 +36,7 @@ #include "e-util/e-alert-dialog.h" #include "filter/e-rule-editor.h" #include "widgets/misc/e-action-combo-box.h" +#include "widgets/misc/e-alert-bar.h" #include "widgets/misc/e-hinted-entry.h" #include "e-shell-backend.h" @@ -244,29 +245,35 @@ shell_content_size_allocate (GtkWidget *widget, GtkAllocation child_allocation; GtkRequisition child_requisition; GtkWidget *child; + gint remaining_height; priv = E_SHELL_CONTENT_GET_PRIVATE (widget); + remaining_height = allocation->height; gtk_widget_set_allocation (widget, allocation); child_allocation.x = allocation->x; + child_allocation.y = allocation->y; child_allocation.width = allocation->width; - /* Alert bar gets to be as tall as it wants. */ + child_requisition.height = 0; + + /* Alert bar gets to be as tall as it wants (if visible). */ child = priv->alert_bar; - child_allocation.y = allocation->y; + child_allocation.y += child_requisition.height; if (gtk_widget_get_visible (child)) gtk_widget_size_request (child, &child_requisition); else child_requisition.height = 0; + remaining_height -= child_requisition.height; child_allocation.height = child_requisition.height; gtk_widget_size_allocate (child, &child_allocation); - /* So does the search bar (if we have one). */ + /* Search bar gets to be as tall as it wants (if we have one). */ child = priv->searchbar; child_allocation.y += child_requisition.height; @@ -276,6 +283,7 @@ shell_content_size_allocate (GtkWidget *widget, else child_requisition.height = 0; + remaining_height -= child_requisition.height; child_allocation.height = child_requisition.height; if (child != NULL) @@ -284,8 +292,7 @@ shell_content_size_allocate (GtkWidget *widget, /* The GtkBin child gets whatever vertical space is left. */ child_allocation.y += child_requisition.height; - child_allocation.height = - allocation->height - child_requisition.height; + child_allocation.height = remaining_height; child = gtk_bin_get_child (GTK_BIN (widget)); if (child != NULL) @@ -346,9 +353,8 @@ shell_content_submit_alert (EAlertSink *alert_sink, EShellView *shell_view; EShellWindow *shell_window; EShellContent *shell_content; - EAlertBar *alert_bar; + GtkWidget *alert_bar; GtkWidget *dialog; - GtkWindow *parent; shell_content = E_SHELL_CONTENT (alert_sink); shell_view = e_shell_content_get_shell_view (shell_content); @@ -359,12 +365,13 @@ shell_content_submit_alert (EAlertSink *alert_sink, case GTK_MESSAGE_INFO: case GTK_MESSAGE_WARNING: case GTK_MESSAGE_ERROR: - e_alert_bar_add_alert (alert_bar, alert); + e_alert_bar_add_alert ( + E_ALERT_BAR (alert_bar), alert); break; default: - parent = GTK_WINDOW (shell_window); - dialog = e_alert_dialog_new (parent, alert); + dialog = e_alert_dialog_new ( + GTK_WINDOW (shell_window), alert); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); break; @@ -395,7 +402,8 @@ e_shell_content_class_init (EShellContentClass *class) container_class->remove = shell_content_remove; container_class->forall = shell_content_forall; - /* EShellContent:alert-bar + /** + * EShellContent:alert-bar * * Displays informational and error messages. **/ @@ -543,12 +551,12 @@ e_shell_content_focus_search_results (EShellContent *shell_content) * * Returns: the #EAlertBar for @shell_content **/ -EAlertBar * +GtkWidget * e_shell_content_get_alert_bar (EShellContent *shell_content) { g_return_val_if_fail (E_IS_SHELL_CONTENT (shell_content), NULL); - return E_ALERT_BAR (shell_content->priv->alert_bar); + return shell_content->priv->alert_bar; } /** diff --git a/shell/e-shell-content.h b/shell/e-shell-content.h index 099c841655..58c20e38ad 100644 --- a/shell/e-shell-content.h +++ b/shell/e-shell-content.h @@ -22,7 +22,6 @@ #ifndef E_SHELL_CONTENT_H #define E_SHELL_CONTENT_H -#include <misc/e-alert-bar.h> #include <shell/e-shell-common.h> /* Standard GObject macros */ @@ -79,7 +78,7 @@ void e_shell_content_set_searchbar (EShellContent *shell_content, guint32 e_shell_content_check_state (EShellContent *shell_content); void e_shell_content_focus_search_results (EShellContent *shell_content); -EAlertBar * e_shell_content_get_alert_bar (EShellContent *shell_content); +GtkWidget * e_shell_content_get_alert_bar (EShellContent *shell_content); struct _EShellView * e_shell_content_get_shell_view (EShellContent *shell_content); const gchar * e_shell_content_get_view_id (EShellContent *shell_content); diff --git a/shell/e-shell-window-actions.c b/shell/e-shell-window-actions.c index 740adcc9f7..a77bd35e97 100644 --- a/shell/e-shell-window-actions.c +++ b/shell/e-shell-window-actions.c @@ -22,9 +22,7 @@ #include "e-shell-window-private.h" #include "e-preferences-window.h" -#include <e-util/e-util-private.h> #include <e-util/e-dialog-utils.h> -#include <e-util/e-alert-dialog.h> #include <e-util/e-print.h> #include <gal-define-views-dialog.h> diff --git a/shell/e-shell-window-private.c b/shell/e-shell-window-private.c index 5c4e1217ca..dee6450bcd 100644 --- a/shell/e-shell-window-private.c +++ b/shell/e-shell-window-private.c @@ -289,10 +289,6 @@ e_shell_window_private_constructed (EShellWindow *shell_window) e_shell_window_actions_init (shell_window); - /* Do this after intializing actions because it - * triggers shell_window_update_close_action_cb(). */ - e_shell_watch_window (shell, window); - accel_group = gtk_ui_manager_get_accel_group (ui_manager); gtk_window_add_accel_group (GTK_WINDOW (shell_window), accel_group); @@ -481,6 +477,8 @@ e_shell_window_private_constructed (EShellWindow *shell_window) id = "org.gnome.evolution.shell"; e_plugin_ui_register_manager (ui_manager, id, shell_window); e_plugin_ui_enable_manager (ui_manager, id); + + e_shell_watch_window (shell, window); } void @@ -514,6 +512,7 @@ e_shell_window_private_dispose (EShellWindow *shell_window) g_hash_table_remove_all (priv->loaded_views); + DISPOSE (priv->alert_bar); DISPOSE (priv->content_pane); DISPOSE (priv->content_notebook); DISPOSE (priv->sidebar_notebook); diff --git a/shell/e-shell-window-private.h b/shell/e-shell-window-private.h index 960fc74773..79f15acb68 100644 --- a/shell/e-shell-window-private.h +++ b/shell/e-shell-window-private.h @@ -27,9 +27,16 @@ #include <string.h> #include <glib/gi18n.h> +#include <gconf/gconf-client.h> + #include <e-util/e-util.h> +#include <e-util/e-util-private.h> +#include <e-util/e-alert-dialog.h> +#include <e-util/e-alert-sink.h> +#include <e-util/e-extensible.h> #include <e-util/e-plugin-ui.h> #include <e-util/gconf-bridge.h> +#include <widgets/misc/e-alert-bar.h> #include <widgets/misc/e-import-assistant.h> #include <widgets/misc/e-menu-tool-button.h> #include <widgets/misc/e-online-button.h> @@ -87,6 +94,7 @@ struct _EShellWindowPrivate { /*** Widgetry ***/ + GtkWidget *alert_bar; GtkWidget *content_pane; GtkWidget *content_notebook; GtkWidget *sidebar_notebook; diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c index 7704fb5e71..4f4e5c1b82 100644 --- a/shell/e-shell-window.c +++ b/shell/e-shell-window.c @@ -27,15 +27,10 @@ #include "e-shell-window-private.h" -#include <gconf/gconf-client.h> - -#include <e-util/e-extensible.h> -#include <e-util/e-plugin-ui.h> -#include <e-util/e-util-private.h> - enum { PROP_0, PROP_ACTIVE_VIEW, + PROP_ALERT_BAR, PROP_FOCUS_TRACKER, PROP_GEOMETRY, PROP_SAFE_MODE, @@ -54,11 +49,17 @@ enum { static gulong signals[LAST_SIGNAL]; +/* Forward Declarations */ +static void e_shell_window_alert_sink_init + (EAlertSinkInterface *interface); + G_DEFINE_TYPE_WITH_CODE ( EShellWindow, e_shell_window, GTK_TYPE_WINDOW, G_IMPLEMENT_INTERFACE ( + E_TYPE_ALERT_SINK, e_shell_window_alert_sink_init) + G_IMPLEMENT_INTERFACE ( E_TYPE_EXTENSIBLE, NULL)) static void @@ -254,6 +255,12 @@ shell_window_get_property (GObject *object, E_SHELL_WINDOW (object))); return; + case PROP_ALERT_BAR: + g_value_set_object ( + value, e_shell_window_get_alert_bar ( + E_SHELL_WINDOW (object))); + return; + case PROP_FOCUS_TRACKER: g_value_set_object ( value, e_shell_window_get_focus_tracker ( @@ -492,19 +499,29 @@ shell_window_construct_sidebar (EShellWindow *shell_window) static GtkWidget * shell_window_construct_content (EShellWindow *shell_window) { - GtkWidget *notebook; + GtkWidget *box; + GtkWidget *widget; - notebook = gtk_notebook_new (); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE); - gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE); - shell_window->priv->content_notebook = g_object_ref_sink (notebook); - gtk_widget_show (notebook); + box = gtk_vbox_new (FALSE, 0); + gtk_widget_show (box); + + widget = e_alert_bar_new (); + gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0); + shell_window->priv->alert_bar = g_object_ref (widget); + /* EAlertBar controls its own visibility. */ + + widget = gtk_notebook_new (); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE); + gtk_notebook_set_show_border (GTK_NOTEBOOK (widget), FALSE); + gtk_box_pack_start (GTK_BOX (box), widget, TRUE, TRUE, 0); + shell_window->priv->content_notebook = g_object_ref (widget); + gtk_widget_show (widget); g_signal_connect ( shell_window, "notify::active-view", - G_CALLBACK (shell_window_set_notebook_page), notebook); + G_CALLBACK (shell_window_set_notebook_page), widget); - return notebook; + return box; } static GtkWidget * @@ -676,6 +693,34 @@ shell_window_realize (GtkWidget *widget) } static void +shell_window_submit_alert (EAlertSink *alert_sink, + EAlert *alert) +{ + EShellWindow *shell_window; + GtkWidget *alert_bar; + GtkWidget *dialog; + + shell_window = E_SHELL_WINDOW (alert_sink); + alert_bar = e_shell_window_get_alert_bar (shell_window); + + switch (e_alert_get_message_type (alert)) { + case GTK_MESSAGE_INFO: + case GTK_MESSAGE_WARNING: + case GTK_MESSAGE_ERROR: + e_alert_bar_add_alert ( + E_ALERT_BAR (alert_bar), alert); + break; + + default: + dialog = e_alert_dialog_new ( + GTK_WINDOW (shell_window), alert); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + break; + } +} + +static void e_shell_window_class_init (EShellWindowClass *class) { GObjectClass *object_class; @@ -716,6 +761,21 @@ e_shell_window_class_init (EShellWindowClass *class) G_PARAM_READWRITE)); /** + * EShellWindow:alert-bar + * + * Displays informational and error messages. + **/ + g_object_class_install_property ( + object_class, + PROP_ALERT_BAR, + g_param_spec_object ( + "alert-bar", + "Alert Bar", + "Displays informational and error messages", + E_TYPE_ALERT_BAR, + G_PARAM_READABLE)); + + /** * EShellWindow:focus-tracker * * The shell window's #EFocusTracker. @@ -876,6 +936,12 @@ e_shell_window_class_init (EShellWindowClass *class) } static void +e_shell_window_alert_sink_init (EAlertSinkInterface *interface) +{ + interface->submit_alert = shell_window_submit_alert; +} + +static void e_shell_window_init (EShellWindow *shell_window) { shell_window->priv = E_SHELL_WINDOW_GET_PRIVATE (shell_window); @@ -1036,6 +1102,22 @@ e_shell_window_get_shell_view_action (EShellWindow *shell_window, } /** + * e_shell_window_get_alert_bar: + * @shell_window: an #EShellWindow + * + * Returns the #EAlertBar used to display informational and error messages. + * + * Returns: the #EAlertBar for @shell_window + **/ +GtkWidget * +e_shell_window_get_alert_bar (EShellWindow *shell_window) +{ + g_return_val_if_fail (E_IS_SHELL_WINDOW (shell_window), NULL); + + return shell_window->priv->alert_bar; +} + +/** * e_shell_window_get_focus_tracker: * @shell_window: an #EShellWindow * diff --git a/shell/e-shell-window.h b/shell/e-shell-window.h index 8e29093ed7..25e039a0ab 100644 --- a/shell/e-shell-window.h +++ b/shell/e-shell-window.h @@ -96,6 +96,7 @@ struct _EShellView * GtkAction * e_shell_window_get_shell_view_action (EShellWindow *shell_window, const gchar *view_name); +GtkWidget * e_shell_window_get_alert_bar (EShellWindow *shell_window); EFocusTracker * e_shell_window_get_focus_tracker (EShellWindow *shell_window); GtkUIManager * e_shell_window_get_ui_manager (EShellWindow *shell_window); |