aboutsummaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2008-08-24 21:17:11 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2008-08-24 21:17:11 +0800
commit2ef1b5bf42b5d429e00f94710458f237d18315b2 (patch)
treefbeb4821b6190841688e5e52aa0a964d8db6b7ab /shell
parentfd6cd9e3a6dc06f9b8e44ec13ac881ebd6793e6e (diff)
downloadgsoc2013-evolution-2ef1b5bf42b5d429e00f94710458f237d18315b2.tar
gsoc2013-evolution-2ef1b5bf42b5d429e00f94710458f237d18315b2.tar.gz
gsoc2013-evolution-2ef1b5bf42b5d429e00f94710458f237d18315b2.tar.bz2
gsoc2013-evolution-2ef1b5bf42b5d429e00f94710458f237d18315b2.tar.lz
gsoc2013-evolution-2ef1b5bf42b5d429e00f94710458f237d18315b2.tar.xz
gsoc2013-evolution-2ef1b5bf42b5d429e00f94710458f237d18315b2.tar.zst
gsoc2013-evolution-2ef1b5bf42b5d429e00f94710458f237d18315b2.zip
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
Diffstat (limited to 'shell')
-rw-r--r--shell/e-shell-window-actions.c149
-rw-r--r--shell/e-shell-window-private.c104
-rw-r--r--shell/e-shell-window-private.h38
-rw-r--r--shell/e-shell-window.c76
-rw-r--r--shell/e-shell-window.h2
-rw-r--r--shell/e-shell.c36
-rw-r--r--shell/e-shell.h13
-rw-r--r--shell/main.c21
-rw-r--r--shell/test/e-test-shell-module.c48
9 files changed, 304 insertions, 183 deletions
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 <string.h>
-#include "e-util/e-dialog-utils.h"
-#include "e-util/e-error.h"
-#include "e-util/e-print.h"
+#include <e-shell.h>
+#include <e-shell-importer.h>
+
+#include <e-util/e-dialog-utils.h>
+#include <e-util/e-error.h>
+#include <e-util/e-print.h>
+#include <e-util/e-util.h>
-#include <string.h>
#include <libedataserverui/e-passwords.h>
#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
@@ -25,9 +25,29 @@
#include <e-util/gconf-bridge.h>
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 <glib/gi18n.h>
-#include "e-shell.h"
-#include "e-shell-view.h"
-#include "e-shell-registry.h"
-#include "e-shell-window-actions.h"
+#include <e-shell.h>
+#include <e-shell-view.h>
+#include <e-shell-registry.h>
+#include <e-shell-window-actions.h>
-#include "e-online-button.h"
-#include "e-sidebar.h"
+#include <e-menu-tool-button.h>
+#include <e-online-button.h>
+#include <e-sidebar.h>
#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 <config.h>
-#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 <string.h>
#include <glib/gi18n.h>
-
#include <gconf/gconf-client.h>
-#include <string.h>
+#include <e-sidebar.h>
+#include <es-event.h>
+#include <es-menu.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>
enum {
PROP_0,
@@ -49,11 +43,41 @@ 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 <glib/gi18n.h>
+
#include <e-shell.h>
#include <e-shell-module.h>
#include <e-shell-window.h>
@@ -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