[evolution] Get the mailing-list-actions plugin working.



commit 016805f54d602763358da78f45b4779bd85763b1
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Sep 5 11:35:02 2009 -0400

    Get the mailing-list-actions plugin working.
    
    Also get mail-to-task working for the message browser window.
    Came up with a new technique for managing actions and action groups in
    the process.  Also gave the EMailReader interface an "update-actions"
    signal for plugins to connect to.

 configure.ac                                       |    3 +-
 mail/e-mail-browser.c                              |    6 +
 mail/e-mail-reader.c                               |  533 ++++++++++----------
 mail/e-mail-reader.h                               |    1 +
 plugins/mail-to-task/mail-to-task.c                |  135 +++--
 .../mail-to-task/org-gnome-mail-to-task.eplug.xml  |   26 +-
 plugins/mailing-list-actions/Makefile.am           |    5 +-
 .../mailing-list-actions/mailing-list-actions.c    |  262 ++++++++--
 .../org-gnome-mailing-list-actions.eplug.xml       |   92 ++--
 .../org-gnome-mailing-list-actions.xml             |   25 -
 ui/evolution-mail-reader.ui                        |    1 +
 11 files changed, 649 insertions(+), 440 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 0b601aa..1f709dc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1786,14 +1786,13 @@ plugins_experimental="$plugins_experimental_always $IPOD_SYNC $TNEF_ATTACHMENTS"
 all_plugins_experimental="$plugins_experimental_always ipod-sync tnef-attachments"
 
 dnl Temporary KILL-BONOBO hack
-enable_plugins="attachment-reminder addressbook-file audio-inline backup-restore bbdb bogo-junk-plugin caldav calendar-file calendar-http calendar-weather default-mailer default-source email-custom-header external-editor face google-account-setup hula-account-setup imap-features itip-formatter mail-notification mail-to-task mark-all-read plugin-manager prefer-plain profiler pst-import publish-calendar sa-junk-plugin save-calendar startup-wizard subject-thread templates $TNEF_ATTACHMENTS vcard-inline webdav-account-setup"
+enable_plugins="attachment-reminder addressbook-file audio-inline backup-restore bbdb bogo-junk-plugin caldav calendar-file calendar-http calendar-weather default-mailer default-source email-custom-header external-editor face google-account-setup hula-account-setup imap-features itip-formatter mailing-list-actions mail-notification mail-to-task mark-all-read plugin-manager prefer-plain profiler pst-import publish-calendar sa-junk-plugin save-calendar startup-wizard subject-thread templates $TNEF_ATTACHMENTS vcard-inline webdav-account-setup"
 
 dnl PLUGINS NOT BUILDING YET
 dnl ------------------------
 dnl exchange-operations
 dnl groupwise-features
 dnl ipod-sync
-dnl mailing-list-actions
 
 case x"$enable_plugins" in
 xno)
diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
index fb79932..ea860c0 100644
--- a/mail/e-mail-browser.c
+++ b/mail/e-mail-browser.c
@@ -26,6 +26,7 @@
 #include <camel/camel-folder.h>
 
 #include "e-util/e-util.h"
+#include "e-util/e-plugin-ui.h"
 #include "e-util/gconf-bridge.h"
 #include "shell/e-shell.h"
 
@@ -372,6 +373,7 @@ mail_browser_constructed (GObject *object)
 	GtkHTML *html;
 	const gchar *domain;
 	const gchar *key;
+	const gchar *id;
 	guint merge_id;
 
 	priv = E_MAIL_BROWSER_GET_PRIVATE (object);
@@ -479,6 +481,10 @@ mail_browser_constructed (GObject *object)
 	object = G_OBJECT (reader);
 	key = "/apps/evolution/mail/display/show_deleted";
 	gconf_bridge_bind_property (bridge, key, object, "show-deleted");
+
+	id = "org.gnome.evolution.mail.browser";
+	e_plugin_ui_register_manager (ui_manager, id, object);
+	e_plugin_ui_enable_manager (ui_manager, id);
 }
 
 static gboolean
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 96ed8cf..72f7918 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -54,6 +54,7 @@ enum {
 	CHANGED,
 	FOLDER_LOADED,
 	SHOW_SEARCH_BAR,
+	UPDATE_ACTIONS,
 	LAST_SIGNAL
 };
 
@@ -1883,6 +1884,269 @@ mail_reader_set_message (EMailReader *reader,
 }
 
 static void
+mail_reader_update_actions (EMailReader *reader)
+{
+	EShell *shell;
+	EShellBackend *shell_backend;
+	EShellSettings *shell_settings;
+	GtkAction *action;
+	GtkActionGroup *action_group;
+	const gchar *action_name;
+	gboolean sensitive;
+	guint32 state;
+
+	/* Be descriptive. */
+	gboolean any_messages_selected;
+	gboolean disable_printing;
+	gboolean enable_flag_clear;
+	gboolean enable_flag_completed;
+	gboolean enable_flag_for_followup;
+	gboolean have_an_account;
+	gboolean multiple_messages_selected;
+	gboolean selection_has_deleted_messages;
+	gboolean selection_has_important_messages;
+	gboolean selection_has_junk_messages;
+	gboolean selection_has_not_junk_messages;
+	gboolean selection_has_read_messages;
+	gboolean selection_has_undeleted_messages;
+	gboolean selection_has_unimportant_messages;
+	gboolean selection_has_unread_messages;
+	gboolean selection_is_mailing_list;
+	gboolean single_message_selected;
+
+	action_group = e_mail_reader_get_action_group (reader);
+	state = e_mail_reader_check_state (reader);
+
+	shell_backend = e_mail_reader_get_shell_backend (reader);
+	shell = e_shell_backend_get_shell (shell_backend);
+	shell_settings = e_shell_get_shell_settings (shell);
+
+	disable_printing = e_shell_settings_get_boolean (
+		shell_settings, "disable-printing");
+
+	have_an_account =
+		(state & E_MAIL_READER_HAVE_ACCOUNT);
+	single_message_selected =
+		(state & E_MAIL_READER_SELECTION_SINGLE);
+	multiple_messages_selected =
+		(state & E_MAIL_READER_SELECTION_MULTIPLE);
+	/* FIXME Missing CAN_ADD_SENDER */
+	enable_flag_clear =
+		(state & E_MAIL_READER_SELECTION_FLAG_CLEAR);
+	enable_flag_completed =
+		(state & E_MAIL_READER_SELECTION_FLAG_COMPLETED);
+	enable_flag_for_followup =
+		(state & E_MAIL_READER_SELECTION_FLAG_FOLLOWUP);
+	selection_has_deleted_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_DELETED);
+	selection_has_important_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_IMPORTANT);
+	selection_has_junk_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_JUNK);
+	selection_has_not_junk_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_NOT_JUNK);
+	selection_has_read_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_READ);
+	selection_has_undeleted_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_UNDELETED);
+	selection_has_unimportant_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_UNIMPORTANT);
+	selection_has_unread_messages =
+		(state & E_MAIL_READER_SELECTION_HAS_UNREAD);
+	selection_is_mailing_list =
+		(state & E_MAIL_READER_SELECTION_IS_MAILING_LIST);
+
+	any_messages_selected =
+		(single_message_selected || multiple_messages_selected);
+
+	action_name = "mail-check-for-junk";
+	sensitive = any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-copy";
+	sensitive = any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-delete";
+	sensitive = selection_has_undeleted_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-filters-apply";
+	sensitive = any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-forward";
+	sensitive = have_an_account && any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-forward-attached";
+	sensitive = have_an_account && any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-forward-inline";
+	sensitive = have_an_account && single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-forward-quoted";
+	sensitive = have_an_account && single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-load-images";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-mark-important";
+	sensitive = selection_has_unimportant_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-mark-junk";
+	sensitive = selection_has_not_junk_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-mark-notjunk";
+	sensitive = selection_has_junk_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-mark-read";
+	sensitive = selection_has_unread_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-mark-unimportant";
+	sensitive = selection_has_important_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-mark-unread";
+	sensitive = selection_has_read_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-message-edit";
+	sensitive = have_an_account && single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-message-new";
+	sensitive = have_an_account;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-message-open";
+	sensitive = any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-move";
+	sensitive = any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-next-important";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-next-thread";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-next-unread";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-previous-important";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-previous-unread";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-print";
+	sensitive = single_message_selected && !disable_printing;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-print-preview";
+	sensitive = single_message_selected && !disable_printing;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-redirect";
+	sensitive = have_an_account && single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-reply-all";
+	sensitive = have_an_account && single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-reply-list";
+	sensitive = have_an_account && single_message_selected &&
+		selection_is_mailing_list;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-reply-sender";
+	sensitive = have_an_account && single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-save-as";
+	sensitive = any_messages_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-select-all";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-show-source";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-undelete";
+	sensitive = selection_has_deleted_messages;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-zoom-100";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-zoom-in";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action_name = "mail-zoom-out";
+	sensitive = single_message_selected;
+	action = e_mail_reader_get_action (reader, action_name);
+	gtk_action_set_sensitive (action, sensitive);
+}
+
+static void
 mail_reader_init_charset_actions (EMailReader *reader)
 {
 	GtkActionGroup *action_group;
@@ -1916,6 +2180,7 @@ mail_reader_class_init (EMailReaderIface *iface)
 {
 	iface->set_folder = mail_reader_set_folder;
 	iface->set_message = mail_reader_set_message;
+	iface->update_actions = mail_reader_update_actions;
 
 	signals[CHANGED] = g_signal_new (
 		"changed",
@@ -1941,6 +2206,15 @@ mail_reader_class_init (EMailReaderIface *iface)
 		NULL, NULL,
 		g_cclosure_marshal_VOID__VOID,
 		G_TYPE_NONE, 0);
+
+	signals[UPDATE_ACTIONS] = g_signal_new (
+		"update-actions",
+		G_OBJECT_CLASS_TYPE (iface),
+		G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+		G_STRUCT_OFFSET (EMailReaderIface, update_actions),
+		NULL, NULL,
+		g_cclosure_marshal_VOID__VOID,
+		G_TYPE_NONE, 0);
 }
 
 GType
@@ -2289,266 +2563,9 @@ e_mail_reader_check_state (EMailReader *reader)
 void
 e_mail_reader_update_actions (EMailReader *reader)
 {
-	EShell *shell;
-	EShellBackend *shell_backend;
-	EShellSettings *shell_settings;
-	GtkAction *action;
-	GtkActionGroup *action_group;
-	const gchar *action_name;
-	gboolean sensitive;
-	guint32 state;
-
-	/* Be descriptive. */
-	gboolean any_messages_selected;
-	gboolean disable_printing;
-	gboolean enable_flag_clear;
-	gboolean enable_flag_completed;
-	gboolean enable_flag_for_followup;
-	gboolean have_an_account;
-	gboolean multiple_messages_selected;
-	gboolean selection_has_deleted_messages;
-	gboolean selection_has_important_messages;
-	gboolean selection_has_junk_messages;
-	gboolean selection_has_not_junk_messages;
-	gboolean selection_has_read_messages;
-	gboolean selection_has_undeleted_messages;
-	gboolean selection_has_unimportant_messages;
-	gboolean selection_has_unread_messages;
-	gboolean selection_is_mailing_list;
-	gboolean single_message_selected;
-
 	g_return_if_fail (E_IS_MAIL_READER (reader));
 
-	action_group = e_mail_reader_get_action_group (reader);
-	state = e_mail_reader_check_state (reader);
-
-	shell_backend = e_mail_reader_get_shell_backend (reader);
-	shell = e_shell_backend_get_shell (shell_backend);
-	shell_settings = e_shell_get_shell_settings (shell);
-
-	disable_printing = e_shell_settings_get_boolean (
-		shell_settings, "disable-printing");
-
-	have_an_account =
-		(state & E_MAIL_READER_HAVE_ACCOUNT);
-	single_message_selected =
-		(state & E_MAIL_READER_SELECTION_SINGLE);
-	multiple_messages_selected =
-		(state & E_MAIL_READER_SELECTION_MULTIPLE);
-	/* FIXME Missing CAN_ADD_SENDER */
-	enable_flag_clear =
-		(state & E_MAIL_READER_SELECTION_FLAG_CLEAR);
-	enable_flag_completed =
-		(state & E_MAIL_READER_SELECTION_FLAG_COMPLETED);
-	enable_flag_for_followup =
-		(state & E_MAIL_READER_SELECTION_FLAG_FOLLOWUP);
-	selection_has_deleted_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_DELETED);
-	selection_has_important_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_IMPORTANT);
-	selection_has_junk_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_JUNK);
-	selection_has_not_junk_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_NOT_JUNK);
-	selection_has_read_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_READ);
-	selection_has_undeleted_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_UNDELETED);
-	selection_has_unimportant_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_UNIMPORTANT);
-	selection_has_unread_messages =
-		(state & E_MAIL_READER_SELECTION_HAS_UNREAD);
-	selection_is_mailing_list =
-		(state & E_MAIL_READER_SELECTION_IS_MAILING_LIST);
-
-	any_messages_selected =
-		(single_message_selected || multiple_messages_selected);
-
-	action_name = "mail-check-for-junk";
-	sensitive = any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-copy";
-	sensitive = any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-delete";
-	sensitive = selection_has_undeleted_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-filters-apply";
-	sensitive = any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-forward";
-	sensitive = have_an_account && any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-forward-attached";
-	sensitive = have_an_account && any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-forward-inline";
-	sensitive = have_an_account && single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-forward-quoted";
-	sensitive = have_an_account && single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-load-images";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-mark-important";
-	sensitive = selection_has_unimportant_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-mark-junk";
-	sensitive = selection_has_not_junk_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-mark-notjunk";
-	sensitive = selection_has_junk_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-mark-read";
-	sensitive = selection_has_unread_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-mark-unimportant";
-	sensitive = selection_has_important_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-mark-unread";
-	sensitive = selection_has_read_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-message-edit";
-	sensitive = have_an_account && single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-message-new";
-	sensitive = have_an_account;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-message-open";
-	sensitive = any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-move";
-	sensitive = any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-next-important";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-next-thread";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-next-unread";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-previous-important";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-previous-unread";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-print";
-	sensitive = single_message_selected && !disable_printing;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-print-preview";
-	sensitive = single_message_selected && !disable_printing;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-redirect";
-	sensitive = have_an_account && single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-reply-all";
-	sensitive = have_an_account && single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-reply-list";
-	sensitive = have_an_account && single_message_selected &&
-		selection_is_mailing_list;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-reply-sender";
-	sensitive = have_an_account && single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-save-as";
-	sensitive = any_messages_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-select-all";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-show-source";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-undelete";
-	sensitive = selection_has_deleted_messages;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-zoom-100";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-zoom-in";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
-
-	action_name = "mail-zoom-out";
-	sensitive = single_message_selected;
-	action = e_mail_reader_get_action (reader, action_name);
-	gtk_action_set_sensitive (action, sensitive);
+	g_signal_emit (reader, signals[UPDATE_ACTIONS], 0);
 }
 
 GtkAction *
diff --git a/mail/e-mail-reader.h b/mail/e-mail-reader.h
index 6830e4f..d1b713d 100644
--- a/mail/e-mail-reader.h
+++ b/mail/e-mail-reader.h
@@ -94,6 +94,7 @@ struct _EMailReaderIface {
 
 	/* Signals */
 	void		(*show_search_bar)	(EMailReader *reader);
+	void		(*update_actions)	(EMailReader *reader);
 };
 
 GType		e_mail_reader_get_type		(void);
diff --git a/plugins/mail-to-task/mail-to-task.c b/plugins/mail-to-task/mail-to-task.c
index 1b8ad64..cef8665 100644
--- a/plugins/mail-to-task/mail-to-task.c
+++ b/plugins/mail-to-task/mail-to-task.c
@@ -46,6 +46,7 @@
 #include <camel/camel-stream-mem.h>
 #include <camel/camel-utf8.h>
 
+#include <mail/e-mail-browser.h>
 #include <mail/em-utils.h>
 #include <mail/em-format-html.h>
 #include <mail/mail-config.h>
@@ -66,7 +67,9 @@
 #define E_SHELL_WINDOW_ACTION_CONVERT_TO_TASK(window) \
 	E_SHELL_WINDOW_ACTION ((window), "mail-convert-to-task")
 
-gboolean	e_plugin_ui_init		(GtkUIManager *ui_manager,
+gboolean	mail_browser_init		(GtkUIManager *ui_manager,
+						 EMailBrowser *browser);
+gboolean	mail_shell_view_init		(GtkUIManager *ui_manager,
 						 EShellView *shell_view);
 
 static gchar *
@@ -948,7 +951,11 @@ action_mail_convert_to_task_cb (GtkAction *action,
 	mail_to_event (E_CAL_SOURCE_TYPE_TODO, FALSE, shell_view);
 }
 
-static GtkActionEntry entries[] = {
+/* Note, we're not using EPopupActions here because we update the state
+ * of entire actions groups instead of individual actions.  EPopupActions
+ * just proxy the state of individual actions. */
+
+static GtkActionEntry multi_selection_entries[] = {
 
 	{ "mail-convert-to-event",
 	  "appointment-new",
@@ -957,13 +964,6 @@ static GtkActionEntry entries[] = {
 	  N_("Create a new event from the selected message"),
 	  G_CALLBACK (action_mail_convert_to_event_cb) },
 
-	{ "mail-convert-to-meeting",
-	  "stock_new-meeting",
-	  N_("Create a _Meeting"),
-	  NULL,
-	  N_("Create a new meeting from the selected message"),
-	  G_CALLBACK (action_mail_convert_to_meeting_cb) },
-
 	{ "mail-convert-to-memo",
 	  "stock_insert-note",
 	  N_("Create a Mem_o"),
@@ -979,79 +979,106 @@ static GtkActionEntry entries[] = {
 	  G_CALLBACK (action_mail_convert_to_task_cb) }
 };
 
-static EPopupActionEntry popup_entries[] = {
-
-	{ "mail-popup-convert-to-event",
-	  NULL,
-	  "mail-convert-to-event" },
-
-	{ "mail-popup-convert-to-meeting",
-	  NULL,
-	  "mail-convert-to-meeting" },
-
-	{ "mail-popup-convert-to-memo",
-	  NULL,
-	  "mail-convert-to-memo" },
+static GtkActionEntry single_selection_entries[] = {
 
-	{ "mail-popup-convert-to-task",
+	{ "mail-convert-to-meeting",
+	  "stock_new-meeting",
+	  N_("Create a _Meeting"),
 	  NULL,
-	  "mail-convert-to-task" }
+	  N_("Create a new meeting from the selected message"),
+	  G_CALLBACK (action_mail_convert_to_meeting_cb) }
 };
 
 static void
-update_actions_cb (EShellView *shell_view)
+update_actions_any_cb (EMailReader *reader,
+                       GtkActionGroup *action_group)
 {
-	EShellContent *shell_content;
-	EShellWindow *shell_window;
-	GtkAction *action;
 	gboolean sensitive;
 	guint32 state;
 
-	shell_content = e_shell_view_get_shell_content (shell_view);
-	shell_window = e_shell_view_get_shell_window (shell_view);
-
-	state = e_mail_reader_check_state (E_MAIL_READER (shell_content));
+	state = e_mail_reader_check_state (reader);
 
 	sensitive =
 		(state & E_MAIL_READER_SELECTION_SINGLE) ||
 		(state & E_MAIL_READER_SELECTION_MULTIPLE);
 
-	action = E_SHELL_WINDOW_ACTION_CONVERT_TO_EVENT (shell_window);
-	gtk_action_set_sensitive (action, sensitive);
+	gtk_action_group_set_sensitive (action_group, sensitive);
+}
 
-	action = E_SHELL_WINDOW_ACTION_CONVERT_TO_MEMO (shell_window);
-	gtk_action_set_sensitive (action, sensitive);
+static void
+update_actions_one_cb (EMailReader *reader,
+                       GtkActionGroup *action_group)
+{
+	gboolean sensitive;
+	guint32 state;
 
-	action = E_SHELL_WINDOW_ACTION_CONVERT_TO_TASK (shell_window);
-	gtk_action_set_sensitive (action, sensitive);
+	state = e_mail_reader_check_state (reader);
 
 	sensitive = (state & E_MAIL_READER_SELECTION_SINGLE);
 
-	action = E_SHELL_WINDOW_ACTION_CONVERT_TO_MEETING (shell_window);
-	gtk_action_set_sensitive (action, sensitive);
-
+	gtk_action_group_set_sensitive (action_group, sensitive);
 }
 
-gboolean
-e_plugin_ui_init (GtkUIManager *ui_manager,
-                  EShellView *shell_view)
+static void
+setup_actions (EMailReader *reader,
+               GtkUIManager *ui_manager)
 {
-	EShellWindow *shell_window;
 	GtkActionGroup *action_group;
+	const gchar *domain = GETTEXT_PACKAGE;
+
+	action_group = gtk_action_group_new ("mail-convert-any");
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_action_group_add_actions (
+		action_group, multi_selection_entries,
+		G_N_ELEMENTS (multi_selection_entries), reader);
+	gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+	g_object_unref (action_group);
 
-	shell_window = e_shell_view_get_shell_window (shell_view);
-	action_group = e_shell_window_get_action_group (shell_window, "mail");
+	/* GtkUIManager now owns the action group reference.
+	 * The signal we're connecting to will only be emitted
+	 * during the GtkUIManager's lifetime, so the action
+	 * group will not disappear on us. */
 
+	g_signal_connect (
+		reader, "update-actions",
+		G_CALLBACK (update_actions_any_cb), action_group);
+
+	action_group = gtk_action_group_new ("mail-convert-one");
+	gtk_action_group_set_translation_domain (action_group, domain);
 	gtk_action_group_add_actions (
-		action_group, entries,
-		G_N_ELEMENTS (entries), shell_view);
-	e_action_group_add_popup_actions (
-		action_group, popup_entries,
-		G_N_ELEMENTS (popup_entries));
+		action_group, single_selection_entries,
+		G_N_ELEMENTS (single_selection_entries), reader);
+	gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+	g_object_unref (action_group);
+
+	/* GtkUIManager now owns the action group reference.
+	 * The signal we're connecting to will only be emitted
+	 * during the GtkUIManager's lifetime, so the action
+	 * group will not disappear on us. */
 
 	g_signal_connect (
-		shell_view, "update-actions",
-		G_CALLBACK (update_actions_cb), NULL);
+		reader, "update-actions",
+		G_CALLBACK (update_actions_one_cb), action_group);
+}
+
+gboolean
+mail_browser_init (GtkUIManager *ui_manager,
+                   EMailBrowser *browser)
+{
+	setup_actions (E_MAIL_READER (browser), ui_manager);
+
+	return TRUE;
+}
+
+gboolean
+mail_shell_view_init (GtkUIManager *ui_manager,
+                      EShellView *shell_view)
+{
+	EShellContent *shell_content;
+
+	shell_content = e_shell_view_get_shell_content (shell_view);
+
+	setup_actions (E_MAIL_READER (shell_content), ui_manager);
 
 	return TRUE;
 }
diff --git a/plugins/mail-to-task/org-gnome-mail-to-task.eplug.xml b/plugins/mail-to-task/org-gnome-mail-to-task.eplug.xml
index 0170b59..a02e2a5 100644
--- a/plugins/mail-to-task/org-gnome-mail-to-task.eplug.xml
+++ b/plugins/mail-to-task/org-gnome-mail-to-task.eplug.xml
@@ -5,7 +5,23 @@
     <_description>Convert a mail message to a task.</_description>
 
     <hook class="org.gnome.evolution.ui:1.0">
-      <ui-manager id="org.gnome.evolution.mail">
+      <ui-manager id="org.gnome.evolution.mail.browser"
+                  callback="mail_browser_init">
+        <menubar name='main-menu'>
+          <placeholder name='custom-menus'>
+            <menu action="mail-message-menu">
+              <placeholder name="mail-message-actions">
+                <menuitem action="mail-convert-to-event"/>
+                <menuitem action="mail-convert-to-meeting"/>
+                <menuitem action="mail-convert-to-task"/>
+                <menuitem action="mail-convert-to-memo"/>
+              </placeholder>
+            </menu>
+          </placeholder>
+        </menubar>
+      </ui-manager>
+      <ui-manager id="org.gnome.evolution.mail"
+                  callback="mail_shell_view_init">
         <menubar name='main-menu'>
           <placeholder name='custom-menus'>
             <menu action="mail-message-menu">
@@ -20,10 +36,10 @@
         </menubar>
         <popup name="mail-message-popup">
           <placeholder name="mail-message-popup-actions">
-            <menuitem action="mail-popup-convert-to-event"/>
-            <menuitem action="mail-popup-convert-to-meeting"/>
-            <menuitem action="mail-popup-convert-to-task"/>
-            <menuitem action="mail-popup-convert-to-memo"/>
+            <menuitem action="mail-convert-to-event"/>
+            <menuitem action="mail-convert-to-meeting"/>
+            <menuitem action="mail-convert-to-task"/>
+            <menuitem action="mail-convert-to-memo"/>
           </placeholder>
         </popup>
       </ui-manager>
diff --git a/plugins/mailing-list-actions/Makefile.am b/plugins/mailing-list-actions/Makefile.am
index 80dc122..7f205a1 100644
--- a/plugins/mailing-list-actions/Makefile.am
+++ b/plugins/mailing-list-actions/Makefile.am
@@ -6,7 +6,7 @@ AM_CPPFLAGS =						\
 
 @EVO_PLUGIN_RULE@
 
-plugin_DATA = org-gnome-mailing-list-actions.eplug org-gnome-mailing-list-actions.xml
+plugin_DATA = org-gnome-mailing-list-actions.eplug
 plugin_LTLIBRARIES = liborg-gnome-mailing-list-actions.la
 
 liborg_gnome_mailing_list_actions_la_SOURCES = mailing-list-actions.c
@@ -27,7 +27,6 @@ CLEANFILES = $(BUILT_SOURCES)
 
 EXTRA_DIST = 						\
 	org-gnome-mailing-list-actions.eplug.xml	\
-	org-gnome-mailing-list-actions.error.xml	\
-	org-gnome-mailing-list-actions.xml
+	org-gnome-mailing-list-actions.error.xml
 
 -include $(top_srcdir)/git.mk
diff --git a/plugins/mailing-list-actions/mailing-list-actions.c b/plugins/mailing-list-actions/mailing-list-actions.c
index f3ca8d1..428bb18 100644
--- a/plugins/mailing-list-actions/mailing-list-actions.c
+++ b/plugins/mailing-list-actions/mailing-list-actions.c
@@ -35,16 +35,28 @@
 #include "camel/camel-exception.h"
 #include "camel/camel-folder.h"
 #include "composer/e-msg-composer.h"
+#include "mail/e-mail-browser.h"
+#include "mail/e-mail-reader.h"
 #include "mail/em-composer-utils.h"
 #include "mail/em-format-hook.h"
-#include "mail/em-format.h"
-#include "mail/em-menu.h"
 #include "mail/em-config.h"
+#include "mail/em-utils.h"
 #include "mail/mail-ops.h"
 #include "mail/mail-mt.h"
 #include "mail/mail-config.h"
 #include "e-util/e-util.h"
 #include "e-util/e-error.h"
+#include "shell/e-shell-view.h"
+#include "shell/e-shell-window.h"
+#include "shell/e-shell-window-actions.h"
+
+/* EError Message IDs */
+#define MESSAGE_PREFIX			"org.gnome.mailing-list-actions:"
+#define MESSAGE_NO_ACTION		MESSAGE_PREFIX "no-action"
+#define MESSAGE_NO_HEADER		MESSAGE_PREFIX "no-header"
+#define MESSAGE_ASK_SEND_MESSAGE	MESSAGE_PREFIX "ask-send-message"
+#define MESSAGE_MALFORMED_HEADER	MESSAGE_PREFIX "malformed-header"
+#define MESSAGE_POSTING_NOT_ALLOWED	MESSAGE_PREFIX "posting-not-allowed"
 
 typedef enum {
 	EMLA_ACTION_HELP,
@@ -70,38 +82,22 @@ const EmlaActionHeader emla_action_headers[] = {
 	{ EMLA_ACTION_ARCHIVE,     FALSE, "List-Archive" },
 };
 
-const gint emla_n_action_headers = sizeof(emla_action_headers) / sizeof(EmlaActionHeader);
-
-void emla_list_action (EPlugin *item, EMMenuTargetSelect* sel, EmlaAction action);
-void emla_list_help (EPlugin *item, EMMenuTargetSelect* sel);
-void emla_list_unsubscribe (EPlugin *item, EMMenuTargetSelect* sel);
-void emla_list_subscribe (EPlugin *item, EMMenuTargetSelect* sel);
-void emla_list_post (EPlugin *item, EMMenuTargetSelect* sel);
-void emla_list_owner (EPlugin *item, EMMenuTargetSelect* sel);
-void emla_list_archive (EPlugin *item, EMMenuTargetSelect* sel);
-
-void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data);
+gboolean	mail_browser_init		(GtkUIManager *ui_manager,
+						 EMailBrowser *browser);
+gboolean	mail_shell_view_init		(GtkUIManager *ui_manager,
+						 EShellView *shell_view);
 
 typedef struct {
+	EMailReader *reader;
 	EmlaAction action;
 	gchar * uri;
 } emla_action_data;
 
-void emla_list_action (EPlugin *item, EMMenuTargetSelect* sel, EmlaAction action)
-{
-	emla_action_data *data;
-
-	g_return_if_fail (sel->uids->len == 1);
-
-	data = (emla_action_data *) malloc (sizeof (emla_action_data));
-	data->action = action;
-	data->uri = strdup (sel->uri);
-
-	mail_get_message (sel->folder, (const gchar *) g_ptr_array_index (sel->uids, 0),
-			emla_list_action_do, data, mail_msg_unordered_push);
-}
-
-void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessage *msg, gpointer data)
+static void
+emla_list_action_do (CamelFolder *folder,
+                     const gchar *uid,
+                     CamelMimeMessage *msg,
+                     gpointer data)
 {
 	emla_action_data *action_data = (emla_action_data *) data;
 	EmlaAction action = action_data->action;
@@ -111,11 +107,14 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 	EMsgComposer *composer;
 	gint send_message_response;
 	EAccount *account;
+	GtkWindow *parent;
 
 	if (msg == NULL)
 		return;
 
-	for (t = 0; t < emla_n_action_headers; t++) {
+	parent = e_mail_reader_get_window (action_data->reader);
+
+	for (t = 0; t < G_N_ELEMENTS (emla_action_headers); t++) {
 		if (emla_action_headers[t].action == action &&
 		    (header = camel_medium_get_header (CAMEL_MEDIUM (msg), emla_action_headers[t].header)) != NULL)
 			break;
@@ -123,7 +122,7 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 
 	if (!header) {
 		/* there was no header matching the action */
-		e_error_run (NULL, "org.gnome.mailing-list-actions:no-header", NULL);
+		e_error_run (parent, MESSAGE_NO_HEADER, NULL);
 		goto exit;
 	}
 
@@ -132,7 +131,7 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 	if (action == EMLA_ACTION_POST) {
 		while (*headerpos == ' ') headerpos++;
 		if (g_ascii_strcasecmp (headerpos, "NO") == 0) {
-			e_error_run (NULL, "org.gnome.mailing-list-actions:posting-not-allowed", NULL);
+			e_error_run (parent, MESSAGE_POSTING_NOT_ALLOWED, NULL);
 			goto exit;
 		}
 	}
@@ -142,7 +141,9 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 		/* skip whitespace */
 		while (*headerpos == ' ') headerpos++;
 		if (*headerpos != '<' || (end = strchr (headerpos++, '>')) == NULL) {
-			e_error_run (NULL, "org.gnome.mailing-list-actions:malformed-header", emla_action_headers[t].header, header, NULL);
+			e_error_run (
+				parent, MESSAGE_MALFORMED_HEADER,
+				emla_action_headers[t].header, header, NULL);
 			goto exit;
 		}
 
@@ -153,7 +154,9 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 			if (emla_action_headers[t].interactive)
 				send_message_response = GTK_RESPONSE_NO;
 			else
-				send_message_response = e_error_run (NULL, "org.gnome.mailing-list-actions:ask-send-message", url, NULL);
+				send_message_response = e_error_run (
+					parent, MESSAGE_ASK_SEND_MESSAGE,
+					url, NULL);
 
 			if (send_message_response == GTK_RESPONSE_YES) {
 				/* directly send message */
@@ -162,7 +165,7 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 					e_composer_header_table_set_account (
 						e_msg_composer_get_header_table (composer),
 						account);
-				em_utils_composer_send_cb (composer, NULL);
+				e_msg_composer_send (composer);
 			} else if (send_message_response == GTK_RESPONSE_NO) {
 				/* show composer */
 				em_utils_compose_new_message_with_mailto (url, action_data->uri);
@@ -170,8 +173,7 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 
 			goto exit;
 		} else {
-			/* FIXME Pass a parent window. */
-			e_show_uri (NULL, url);
+			e_show_uri (parent, url);
 			goto exit;
 		}
 		g_free (url);
@@ -186,40 +188,196 @@ void emla_list_action_do (CamelFolder *folder, const gchar *uid, CamelMimeMessag
 	}
 
 	/* if we got here, there's no valid action */
-	e_error_run (NULL, "org.gnome.mailing-list-actions:no-action", header, NULL);
+	e_error_run (parent, MESSAGE_NO_ACTION, header, NULL);
 
 exit:
-	free (action_data->uri);
-	free (action_data);
-	g_free(url);
+	g_object_unref (action_data->reader);
+	g_free (action_data->uri);
+	g_free (action_data);
+	g_free (url);
+}
+
+static void
+emla_list_action (EMailReader *reader,
+                  EmlaAction action)
+{
+	MessageList *message_list;
+	CamelFolder *folder;
+	GPtrArray *uids;
+	emla_action_data *data;
+	const gchar *folder_uri;
+
+	message_list = e_mail_reader_get_message_list (reader);
+
+	folder = message_list->folder;
+	folder_uri = message_list->folder_uri;
+	uids = message_list_get_selected (message_list);
+	g_return_if_fail (uids->len == 1);
+
+	data = g_malloc (sizeof (emla_action_data));
+	data->reader = g_object_ref (reader);
+	data->action = action;
+	data->uri = g_strdup (folder_uri);
+
+	mail_get_message (
+		folder, uids->pdata[0],
+		emla_list_action_do, data,
+		mail_msg_unordered_push);
+
+	em_utils_uids_free (uids);
+}
+
+static void
+action_mailing_list_archive_cb (GtkAction *action,
+                                EMailReader *reader)
+{
+	emla_list_action (reader, EMLA_ACTION_ARCHIVE);
+}
+
+static void
+action_mailing_list_help_cb (GtkAction *action,
+                             EMailReader *reader)
+{
+	emla_list_action (reader, EMLA_ACTION_HELP);
+}
+
+static void
+action_mailing_list_owner_cb (GtkAction *action,
+                              EMailReader *reader)
+{
+	emla_list_action (reader, EMLA_ACTION_OWNER);
 }
 
-void emla_list_help (EPlugin *item, EMMenuTargetSelect* sel)
+static void
+action_mailing_list_post_cb (GtkAction *action,
+                             EMailReader *reader)
 {
-	emla_list_action (item, sel, EMLA_ACTION_HELP);
+	emla_list_action (reader, EMLA_ACTION_POST);
 }
 
-void emla_list_unsubscribe (EPlugin *item, EMMenuTargetSelect* sel)
+static void
+action_mailing_list_subscribe_cb (GtkAction *action,
+                                  EMailReader *reader)
 {
-	emla_list_action (item, sel, EMLA_ACTION_UNSUBSCRIBE);
+	emla_list_action (reader, EMLA_ACTION_SUBSCRIBE);
 }
 
-void emla_list_subscribe (EPlugin *item, EMMenuTargetSelect* sel)
+static void
+action_mailing_list_unsubscribe_cb (GtkAction *action,
+                                    EMailReader *reader)
 {
-	emla_list_action (item, sel, EMLA_ACTION_SUBSCRIBE);
+	emla_list_action (reader, EMLA_ACTION_UNSUBSCRIBE);
 }
 
-void emla_list_post (EPlugin *item, EMMenuTargetSelect* sel)
+static GtkActionEntry mailing_list_entries[] = {
+
+	{ "mailing-list-archive",
+	  NULL,
+	  N_("Get List _Archive"),
+	  NULL,
+	  N_("Get an archive of the list this message belongs to"),
+	  G_CALLBACK (action_mailing_list_archive_cb) },
+
+	{ "mailing-list-help",
+	  NULL,
+	  N_("Get List _Usage Information"),
+	  NULL,
+	  N_("Get information about the usage of the list this message belongs to"),
+	  G_CALLBACK (action_mailing_list_help_cb) },
+
+	{ "mailing-list-owner",
+	  NULL,
+	  N_("Contact List _Owner"),
+	  NULL,
+	  N_("Contact the owner of the mailing list this message belongs to"),
+	  G_CALLBACK (action_mailing_list_owner_cb) },
+
+	{ "mailing-list-post",
+	  NULL,
+	  N_("_Post Message to List"),
+	  NULL,
+	  N_("Post a message to the mailing list this message belongs to"),
+	  G_CALLBACK (action_mailing_list_post_cb) },
+
+	{ "mailing-list-subscribe",
+	  NULL,
+	  N_("_Subscribe to List"),
+	  NULL,
+	  N_("Subscribe to the mailing list this message belongs to"),
+	  G_CALLBACK (action_mailing_list_subscribe_cb) },
+
+	{ "mailing-list-unsubscribe",
+	  NULL,
+	  N_("_Unsubscribe from List"),
+	  NULL,
+	  N_("Unsubscribe from the mailing list this message belongs to"),
+	  G_CALLBACK (action_mailing_list_unsubscribe_cb) },
+
+	/*** Menus ***/
+
+	{ "mailing-list-menu",
+	  NULL,
+	  N_("Mailing _List"),
+	  NULL,
+	  NULL,
+	  NULL }
+};
+
+static void
+update_actions_cb (EMailReader *reader,
+                   GtkActionGroup *action_group)
+{
+	gboolean sensitive;
+	guint32 state;
+
+	state = e_mail_reader_check_state (reader);
+	sensitive = (state & E_MAIL_READER_SELECTION_IS_MAILING_LIST);
+	gtk_action_group_set_sensitive (action_group, sensitive);
+}
+
+static void
+setup_actions (EMailReader *reader,
+               GtkUIManager *ui_manager)
 {
-	emla_list_action (item, sel, EMLA_ACTION_POST);
+	GtkActionGroup *action_group;
+	const gchar *domain = GETTEXT_PACKAGE;
+
+	action_group = gtk_action_group_new ("mailing-list");
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_action_group_add_actions (
+		action_group, mailing_list_entries,
+		G_N_ELEMENTS (mailing_list_entries), reader);
+	gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+	g_object_unref (action_group);
+
+	/* GtkUIManager now owns the action group reference.
+	 * The signal we're connecting to will only be emitted
+	 * during the GtkUIManager's lifetime, so the action
+	 * group will not disappear on us. */
+
+	g_signal_connect (
+		reader, "update-actions",
+		G_CALLBACK (update_actions_cb), action_group);
 }
 
-void emla_list_owner (EPlugin *item, EMMenuTargetSelect* sel)
+gboolean
+mail_browser_init (GtkUIManager *ui_manager,
+                   EMailBrowser *browser)
 {
-	emla_list_action (item, sel, EMLA_ACTION_OWNER);
+	setup_actions (E_MAIL_READER (browser), ui_manager);
+
+	return TRUE;
 }
 
-void emla_list_archive (EPlugin *item, EMMenuTargetSelect* sel)
+gboolean
+mail_shell_view_init (GtkUIManager *ui_manager,
+                      EShellView *shell_view)
 {
-	emla_list_action (item, sel, EMLA_ACTION_ARCHIVE);
+	EShellContent *shell_content;
+
+	shell_content = e_shell_view_get_shell_content (shell_view);
+
+	setup_actions (E_MAIL_READER (shell_content), ui_manager);
+
+	return TRUE;
 }
diff --git a/plugins/mailing-list-actions/org-gnome-mailing-list-actions.eplug.xml b/plugins/mailing-list-actions/org-gnome-mailing-list-actions.eplug.xml
index 7b0861c..464ade9 100644
--- a/plugins/mailing-list-actions/org-gnome-mailing-list-actions.eplug.xml
+++ b/plugins/mailing-list-actions/org-gnome-mailing-list-actions.eplug.xml
@@ -1,44 +1,54 @@
 <?xml version="1.0"?>
 <e-plugin-list>
-	<e-plugin
-		type="shlib"
-		id="org.gnome.plugin.mailing-list.actions"
-		domain="@GETTEXT_PACKAGE@"
-		location="@PLUGINDIR@/liborg-gnome-mailing-list-actions SOEXT@"
-		_name="Mailing List Actions">
-	    	<author name="Meilof Veeningen" email="meilof wanadoo nl"/>
-		<_description>Perform common mailing list actions (subscribe, unsubscribe, etc.).</_description>
-		<hook class="org.gnome.evolution.mail.bonobomenu:1.0">
-			<menu id="org.gnome.evolution.mail.browser" target="select">
-				<ui file="@PLUGINDIR@/org-gnome-mailing-list-actions.xml"/>
-				<item type="item" verb="ListHelp" path="/commands/ListHelp" enable="mailing_list" activate="emla_list_help"/>
-				<item type="item" verb="ListSubscribe" path="/commands/ListSubscribe" enable="mailing_list" activate="emla_list_subscribe"/>
-				<item type="item" verb="ListUnsubscribe" path="/commands/ListUnsubscribe" enable="mailing_list" activate="emla_list_unsubscribe"/>
-				<item type="item" verb="ListPost" path="/commands/ListPost" enable="mailing_list" activate="emla_list_post"/>
-				<item type="item" verb="ListOwner" path="/commands/ListOwner" enable="mailing_list" activate="emla_list_owner"/>
-				<item type="item" verb="ListArchive" path="/commands/ListArchive" enable="mailing_list" activate="emla_list_archive"/>
-			</menu>
-			<menu id="org.gnome.evolution.mail.messagebrowser" target="select">
-				<ui file="@PLUGINDIR@/org-gnome-mailing-list-actions.xml"/>
-				<item type="item" verb="ListHelp" path="/commands/ListHelp" enable="mailing_list" activate="emla_list_help"/>
-				<item type="item" verb="ListSubscribe" path="/commands/ListSubscribe" enable="mailing_list" activate="emla_list_subscribe"/>
-				<item type="item" verb="ListUnsubscribe" path="/commands/ListUnsubscribe" enable="mailing_list" activate="emla_list_unsubscribe"/>
-				<item type="item" verb="ListPost" path="/commands/ListPost" enable="mailing_list" activate="emla_list_post"/>
-				<item type="item" verb="ListOwner" path="/commands/ListOwner" enable="mailing_list" activate="emla_list_owner"/>
-				<item type="item" verb="ListArchive" path="/commands/ListArchive" enable="mailing_list" activate="emla_list_archive"/>
-			</menu>
-		</hook>
-		<hook class="org.gnome.evolution.mail.popup:1.0">
-			<menu id="org.gnome.mail.folderview.popup.select" target="select">
-				<item type="bar" path="96.list" visible="mailing_list" activate=""/>
-				<item type="submenu" path="96.list.00" visible="mailing_list" activate="" _label="Mailing _List"/>
-				<item type="item" verb="ListHelp" path="96.list.00/00.help" _label="Get list _usage information" visible="mailing_list" activate="emla_list_help"/>
-				<item type="item" verb="ListSubscribe" path="96.list.00/10.subscribe" _label="_Subscribe to list" visible="mailing_list" activate="emla_list_subscribe"/>
-				<item type="item" verb="ListUnsubscribe" path="96.list.00/20.unsubscribe" _label="_Un-subscribe to list" visible="mailing_list" activate="emla_list_unsubscribe"/>
-				<item type="item" verb="ListPost" path="96.list.00/30.post" _label="_Post message to list" visible="mailing_list" activate="emla_list_post"/>
-				<item type="item" verb="ListOwner" path="96.list.00/40.owner" _label="Contact list _owner" visible="mailing_list" activate="emla_list_owner"/>
-				<item type="item" verb="ListArchive" path="96.list.00/50.archive" _label="Get list _archive" visible="mailing_list" activate="emla_list_archive"/>
-			</menu>
-		</hook>
-  	</e-plugin>
+  <e-plugin
+    type="shlib"
+    id="org.gnome.plugin.mailing-list.actions"
+    domain="@GETTEXT_PACKAGE@"
+    location="@PLUGINDIR@/liborg-gnome-mailing-list-actions SOEXT@"
+    _name="Mailing List Actions">
+        <author name="Meilof Veeningen" email="meilof wanadoo nl"/>
+    <_description>Perform common mailing list actions (subscribe, unsubscribe, etc.).</_description>
+
+    <hook class="org.gnome.evolution.ui:1.0">
+      <ui-manager id="org.gnome.evolution.mail"
+                  callback="mail_shell_view_init">
+        <menubar name='main-menu'>
+          <placeholder name='custom-menus'>
+            <menu action='mail-message-menu'>
+              <placeholder name='mail-message-custom-menus'>
+                <menu action='mailing-list-menu'>
+                  <menuitem action='mailing-list-help'/>
+                  <menuitem action='mailing-list-subscribe'/>
+                  <menuitem action='mailing-list-unsubscribe'/>
+                  <menuitem action='mailing-list-post'/>
+                  <menuitem action='mailing-list-owner'/>
+                  <menuitem action='mailing-list-archive'/>
+                </menu>
+              </placeholder>
+            </menu>
+          </placeholder>
+        </menubar>
+      </ui-manager>
+      <ui-manager id="org.gnome.evolution.mail.browser"
+                  callback="mail_browser_init">
+        <menubar name='main-menu'>
+          <placeholder name='custom-menus'>
+            <menu action='mail-message-menu'>
+              <placeholder name='mail-message-custom-menus'>
+                <menu action='mailing-list-menu'>
+                  <menuitem action='mailing-list-help'/>
+                  <menuitem action='mailing-list-subscribe'/>
+                  <menuitem action='mailing-list-unsubscribe'/>
+                  <menuitem action='mailing-list-post'/>
+                  <menuitem action='mailing-list-owner'/>
+                  <menuitem action='mailing-list-archive'/>
+                </menu>
+              </placeholder>
+            </menu>
+          </placeholder>
+        </menubar>
+      </ui-manager>
+    </hook>
+
+  </e-plugin>
 </e-plugin-list>
diff --git a/ui/evolution-mail-reader.ui b/ui/evolution-mail-reader.ui
index 374db8f..acc8dd3 100644
--- a/ui/evolution-mail-reader.ui
+++ b/ui/evolution-mail-reader.ui
@@ -102,6 +102,7 @@
           <menuitem action='mail-search-folder-from-recipients'/>
           <menuitem action='mail-search-folder-from-mailing-list'/>
         </menu>
+        <placeholder name='mail-message-custom-menus'/>
         <separator/>
         <placeholder name='mail-message-actions'/>
       </menu>



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