[evolution] Bug 650587 - Hide Search Folder actions when Search Folders are disabled



commit 9aa668aa6bf612673ad7e760b06fc62350be041e
Author: Matthew Barnes <mbarnes redhat com>
Date:   Fri May 20 18:33:11 2011 -0400

    Bug 650587 - Hide Search Folder actions when Search Folders are disabled
    
    Add an action group for Search Folders to EMailReader.  The action
    group's visibility is bound to the "mail-enable-search-folders" setting,
    so that menu items related to Search Folders are hidden when Search
    Folders are disabled in GConf.
    
    Affected menu items are:
    
       Edit -> Search Folders
       Message -> Create Rule -> Search Folder from Subject...
       Message -> Create Rule -> Search Folder from Sender...
       Message -> Create Rule -> Search Folder from Recipients...
       Message -> Create Rule -> Search Folder from Mailing List...
       Search -> Create Search Folder From Search...

 mail/e-mail-browser.c                    |   48 +++++++++++------
 mail/e-mail-notebook-view.c              |    3 +
 mail/e-mail-paned-view.c                 |    3 +
 mail/e-mail-reader.c                     |   84 +++++++++++++++++-------------
 mail/e-mail-reader.h                     |    1 +
 modules/mail/e-mail-config-reader.c      |   30 +++++++++--
 modules/mail/e-mail-shell-content.c      |    3 +
 modules/mail/e-mail-shell-view-actions.c |   37 ++++++++-----
 modules/mail/e-mail-shell-view-actions.h |    2 +
 modules/mail/e-mail-shell-view-private.c |    1 +
 10 files changed, 141 insertions(+), 71 deletions(-)
---
diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
index 6e0a18f..63bfb4d 100644
--- a/mail/e-mail-browser.c
+++ b/mail/e-mail-browser.c
@@ -43,11 +43,13 @@
 
 #define MAIL_BROWSER_GCONF_PREFIX "/apps/evolution/mail/mail_browser"
 
+#define ACTION_GROUP_STANDARD		"action-group-standard"
+#define ACTION_GROUP_SEARCH_FOLDERS	"action-group-search-folders"
+
 struct _EMailBrowserPrivate {
 	EMailBackend *backend;
 	GtkUIManager *ui_manager;
 	EFocusTracker *focus_tracker;
-	GtkActionGroup *action_group;
 	EMFormatHTMLDisplay *formatter;
 
 	GtkWidget *main_menu;
@@ -485,11 +487,6 @@ mail_browser_dispose (GObject *object)
 		priv->focus_tracker = NULL;
 	}
 
-	if (priv->action_group != NULL) {
-		g_object_unref (priv->action_group);
-		priv->action_group = NULL;
-	}
-
 	if (priv->formatter != NULL) {
 		g_object_unref (priv->formatter);
 		priv->formatter = NULL;
@@ -598,9 +595,11 @@ mail_browser_constructed (GObject *object)
 		web_view, "status-message",
 		G_CALLBACK (mail_browser_status_message_cb), object);
 
+	/* Add action groups before initializing the reader interface. */
+
 	e_mail_reader_init (reader, TRUE, TRUE);
 
-	action_group = priv->action_group;
+	action_group = gtk_action_group_new (ACTION_GROUP_STANDARD);
 	gtk_action_group_set_translation_domain (action_group, domain);
 	gtk_action_group_add_actions (
 		action_group, mail_browser_entries,
@@ -610,6 +609,20 @@ mail_browser_constructed (GObject *object)
 		G_N_ELEMENTS (mail_browser_popup_entries));
 	gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
 
+	/* For easy access.  Takes ownership of the reference. */
+	g_object_set_data_full (
+		object, ACTION_GROUP_STANDARD,
+		action_group, (GDestroyNotify) g_object_unref);
+
+	action_group = gtk_action_group_new (ACTION_GROUP_SEARCH_FOLDERS);
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+
+	/* For easy access.  Takes ownership of the reference. */
+	g_object_set_data_full (
+		object, ACTION_GROUP_SEARCH_FOLDERS,
+		action_group, (GDestroyNotify) g_object_unref);
+
 	e_ui_manager_add_ui_from_file (
 		E_UI_MANAGER (ui_manager), E_MAIL_READER_UI_DEFINITION);
 	e_ui_manager_add_ui_from_string (
@@ -628,13 +641,13 @@ mail_browser_constructed (GObject *object)
 	/* Configure an EFocusTracker to manage selection actions. */
 
 	focus_tracker = e_focus_tracker_new (GTK_WINDOW (object));
-	action = gtk_action_group_get_action (action_group, "cut-clipboard");
+	action = e_mail_reader_get_action (reader, "cut-clipboard");
 	e_focus_tracker_set_cut_clipboard_action (focus_tracker, action);
-	action = gtk_action_group_get_action (action_group, "copy-clipboard");
+	action = e_mail_reader_get_action (reader, "copy-clipboard");
 	e_focus_tracker_set_copy_clipboard_action (focus_tracker, action);
-	action = gtk_action_group_get_action (action_group, "paste-clipboard");
+	action = e_mail_reader_get_action (reader, "paste-clipboard");
 	e_focus_tracker_set_paste_clipboard_action (focus_tracker, action);
-	action = gtk_action_group_get_action (action_group, "select-all");
+	action = e_mail_reader_get_action (reader, "select-all");
 	e_focus_tracker_set_select_all_action (focus_tracker, action);
 	priv->focus_tracker = focus_tracker;
 
@@ -745,16 +758,20 @@ static GtkActionGroup *
 mail_browser_get_action_group (EMailReader *reader,
                                EMailReaderActionGroup group)
 {
-	EMailBrowserPrivate *priv;
-
-	priv = E_MAIL_BROWSER (reader)->priv;
+	const gchar *group_name;
 
 	switch (group) {
 		case E_MAIL_READER_ACTION_GROUP_STANDARD:
-			return priv->action_group;
+			group_name = ACTION_GROUP_STANDARD;
+			break;
+		case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
+			group_name = ACTION_GROUP_SEARCH_FOLDERS;
+			break;
 		default:
 			g_return_val_if_reached (NULL);
 	}
+
+	return g_object_get_data (G_OBJECT (reader), group_name);
 }
 
 static EAlertSink *
@@ -959,7 +976,6 @@ e_mail_browser_init (EMailBrowser *browser)
 	browser->priv = G_TYPE_INSTANCE_GET_PRIVATE (
 		browser, E_TYPE_MAIL_BROWSER, EMailBrowserPrivate);
 
-	browser->priv->action_group = gtk_action_group_new ("mail-browser");
 	browser->priv->formatter = em_format_html_display_new ();
 
 	bridge = gconf_bridge_get ();
diff --git a/mail/e-mail-notebook-view.c b/mail/e-mail-notebook-view.c
index d72016d..74b9ead 100644
--- a/mail/e-mail-notebook-view.c
+++ b/mail/e-mail-notebook-view.c
@@ -792,6 +792,9 @@ mail_notebook_view_get_action_group (EMailReader *reader,
 		case E_MAIL_READER_ACTION_GROUP_STANDARD:
 			group_name = "mail";
 			break;
+		case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
+			group_name = "search-folders";
+			break;
 		default:
 			g_return_val_if_reached (NULL);
 	}
diff --git a/mail/e-mail-paned-view.c b/mail/e-mail-paned-view.c
index d95fca1..6d38100 100644
--- a/mail/e-mail-paned-view.c
+++ b/mail/e-mail-paned-view.c
@@ -382,6 +382,9 @@ mail_paned_view_get_action_group (EMailReader *reader,
 		case E_MAIL_READER_ACTION_GROUP_STANDARD:
 			group_name = "mail";
 			break;
+		case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
+			group_name = "search-folders";
+			break;
 		default:
 			g_return_val_if_reached (NULL);
 	}
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 1697db9..bbbcfab 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -2108,34 +2108,6 @@ static GtkActionEntry mail_reader_entries[] = {
 	  N_("Save selected messages as an mbox file"),
 	  G_CALLBACK (action_mail_save_as_cb) },
 
-	{ "mail-search-folder-from-mailing-list",
-	  NULL,
-	  N_("Search Folder from Mailing _List..."),
-	  NULL,
-	  N_("Create a search folder for this mailing list"),
-	  G_CALLBACK (action_mail_search_folder_from_mailing_list_cb) },
-
-	{ "mail-search-folder-from-recipients",
-	  NULL,
-	  N_("Search Folder from Recipien_ts..."),
-	  NULL,
-	  N_("Create a search folder for these recipients"),
-	  G_CALLBACK (action_mail_search_folder_from_recipients_cb) },
-
-	{ "mail-search-folder-from-sender",
-	  NULL,
-	  N_("Search Folder from Sen_der..."),
-	  NULL,
-	  N_("Create a search folder for this sender"),
-	  G_CALLBACK (action_mail_search_folder_from_sender_cb) },
-
-	{ "mail-search-folder-from-subject",
-	  NULL,
-	  N_("Search Folder from S_ubject..."),
-	  NULL,
-	  N_("Create a search folder for this subject"),
-	  G_CALLBACK (action_mail_search_folder_from_subject_cb) },
-
 	{ "mail-show-source",
 	  NULL,
 	  N_("_Message Source"),
@@ -2237,6 +2209,37 @@ static GtkActionEntry mail_reader_entries[] = {
 	  NULL }
 };
 
+static GtkActionEntry mail_reader_search_folder_entries[] = {
+
+	{ "mail-search-folder-from-mailing-list",
+	  NULL,
+	  N_("Search Folder from Mailing _List..."),
+	  NULL,
+	  N_("Create a search folder for this mailing list"),
+	  G_CALLBACK (action_mail_search_folder_from_mailing_list_cb) },
+
+	{ "mail-search-folder-from-recipients",
+	  NULL,
+	  N_("Search Folder from Recipien_ts..."),
+	  NULL,
+	  N_("Create a search folder for these recipients"),
+	  G_CALLBACK (action_mail_search_folder_from_recipients_cb) },
+
+	{ "mail-search-folder-from-sender",
+	  NULL,
+	  N_("Search Folder from Sen_der..."),
+	  NULL,
+	  N_("Create a search folder for this sender"),
+	  G_CALLBACK (action_mail_search_folder_from_sender_cb) },
+
+	{ "mail-search-folder-from-subject",
+	  NULL,
+	  N_("Search Folder from S_ubject..."),
+	  NULL,
+	  N_("Create a search folder for this subject"),
+	  G_CALLBACK (action_mail_search_folder_from_subject_cb) },
+};
+
 static EPopupActionEntry mail_reader_popup_entries[] = {
 
 	{ "mail-popup-copy",
@@ -3200,15 +3203,12 @@ mail_reader_update_actions (EMailReader *reader,
 }
 
 static void
-mail_reader_init_charset_actions (EMailReader *reader)
+mail_reader_init_charset_actions (EMailReader *reader,
+                                  GtkActionGroup *action_group)
 {
-	GtkActionGroup *action_group;
 	GtkRadioAction *default_action;
 	GSList *radio_group;
 
-	action_group = e_mail_reader_get_action_group (
-		reader, E_MAIL_READER_ACTION_GROUP_STANDARD);
-
 	radio_group = e_charset_add_radio_actions (
 		action_group, "mail-charset-", NULL,
 		G_CALLBACK (action_mail_charset_cb), reader);
@@ -3383,6 +3383,8 @@ e_mail_reader_init (EMailReader *reader,
 	if (!init_actions)
 		goto connect_signals;
 
+	/* Add the "standard" EMailReader actions. */
+
 	action_group = e_mail_reader_get_action_group (
 		reader, E_MAIL_READER_ACTION_GROUP_STANDARD);
 
@@ -3403,7 +3405,7 @@ e_mail_reader_init (EMailReader *reader,
 	gtk_action_group_add_action_with_accel (
 		action_group, GTK_ACTION (menu_tool_action), "<Control>f");
 
-	/* Likewise the "mail-reply-group" action */
+	/* Likewise the "mail-reply-group" action. */
 
         /* For Translators: "Group Reply" will reply either to a mailing list
 	   (if possible and if that configuration option is enabled), or else
@@ -3424,8 +3426,6 @@ e_mail_reader_init (EMailReader *reader,
 		action_group, GTK_ACTION (menu_tool_action), "<Control>g");
 
 	/* Add the other actions the normal way. */
-
-	gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
 	gtk_action_group_add_actions (
 		action_group, mail_reader_entries,
 		G_N_ELEMENTS (mail_reader_entries), reader);
@@ -3436,7 +3436,17 @@ e_mail_reader_init (EMailReader *reader,
 		action_group, mail_reader_toggle_entries,
 		G_N_ELEMENTS (mail_reader_toggle_entries), reader);
 
-	mail_reader_init_charset_actions (reader);
+	mail_reader_init_charset_actions (reader, action_group);
+
+	/* Add EMailReader actions for Search Folders.  The action group
+	 * should be made invisible if Search Folders are disabled. */
+
+	action_group = e_mail_reader_get_action_group (
+		reader, E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS);
+
+	gtk_action_group_add_actions (
+		action_group, mail_reader_search_folder_entries,
+		G_N_ELEMENTS (mail_reader_search_folder_entries), reader);
 
 	/* Bind GObject properties to GConf keys. */
 
diff --git a/mail/e-mail-reader.h b/mail/e-mail-reader.h
index ea6732a..f4df175 100644
--- a/mail/e-mail-reader.h
+++ b/mail/e-mail-reader.h
@@ -62,6 +62,7 @@ typedef struct _EMailReaderInterface EMailReaderInterface;
 
 typedef enum {
 	E_MAIL_READER_ACTION_GROUP_STANDARD,
+	E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS,
 	E_MAIL_READER_NUM_ACTION_GROUPS
 } EMailReaderActionGroup;
 
diff --git a/modules/mail/e-mail-config-reader.c b/modules/mail/e-mail-config-reader.c
index a13f0bf..5aea86b 100644
--- a/modules/mail/e-mail-config-reader.c
+++ b/modules/mail/e-mail-config-reader.c
@@ -24,15 +24,14 @@
 
 static gpointer parent_class;
 
-static void
-mail_config_reader_constructed (GObject *object)
+static gboolean
+mail_config_reader_idle_cb (EExtension *extension)
 {
-	EExtension *extension;
 	EExtensible *extensible;
+	GtkActionGroup *action_group;
 	EShellSettings *shell_settings;
 	EShell *shell;
 
-	extension = E_EXTENSION (object);
 	extensible = e_extension_get_extensible (extension);
 
 	shell = e_shell_get_default ();
@@ -48,6 +47,29 @@ mail_config_reader_constructed (GObject *object)
 		extensible, "reply-style",
 		G_BINDING_SYNC_CREATE);
 
+	action_group = e_mail_reader_get_action_group (
+		E_MAIL_READER (extensible),
+		E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS);
+
+	g_object_bind_property (
+		shell_settings, "mail-enable-search-folders",
+		action_group, "visible",
+		G_BINDING_SYNC_CREATE);
+
+	return FALSE;
+}
+
+static void
+mail_config_reader_constructed (GObject *object)
+{
+	/* Bind properties to settings from an idle callback so the
+	 * EMailReader interface has a chance to be initialized first. */
+	g_idle_add_full (
+		G_PRIORITY_DEFAULT_IDLE,
+		(GSourceFunc) mail_config_reader_idle_cb,
+		g_object_ref (object),
+		(GDestroyNotify) g_object_unref);
+
 	/* Chain up to parent's constructed() method. */
 	G_OBJECT_CLASS (parent_class)->constructed (object);
 }
diff --git a/modules/mail/e-mail-shell-content.c b/modules/mail/e-mail-shell-content.c
index 30c8422..5657db1 100644
--- a/modules/mail/e-mail-shell-content.c
+++ b/modules/mail/e-mail-shell-content.c
@@ -264,6 +264,9 @@ mail_shell_content_get_action_group (EMailReader *reader,
 		case E_MAIL_READER_ACTION_GROUP_STANDARD:
 			group_name = "mail";
 			break;
+		case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
+			group_name = "search-folders";
+			break;
 		default:
 			g_return_val_if_reached (NULL);
 	}
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 9009639..f5c5524 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -1117,13 +1117,6 @@ static GtkActionEntry mail_entries[] = {
 	  N_("Permanently remove all the deleted messages from all folders"),
 	  G_CALLBACK (action_mail_folder_expunge_cb) },
 
-	{ "mail-create-search-folder",
-	  NULL,
-	  N_("C_reate Search Folder From Search..."),
-	  NULL,
-	  NULL,  /* XXX Add a tooltip! */
-	  G_CALLBACK (action_mail_create_search_folder_cb) },
-
 	{ "mail-download",
 	  NULL,
 	  N_("_Download Messages for Offline Usage"),
@@ -1329,13 +1322,6 @@ static GtkActionEntry mail_entries[] = {
 	  N_("Create or edit rules for filtering new mail"),
 	  G_CALLBACK (action_mail_tools_filters_cb) },
 
-	{ "mail-tools-search-folders",
-	  NULL,
-	  N_("Search F_olders"),
-	  NULL,
-	  N_("Create or edit search folder definitions"),
-	  G_CALLBACK (action_mail_tools_search_folders_cb) },
-
 	{ "mail-tools-subscriptions",
 	  NULL,
 	  N_("_Subscriptions..."),
@@ -1367,6 +1353,23 @@ static GtkActionEntry mail_entries[] = {
 	  NULL }
 };
 
+static GtkActionEntry search_folder_entries[] = {
+
+	{ "mail-create-search-folder",
+	  NULL,
+	  N_("C_reate Search Folder From Search..."),
+	  NULL,
+	  NULL,  /* XXX Add a tooltip! */
+	  G_CALLBACK (action_mail_create_search_folder_cb) },
+
+	{ "mail-tools-search-folders",
+	  NULL,
+	  N_("Search F_olders"),
+	  NULL,
+	  N_("Create or edit search folder definitions"),
+	  G_CALLBACK (action_mail_tools_search_folders_cb) },
+};
+
 static EPopupActionEntry mail_popup_entries[] = {
 
 	{ "mail-popup-account-disable",
@@ -1666,6 +1669,12 @@ e_mail_shell_view_actions_init (EMailShellView *mail_shell_view)
 		G_N_ELEMENTS (mail_scope_entries),
 		MAIL_SCOPE_CURRENT_FOLDER, NULL, NULL);
 
+	/* Search Folder Actions */
+	action_group = ACTION_GROUP (SEARCH_FOLDERS);
+	gtk_action_group_add_actions (
+		action_group, search_folder_entries,
+		G_N_ELEMENTS (search_folder_entries), mail_shell_view);
+
 	action = ACTION (MAIL_SCOPE_ALL_ACCOUNTS);
 	combo_box = e_shell_searchbar_get_scope_combo_box (searchbar);
 	e_action_combo_box_set_action (combo_box, GTK_RADIO_ACTION (action));
diff --git a/modules/mail/e-mail-shell-view-actions.h b/modules/mail/e-mail-shell-view-actions.h
index d9b801a..c6ca167 100644
--- a/modules/mail/e-mail-shell-view-actions.h
+++ b/modules/mail/e-mail-shell-view-actions.h
@@ -259,5 +259,7 @@
 	E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-filter")
 #define E_SHELL_WINDOW_ACTION_GROUP_MAIL_LABEL(window) \
 	E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-label")
+#define E_SHELL_WINDOW_ACTION_GROUP_SEARCH_FOLDERS(window) \
+	E_SHELL_WINDOW_ACTION_GROUP ((window), "search-folders")
 
 #endif /* E_MAIL_SHELL_VIEW_ACTIONS_H */
diff --git a/modules/mail/e-mail-shell-view-private.c b/modules/mail/e-mail-shell-view-private.c
index 8cc7d45..01ceca2 100644
--- a/modules/mail/e-mail-shell-view-private.c
+++ b/modules/mail/e-mail-shell-view-private.c
@@ -644,6 +644,7 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
 	e_shell_window_add_action_group (shell_window, "mail");
 	e_shell_window_add_action_group (shell_window, "mail-filter");
 	e_shell_window_add_action_group (shell_window, "mail-label");
+	e_shell_window_add_action_group (shell_window, "search-folders");
 
 	merge_id = gtk_ui_manager_new_merge_id (ui_manager);
 	priv->label_merge_id = merge_id;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]