[evolution/kill-bonobo] Get the "mail-to-task" plugin working again.



commit ce37d56d0b42f88549e45920df29a06fdce3ce95
Author: Matthew Barnes <mbarnes redhat com>
Date:   Fri Jun 26 11:05:58 2009 -0400

    Get the "mail-to-task" plugin working again.
    
    This one was more challenging.  It exposed some flaws in the new shell
    design and in EPluginUI, which is good because they're fixed now.

 configure.ac                                       |    3 +-
 e-util/e-plugin-ui.c                               |   22 +-
 modules/mail/e-mail-shell-view.c                   |    6 +-
 plugins/mail-to-task/Makefile.am                   |    5 +-
 plugins/mail-to-task/mail-to-task.c                |  251 +++++++++++++-------
 .../mail-to-task/org-gnome-mail-to-task.eplug.xml  |  101 ++------
 plugins/mail-to-task/org-gnome-mail-to-task.xml    |   28 ---
 plugins/mark-all-read/mark-all-read.c              |    7 +-
 shell/e-shell-view.c                               |   63 ++++--
 ui/evolution-mail-reader.ui                        |    2 +
 ui/evolution-mail.ui                               |    6 +-
 11 files changed, 265 insertions(+), 229 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 78a5748..a27a3b9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1790,7 +1790,7 @@ 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 bbdb bogo-junk-plugin caldav calendar-file calendar-http default-mailer default-source email-custom-header external-editor face google-account-setup hula-account-setup imap-features mail-notification mark-all-read plugin-manager prefer-plain profiler sa-junk-plugin save-calendar subject-thread templates $TNEF_ATTACHMENTS vcard-inline webdav-account-setup"
+enable_plugins="attachment-reminder addressbook-file audio-inline bbdb bogo-junk-plugin caldav calendar-file calendar-http default-mailer default-source email-custom-header external-editor face google-account-setup hula-account-setup imap-features mail-notification mail-to-task mark-all-read plugin-manager prefer-plain profiler sa-junk-plugin save-calendar subject-thread templates $TNEF_ATTACHMENTS vcard-inline webdav-account-setup"
 
 dnl PLUGINS NOT BUILDING YET
 dnl ------------------------
@@ -1801,7 +1801,6 @@ dnl groupwise-features
 dnl ipod-sync
 dnl itip-formatter
 dnl mailing-list-actions
-dnl mail-to-task
 dnl mono
 dnl pst-import
 dnl publish-calendar
diff --git a/e-util/e-plugin-ui.c b/e-util/e-plugin-ui.c
index 2331af0..4f948fb 100644
--- a/e-util/e-plugin-ui.c
+++ b/e-util/e-plugin-ui.c
@@ -375,10 +375,13 @@ plugin_ui_hook_construct (EPluginHook *hook,
 	/* Chain up to parent's construct() method. */
 	E_PLUGIN_HOOK_CLASS (parent_class)->construct (hook, plugin, node);
 
-	for (node = node->children; node != NULL; node = node->next) {
+	for (node = xmlFirstElementChild (node); node != NULL;
+		node = xmlNextElementSibling (node)) {
+
 		xmlNodePtr child;
 		xmlBufferPtr buffer;
-		const gchar *content;
+		GString *content;
+		const gchar *temp;
 		gchar *id;
 
 		if (strcmp ((gchar *) node->name, "ui-manager") != 0)
@@ -390,18 +393,21 @@ plugin_ui_hook_construct (EPluginHook *hook,
 			continue;
 		}
 
+		content = g_string_sized_new (1024);
+
 		/* Extract the XML content below <ui-manager> */
 		buffer = xmlBufferCreate ();
-		child = node->children;
-		while (child != NULL && xmlNodeIsText (child))
-			child = child->next;
-		if (child != NULL)
+		for (child = xmlFirstElementChild (node); child != NULL;
+			child = xmlNextElementSibling (child)) {
+
 			xmlNodeDump (buffer, node->doc, child, 2, 1);
-		content = (const gchar *) xmlBufferContent (buffer);
+			temp = (const gchar *) xmlBufferContent (buffer);
+			g_string_append (content, temp);
+		}
 
 		g_hash_table_insert (
 			priv->ui_definitions,
-			id, g_strdup (content));
+			id, g_string_free (content, FALSE));
 
 		xmlBufferFree (buffer);
 	}
diff --git a/modules/mail/e-mail-shell-view.c b/modules/mail/e-mail-shell-view.c
index ce18936..fb04590 100644
--- a/modules/mail/e-mail-shell-view.c
+++ b/modules/mail/e-mail-shell-view.c
@@ -60,9 +60,6 @@ mail_shell_view_toggled (EShellView *shell_view)
 	const gchar *basename;
 	gboolean view_is_active;
 
-	/* Chain up to parent's toggled() method. */
-	E_SHELL_VIEW_CLASS (parent_class)->toggled (shell_view);
-
 	priv = E_MAIL_SHELL_VIEW_GET_PRIVATE (shell_view);
 
 	shell_window = e_shell_view_get_shell_window (shell_view);
@@ -80,7 +77,8 @@ mail_shell_view_toggled (EShellView *shell_view)
 		priv->merge_id = 0;
 	}
 
-	gtk_ui_manager_ensure_update (ui_manager);
+	/* Chain up to parent's toggled() method. */
+	E_SHELL_VIEW_CLASS (parent_class)->toggled (shell_view);
 }
 
 static void
diff --git a/plugins/mail-to-task/Makefile.am b/plugins/mail-to-task/Makefile.am
index 5261fbc..4c7db06 100644
--- a/plugins/mail-to-task/Makefile.am
+++ b/plugins/mail-to-task/Makefile.am
@@ -6,7 +6,7 @@ INCLUDES =						\
 
 @EVO_PLUGIN_RULE@
 
-plugin_DATA = org-gnome-mail-to-task.eplug org-gnome-mail-to-task.xml
+plugin_DATA = org-gnome-mail-to-task.eplug
 plugin_LTLIBRARIES = liborg-gnome-mail-to-task.la
 
 liborg_gnome_mail_to_task_la_SOURCES = mail-to-task.c
@@ -18,8 +18,7 @@ liborg_gnome_mail_to_task_la_LIBADD =	\
 	$(EVOLUTION_CALENDAR_LIBS)					\
 	$(EVOLUTION_MAIL_LIBS)
 
-EXTRA_DIST = org-gnome-mail-to-task.eplug.xml \
-	     org-gnome-mail-to-task.xml
+EXTRA_DIST = org-gnome-mail-to-task.eplug.xml
 
 BUILT_SOURCES = org-gnome-mail-to-task.eplug
 CLEANFILES = $(BUILT_SOURCES)
diff --git a/plugins/mail-to-task/mail-to-task.c b/plugins/mail-to-task/mail-to-task.c
index e7fa727..49b67a5 100644
--- a/plugins/mail-to-task/mail-to-task.c
+++ b/plugins/mail-to-task/mail-to-task.c
@@ -32,10 +32,12 @@
 #include <string.h>
 #include <stdio.h>
 
+#include <gtkhtml/gtkhtml.h>
 #include <gconf/gconf-client.h>
 #include <libecal/e-cal.h>
 #include <libedataserver/e-account.h>
 #include <libedataserverui/e-source-selector-dialog.h>
+
 #include <camel/camel-folder.h>
 #include <camel/camel-medium.h>
 #include <camel/camel-mime-message.h>
@@ -43,15 +45,31 @@
 #include <camel/camel-stream.h>
 #include <camel/camel-stream-mem.h>
 #include <camel/camel-utf8.h>
-#include "mail/em-menu.h"
-#include "mail/em-popup.h"
-#include "mail/em-utils.h"
-#include "mail/em-folder-view.h"
-#include "mail/em-format-html.h"
-#include "mail/mail-config.h"
-#include "e-util/e-dialog-utils.h"
-#include <gtkhtml/gtkhtml.h>
+
+#include <mail/em-menu.h>
+#include <mail/em-popup.h>
+#include <mail/em-utils.h>
+#include <mail/em-folder-view.h>
+#include <mail/em-format-html.h>
+#include <mail/mail-config.h>
+#include <e-util/e-account-utils.h>
+#include <e-util/e-dialog-utils.h>
 #include <calendar/common/authentication.h>
+#include <misc/e-popup-action.h>
+#include <shell/e-shell-view.h>
+#include <shell/e-shell-window-actions.h>
+
+#define E_SHELL_WINDOW_ACTION_CONVERT_TO_EVENT(window) \
+	E_SHELL_WINDOW_ACTION ((window), "mail-convert-to-event")
+#define E_SHELL_WINDOW_ACTION_CONVERT_TO_MEETING(window) \
+	E_SHELL_WINDOW_ACTION ((window), "mail-convert-to-meeting")
+#define E_SHELL_WINDOW_ACTION_CONVERT_TO_MEMO(window) \
+	E_SHELL_WINDOW_ACTION ((window), "mail-convert-to-memo")
+#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,
+						 EShellView *shell_view);
 
 static gchar *
 clean_name(const guchar *s)
@@ -214,7 +232,7 @@ set_organizer (ECalComponent *comp)
 	ECalComponentOrganizer organizer = {NULL, NULL, NULL, NULL};
 	gchar *res;
 
-	account = mail_config_get_default_account ();
+	account = e_get_default_account ();
 	if (!account)
 		return NULL;
 
@@ -476,12 +494,6 @@ do_mail_to_event (AsyncData *data)
 	return TRUE;
 }
 
-static void
-copy_uids (gchar *uid, GPtrArray *uid_array)
-{
-	g_ptr_array_add (uid_array, g_strdup (uid));
-}
-
 static gboolean
 text_contains_nonwhitespace (const gchar *text, gint len)
 {
@@ -509,47 +521,51 @@ text_contains_nonwhitespace (const gchar *text, gint len)
 
 /* should be freed with g_free after done with it */
 static gchar *
-get_selected_text (EMFolderView *emfv)
+get_selected_text (EMailReader *reader)
 {
+	EMFormatHTMLDisplay *html_display;
+	GtkHTML *html;
 	gchar *text = NULL;
 	gint len;
 
-	if (!emfv || !emfv->preview || !gtk_html_command (((EMFormatHTML *)emfv->preview)->html, "is-selection-active"))
+	html_display = e_mail_reader_get_html_display (reader);
+	html = EM_FORMAT_HTML (html_display)->html;
+
+	if (!gtk_html_command (html, "is-selection-active"))
 		return NULL;
 
-	if (gtk_html_command (((EMFormatHTML *)emfv->preview)->html, "is-selection-active")
-	    && (text = gtk_html_get_selection_plain_text (((EMFormatHTML *)emfv->preview)->html, &len))
-	    && len && text && text[0] && text_contains_nonwhitespace (text, len)) {
-		/* selection is ok, so use it as returned from gtkhtml widget */
-	} else {
+	text = gtk_html_get_selection_plain_text (html, &len);
+
+	if (text == NULL || !text_contains_nonwhitespace (text, len)) {
 		g_free (text);
-		text = NULL;
+		return NULL;
 	}
 
 	return text;
 }
 
 static void
-mail_to_event (ECalSourceType source_type, gboolean with_attendees, GPtrArray *uids, CamelFolder *folder, EMFolderView *emfv)
+mail_to_event (ECalSourceType source_type,
+               gboolean with_attendees,
+               EShellView *shell_view)
 {
-	GPtrArray *uid_array = NULL;
+	EShellContent *shell_content;
+	EMailReader *reader;
+	MessageList *message_list;
+	CamelFolder *folder;
+	GPtrArray *selected;
 	ESourceList *source_list = NULL;
 	gboolean done = FALSE;
 	GSList *groups, *p;
 	ESource *source = NULL;
 	GError *error = NULL;
 
-	g_return_if_fail (uids != NULL);
-	g_return_if_fail (folder != NULL);
-	g_return_if_fail (emfv != NULL);
+	shell_content = e_shell_view_get_shell_content (shell_view);
 
-	if (uids->len > 0) {
-		uid_array = g_ptr_array_new ();
-		g_ptr_array_foreach (uids, (GFunc)copy_uids, (gpointer) uid_array);
-	} else {
-		/* nothing selected */
-		return;
-	}
+	reader = E_MAIL_READER (shell_content);
+	message_list = e_mail_reader_get_message_list (reader);
+	selected = message_list_get_selected (message_list);
+	folder = message_list->folder;
 
 	if (!e_cal_get_sources (&source_list, source_type, &error)) {
 		e_notice (NULL, GTK_MESSAGE_ERROR, _("Cannot get source list. %s"), error ? error->message : _("Unknown error."));
@@ -615,11 +631,11 @@ mail_to_event (ECalSourceType source_type, gboolean with_attendees, GPtrArray *u
 		data = g_new0 (AsyncData, 1);
 		data->client = client;
 		data->folder = folder;
-		data->uids = uid_array;
+		data->uids = selected;
 		data->with_attendees = with_attendees;
 
-		if (uid_array->len == 1)
-			data->selected_text = get_selected_text (emfv);
+		if (selected->len == 1)
+			data->selected_text = get_selected_text (reader);
 		else
 			data->selected_text = NULL;
 
@@ -633,70 +649,135 @@ mail_to_event (ECalSourceType source_type, gboolean with_attendees, GPtrArray *u
 	g_object_unref (source_list);
 }
 
-/* ************************************************************************* */
-
-gint e_plugin_lib_enable (EPluginLib *ep, gint enable);
-void org_gnome_mail_to_event (gpointer ep, EMPopupTargetSelect *t);
-void org_gnome_mail_to_event_menu (EPlugin *ep, EMMenuTargetSelect *t);
-void org_gnome_mail_to_meeting (gpointer ep, EMPopupTargetSelect *t);
-void org_gnome_mail_to_meeting_menu (EPlugin *ep, EMMenuTargetSelect *t);
-void org_gnome_mail_to_task (gpointer ep, EMPopupTargetSelect *t);
-void org_gnome_mail_to_task_menu (EPlugin *ep, EMMenuTargetSelect *t);
-void org_gnome_mail_to_memo (gpointer ep, EMPopupTargetSelect *t);
-void org_gnome_mail_to_memo_menu (EPlugin *ep, EMMenuTargetSelect *t);
-
-gint
-e_plugin_lib_enable (EPluginLib *ep, gint enable)
+static void
+action_mail_convert_to_event_cb (GtkAction *action,
+                                 EShellView *shell_view)
 {
-	return 0;
+	mail_to_event (E_CAL_SOURCE_TYPE_EVENT, FALSE, shell_view);
 }
 
-void
-org_gnome_mail_to_event (gpointer ep, EMPopupTargetSelect *t)
+static void
+action_mail_convert_to_meeting_cb (GtkAction *action,
+                                   EShellView *shell_view)
 {
-	mail_to_event (E_CAL_SOURCE_TYPE_EVENT, FALSE, t->uids, t->folder, (EMFolderView *) t->target.widget);
+	mail_to_event (E_CAL_SOURCE_TYPE_EVENT, TRUE, shell_view);
 }
 
-void
-org_gnome_mail_to_event_menu (EPlugin *ep, EMMenuTargetSelect *t)
+static void
+action_mail_convert_to_memo_cb (GtkAction *action,
+                                EShellView *shell_view)
 {
-	mail_to_event (E_CAL_SOURCE_TYPE_EVENT, FALSE, t->uids, t->folder, (EMFolderView *) t->target.widget);
+	mail_to_event (E_CAL_SOURCE_TYPE_JOURNAL, FALSE, shell_view);
 }
 
-void
-org_gnome_mail_to_meeting (gpointer ep, EMPopupTargetSelect *t)
+static void
+action_mail_convert_to_task_cb (GtkAction *action,
+                                EShellView *shell_view)
 {
-	mail_to_event (E_CAL_SOURCE_TYPE_EVENT, TRUE, t->uids, t->folder, (EMFolderView *) t->target.widget);
+	mail_to_event (E_CAL_SOURCE_TYPE_TODO, FALSE, shell_view);
 }
 
-void
-org_gnome_mail_to_meeting_menu (EPlugin *ep, EMMenuTargetSelect *t)
-{
-	mail_to_event (E_CAL_SOURCE_TYPE_EVENT, TRUE, t->uids, t->folder, (EMFolderView *) t->target.widget);
-}
+static GtkActionEntry entries[] = {
+
+	{ "mail-convert-to-event",
+	  "appointment-new",
+	  N_("Convert to an _Event"),
+	  NULL,
+	  N_("Convert the selected messages to an event"),
+	  G_CALLBACK (action_mail_convert_to_event_cb) },
+
+	{ "mail-convert-to-meeting",
+	  "stock_new-meeting",
+	  N_("Convert to a _Meeting"),
+	  NULL,
+	  N_("Convert the selected messages to a meeting"),
+	  G_CALLBACK (action_mail_convert_to_meeting_cb) },
+
+	{ "mail-convert-to-memo",
+	  "stock_insert-note",
+	  N_("Convert to a Mem_o"),
+	  NULL,
+	  N_("Convert the selected messages to a memo"),
+	  G_CALLBACK (action_mail_convert_to_memo_cb) },
+
+	{ "mail-convert-to-task",
+	  "stock_todo",
+	  N_("Convert to a _Task"),
+	  NULL,
+	  N_("Convert the selected messages to a task"),
+	  G_CALLBACK (action_mail_convert_to_task_cb) }
+};
 
-void
-org_gnome_mail_to_task (gpointer ep, EMPopupTargetSelect *t)
-{
-	mail_to_event (E_CAL_SOURCE_TYPE_TODO, TRUE, t->uids, t->folder, (EMFolderView *) t->target.widget);
-}
+static EPopupActionEntry popup_entries[] = {
 
-void
-org_gnome_mail_to_task_menu (EPlugin *ep, EMMenuTargetSelect *t)
-{
-	mail_to_event (E_CAL_SOURCE_TYPE_TODO, TRUE, t->uids, t->folder, (EMFolderView *) t->target.widget);
-}
+	{ "mail-popup-convert-to-event",
+	  NULL,
+	  "mail-convert-to-event" },
 
-void
-org_gnome_mail_to_memo (gpointer ep, EMPopupTargetSelect *t)
+	{ "mail-popup-convert-to-meeting",
+	  NULL,
+	  "mail-convert-to-meeting" },
+
+	{ "mail-popup-convert-to-memo",
+	  NULL,
+	  "mail-convert-to-memo" },
+
+	{ "mail-popup-convert-to-task",
+	  NULL,
+	  "mail-convert-to-task" }
+};
+
+static void
+update_actions_cb (EShellView *shell_view)
 {
-	/* do not set organizer and attendees for memos */
-	mail_to_event (E_CAL_SOURCE_TYPE_JOURNAL, FALSE, t->uids, t->folder, (EMFolderView *) t->target.widget);
+	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));
+
+	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);
+
+	action = E_SHELL_WINDOW_ACTION_CONVERT_TO_MEETING (shell_window);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action = E_SHELL_WINDOW_ACTION_CONVERT_TO_MEMO (shell_window);
+	gtk_action_set_sensitive (action, sensitive);
+
+	action = E_SHELL_WINDOW_ACTION_CONVERT_TO_TASK (shell_window);
+	gtk_action_set_sensitive (action, sensitive);
 }
 
-void
-org_gnome_mail_to_memo_menu (EPlugin *ep, EMMenuTargetSelect *t)
+gboolean
+e_plugin_ui_init (GtkUIManager *ui_manager,
+                  EShellView *shell_view)
 {
-	/* do not set organizer and attendees for memos */
-	mail_to_event (E_CAL_SOURCE_TYPE_JOURNAL, FALSE, t->uids, t->folder, (EMFolderView *) t->target.widget);
+	EShellWindow *shell_window;
+	GtkActionGroup *action_group;
+
+	shell_window = e_shell_view_get_shell_window (shell_view);
+	action_group = e_shell_window_get_action_group (shell_window, "mail");
+
+	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));
+
+	g_signal_connect (
+		shell_view, "update-actions",
+		G_CALLBACK (update_actions_cb), NULL);
+
+	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 65ae2f4..614da8c 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
@@ -1,80 +1,33 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <e-plugin-list>
-  <e-plugin
-    type="shlib"
-    id="org.gnome.evolution.plugin.mailToTask"
-    location="@PLUGINDIR@/liborg-gnome-mail-to-task SOEXT@"
-    _name="Mail-to-Task">
-    <_description>Convert a mail message to a task.</_description>
+  <e-plugin type="shlib" location="/home/mbarnes/local/lib/evolution/2.28/plugins/liborg-gnome-mail-to-task.so" id="org.gnome.evolution.plugin.mailToTask" name="Mail-to-Task">
     <author name="Rodrigo Moya" email="rodrigo novell com"/>
+    <_description>Convert a mail message to a task.</_description>
 
-    <!-- hook into the uri popup menu -->
-    <hook class="org.gnome.evolution.mail.popup:1.0">
-      <menu id="org.gnome.evolution.mail.folderview.popup" target="select">
-	<item
-	  type="item"
-	  path="70.mail_to_event1"
-	  icon="appointment-new"
-	  _label="Convert to an _Event"
-	  enable="many"
-	  visible="many"
-	  activate="org_gnome_mail_to_event"/>
-	<item
-	  type="item"
-	  path="70.mail_to_event2"
-	  icon="stock_new-meeting"
-	  _label="Convert to a _Meeting"
-	  enable="many"
-	  visible="many"
-	  activate="org_gnome_mail_to_meeting"/>
-	<item
-	  type="item"
-	  path="70.mail_to_event3"
-	  icon="stock_todo"
-	  _label="Convert to a _Task"
-	  enable="many"
-	  visible="many"
-	  activate="org_gnome_mail_to_task"/>
-	<item
-	  type="item"
-	  path="70.mail_to_event4"
-	  icon="stock_insert-note"
-	  _label="Convert to a Mem_o"
-	  enable="many"
-	  visible="many"
-	  activate="org_gnome_mail_to_memo"/>
-      </menu>
+    <hook class="org.gnome.evolution.ui:1.0">
+      <ui-manager id="org.gnome.evolution.mail">
+        <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>
+        <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"/>
+          </placeholder>
+        </popup>
+      </ui-manager>
     </hook>
-    <hook class="org.gnome.evolution.mail.bonobomenu:1.0">
-      <menu id="org.gnome.evolution.mail.browser" target="select">
-	<!-- the path to the bonobo menu description -->
-	<ui file="@PLUGINDIR@/org-gnome-mail-to-task.xml"/>
-	<item
-	  type="item"
-	  verb="ConvertEvent"
-	  path="/commands/ConvertEvent"
-	  enable="many"
-	  activate="org_gnome_mail_to_event_menu"/>
-	<item
-	  type="item"
-	  verb="ConvertMeeting"
-	  path="/commands/ConvertMeeting"
-	  enable="many"
-	  activate="org_gnome_mail_to_meeting_menu"/>
-	<item
-	  type="item"
-	  verb="ConvertTask"
-	  path="/commands/ConvertTask"
-	  enable="many"
-	  activate="org_gnome_mail_to_task_menu"/>
-	<item
-	  type="item"
-	  verb="ConvertMemo"
-	  path="/commands/ConvertMemo"
-	  enable="many"
-	  activate="org_gnome_mail_to_memo_menu"/>
-      </menu>
-    </hook>
-    
+
   </e-plugin>
 </e-plugin-list>
diff --git a/plugins/mark-all-read/mark-all-read.c b/plugins/mark-all-read/mark-all-read.c
index 0a59b69..662bd13 100644
--- a/plugins/mark-all-read/mark-all-read.c
+++ b/plugins/mark-all-read/mark-all-read.c
@@ -38,7 +38,6 @@
 #include <shell/e-shell-sidebar.h>
 #include <shell/e-shell-view.h>
 #include <shell/e-shell-window.h>
-#include <shell/e-shell-window-actions.h>
 
 #define PRIMARY_TEXT \
 	N_("Also mark messages in subfolders?")
@@ -283,6 +282,8 @@ action_mail_mark_read_recursive_cb (GtkAction *action,
 
 	mail_get_folder (
 		folder_uri, 0, mar_got_folder, NULL, mail_msg_unordered_push);
+
+	g_object_unref (folder_tree);
 }
 
 static GtkActionEntry entries[] = {
@@ -303,9 +304,9 @@ e_plugin_ui_init (GtkUIManager *ui_manager,
 	GtkActionGroup *action_group;
 
 	shell_window = e_shell_view_get_shell_window (shell_view);
-	action_group = E_SHELL_WINDOW_ACTION_GROUP_SHELL (shell_window);
+	action_group = e_shell_window_get_action_group (shell_window, "mail");
 
-	/* Add actions to the "shell" action group. */
+	/* Add actions to the "mail" action group. */
 	gtk_action_group_add_actions (
 		action_group, entries,
 		G_N_ELEMENTS (entries), shell_view);
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c
index d1ab1af..5808f9e 100644
--- a/shell/e-shell-view.c
+++ b/shell/e-shell-view.c
@@ -188,6 +188,31 @@ shell_view_state_timeout_cb (EShellView *shell_view)
 	return FALSE;
 }
 
+static gboolean
+shell_view_register_ui_manager (EShellView *shell_view)
+{
+	EShellViewClass *shell_view_class;
+	EShellWindow *shell_window;
+	GtkUIManager *ui_manager;
+	const gchar *id;
+
+	/* This is a one-time, post-construction idle callback. */
+
+	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
+	shell_window = e_shell_view_get_shell_window (shell_view);
+	ui_manager = e_shell_window_get_ui_manager (shell_window);
+	id = shell_view_class->ui_manager_id;
+
+	e_plugin_ui_register_manager (ui_manager, id, shell_view);
+
+	if (e_shell_view_is_active (shell_view)) {
+		e_plugin_ui_enable_manager (ui_manager, id);
+		e_shell_view_update_actions (shell_view);
+	}
+
+	return FALSE;
+}
+
 static void
 shell_view_emit_toggled (EShellView *shell_view)
 {
@@ -394,35 +419,34 @@ shell_view_finalize (GObject *object)
 static void
 shell_view_constructed (GObject *object)
 {
-	EShellWindow *shell_window;
+	EShellViewClass *shell_view_class;
 	EShellView *shell_view;
-	EShellViewClass *class;
-	GtkUIManager *ui_manager;
 	GtkWidget *widget;
-	const gchar *id;
 
 	shell_view = E_SHELL_VIEW (object);
-	class = E_SHELL_VIEW_GET_CLASS (object);
+	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
 
-	shell_window = e_shell_view_get_shell_window (shell_view);
-	ui_manager = e_shell_window_get_ui_manager (shell_window);
-	id = class->ui_manager_id;
-
-	e_plugin_ui_register_manager (ui_manager, id, shell_view);
+	/* Defer EPluginUI registration to an idle callback to give the
+	 * shell view subclass a chance to register its own actions and
+	 * action groups.  Registration will immediately load EPlugins
+	 * that specify the shell view's GtkUIManager ID, and their
+	 * initialization routines may require those actions or action
+	 * groups that have not yet been added. */
+	g_idle_add ((GSourceFunc) shell_view_register_ui_manager, shell_view);
 
 	shell_view_load_state (shell_view);
 
 	/* Invoke factory methods. */
 
-	widget = class->new_shell_content (shell_view);
+	widget = shell_view_class->new_shell_content (shell_view);
 	shell_view->priv->shell_content = g_object_ref_sink (widget);
 	gtk_widget_show (widget);
 
-	widget = class->new_shell_sidebar (shell_view);
+	widget = shell_view_class->new_shell_sidebar (shell_view);
 	shell_view->priv->shell_sidebar = g_object_ref_sink (widget);
 	gtk_widget_show (widget);
 
-	widget = class->new_shell_taskbar (shell_view);
+	widget = shell_view_class->new_shell_taskbar (shell_view);
 	shell_view->priv->shell_taskbar = g_object_ref_sink (widget);
 	gtk_widget_show (widget);
 }
@@ -431,24 +455,25 @@ static void
 shell_view_toggled (EShellView *shell_view)
 {
 	EShellViewPrivate *priv = shell_view->priv;
-	EShellViewClass *class;
+	EShellViewClass *shell_view_class;
 	EShellWindow *shell_window;
 	GtkUIManager *ui_manager;
-	const gchar *basename;
+	const gchar *basename, *id;
 	gboolean view_is_active;
 
-	class = E_SHELL_VIEW_GET_CLASS (shell_view);
+	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
 	shell_window = e_shell_view_get_shell_window (shell_view);
 	ui_manager = e_shell_window_get_ui_manager (shell_window);
 	view_is_active = e_shell_view_is_active (shell_view);
-	basename = class->ui_definition;
+	basename = shell_view_class->ui_definition;
+	id = shell_view_class->ui_manager_id;
 
 	if (view_is_active && priv->merge_id == 0) {
 		priv->merge_id = e_load_ui_definition (ui_manager, basename);
-		e_plugin_ui_enable_manager (ui_manager, class->ui_manager_id);
+		e_plugin_ui_enable_manager (ui_manager, id);
 
 	} else if (!view_is_active && priv->merge_id != 0) {
-		e_plugin_ui_disable_manager (ui_manager, class->ui_manager_id);
+		e_plugin_ui_disable_manager (ui_manager, id);
 		gtk_ui_manager_remove_ui (ui_manager, priv->merge_id);
 		priv->merge_id = 0;
 	}
diff --git a/ui/evolution-mail-reader.ui b/ui/evolution-mail-reader.ui
index 1000fe5..374db8f 100644
--- a/ui/evolution-mail-reader.ui
+++ b/ui/evolution-mail-reader.ui
@@ -102,6 +102,8 @@
           <menuitem action='mail-search-folder-from-recipients'/>
           <menuitem action='mail-search-folder-from-mailing-list'/>
         </menu>
+        <separator/>
+        <placeholder name='mail-message-actions'/>
       </menu>
     </placeholder>
   </menubar>
diff --git a/ui/evolution-mail.ui b/ui/evolution-mail.ui
index a73cfd0..c676cf5 100644
--- a/ui/evolution-mail.ui
+++ b/ui/evolution-mail.ui
@@ -37,6 +37,7 @@
       <menu action='mail-folder-menu'>
         <menuitem action='mail-folder-new'/>
         <menuitem action='mail-tools-subscriptions'/>
+        <menuitem action='mail-folder-unsubscribe'/>
         <separator/>
         <menuitem action='mail-folder-copy'/>
         <menuitem action='mail-folder-move'/>
@@ -51,11 +52,8 @@
         <menuitem action='mail-folder-refresh'/>
         <menuitem action='mail-folder-delete'/>
         <separator/>
-        <menuitem action='mail-folder-unsubscribe'/>
-        <separator/>
         <menuitem action='mail-folder-properties'/>
       </menu>
-      <menu action='mail-message-menu'/>
     </placeholder>
     <menu action='search-menu'>
       <placeholder name='search-actions'>
@@ -110,6 +108,8 @@
       <separator/>
       <menuitem action='mail-label-new'/>
     </menu>
+    <separator/>
+    <placeholder name='mail-message-popup-actions'/>
   </popup>
   <popup name='mail-search-options'>
     <menuitem action='mail-search-subject-or-sender-contains'/>



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