From 2ef1b5bf42b5d429e00f94710458f237d18315b2 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 24 Aug 2008 13:17:11 +0000 Subject: Progress update: - Get the "New" button and menu working. - Add a GtkMenuToolButton subclass called EMenuToolButton, which does some behind-the-scenes stuff to make the "New" button work properly. - Kill EComboButton and its associated a11y widget. svn path=/branches/kill-bonobo/; revision=36045 --- shell/e-shell-window-actions.c | 149 ++++++++++++++++++++------------------- shell/e-shell-window-private.c | 104 +++++++++++++++++++-------- shell/e-shell-window-private.h | 38 +++++----- shell/e-shell-window.c | 76 +++++++++++++++----- shell/e-shell-window.h | 2 +- shell/e-shell.c | 36 +++++----- shell/e-shell.h | 13 +--- shell/main.c | 21 ++---- shell/test/e-test-shell-module.c | 48 +++++++++++++ 9 files changed, 304 insertions(+), 183 deletions(-) (limited to 'shell') diff --git a/shell/e-shell-window-actions.c b/shell/e-shell-window-actions.c index bc1fcea27b..24588b4931 100644 --- a/shell/e-shell-window-actions.c +++ b/shell/e-shell-window-actions.c @@ -20,14 +20,16 @@ #include "e-shell-window-private.h" -#include "e-shell.h" -#include "e-shell-importer.h" +#include -#include "e-util/e-dialog-utils.h" -#include "e-util/e-error.h" -#include "e-util/e-print.h" +#include +#include + +#include +#include +#include +#include -#include #include #define EVOLUTION_COPYRIGHT \ @@ -626,7 +628,7 @@ static const gchar *documenters[] = { static void action_about_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { gchar *translator_credits; @@ -638,7 +640,7 @@ action_about_cb (GtkAction *action, translator_credits = NULL; gtk_show_about_dialog ( - GTK_WINDOW (window), + GTK_WINDOW (shell_window), "program-name", "Evolution", "version", VERSION, "copyright", EVOLUTION_COPYRIGHT, @@ -654,9 +656,9 @@ action_about_cb (GtkAction *action, static void action_close_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { - GtkWidget *widget = GTK_WIDGET (window); + GtkWidget *widget = GTK_WIDGET (shell_window); GdkEvent *event; /* Synthesize a delete_event on this window. */ @@ -669,14 +671,14 @@ action_close_cb (GtkAction *action, static void action_contents_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { - /* FIXME Unfinished. */ + e_display_help (GTK_WINDOW (shell_window), NULL); } static void action_faq_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { GError *error = NULL; @@ -691,12 +693,12 @@ action_faq_cb (GtkAction *action, static void action_forget_passwords_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { gint response; response = e_error_run ( - GTK_WINDOW (window), "shell:forget-passwords", NULL); + GTK_WINDOW (shell_window), "shell:forget-passwords", NULL); if (response == GTK_RESPONSE_OK) e_passwords_forget_passwords (); @@ -704,31 +706,31 @@ action_forget_passwords_cb (GtkAction *action, static void action_import_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { - e_shell_importer_start_import (window); + e_shell_importer_start_import (shell_window); } static void action_new_window_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { EShell *shell; - shell = e_shell_window_get_shell (window); + shell = e_shell_window_get_shell (shell_window); e_shell_create_window (shell); } static void action_page_setup_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { - e_print_run_page_setup_dialog (GTK_WINDOW (window)); + e_print_run_page_setup_dialog (GTK_WINDOW (shell_window)); } static void action_preferences_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { GtkWidget *preferences_window; @@ -740,7 +742,7 @@ action_preferences_cb (GtkAction *action, static void action_quick_reference_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { const gchar * const *language_names; @@ -785,86 +787,86 @@ action_quick_reference_cb (GtkAction *action, static void action_quit_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { EShell *shell; - shell = e_shell_window_get_shell (window); + shell = e_shell_window_get_shell (shell_window); e_shell_quit (shell); } static void action_send_receive_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { EShell *shell; - shell = e_shell_window_get_shell (window); - e_shell_send_receive (shell, GTK_WINDOW (window)); + shell = e_shell_window_get_shell (shell_window); + e_shell_send_receive (shell, GTK_WINDOW (shell_window)); } static void action_shell_view_cb (GtkRadioAction *action, GtkRadioAction *current, - EShellWindow *window) + EShellWindow *shell_window) { const gchar *view_name; view_name = g_object_get_data (G_OBJECT (current), "view-name"); - e_shell_window_set_current_view (window, view_name); + e_shell_window_set_current_view (shell_window, view_name); } static void action_show_sidebar_cb (GtkToggleAction *action, - EShellWindow *window) + EShellWindow *shell_window) { GtkWidget *widget; gboolean active; - widget = window->priv->sidebar; + widget = shell_window->priv->sidebar; active = gtk_toggle_action_get_active (action); g_object_set (widget, "visible", active, NULL); } static void action_show_statusbar_cb (GtkToggleAction *action, - EShellWindow *window) + EShellWindow *shell_window) { GtkWidget *widget; gboolean active; - widget = window->priv->status_area; + widget = shell_window->priv->status_area; active = gtk_toggle_action_get_active (action); g_object_set (widget, "visible", active, NULL); } static void action_show_switcher_cb (GtkToggleAction *action, - EShellWindow *window) + EShellWindow *shell_window) { ESidebar *sidebar; gboolean active; - sidebar = E_SIDEBAR (window->priv->sidebar); + sidebar = E_SIDEBAR (shell_window->priv->sidebar); active = gtk_toggle_action_get_active (action); e_sidebar_set_actions_visible (sidebar, active); } static void action_show_toolbar_cb (GtkToggleAction *action, - EShellWindow *window) + EShellWindow *shell_window) { GtkWidget *widget; gboolean active; - widget = window->priv->main_toolbar; + widget = shell_window->priv->main_toolbar; active = gtk_toggle_action_get_active (action); g_object_set (widget, "visible", active, NULL); } static void action_submit_bug_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { const gchar *command_line; GError *error = NULL; @@ -881,7 +883,7 @@ action_submit_bug_cb (GtkAction *action, message = _("Bug Buddy is not installed."); else message = _("Bug Buddy could not be run."); - e_notice (window, GTK_MESSAGE_ERROR, message); + e_notice (shell_window, GTK_MESSAGE_ERROR, message); g_error_free (error); } } @@ -889,12 +891,12 @@ action_submit_bug_cb (GtkAction *action, static void action_switcher_style_cb (GtkRadioAction *action, GtkRadioAction *current, - EShellWindow *window) + EShellWindow *shell_window) { ESidebar *sidebar; GtkToolbarStyle style; - sidebar = E_SIDEBAR (window->priv->sidebar); + sidebar = E_SIDEBAR (shell_window->priv->sidebar); style = gtk_radio_action_get_current_value (action); switch (style) { @@ -913,7 +915,7 @@ action_switcher_style_cb (GtkRadioAction *action, static void action_sync_options_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { const gchar *command_line; GError *error = NULL; @@ -930,28 +932,28 @@ action_sync_options_cb (GtkAction *action, message = _("GNOME Pilot is not installed."); else message = _("GNOME Pilot could not be run."); - e_notice (window, GTK_MESSAGE_ERROR, message); + e_notice (shell_window, GTK_MESSAGE_ERROR, message); g_error_free (error); } } static void action_work_offline_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { EShell *shell; - shell = e_shell_window_get_shell (window); + shell = e_shell_window_get_shell (shell_window); e_shell_set_line_status (shell, E_SHELL_LINE_STATUS_OFFLINE); } static void action_work_online_cb (GtkAction *action, - EShellWindow *window) + EShellWindow *shell_window) { EShell *shell; - shell = e_shell_window_get_shell (window); + shell = e_shell_window_get_shell (shell_window); e_shell_set_line_status (shell, E_SHELL_LINE_STATUS_ONLINE); } @@ -1102,7 +1104,7 @@ static GtkActionEntry shell_entries[] = { { "new-menu", GTK_STOCK_NEW, N_("_New"), - NULL, + "", NULL, NULL }, @@ -1223,7 +1225,7 @@ shell_window_compare_actions (GtkAction *action1, } static void -shell_window_extract_actions (EShellWindow *window, +shell_window_extract_actions (EShellWindow *shell_window, GList **source_list, GList **destination_list) { @@ -1235,7 +1237,7 @@ shell_window_extract_actions (EShellWindow *window, * as belonging to the current EShellView and move them to the * destination list. */ - current_view = e_shell_window_get_current_view (window); + current_view = e_shell_window_get_current_view (shell_window); /* Example: Suppose [A] and [C] are tagged for this EShellView. * @@ -1273,51 +1275,51 @@ shell_window_extract_actions (EShellWindow *window, } void -e_shell_window_actions_init (EShellWindow *window) +e_shell_window_actions_init (EShellWindow *shell_window) { GtkActionGroup *action_group; GtkUIManager *manager; const gchar *domain; - g_return_if_fail (E_IS_SHELL_WINDOW (window)); + g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); - manager = e_shell_window_get_ui_manager (window); + manager = e_shell_window_get_ui_manager (shell_window); domain = GETTEXT_PACKAGE; /* Shell Actions */ - action_group = window->priv->shell_actions; + action_group = shell_window->priv->shell_actions; gtk_action_group_set_translation_domain (action_group, domain); gtk_action_group_add_actions ( action_group, shell_entries, - G_N_ELEMENTS (shell_entries), window); + G_N_ELEMENTS (shell_entries), shell_window); gtk_action_group_add_toggle_actions ( action_group, shell_toggle_entries, - G_N_ELEMENTS (shell_toggle_entries), window); + G_N_ELEMENTS (shell_toggle_entries), shell_window); gtk_action_group_add_radio_actions ( action_group, shell_switcher_style_entries, G_N_ELEMENTS (shell_switcher_style_entries), E_SIDEBAR_DEFAULT_TOOLBAR_STYLE, - G_CALLBACK (action_switcher_style_cb), window); + G_CALLBACK (action_switcher_style_cb), shell_window); gtk_ui_manager_insert_action_group (manager, action_group, 0); /* New Item Actions (empty) */ - action_group = window->priv->new_item_actions; + action_group = shell_window->priv->new_item_actions; gtk_action_group_set_translation_domain (action_group, domain); gtk_ui_manager_insert_action_group (manager, action_group, 0); /* New Source Actions (empty) */ - action_group = window->priv->new_source_actions; + action_group = shell_window->priv->new_source_actions; gtk_action_group_set_translation_domain (action_group, domain); gtk_ui_manager_insert_action_group (manager, action_group, 0); /* Shell View Actions (empty) */ - action_group = window->priv->shell_view_actions; + action_group = shell_window->priv->shell_view_actions; gtk_action_group_set_translation_domain (action_group, domain); gtk_ui_manager_insert_action_group (manager, action_group, 0); } GtkWidget * -e_shell_window_create_new_menu (EShellWindow *window) +e_shell_window_create_new_menu (EShellWindow *shell_window) { GtkActionGroup *action_group; GList *new_item_actions; @@ -1328,13 +1330,13 @@ e_shell_window_create_new_menu (EShellWindow *window) /* Get sorted lists of "new item" and "new source" actions. */ - action_group = window->priv->new_item_actions; + action_group = shell_window->priv->new_item_actions; new_item_actions = g_list_sort ( gtk_action_group_list_actions (action_group), (GCompareFunc) shell_window_compare_actions); - action_group = window->priv->new_source_actions; + action_group = shell_window->priv->new_source_actions; new_source_actions = g_list_sort ( gtk_action_group_list_actions (action_group), @@ -1343,10 +1345,10 @@ e_shell_window_create_new_menu (EShellWindow *window) /* Give priority to actions that belong to this shell view. */ shell_window_extract_actions ( - window, &new_item_actions, &list); + shell_window, &new_item_actions, &list); shell_window_extract_actions ( - window, &new_source_actions, &list); + shell_window, &new_source_actions, &list); /* Convert the actions to menu item proxy widgets. */ @@ -1388,7 +1390,7 @@ e_shell_window_create_new_menu (EShellWindow *window) } void -e_shell_window_create_shell_view_actions (EShellWindow *window) +e_shell_window_create_shell_view_actions (EShellWindow *shell_window) { GType *children; GSList *group = NULL; @@ -1397,11 +1399,11 @@ e_shell_window_create_shell_view_actions (EShellWindow *window) guint n_children, ii; guint merge_id; - g_return_if_fail (E_IS_SHELL_WINDOW (window)); + g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); - action_group = window->priv->shell_view_actions; + action_group = shell_window->priv->shell_view_actions; children = g_type_children (E_TYPE_SHELL_VIEW, &n_children); - manager = e_shell_window_get_ui_manager (window); + manager = e_shell_window_get_ui_manager (shell_window); merge_id = gtk_ui_manager_new_merge_id (manager); /* Construct a group of radio actions from the various EShellView @@ -1454,12 +1456,13 @@ e_shell_window_create_shell_view_actions (EShellWindow *window) if (group == NULL) { /* First view is the default. */ - window->priv->default_view = view_name; + shell_window->priv->default_view = view_name; /* Only listen to the first action. */ g_signal_connect ( action, "changed", - G_CALLBACK (action_shell_view_cb), window); + G_CALLBACK (action_shell_view_cb), + shell_window); } gtk_radio_action_set_group (action, group); @@ -1469,7 +1472,7 @@ e_shell_window_create_shell_view_actions (EShellWindow *window) action_group, GTK_ACTION (action)); e_sidebar_add_action ( - E_SIDEBAR (window->priv->sidebar), + E_SIDEBAR (shell_window->priv->sidebar), GTK_ACTION (action)); gtk_ui_manager_add_ui ( diff --git a/shell/e-shell-window-private.c b/shell/e-shell-window-private.c index 4953c9fecf..5b4c1e40ba 100644 --- a/shell/e-shell-window-private.c +++ b/shell/e-shell-window-private.c @@ -24,10 +24,30 @@ #include #include +static void +shell_window_notify_current_view_cb (EShellWindow *shell_window) +{ + GtkWidget *menu; + GtkWidget *widget; + const gchar *path; + + /* Update the "File -> New" submenu. */ + path = "/main-menu/file-menu/new-menu"; + menu = e_shell_window_create_new_menu (shell_window); + widget = e_shell_window_get_managed_widget (shell_window, path); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (widget), menu); + gtk_widget_show (widget); + + /* Update the "New" menu tool button submenu. */ + menu = e_shell_window_create_new_menu (shell_window); + widget = shell_window->priv->menu_tool_button; + gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (widget), menu); +} + static void shell_window_save_switcher_style_cb (GtkRadioAction *action, GtkRadioAction *current, - EShellWindow *window) + EShellWindow *shell_window) { GConfClient *client; GtkToolbarStyle style; @@ -67,7 +87,7 @@ shell_window_save_switcher_style_cb (GtkRadioAction *action, } static void -shell_window_init_switcher_style (EShellWindow *window) +shell_window_init_switcher_style (EShellWindow *shell_window) { GtkAction *action; GConfClient *client; @@ -100,13 +120,14 @@ shell_window_init_switcher_style (EShellWindow *window) g_signal_connect ( action, "changed", - G_CALLBACK (shell_window_save_switcher_style_cb), window); + G_CALLBACK (shell_window_save_switcher_style_cb), + shell_window); g_object_unref (client); } static void -shell_window_menu_item_select_cb (EShellWindow *window, +shell_window_menu_item_select_cb (EShellWindow *shell_window, GtkWidget *menu_item) { GtkAction *action; @@ -121,23 +142,23 @@ shell_window_menu_item_select_cb (EShellWindow *window, if (tooltip == NULL) return; - label = GTK_LABEL (window->priv->tooltip_label); + label = GTK_LABEL (shell_window->priv->tooltip_label); gtk_label_set_text (label, tooltip); g_free (tooltip); - gtk_widget_show (window->priv->tooltip_label); - gtk_widget_hide (window->priv->status_notebook); + gtk_widget_show (shell_window->priv->tooltip_label); + gtk_widget_hide (shell_window->priv->status_notebook); } static void -shell_window_menu_item_deselect_cb (EShellWindow *window) +shell_window_menu_item_deselect_cb (EShellWindow *shell_window) { - gtk_widget_hide (window->priv->tooltip_label); - gtk_widget_show (window->priv->status_notebook); + gtk_widget_hide (shell_window->priv->tooltip_label); + gtk_widget_show (shell_window->priv->status_notebook); } static void -shell_window_connect_proxy_cb (EShellWindow *window, +shell_window_connect_proxy_cb (EShellWindow *shell_window, GtkAction *action, GtkWidget *proxy) { @@ -151,16 +172,18 @@ shell_window_connect_proxy_cb (EShellWindow *window, g_signal_connect_swapped ( proxy, "select", - G_CALLBACK (shell_window_menu_item_select_cb), window); + G_CALLBACK (shell_window_menu_item_select_cb), + shell_window); g_signal_connect_swapped ( proxy, "deselect", - G_CALLBACK (shell_window_menu_item_deselect_cb), window); + G_CALLBACK (shell_window_menu_item_deselect_cb), + shell_window); } static void shell_window_online_button_clicked_cb (EOnlineButton *button, - EShellWindow *window) + EShellWindow *shell_window) { if (e_online_button_get_online (button)) gtk_action_activate (ACTION (WORK_OFFLINE)); @@ -169,11 +192,12 @@ shell_window_online_button_clicked_cb (EOnlineButton *button, } void -e_shell_window_private_init (EShellWindow *window) +e_shell_window_private_init (EShellWindow *shell_window) { - EShellWindowPrivate *priv = window->priv; + EShellWindowPrivate *priv = shell_window->priv; GHashTable *loaded_views; GConfBridge *bridge; + GtkToolItem *item; GtkWidget *container; GtkWidget *widget; GObject *object; @@ -194,34 +218,42 @@ e_shell_window_private_init (EShellWindow *window) e_load_ui_definition (priv->manager, "evolution-shell.ui"); - e_shell_window_actions_init (window); + e_shell_window_actions_init (shell_window); gtk_window_add_accel_group ( - GTK_WINDOW (window), + GTK_WINDOW (shell_window), gtk_ui_manager_get_accel_group (priv->manager)); g_signal_connect_swapped ( priv->manager, "connect-proxy", - G_CALLBACK (shell_window_connect_proxy_cb), window); + G_CALLBACK (shell_window_connect_proxy_cb), shell_window); /* Construct window widgets. */ widget = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (window), widget); + gtk_container_add (GTK_CONTAINER (shell_window), widget); gtk_widget_show (widget); container = widget; - widget = e_shell_window_get_managed_widget (window, "/main-menu"); + widget = e_shell_window_get_managed_widget ( + shell_window, "/main-menu"); gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); priv->main_menu = g_object_ref (widget); gtk_widget_show (widget); - widget = e_shell_window_get_managed_widget (window, "/main-toolbar"); + widget = e_shell_window_get_managed_widget ( + shell_window, "/main-toolbar"); gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); priv->main_toolbar = g_object_ref (widget); gtk_widget_show (widget); + item = e_menu_tool_button_new (_("New")); + gtk_tool_item_set_is_important (GTK_TOOL_ITEM (item), TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (widget), item, 0); + priv->menu_tool_button = g_object_ref (item); + gtk_widget_show (GTK_WIDGET (item)); + widget = gtk_hpaned_new (); gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); priv->content_pane = g_object_ref (widget); @@ -264,7 +296,8 @@ e_shell_window_private_init (EShellWindow *window) widget = e_online_button_new (); g_signal_connect ( widget, "clicked", - G_CALLBACK (shell_window_online_button_clicked_cb), window); + G_CALLBACK (shell_window_online_button_clicked_cb), + shell_window); gtk_box_pack_start (GTK_BOX (container), widget, FALSE, TRUE, 0); priv->online_button = g_object_ref (widget); gtk_widget_show (widget); @@ -288,7 +321,7 @@ e_shell_window_private_init (EShellWindow *window) key = "/apps/evolution/shell/view_defaults/window"; gconf_bridge_bind_window ( - bridge, key, GTK_WINDOW (window), TRUE, FALSE); + bridge, key, GTK_WINDOW (shell_window), TRUE, FALSE); object = G_OBJECT (priv->content_pane); key = "/apps/evolution/shell/view_defaults/folder_bar/width"; @@ -310,17 +343,25 @@ e_shell_window_private_init (EShellWindow *window) key = "/apps/evolution/shell/view_defaults/toolbar_visible"; gconf_bridge_bind_property (bridge, key, object, "active"); - shell_window_init_switcher_style (window); + shell_window_init_switcher_style (shell_window); + + /* Fine tuning. */ + + g_object_set (ACTION (SEND_RECEIVE), "is-important", TRUE, NULL); + + g_signal_connect ( + shell_window, "notify::current-view", + G_CALLBACK (shell_window_notify_current_view_cb), NULL); - /* Initialize shell views */ + /* Initialize shell views. */ - e_shell_window_create_shell_view_actions (window); + e_shell_window_create_shell_view_actions (shell_window); } void -e_shell_window_private_dispose (EShellWindow *window) +e_shell_window_private_dispose (EShellWindow *shell_window) { - EShellWindowPrivate *priv = window->priv; + EShellWindowPrivate *priv = shell_window->priv; DISPOSE (priv->shell); @@ -334,6 +375,7 @@ e_shell_window_private_dispose (EShellWindow *window) DISPOSE (priv->main_menu); DISPOSE (priv->main_toolbar); + DISPOSE (priv->menu_tool_button); DISPOSE (priv->content_pane); DISPOSE (priv->content_notebook); DISPOSE (priv->sidebar); @@ -347,9 +389,9 @@ e_shell_window_private_dispose (EShellWindow *window) } void -e_shell_window_private_finalize (EShellWindow *window) +e_shell_window_private_finalize (EShellWindow *shell_window) { - EShellWindowPrivate *priv = window->priv; + EShellWindowPrivate *priv = shell_window->priv; g_hash_table_destroy (priv->loaded_views); } diff --git a/shell/e-shell-window-private.h b/shell/e-shell-window-private.h index ac1ed1f187..db8174832d 100644 --- a/shell/e-shell-window-private.h +++ b/shell/e-shell-window-private.h @@ -25,21 +25,24 @@ #include -#include "e-shell.h" -#include "e-shell-view.h" -#include "e-shell-registry.h" -#include "e-shell-window-actions.h" +#include +#include +#include +#include -#include "e-online-button.h" -#include "e-sidebar.h" +#include +#include +#include #define E_SHELL_WINDOW_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_SHELL_WINDOW, EShellWindowPrivate)) -/* Shorthand, requires a variable named "window". */ -#define ACTION(name) (E_SHELL_WINDOW_ACTION_##name (window)) -#define ACTION_GROUP(name) (E_SHELL_WINDOW_ACTION_GROUP_##name (window)) +/* Shorthand, requires a variable named "shell_window". */ +#define ACTION(name) \ + (E_SHELL_WINDOW_ACTION_##name (shell_window)) +#define ACTION_GROUP(name) \ + (E_SHELL_WINDOW_ACTION_GROUP_##name (shell_window)) /* For use in dispose() methods. */ #define DISPOSE(obj) \ @@ -71,6 +74,7 @@ struct _EShellWindowPrivate { GtkWidget *main_menu; GtkWidget *main_toolbar; + GtkWidget *menu_tool_button; GtkWidget *content_pane; GtkWidget *content_notebook; GtkWidget *sidebar; @@ -82,20 +86,20 @@ struct _EShellWindowPrivate { /* Miscellaneous */ - gboolean destroyed; /* XXX Do we still need this? */ - gboolean safe_mode; + guint destroyed : 1; /* XXX Do we still need this? */ + guint safe_mode : 1; }; -void e_shell_window_private_init (EShellWindow *window); -void e_shell_window_private_dispose (EShellWindow *window); -void e_shell_window_private_finalize (EShellWindow *window); +void e_shell_window_private_init (EShellWindow *shell_window); +void e_shell_window_private_dispose (EShellWindow *shell_window); +void e_shell_window_private_finalize (EShellWindow *shell_window); /* Private Utilities */ -void e_shell_window_actions_init (EShellWindow *window); -GtkWidget * e_shell_window_create_new_menu (EShellWindow *window); +void e_shell_window_actions_init (EShellWindow *shell_window); +GtkWidget * e_shell_window_create_new_menu (EShellWindow *shell_window); void e_shell_window_create_shell_view_actions - (EShellWindow *window); + (EShellWindow *shell_window); G_END_DECLS diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c index c12e6ecc64..c29f7d10e8 100644 --- a/shell/e-shell-window.c +++ b/shell/e-shell-window.c @@ -18,26 +18,20 @@ * Boston, MA 02110-1301, USA. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include "e-shell-window-private.h" -#include "e-util/e-plugin-ui.h" -#include "e-util/e-util-private.h" -#include "e-util/gconf-bridge.h" -#include "widgets/misc/e-online-button.h" - -#include "e-sidebar.h" -#include "es-menu.h" -#include "es-event.h" - +#include #include - #include -#include +#include +#include +#include + +#include +#include +#include +#include enum { PROP_0, @@ -48,12 +42,42 @@ enum { static gpointer parent_class; +static void +shell_window_online_mode_notify_cb (EShell *shell, + GParamSpec *pspec, + EShellWindow *shell_window) +{ + GtkAction *action; + EOnlineButton *online_button; + gboolean online_mode; + + online_mode = e_shell_get_online_mode (shell); + + action = ACTION (WORK_OFFLINE); + gtk_action_set_sensitive (action, TRUE); + gtk_action_set_visible (action, online_mode); + + action = ACTION (WORK_ONLINE); + gtk_action_set_sensitive (action, TRUE); + gtk_action_set_visible (action, !online_mode); + + online_button = E_ONLINE_BUTTON (shell_window->priv->online_button); + e_online_button_set_online (online_button, online_mode); +} + static void shell_window_set_shell (EShellWindow *shell_window, EShell *shell) { g_return_if_fail (shell_window->priv->shell == NULL); shell_window->priv->shell = g_object_ref (shell); + + g_signal_connect ( + shell, "notify::online-mode", + G_CALLBACK (shell_window_online_mode_notify_cb), + shell_window); + + g_object_notify (G_OBJECT (shell), "online-mode"); } static void @@ -226,8 +250,8 @@ e_shell_window_new (EShell *shell, gboolean safe_mode) { return g_object_new ( - E_TYPE_SHELL_WINDOW, "shell", shell, - "safe-mode", safe_mode, NULL); + E_TYPE_SHELL_WINDOW, + "shell", shell, "safe-mode", safe_mode, NULL); } EShell * @@ -372,6 +396,8 @@ e_shell_window_register_new_item_actions (EShellWindow *shell_window, guint n_entries) { GtkActionGroup *action_group; + GtkAccelGroup *accel_group; + GtkUIManager *manager; guint ii; g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); @@ -379,6 +405,8 @@ e_shell_window_register_new_item_actions (EShellWindow *shell_window, g_return_if_fail (entries != NULL); action_group = shell_window->priv->new_item_actions; + manager = e_shell_window_get_ui_manager (shell_window); + accel_group = gtk_ui_manager_get_accel_group (manager); module_name = g_intern_string (module_name); gtk_action_group_add_actions ( @@ -397,10 +425,15 @@ e_shell_window_register_new_item_actions (EShellWindow *shell_window, action = gtk_action_group_get_action ( action_group, action_name); + gtk_action_set_accel_group (action, accel_group); + g_object_set_data ( G_OBJECT (action), "module-name", (gpointer) module_name); } + + /* Force a rebuild of the "New" menu. */ + g_object_notify (G_OBJECT (shell_window), "current-view"); } void @@ -410,6 +443,8 @@ e_shell_window_register_new_source_actions (EShellWindow *shell_window, guint n_entries) { GtkActionGroup *action_group; + GtkAccelGroup *accel_group; + GtkUIManager *manager; guint ii; g_return_if_fail (E_IS_SHELL_WINDOW (shell_window)); @@ -417,6 +452,8 @@ e_shell_window_register_new_source_actions (EShellWindow *shell_window, g_return_if_fail (entries != NULL); action_group = shell_window->priv->new_source_actions; + manager = e_shell_window_get_ui_manager (shell_window); + accel_group = gtk_ui_manager_get_accel_group (manager); module_name = g_intern_string (module_name); gtk_action_group_add_actions ( @@ -435,8 +472,13 @@ e_shell_window_register_new_source_actions (EShellWindow *shell_window, action = gtk_action_group_get_action ( action_group, action_name); + gtk_action_set_accel_group (action, accel_group); + g_object_set_data ( G_OBJECT (action), "module-name", (gpointer) module_name); } + + /* Force a rebuild of the "New" menu. */ + g_object_notify (G_OBJECT (shell_window), "current-view"); } diff --git a/shell/e-shell-window.h b/shell/e-shell-window.h index f4f74f293b..0ec9b15e5f 100644 --- a/shell/e-shell-window.h +++ b/shell/e-shell-window.h @@ -77,7 +77,7 @@ gboolean e_shell_window_get_safe_mode (EShellWindow *shell_window); void e_shell_window_set_safe_mode (EShellWindow *shell_window, gboolean safe_mode); -/* These should be called from the shell module's window_created() method. */ +/* These should be called from the shell module's window_created() handler. */ void e_shell_window_register_new_item_actions (EShellWindow *shell_window, diff --git a/shell/e-shell.c b/shell/e-shell.c index 6ef5de27c5..b96ceb4944 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -39,13 +39,13 @@ struct _EShellPrivate { GList *active_windows; EShellLineStatus line_status; - guint online : 1; - guint safe_mode : 1; + guint online_mode : 1; + guint safe_mode : 1; }; enum { PROP_0, - PROP_ONLINE + PROP_ONLINE_MODE }; enum { @@ -145,8 +145,8 @@ shell_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_ONLINE: - e_shell_set_online ( + case PROP_ONLINE_MODE: + e_shell_set_online_mode ( E_SHELL (object), g_value_get_boolean (value)); return; @@ -162,9 +162,9 @@ shell_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_ONLINE: + case PROP_ONLINE_MODE: g_value_set_boolean ( - value, e_shell_get_online ( + value, e_shell_get_online_mode ( E_SHELL (object))); return; } @@ -202,10 +202,10 @@ shell_class_init (EShellClass *class) g_object_class_install_property ( object_class, - PROP_ONLINE, + PROP_ONLINE_MODE, g_param_spec_boolean ( - "online", - _("Online"), + "online-mode", + _("Online Mode"), _("Whether the shell is online"), TRUE, G_PARAM_READWRITE | @@ -290,9 +290,9 @@ e_shell_get_type (void) } EShell * -e_shell_new (gboolean online) +e_shell_new (gboolean online_mode) { - return g_object_new (E_TYPE_SHELL, "online", online, NULL); + return g_object_new (E_TYPE_SHELL, "online-mode", online_mode, NULL); } GtkWidget * @@ -349,22 +349,22 @@ e_shell_send_receive (EShell *shell, } gboolean -e_shell_get_online (EShell *shell) +e_shell_get_online_mode (EShell *shell) { g_return_val_if_fail (E_IS_SHELL (shell), FALSE); - return shell->priv->online; + return shell->priv->online_mode; } void -e_shell_set_online (EShell *shell, - gboolean online) +e_shell_set_online_mode (EShell *shell, + gboolean online_mode) { g_return_if_fail (E_IS_SHELL (shell)); - shell->priv->online = online; + shell->priv->online_mode = online_mode; - g_object_notify (G_OBJECT (shell), "online"); + g_object_notify (G_OBJECT (shell), "online-mode"); } EShellLineStatus diff --git a/shell/e-shell.h b/shell/e-shell.h index fd0e26e11b..a0f037ea98 100644 --- a/shell/e-shell.h +++ b/shell/e-shell.h @@ -49,7 +49,6 @@ typedef struct _EShellClass EShellClass; typedef struct _EShellPrivate EShellPrivate; typedef enum _EShellLineStatus EShellLineStatus; -typedef enum _EShellStartupLineMode EShellStartupLineMode; struct _EShell { GObject parent; @@ -67,12 +66,6 @@ enum _EShellLineStatus { E_SHELL_LINE_STATUS_FORCED_OFFLINE }; -enum _EShellStartupLineMode { - E_SHELL_STARTUP_LINE_MODE_CONFIG, - E_SHELL_STARTUP_LINE_MODE_ONLINE, - E_SHELL_STARTUP_LINE_MODE_OFFLINE -}; - GType e_shell_get_type (void); EShell * e_shell_new (gboolean online); GtkWidget * e_shell_create_window (EShell *shell); @@ -80,9 +73,9 @@ gboolean e_shell_handle_uri (EShell *shell, const gchar *uri); void e_shell_send_receive (EShell *shell, GtkWindow *parent); -gboolean e_shell_get_online (EShell *shell); -void e_shell_set_online (EShell *shell, - gboolean online); +gboolean e_shell_get_online_mode (EShell *shell); +void e_shell_set_online_mode (EShell *shell, + gboolean online_mode); EShellLineStatus e_shell_get_line_status (EShell *shell); void e_shell_set_line_status (EShell *shell, diff --git a/shell/main.c b/shell/main.c index 78fa80555f..292b7f96cf 100644 --- a/shell/main.c +++ b/shell/main.c @@ -282,23 +282,12 @@ open_uris (gchar **uris) static gboolean idle_cb (gchar **uris) { - EShellStartupLineMode startup_line_mode; - g_return_val_if_fail (uris == NULL || g_strv_length (uris) > 0, FALSE); #ifdef KILL_PROCESS_CMD kill_old_dataserver (); #endif - if (! start_online && ! start_offline) - startup_line_mode = E_SHELL_STARTUP_LINE_MODE_CONFIG; - else if (start_online) - startup_line_mode = E_SHELL_STARTUP_LINE_MODE_ONLINE; - else - startup_line_mode = E_SHELL_STARTUP_LINE_MODE_OFFLINE; - - /* FIXME Do something with startup_line_mode. */ - if (uris != NULL) open_uris (uris); else { @@ -486,16 +475,16 @@ create_shell (void) EShell *shell; GConfClient *conf_client; GnomeClient *master_client; - gboolean online = TRUE; + gboolean online_mode = TRUE; GError *error = NULL; conf_client = gconf_client_get_default (); master_client = gnome_master_client (); if (start_online) - online = TRUE; + online_mode = TRUE; else if (start_offline) - online = FALSE; + online_mode = FALSE; else { const gchar *key; gboolean value; @@ -503,14 +492,14 @@ create_shell (void) key = "/apps/evolution/shell/start_offline"; value = gconf_client_get_bool (conf_client, key, &error); if (error == NULL) - online = !value; + online_mode = !value; else { g_warning ("%s", error->message); g_error_free (error); } } - shell = e_shell_new (online); + shell = e_shell_new (online_mode); g_signal_connect ( shell, "window-destroyed", diff --git a/shell/test/e-test-shell-module.c b/shell/test/e-test-shell-module.c index 65c483bad0..f7deaaca67 100644 --- a/shell/test/e-test-shell-module.c +++ b/shell/test/e-test-shell-module.c @@ -18,6 +18,8 @@ * Boston, MA 02110-1301, USA. */ +#include + #include #include #include @@ -32,6 +34,40 @@ /* Module Entry Point */ void e_shell_module_init (GTypeModule *module); +static void +action_new_test_item_cb (GtkAction *action, + EShellWindow *shell_window) +{ + g_debug ("%s", G_STRFUNC); +} + +static void +action_new_test_source_cb (GtkAction *action, + EShellWindow *shell_window) +{ + g_debug ("%s", G_STRFUNC); +} + +static GtkActionEntry item_entries[] = { + + { "new-test-item", + "document-new", + N_("_Test Item"), + NULL, + N_("Create a new test item"), + G_CALLBACK (action_new_test_item_cb) } +}; + +static GtkActionEntry source_entries[] = { + + { "new-test-source", + "folder-new", + N_("Test _Source"), + NULL, + N_("Create a new test source"), + G_CALLBACK (action_new_test_source_cb) } +}; + static gboolean test_module_is_busy (EShellModule *shell_module) { @@ -68,7 +104,19 @@ static void test_module_window_created (EShellModule *shell_module, EShellWindow *shell_window) { + const gchar *module_name; + g_debug ("%s (window=%p)", G_STRFUNC, shell_window); + + module_name = G_TYPE_MODULE (shell_module)->name; + + e_shell_window_register_new_item_actions ( + shell_window, module_name, + item_entries, G_N_ELEMENTS (item_entries)); + + e_shell_window_register_new_source_actions ( + shell_window, module_name, + source_entries, G_N_ELEMENTS (source_entries)); } static void -- cgit v1.2.3