Files
evolution/shell/e-shell-window-private.c
Matthew Barnes eb0f59091a Hide actions when lockdown settings are enabled.
Hide actions that are disabled by lockdown settings instead of showing
them as disabled.  Showing them as disabled gives the impression the
user can do something to enable them, which is not the case here.
2009-11-13 11:43:17 -05:00

597 lines
18 KiB
C

/*
* e-shell-window-private.c
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with the program; if not, see <http://www.gnu.org/licenses/>
*
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
*/
#include "e-shell-window-private.h"
static void
shell_window_save_switcher_style_cb (GtkRadioAction *action,
GtkRadioAction *current,
EShellWindow *shell_window)
{
EShell *shell;
GConfClient *client;
GtkToolbarStyle style;
const gchar *key;
const gchar *string;
GError *error = NULL;
shell = e_shell_window_get_shell (shell_window);
client = e_shell_get_gconf_client (shell);
style = gtk_radio_action_get_current_value (action);
key = "/apps/evolution/shell/view_defaults/buttons_style";
switch (style) {
case GTK_TOOLBAR_ICONS:
string = "icons";
break;
case GTK_TOOLBAR_TEXT:
string = "text";
break;
case GTK_TOOLBAR_BOTH:
case GTK_TOOLBAR_BOTH_HORIZ:
string = "both";
break;
default:
string = "toolbar";
break;
}
if (!gconf_client_set_string (client, key, string, &error)) {
g_warning ("%s", error->message);
g_error_free (error);
}
}
static void
shell_window_init_switcher_style (EShellWindow *shell_window)
{
EShell *shell;
GtkAction *action;
GConfClient *client;
GtkToolbarStyle style;
const gchar *key;
gchar *string;
GError *error = NULL;
/* XXX GConfBridge doesn't let you convert between numeric properties
* and string keys, so we have to create the binding manually. */
shell = e_shell_window_get_shell (shell_window);
client = e_shell_get_gconf_client (shell);
action = ACTION (SWITCHER_STYLE_ICONS);
key = "/apps/evolution/shell/view_defaults/buttons_style";
string = gconf_client_get_string (client, key, &error);
if (string != NULL) {
if (strcmp (string, "icons") == 0)
style = GTK_TOOLBAR_ICONS;
else if (strcmp (string, "text") == 0)
style = GTK_TOOLBAR_TEXT;
else if (strcmp (string, "both") == 0)
style = GTK_TOOLBAR_BOTH_HORIZ;
else
style = -1;
gtk_radio_action_set_current_value (
GTK_RADIO_ACTION (action), style);
}
g_signal_connect (
action, "changed",
G_CALLBACK (shell_window_save_switcher_style_cb),
shell_window);
}
static void
shell_window_menu_item_select_cb (EShellWindow *shell_window,
GtkWidget *widget)
{
GtkAction *action;
GtkActivatable *activatable;
GtkLabel *label;
const gchar *tooltip;
activatable = GTK_ACTIVATABLE (widget);
action = gtk_activatable_get_related_action (activatable);
tooltip = gtk_action_get_tooltip (action);
if (tooltip == NULL)
return;
label = GTK_LABEL (shell_window->priv->tooltip_label);
gtk_label_set_text (label, tooltip);
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 *shell_window)
{
gtk_widget_hide (shell_window->priv->tooltip_label);
gtk_widget_show (shell_window->priv->status_notebook);
}
static void
shell_window_connect_proxy_cb (EShellWindow *shell_window,
GtkAction *action,
GtkWidget *proxy)
{
if (!GTK_IS_MENU_ITEM (proxy))
return;
g_signal_connect_swapped (
proxy, "select",
G_CALLBACK (shell_window_menu_item_select_cb),
shell_window);
g_signal_connect_swapped (
proxy, "deselect",
G_CALLBACK (shell_window_menu_item_deselect_cb),
shell_window);
}
static void
shell_window_online_button_clicked_cb (EOnlineButton *button,
EShellWindow *shell_window)
{
if (e_online_button_get_online (button))
gtk_action_activate (ACTION (WORK_OFFLINE));
else
gtk_action_activate (ACTION (WORK_ONLINE));
}
void
e_shell_window_private_init (EShellWindow *shell_window)
{
EShellWindowPrivate *priv = shell_window->priv;
GHashTable *loaded_views;
GArray *signal_handler_ids;
GtkAccelGroup *accel_group;
GtkToolItem *item;
GtkWidget *container;
GtkWidget *widget;
guint merge_id;
gint height;
loaded_views = g_hash_table_new_full (
g_str_hash, g_str_equal,
(GDestroyNotify) g_free,
(GDestroyNotify) g_object_unref);
signal_handler_ids = g_array_new (FALSE, FALSE, sizeof (gulong));
priv->ui_manager = gtk_ui_manager_new ();
priv->loaded_views = loaded_views;
priv->active_view = "unknown";
priv->signal_handler_ids = signal_handler_ids;
e_shell_window_add_action_group (shell_window, "shell");
e_shell_window_add_action_group (shell_window, "gal-view");
e_shell_window_add_action_group (shell_window, "new-item");
e_shell_window_add_action_group (shell_window, "new-source");
e_shell_window_add_action_group (shell_window, "custom-rules");
e_shell_window_add_action_group (shell_window, "switcher");
e_shell_window_add_action_group (shell_window, "lockdown-application-handlers");
e_shell_window_add_action_group (shell_window, "lockdown-printing");
e_shell_window_add_action_group (shell_window, "lockdown-print-setup");
e_shell_window_add_action_group (shell_window, "lockdown-save-to-disk");
merge_id = gtk_ui_manager_new_merge_id (priv->ui_manager);
priv->custom_rule_merge_id = merge_id;
merge_id = gtk_ui_manager_new_merge_id (priv->ui_manager);
priv->gal_view_merge_id = merge_id;
gtk_window_set_title (GTK_WINDOW (shell_window), _("Evolution"));
e_shell_window_actions_init (shell_window);
accel_group = gtk_ui_manager_get_accel_group (priv->ui_manager);
gtk_window_add_accel_group (GTK_WINDOW (shell_window), accel_group);
g_signal_connect_swapped (
priv->ui_manager, "connect-proxy",
G_CALLBACK (shell_window_connect_proxy_cb), shell_window);
/* Construct window widgets. */
widget = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (shell_window), widget);
gtk_widget_show (widget);
container = widget;
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 (
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);
/* XXX Having this separator in the UI definition doesn't work
* because GtkUIManager is unaware of the "New" button, so
* it makes the separator invisible. One possibility is to
* define a GtkAction subclass for which create_tool_item()
* returns an EMenuToolButton. Then both this separator
* and the "New" button could be added to the UI definition.
* Tempting, but the "New" button and its dynamically
* generated menu is already a complex beast, and I'm not
* convinced having it proxy some new type of GtkAction
* is worth the extra effort. */
item = gtk_separator_tool_item_new ();
gtk_toolbar_insert (GTK_TOOLBAR (widget), item, 0);
gtk_widget_show (GTK_WIDGET (item));
item = e_menu_tool_button_new (_("New"));
gtk_tool_item_set_is_important (GTK_TOOL_ITEM (item), TRUE);
gtk_widget_add_accelerator (
GTK_WIDGET (item), "clicked",
gtk_ui_manager_get_accel_group (priv->ui_manager),
GDK_N, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
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);
gtk_widget_show (widget);
widget = gtk_hbox_new (FALSE, 3);
gtk_container_set_border_width (GTK_CONTAINER (widget), 3);
gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
priv->status_area = g_object_ref (widget);
gtk_widget_show (widget);
/* Make the status area as large as the task bar. */
gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, NULL, &height);
gtk_widget_set_size_request (widget, -1, (height * 2) + 6);
container = priv->content_pane;
widget = e_shell_switcher_new ();
gtk_paned_pack1 (GTK_PANED (container), widget, FALSE, FALSE);
priv->switcher = g_object_ref (widget);
gtk_widget_show (widget);
widget = gtk_notebook_new ();
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE);
gtk_notebook_set_show_border (GTK_NOTEBOOK (widget), FALSE);
gtk_paned_pack2 (GTK_PANED (container), widget, TRUE, FALSE);
priv->content_notebook = g_object_ref (widget);
gtk_widget_show (widget);
container = priv->switcher;
widget = gtk_notebook_new ();
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE);
gtk_notebook_set_show_border (GTK_NOTEBOOK (widget), FALSE);
gtk_container_add (GTK_CONTAINER (container), widget);
priv->sidebar_notebook = g_object_ref (widget);
gtk_widget_show (widget);
container = priv->status_area;
widget = e_online_button_new ();
g_signal_connect (
widget, "clicked",
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);
widget = gtk_label_new ("");
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
priv->tooltip_label = g_object_ref (widget);
gtk_widget_hide (widget);
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 (container), widget, TRUE, TRUE, 0);
priv->status_notebook = g_object_ref (widget);
gtk_widget_show (widget);
}
void
e_shell_window_private_constructed (EShellWindow *shell_window)
{
EShellWindowPrivate *priv = shell_window->priv;
EShellSettings *shell_settings;
EShell *shell;
GConfBridge *bridge;
GtkAction *action;
GtkActionGroup *action_group;
GtkUIManager *ui_manager;
GObject *object;
const gchar *key;
const gchar *id;
shell = e_shell_window_get_shell (shell_window);
shell_settings = e_shell_get_shell_settings (shell);
e_shell_watch_window (shell, GTK_WINDOW (shell_window));
/* Create the switcher actions before we set the initial
* shell view, because the shell view relies on them for
* default settings during construction. */
e_shell_window_create_switcher_actions (shell_window);
/* Support lockdown. */
action_group = ACTION_GROUP (LOCKDOWN_PRINTING);
e_binding_new_with_negation (
shell_settings, "disable-printing",
action_group, "visible");
action_group = ACTION_GROUP (LOCKDOWN_PRINT_SETUP);
e_binding_new_with_negation (
shell_settings, "disable-print-setup",
action_group, "visible");
action_group = ACTION_GROUP (LOCKDOWN_SAVE_TO_DISK);
e_binding_new_with_negation (
shell_settings, "disable-save-to-disk",
action_group, "visible");
/* Bind GObject properties to GObject properties. */
action = ACTION (SEND_RECEIVE);
e_binding_new (
shell, "online",
action, "sensitive");
action = ACTION (WORK_OFFLINE);
e_binding_new (
shell, "online",
action, "visible");
e_binding_new (
shell, "network-available",
action, "sensitive");
action = ACTION (WORK_ONLINE);
e_binding_new_with_negation (
shell, "online",
action, "visible");
e_binding_new (
shell, "network-available",
action, "sensitive");
e_binding_new (
shell, "online",
priv->online_button, "online");
e_binding_new (
shell, "network-available",
priv->online_button, "sensitive");
/* Bind GObject properties to GConf keys. */
bridge = gconf_bridge_get ();
key = "/apps/evolution/shell/view_defaults/window";
gconf_bridge_bind_window (
bridge, key, GTK_WINDOW (shell_window), TRUE, TRUE);
object = G_OBJECT (shell_window);
key = "/apps/evolution/shell/view_defaults/component_id";
gconf_bridge_bind_property (bridge, key, object, "active-view");
object = G_OBJECT (priv->content_pane);
key = "/apps/evolution/shell/view_defaults/folder_bar/width";
gconf_bridge_bind_property_delayed (bridge, key, object, "position");
object = G_OBJECT (ACTION (SHOW_SIDEBAR));
key = "/apps/evolution/shell/view_defaults/sidebar_visible";
gconf_bridge_bind_property (bridge, key, object, "active");
object = G_OBJECT (ACTION (SHOW_STATUSBAR));
key = "/apps/evolution/shell/view_defaults/statusbar_visible";
gconf_bridge_bind_property (bridge, key, object, "active");
object = G_OBJECT (ACTION (SHOW_SWITCHER));
key = "/apps/evolution/shell/view_defaults/buttons_visible";
gconf_bridge_bind_property (bridge, key, object, "active");
object = G_OBJECT (ACTION (SHOW_TOOLBAR));
key = "/apps/evolution/shell/view_defaults/toolbar_visible";
gconf_bridge_bind_property (bridge, key, object, "active");
shell_window_init_switcher_style (shell_window);
id = "org.gnome.evolution.shell";
ui_manager = e_shell_window_get_ui_manager (shell_window);
e_plugin_ui_register_manager (ui_manager, id, shell_window);
e_plugin_ui_enable_manager (ui_manager, id);
}
void
e_shell_window_private_dispose (EShellWindow *shell_window)
{
EShellWindowPrivate *priv = shell_window->priv;
/* Need to disconnect handlers before we unref the shell. */
if (priv->signal_handler_ids != NULL) {
GArray *array = priv->signal_handler_ids;
gulong handler_id;
guint ii;
for (ii = 0; ii < array->len; ii++) {
handler_id = g_array_index (array, gulong, ii);
g_signal_handler_disconnect (priv->shell, handler_id);
}
g_array_free (array, TRUE);
priv->signal_handler_ids = NULL;
}
if (priv->shell != NULL) {
g_object_remove_weak_pointer (
G_OBJECT (priv->shell), &priv->shell);
priv->shell = NULL;
}
DISPOSE (priv->ui_manager);
g_hash_table_remove_all (priv->loaded_views);
DISPOSE (priv->main_menu);
DISPOSE (priv->main_toolbar);
DISPOSE (priv->menu_tool_button);
DISPOSE (priv->content_pane);
DISPOSE (priv->content_notebook);
DISPOSE (priv->sidebar_notebook);
DISPOSE (priv->switcher);
DISPOSE (priv->status_area);
DISPOSE (priv->online_button);
DISPOSE (priv->tooltip_label);
DISPOSE (priv->status_notebook);
priv->destroyed = TRUE;
}
void
e_shell_window_private_finalize (EShellWindow *shell_window)
{
EShellWindowPrivate *priv = shell_window->priv;
g_hash_table_destroy (priv->loaded_views);
}
void
e_shell_window_switch_to_view (EShellWindow *shell_window,
const gchar *view_name)
{
GtkNotebook *notebook;
EShellView *shell_view;
gint page_num;
g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
g_return_if_fail (view_name != NULL);
shell_view = e_shell_window_get_shell_view (shell_window, view_name);
page_num = e_shell_view_get_page_num (shell_view);
g_return_if_fail (page_num >= 0);
notebook = GTK_NOTEBOOK (shell_window->priv->content_notebook);
gtk_notebook_set_current_page (notebook, page_num);
notebook = GTK_NOTEBOOK (shell_window->priv->sidebar_notebook);
gtk_notebook_set_current_page (notebook, page_num);
notebook = GTK_NOTEBOOK (shell_window->priv->status_notebook);
gtk_notebook_set_current_page (notebook, page_num);
shell_window->priv->active_view = view_name;
g_object_notify (G_OBJECT (shell_window), "active-view");
e_shell_window_update_icon (shell_window);
e_shell_window_update_title (shell_window);
e_shell_window_update_new_menu (shell_window);
e_shell_window_update_view_menu (shell_window);
e_shell_window_update_search_menu (shell_window);
e_shell_view_update_actions (shell_view);
}
void
e_shell_window_update_icon (EShellWindow *shell_window)
{
EShellView *shell_view;
GtkAction *action;
const gchar *view_name;
gchar *icon_name = NULL;
g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
view_name = e_shell_window_get_active_view (shell_window);
shell_view = e_shell_window_get_shell_view (shell_window, view_name);
action = e_shell_view_get_action (shell_view);
g_object_get (action, "icon-name", &icon_name, NULL);
gtk_window_set_icon_name (GTK_WINDOW (shell_window), icon_name);
g_free (icon_name);
}
void
e_shell_window_update_title (EShellWindow *shell_window)
{
EShellView *shell_view;
const gchar *view_title;
const gchar *view_name;
gchar *window_title;
g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
view_name = e_shell_window_get_active_view (shell_window);
shell_view = e_shell_window_get_shell_view (shell_window, view_name);
view_title = e_shell_view_get_title (shell_view);
/* Translators: This is used for the main window title. */
window_title = g_strdup_printf (_("%s - Evolution"), view_title);
gtk_window_set_title (GTK_WINDOW (shell_window), window_title);
g_free (window_title);
}
void
e_shell_window_update_new_menu (EShellWindow *shell_window)
{
GtkWidget *menu;
GtkWidget *widget;
const gchar *path;
g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
/* 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);
}