[evolution] Bug #668482 - Edit account properties from menu on folder store



commit 3ec164d12e61102c0e3ce5271d5cb6ad7be6e4a6
Author: Milan Crha <mcrha redhat com>
Date:   Thu Feb 16 13:04:47 2012 +0100

    Bug #668482 - Edit account properties from menu on folder store

 modules/mail/e-mail-shell-backend.c      |  149 +++++++++++++++++++++++-------
 modules/mail/e-mail-shell-backend.h      |   12 ++-
 modules/mail/e-mail-shell-view-actions.c |   42 +++++++++
 modules/mail/e-mail-shell-view-actions.h |    2 +
 modules/mail/e-mail-shell-view.c         |    4 +
 modules/mail/em-account-prefs.c          |   75 +--------------
 ui/evolution-mail.ui                     |    1 +
 7 files changed, 178 insertions(+), 107 deletions(-)
---
diff --git a/modules/mail/e-mail-shell-backend.c b/modules/mail/e-mail-shell-backend.c
index 68ed9c3..2012b25 100644
--- a/modules/mail/e-mail-shell-backend.c
+++ b/modules/mail/e-mail-shell-backend.c
@@ -76,6 +76,7 @@ struct _EMailShellBackendPrivate {
 	gint mail_sync_in_progress;
 	guint mail_sync_source_id;
 	gpointer assistant; /* weak pointer, when adding new mail account */
+	gpointer editor;    /* weak pointer, when editing a mail account */
 };
 
 static void mbox_create_preview_cb (GObject *preview, GtkWidget **preview_widget);
@@ -165,7 +166,6 @@ action_mail_account_new_cb (GtkAction *action,
 {
 	EShell *shell;
 	EShellBackend *shell_backend;
-	EMailShellBackend *backend;
 
 	g_return_if_fail (shell_window != NULL);
 
@@ -173,37 +173,9 @@ action_mail_account_new_cb (GtkAction *action,
 	shell_backend = e_shell_get_backend_by_name (shell, BACKEND_NAME);
 	g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (shell_backend));
 
-	backend = E_MAIL_SHELL_BACKEND (shell_backend);
-	if (backend->priv->assistant) {
-		gtk_window_present (GTK_WINDOW (backend->priv->assistant));
-	} else {
-		EMAccountEditor *emae;
-		GtkWindow *parent = GTK_WINDOW (shell_window);
-
-		if (!e_shell_get_express_mode (shell)) {
-			/** @HookPoint-EMConfig: New Mail Account Assistant
-			 * @Id: org.gnome.evolution.mail.config.accountAssistant
-			 * @Type: E_CONFIG_ASSISTANT
-			 * @Class: org.gnome.evolution.mail.config:1.0
-			 * @Target: EMConfigTargetAccount
-			 *
-			 * The new mail account assistant.
-			 */
-			emae = em_account_editor_new (
-				NULL, EMAE_ASSISTANT, E_MAIL_BACKEND (backend),
-				"org.gnome.evolution.mail.config.accountAssistant");
-			e_config_create_window (
-				E_CONFIG (emae->config), NULL,
-				_("Evolution Account Assistant"));
-			backend->priv->assistant = E_CONFIG (emae->config)->window;
-		} else {
-			backend->priv->assistant = mail_capplet_shell_new (0, TRUE, FALSE);
-		}
-
-		g_object_add_weak_pointer (G_OBJECT (backend->priv->assistant), &backend->priv->assistant);
-		gtk_window_set_transient_for (GTK_WINDOW (backend->priv->assistant), parent);
-		gtk_widget_show (backend->priv->assistant);
-	}
+	e_mail_shell_backend_new_account (
+		E_MAIL_SHELL_BACKEND (shell_backend),
+		GTK_WINDOW (shell_window));
 }
 
 static void
@@ -641,6 +613,29 @@ mail_shell_backend_empty_trash_policy_decision (EMailBackend *backend)
 }
 
 static void
+mail_shell_backend_dispose (GObject *object)
+{
+	EMailShellBackendPrivate *priv;
+
+	priv = E_MAIL_SHELL_BACKEND (object)->priv;
+
+	if (priv->assistant != NULL) {
+		g_object_remove_weak_pointer (
+			G_OBJECT (priv->assistant), &priv->assistant);
+		priv->assistant = NULL;
+	}
+
+	if (priv->editor != NULL) {
+		g_object_remove_weak_pointer (
+			G_OBJECT (priv->editor), &priv->editor);
+		priv->editor = NULL;
+	}
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (e_mail_shell_backend_parent_class)->dispose (object);
+}
+
+static void
 e_mail_shell_backend_class_init (EMailShellBackendClass *class)
 {
 	GObjectClass *object_class;
@@ -651,6 +646,7 @@ e_mail_shell_backend_class_init (EMailShellBackendClass *class)
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->constructed = mail_shell_backend_constructed;
+	object_class->dispose = mail_shell_backend_dispose;
 
 	shell_backend_class = E_SHELL_BACKEND_CLASS (class);
 	shell_backend_class->shell_view_type = E_TYPE_MAIL_SHELL_VIEW;
@@ -689,6 +685,95 @@ e_mail_shell_backend_type_register (GTypeModule *type_module)
 	e_mail_shell_backend_register_type (type_module);
 }
 
+void
+e_mail_shell_backend_new_account (EMailShellBackend *mail_shell_backend,
+				  GtkWindow *parent)
+{
+	EMailShellBackendPrivate *priv;
+
+	g_return_if_fail (mail_shell_backend != NULL);
+	g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (mail_shell_backend));
+
+	priv = mail_shell_backend->priv;
+
+	if (priv->assistant) {
+		gtk_window_present (GTK_WINDOW (priv->assistant));
+	} else {
+		EMAccountEditor *emae;
+		EShell *shell;
+
+		shell = e_shell_backend_get_shell (E_SHELL_BACKEND (mail_shell_backend));
+
+		if (!e_shell_get_express_mode (shell)) {
+			/** @HookPoint-EMConfig: New Mail Account Assistant
+			 * @Id: org.gnome.evolution.mail.config.accountAssistant
+			 * @Type: E_CONFIG_ASSISTANT
+			 * @Class: org.gnome.evolution.mail.config:1.0
+			 * @Target: EMConfigTargetAccount
+			 *
+			 * The new mail account assistant.
+			 */
+			emae = em_account_editor_new (
+				NULL, EMAE_ASSISTANT, E_MAIL_BACKEND (mail_shell_backend),
+				"org.gnome.evolution.mail.config.accountAssistant");
+			e_config_create_window (
+				E_CONFIG (emae->config), NULL,
+				_("Evolution Account Assistant"));
+			priv->assistant = E_CONFIG (emae->config)->window;
+			g_object_set_data_full (
+				G_OBJECT (priv->assistant), "AccountEditor",
+				emae, (GDestroyNotify) g_object_unref);
+		} else {
+			priv->assistant = mail_capplet_shell_new (0, TRUE, FALSE);
+		}
+
+		g_object_add_weak_pointer (G_OBJECT (priv->assistant), &priv->assistant);
+		gtk_window_set_transient_for (GTK_WINDOW (priv->assistant), parent);
+		gtk_widget_show (priv->assistant);
+	}
+}
+
+void
+e_mail_shell_backend_edit_account (EMailShellBackend *mail_shell_backend,
+				   GtkWindow *parent,
+				   EAccount *account)
+{
+	EMailShellBackendPrivate *priv;
+	EMAccountEditor *emae;
+
+	g_return_if_fail (mail_shell_backend != NULL);
+	g_return_if_fail (E_IS_MAIL_SHELL_BACKEND (mail_shell_backend));
+	g_return_if_fail (account != NULL);
+
+	priv = mail_shell_backend->priv;
+
+	if (priv->editor != NULL) {
+		gtk_window_present (GTK_WINDOW (priv->editor));
+		return;
+	}
+
+	/** @HookPoint-EMConfig: Mail Account Editor
+	 * @Id: org.gnome.evolution.mail.config.accountEditor
+	 * @Type: E_CONFIG_BOOK
+	 * @Class: org.gnome.evolution.mail.config:1.0
+	 * @Target: EMConfigTargetAccount
+	 *
+	 * The account editor window.
+	 */
+	emae = em_account_editor_new (
+		account, EMAE_NOTEBOOK, E_MAIL_BACKEND (mail_shell_backend),
+		"org.gnome.evolution.mail.config.accountEditor");
+	e_config_create_window (
+		E_CONFIG (emae->config), parent, _("Account Editor"));
+	priv->editor = E_CONFIG (emae->config)->window;
+	g_object_set_data_full (
+		G_OBJECT (priv->editor), "AccountEditor",
+		emae, (GDestroyNotify) g_object_unref);
+
+	g_object_add_weak_pointer (G_OBJECT (priv->editor), &priv->editor);
+	gtk_widget_show (priv->editor);
+}
+
 /******************* Code below here belongs elsewhere. *******************/
 
 #include "filter/e-filter-option.h"
diff --git a/modules/mail/e-mail-shell-backend.h b/modules/mail/e-mail-shell-backend.h
index 9d9a8e1..c9c23d0 100644
--- a/modules/mail/e-mail-shell-backend.h
+++ b/modules/mail/e-mail-shell-backend.h
@@ -22,6 +22,7 @@
 #ifndef E_MAIL_SHELL_BACKEND_H
 #define E_MAIL_SHELL_BACKEND_H
 
+#include <libedataserver/e-account.h>
 #include <mail/e-mail-backend.h>
 
 /* Standard GObject macros */
@@ -58,9 +59,14 @@ struct _EMailShellBackendClass {
 	EMailBackendClass parent_class;
 };
 
-GType		e_mail_shell_backend_get_type	(void);
-void		e_mail_shell_backend_type_register
-						(GTypeModule *type_module);
+GType		e_mail_shell_backend_get_type		(void);
+void		e_mail_shell_backend_type_register	(GTypeModule *type_module);
+
+void		e_mail_shell_backend_new_account	(EMailShellBackend *mail_shell_backend,
+							 GtkWindow *parent);
+void		e_mail_shell_backend_edit_account	(EMailShellBackend *mail_shell_backend,
+							 GtkWindow *parent,
+							 EAccount *account);
 
 /* XXX Find a better place for this function. */
 GSList *	e_mail_labels_get_filter_options (void);
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 407f17e..c5c51a7 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -114,6 +114,37 @@ action_mail_account_disable_cb (GtkAction *action,
 }
 
 static void
+action_mail_account_properties_cb (GtkAction *action,
+				   EMailShellView *mail_shell_view)
+{
+	EMailShellSidebar *mail_shell_sidebar;
+	EShellView *shell_view;
+	EShellWindow *shell_window;
+	EShellBackend *shell_backend;
+	EMFolderTree *folder_tree;
+	CamelService *service;
+	CamelStore *store;
+	const gchar *uid;
+
+	mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
+
+	shell_view = E_SHELL_VIEW (mail_shell_view);
+	shell_backend = e_shell_view_get_shell_backend (shell_view);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+
+	folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
+	store = em_folder_tree_get_selected_store (folder_tree);
+	g_return_if_fail (store != NULL);
+
+	service = CAMEL_SERVICE (store);
+	uid = camel_service_get_uid (service);
+
+	e_mail_shell_backend_edit_account (E_MAIL_SHELL_BACKEND (shell_backend),
+		GTK_WINDOW (shell_window),
+		e_get_account_by_uid (uid));
+}
+
+static void
 action_mail_create_search_folder_cb (GtkAction *action,
                                      EMailShellView *mail_shell_view)
 {
@@ -1158,6 +1189,13 @@ static GtkActionEntry mail_entries[] = {
 	  N_("Permanently remove all the deleted messages from all folders"),
 	  G_CALLBACK (action_mail_folder_expunge_cb) },
 
+	{ "mail-account-properties",
+	  GTK_STOCK_PROPERTIES,
+	  N_("_Properties"),
+	  NULL,
+	  N_("Edit properties of this account"),
+	  G_CALLBACK (action_mail_account_properties_cb) },
+
 	{ "mail-download",
 	  NULL,
 	  N_("_Download Messages for Offline Usage"),
@@ -1421,6 +1459,10 @@ static EPopupActionEntry mail_popup_entries[] = {
 	  NULL,
 	  "mail-account-expunge" },
 
+	{ "mail-popup-account-properties",
+	  NULL,
+	  "mail-account-properties" },
+
 	{ "mail-popup-flush-outbox",
 	  NULL,
 	  "mail-flush-outbox" },
diff --git a/modules/mail/e-mail-shell-view-actions.h b/modules/mail/e-mail-shell-view-actions.h
index c6ca167..ac682b3 100644
--- a/modules/mail/e-mail-shell-view-actions.h
+++ b/modules/mail/e-mail-shell-view-actions.h
@@ -29,6 +29,8 @@
 	E_SHELL_WINDOW_ACTION ((window), "mail-account-disable")
 #define E_SHELL_WINDOW_ACTION_MAIL_ACCOUNT_EXPUNGE(window) \
 	E_SHELL_WINDOW_ACTION ((window), "mail-account-expunge")
+#define E_SHELL_WINDOW_ACTION_MAIL_ACCOUNT_PROPERTIES(window) \
+	E_SHELL_WINDOW_ACTION ((window), "mail-account-properties")
 #define E_SHELL_WINDOW_ACTION_MAIL_ADD_SENDER(window) \
 	E_SHELL_WINDOW_ACTION ((window), "mail-add-sender")
 #define E_SHELL_WINDOW_ACTION_MAIL_CARET_MODE(window) \
diff --git a/modules/mail/e-mail-shell-view.c b/modules/mail/e-mail-shell-view.c
index 9929d8a..f0661cf 100644
--- a/modules/mail/e-mail-shell-view.c
+++ b/modules/mail/e-mail-shell-view.c
@@ -952,6 +952,10 @@ mail_shell_view_update_actions (EShellView *shell_view)
 	sensitive = folder_is_trash;
 	gtk_action_set_sensitive (action, sensitive);
 
+	action = ACTION (MAIL_ACCOUNT_PROPERTIES);
+	sensitive = account != NULL;
+	gtk_action_set_sensitive (action, sensitive);
+
 	action = ACTION (MAIL_FLUSH_OUTBOX);
 	sensitive = folder_is_outbox;
 	gtk_action_set_sensitive (action, sensitive);
diff --git a/modules/mail/em-account-prefs.c b/modules/mail/em-account-prefs.c
index c6b132e..08434d1 100644
--- a/modules/mail/em-account-prefs.c
+++ b/modules/mail/em-account-prefs.c
@@ -30,6 +30,7 @@
 #endif
 
 #include "em-account-prefs.h"
+#include "e-mail-shell-backend.h"
 
 #include <glib/gi18n.h>
 
@@ -54,8 +55,6 @@
 
 struct _EMAccountPrefsPrivate {
 	EMailBackend *backend;
-	gpointer assistant; /* weak pointer */
-	gpointer editor;    /* weak pointer */
 };
 
 enum {
@@ -142,18 +141,6 @@ account_prefs_dispose (GObject *object)
 		priv->backend = NULL;
 	}
 
-	if (priv->assistant != NULL) {
-		g_object_remove_weak_pointer (
-			G_OBJECT (priv->assistant), &priv->assistant);
-		priv->assistant = NULL;
-	}
-
-	if (priv->editor != NULL) {
-		g_object_remove_weak_pointer (
-			G_OBJECT (priv->editor), &priv->editor);
-		priv->editor = NULL;
-	}
-
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (em_account_prefs_parent_class)->dispose (object);
 }
@@ -179,45 +166,14 @@ static void
 account_prefs_add_account (EMailAccountManager *manager)
 {
 	EMAccountPrefsPrivate *priv;
-	EMAccountEditor *emae;
 	gpointer parent;
 
 	priv = EM_ACCOUNT_PREFS_GET_PRIVATE (manager);
 
-	if (priv->assistant != NULL) {
-		gtk_window_present (GTK_WINDOW (priv->assistant));
-		return;
-	}
-
 	parent = gtk_widget_get_toplevel (GTK_WIDGET (manager));
 	parent = gtk_widget_is_toplevel (parent) ? parent : NULL;
 
-	if (!e_shell_get_express_mode (e_shell_get_default ())) {
-		/** @HookPoint-EMConfig: New Mail Account Assistant
-		 * @Id: org.gnome.evolution.mail.config.accountAssistant
-		 * @Type: E_CONFIG_ASSISTANT
-		 * @Class: org.gnome.evolution.mail.config:1.0
-		 * @Target: EMConfigTargetAccount
-		 *
-		 * The new mail account assistant.
-		 */
-		emae = em_account_editor_new (
-			NULL, EMAE_ASSISTANT, priv->backend,
-			"org.gnome.evolution.mail.config.accountAssistant");
-		e_config_create_window (
-			E_CONFIG (emae->config), NULL,
-			_("Evolution Account Assistant"));
-		priv->assistant = E_CONFIG (emae->config)->window;
-		g_object_set_data_full (
-			G_OBJECT (priv->assistant), "AccountEditor",
-			emae, (GDestroyNotify) g_object_unref);
-	} else {
-		priv->assistant = mail_capplet_shell_new (0, TRUE, FALSE);
-	}
-
-	g_object_add_weak_pointer (G_OBJECT (priv->assistant), &priv->assistant);
-	gtk_window_set_transient_for (GTK_WINDOW (priv->assistant), parent);
-	gtk_widget_show (priv->assistant);
+	e_mail_shell_backend_new_account (E_MAIL_SHELL_BACKEND (priv->backend), parent);
 }
 
 static void
@@ -225,39 +181,14 @@ account_prefs_edit_account (EMailAccountManager *manager,
                             EAccount *account)
 {
 	EMAccountPrefsPrivate *priv;
-	EMAccountEditor *emae;
 	gpointer parent;
 
 	priv = EM_ACCOUNT_PREFS_GET_PRIVATE (manager);
 
-	if (priv->editor != NULL) {
-		gtk_window_present (GTK_WINDOW (priv->editor));
-		return;
-	}
-
 	parent = gtk_widget_get_toplevel (GTK_WIDGET (manager));
 	parent = gtk_widget_is_toplevel (parent) ? parent : NULL;
 
-	/** @HookPoint-EMConfig: Mail Account Editor
-	 * @Id: org.gnome.evolution.mail.config.accountEditor
-	 * @Type: E_CONFIG_BOOK
-	 * @Class: org.gnome.evolution.mail.config:1.0
-	 * @Target: EMConfigTargetAccount
-	 *
-	 * The account editor window.
-	 */
-	emae = em_account_editor_new (
-		account, EMAE_NOTEBOOK, priv->backend,
-		"org.gnome.evolution.mail.config.accountEditor");
-	e_config_create_window (
-		E_CONFIG (emae->config), parent, _("Account Editor"));
-	priv->editor = E_CONFIG (emae->config)->window;
-	g_object_set_data_full (
-		G_OBJECT (priv->editor), "AccountEditor",
-		emae, (GDestroyNotify) g_object_unref);
-
-	g_object_add_weak_pointer (G_OBJECT (priv->editor), &priv->editor);
-	gtk_widget_show (priv->editor);
+	e_mail_shell_backend_edit_account (E_MAIL_SHELL_BACKEND (priv->backend), parent, account);
 }
 
 static void
diff --git a/ui/evolution-mail.ui b/ui/evolution-mail.ui
index 3f81803..d1030ff 100644
--- a/ui/evolution-mail.ui
+++ b/ui/evolution-mail.ui
@@ -99,6 +99,7 @@
     <separator/>
     <menuitem action='mail-popup-folder-unsubscribe'/>
     <separator/>
+    <menuitem action='mail-popup-account-properties'/>
     <menuitem action='mail-popup-folder-properties'/>
   </popup>
   <popup name='mail-message-popup'>



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