[evolution] Bug 269852 - Label should be on "Message" menu when mail is selected ][



commit 46896a39e5c004c26fc5e3f46c965c3d6975c853
Author: Milan Crha <mcrha redhat com>
Date:   Thu Jul 26 18:02:27 2018 +0200

    Bug 269852 - Label should be on "Message" menu when mail is selected ][
    
    The Message->Mark As->Label had been failing in EMailBrowser with
    a runtime warning.

 src/mail/e-mail-browser.c                    |  24 ++
 src/mail/e-mail-paned-view.c                 |   3 +
 src/mail/e-mail-reader.c                     | 347 ++++++++++++++++++++++++
 src/mail/e-mail-reader.h                     |   1 +
 src/modules/mail/e-mail-shell-content.c      |  22 ++
 src/modules/mail/e-mail-shell-view-actions.c | 378 ---------------------------
 src/modules/mail/e-mail-shell-view-actions.h |   6 -
 src/modules/mail/e-mail-shell-view-private.c |  40 +--
 src/modules/mail/e-mail-shell-view-private.h |  10 +-
 src/modules/mail/e-mail-shell-view.c         |  20 +-
 10 files changed, 419 insertions(+), 432 deletions(-)
---
diff --git a/src/mail/e-mail-browser.c b/src/mail/e-mail-browser.c
index 48b9ac0f93..b8dc5cc8ef 100644
--- a/src/mail/e-mail-browser.c
+++ b/src/mail/e-mail-browser.c
@@ -41,6 +41,7 @@
 
 #define ACTION_GROUP_STANDARD          "action-group-standard"
 #define ACTION_GROUP_SEARCH_FOLDERS    "action-group-search-folders"
+#define ACTION_GROUP_LABELS            "action-group-labels"
 
 struct _EMailBrowserPrivate {
        EMailBackend *backend;
@@ -721,6 +722,20 @@ mail_browser_constructed (GObject *object)
                object, ACTION_GROUP_SEARCH_FOLDERS,
                action_group, (GDestroyNotify) g_object_unref);
 
+       action_group = gtk_action_group_new (ACTION_GROUP_LABELS);
+       gtk_action_group_set_translation_domain (action_group, domain);
+       gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+
+       /* For easy access.  Takes ownership of the reference. */
+       g_object_set_data_full (
+               object, ACTION_GROUP_LABELS,
+               action_group, (GDestroyNotify) g_object_unref);
+
+       e_binding_bind_property (
+               display, "need-input",
+               action_group, "sensitive",
+               G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
+
        e_mail_reader_init (reader, TRUE, TRUE);
 
        e_load_ui_manager_definition (ui_manager, E_MAIL_READER_UI_DEFINITION);
@@ -799,6 +814,12 @@ mail_browser_constructed (GObject *object)
        e_plugin_ui_register_manager (ui_manager, id, object);
        e_plugin_ui_enable_manager (ui_manager, id);
 
+       action = e_mail_reader_get_action (reader, "mail-label-none");
+       e_binding_bind_property (
+               display, "need-input",
+               action, "sensitive",
+               G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
+
        e_extensible_load_extensions (E_EXTENSIBLE (object));
 }
 
@@ -829,6 +850,9 @@ mail_browser_get_action_group (EMailReader *reader,
                case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
                        group_name = ACTION_GROUP_SEARCH_FOLDERS;
                        break;
+               case E_MAIL_READER_ACTION_GROUP_LABELS:
+                       group_name = ACTION_GROUP_LABELS;
+                       break;
                default:
                        g_return_val_if_reached (NULL);
        }
diff --git a/src/mail/e-mail-paned-view.c b/src/mail/e-mail-paned-view.c
index 228be05daa..17f0c7c7f3 100644
--- a/src/mail/e-mail-paned-view.c
+++ b/src/mail/e-mail-paned-view.c
@@ -486,6 +486,9 @@ mail_paned_view_get_action_group (EMailReader *reader,
                case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
                        group_name = "search-folders";
                        break;
+               case E_MAIL_READER_ACTION_GROUP_LABELS:
+                       group_name = "mail-labels";
+                       break;
                default:
                        g_return_val_if_reached (NULL);
        }
diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c
index 98dde18a82..95773c9c68 100644
--- a/src/mail/e-mail-reader.c
+++ b/src/mail/e-mail-reader.c
@@ -40,6 +40,9 @@
 #include "e-mail-backend.h"
 #include "e-mail-browser.h"
 #include "e-mail-enumtypes.h"
+#include "e-mail-label-action.h"
+#include "e-mail-label-dialog.h"
+#include "e-mail-label-list-store.h"
 #include "e-mail-notes.h"
 #include "e-mail-reader-utils.h"
 #include "e-mail-ui-session.h"
@@ -101,6 +104,9 @@ struct _EMailReaderPrivate {
        gpointer followup_alert; /* weak pointer to an EAlert */
 
        GSList *ongoing_operations; /* GCancellable * */
+
+       guint main_menu_label_merge_id;
+       guint popup_menu_label_merge_id;
 };
 
 enum {
@@ -876,6 +882,116 @@ action_mail_forward_quoted_cb (GtkAction *action,
        g_ptr_array_unref (uids);
 }
 
+static void
+action_mail_label_new_cb (GtkAction *action,
+                          EMailReader *reader)
+{
+       EMailLabelDialog *label_dialog;
+       EMailLabelListStore *label_store;
+       EMailBackend *backend;
+       EMailSession *session;
+       CamelFolder *folder;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       GtkWidget *dialog;
+       GPtrArray *uids;
+       GdkColor label_color;
+       const gchar *label_name;
+       gchar *label_tag;
+       gint n_children;
+       guint ii;
+
+       dialog = e_mail_label_dialog_new (e_mail_reader_get_window (reader));
+
+       gtk_window_set_title (GTK_WINDOW (dialog), _("Add Label"));
+
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
+               goto exit;
+
+       backend = e_mail_reader_get_backend (reader);
+       session = e_mail_backend_get_session (backend);
+       label_store = e_mail_ui_session_get_label_store (
+               E_MAIL_UI_SESSION (session));
+
+       label_dialog = E_MAIL_LABEL_DIALOG (dialog);
+       label_name = e_mail_label_dialog_get_label_name (label_dialog);
+       e_mail_label_dialog_get_label_color (label_dialog, &label_color);
+
+       e_mail_label_list_store_set (
+               label_store, NULL, label_name, &label_color);
+
+       /* XXX This is awkward.  We've added a new label to the list store
+        *     but we don't have the new label's tag nor an iterator to use
+        *     to fetch it.  We know the label was appended to the store,
+        *     so we have to dig it out manually.  EMailLabelListStore API
+        *     probably needs some rethinking. */
+       model = GTK_TREE_MODEL (label_store);
+       n_children = gtk_tree_model_iter_n_children (model, NULL);
+       g_warn_if_fail (gtk_tree_model_iter_nth_child (model, &iter, NULL, n_children - 1));
+       label_tag = e_mail_label_list_store_get_tag (label_store, &iter);
+
+       folder = e_mail_reader_ref_folder (reader);
+       uids = e_mail_reader_get_selected_uids (reader);
+
+       for (ii = 0; ii < uids->len; ii++)
+               camel_folder_set_message_user_flag (
+                       folder, uids->pdata[ii], label_tag, TRUE);
+
+       g_clear_object (&folder);
+       g_ptr_array_unref (uids);
+
+       g_free (label_tag);
+
+ exit:
+       gtk_widget_destroy (dialog);
+}
+
+static void
+action_mail_label_none_cb (GtkAction *action,
+                           EMailReader *reader)
+{
+       EMailBackend *backend;
+       EMailSession *session;
+       EMailLabelListStore *label_store;
+       CamelFolder *folder;
+       GtkTreeIter iter;
+       GPtrArray *uids;
+       gboolean valid;
+       guint ii;
+
+       backend = e_mail_reader_get_backend (reader);
+       session = e_mail_backend_get_session (backend);
+       label_store = e_mail_ui_session_get_label_store (
+               E_MAIL_UI_SESSION (session));
+
+       folder = e_mail_reader_ref_folder (reader);
+       uids = e_mail_reader_get_selected_uids (reader);
+
+       valid = gtk_tree_model_get_iter_first (
+               GTK_TREE_MODEL (label_store), &iter);
+
+       while (valid) {
+               gchar *tag;
+
+               tag = e_mail_label_list_store_get_tag (label_store, &iter);
+
+               for (ii = 0; ii < uids->len; ii++) {
+                       camel_folder_set_message_user_flag (
+                               folder, uids->pdata[ii], tag, FALSE);
+                       camel_folder_set_message_user_tag (
+                               folder, uids->pdata[ii], "label", NULL);
+               }
+
+               g_free (tag);
+
+               valid = gtk_tree_model_iter_next (
+                       GTK_TREE_MODEL (label_store), &iter);
+       }
+
+       g_clear_object (&folder);
+       g_ptr_array_unref (uids);
+}
+
 static void
 action_mail_load_images_cb (GtkAction *action,
                             EMailReader *reader)
@@ -2406,6 +2522,22 @@ static GtkActionEntry mail_reader_entries[] = {
          N_("Forward the selected message quoted like a reply"),
          G_CALLBACK (action_mail_forward_quoted_cb) },
 
+       { "mail-label-new",
+         NULL,
+         N_("_New Label"),
+         NULL,
+         NULL,  /* XXX Add a tooltip! */
+         G_CALLBACK (action_mail_label_new_cb) },
+
+       { "mail-label-none",
+         NULL,
+         /* Translators: "None" is used in the message label context menu.
+          *              It removes all labels from the selected messages. */
+         N_("N_one"),
+         "0",
+         NULL,  /* XXX Add a tooltip! */
+         G_CALLBACK (action_mail_label_none_cb) },
+
        { "mail-load-images",
          "image-x-generic",
          N_("_Load Images"),
@@ -2702,6 +2834,13 @@ static GtkActionEntry mail_reader_entries[] = {
          NULL,
          NULL },
 
+       { "mail-label-menu",
+         NULL,
+         N_("_Label"),
+         NULL,
+         NULL,
+         NULL },
+
        { "mail-reply-group-menu",
          NULL,
          N_("_Group Reply"),
@@ -3890,6 +4029,212 @@ mail_reader_show_search_bar (EMailReader *reader)
        e_preview_pane_show_search_bar (preview_pane);
 }
 
+static void
+action_mail_label_cb (GtkToggleAction *action,
+                      EMailReader *reader)
+{
+       CamelFolder *folder;
+       GPtrArray *uids;
+       const gchar *tag;
+       gint ii;
+
+       tag = g_object_get_data (G_OBJECT (action), "tag");
+       g_return_if_fail (tag != NULL);
+
+       folder = e_mail_reader_ref_folder (reader);
+       uids = e_mail_reader_get_selected_uids (reader);
+
+       camel_folder_freeze (folder);
+       for (ii = 0; ii < uids->len; ii++) {
+               if (gtk_toggle_action_get_active (action))
+                       camel_folder_set_message_user_flag (
+                               folder, uids->pdata[ii], tag, TRUE);
+               else {
+                       camel_folder_set_message_user_flag (
+                               folder, uids->pdata[ii], tag, FALSE);
+                       camel_folder_set_message_user_tag (
+                               folder, uids->pdata[ii], "label", NULL);
+               }
+       }
+       camel_folder_thaw (folder);
+
+       g_clear_object (&folder);
+       g_ptr_array_unref (uids);
+}
+
+static void
+mail_reader_update_label_action (GtkToggleAction *action,
+                                EMailReader *reader,
+                                GPtrArray *uids,
+                                const gchar *label_tag)
+{
+       CamelFolder *folder;
+       gboolean exists = FALSE;
+       gboolean not_exists = FALSE;
+       gboolean sensitive;
+       guint ii;
+
+       folder = e_mail_reader_ref_folder (reader);
+
+       /* Figure out the proper label action state for the selected
+        * messages.  If all the selected messages have the given label,
+        * make the toggle action active.  If all the selected message
+        * DO NOT have the given label, make the toggle action inactive.
+        * If some do and some don't, make the action insensitive. */
+
+       for (ii = 0; ii < uids->len && (!exists || !not_exists); ii++) {
+               const gchar *old_label;
+               gchar *new_label;
+
+               /* Check for new-style labels. */
+               if (camel_folder_get_message_user_flag (
+                       folder, uids->pdata[ii], label_tag)) {
+                       exists = TRUE;
+                       continue;
+               }
+
+               /* Check for old-style labels. */
+               old_label = camel_folder_get_message_user_tag (
+                       folder, uids->pdata[ii], "label");
+               if (old_label == NULL) {
+                       not_exists = TRUE;
+                       continue;
+               }
+
+               /* Convert old-style labels ("<name>") to "$Label<name>". */
+               new_label = g_alloca (strlen (old_label) + 10);
+               g_stpcpy (g_stpcpy (new_label, "$Label"), old_label);
+
+               if (strcmp (new_label, label_tag) == 0)
+                       exists = TRUE;
+               else
+                       not_exists = TRUE;
+       }
+
+       sensitive = !(exists && not_exists);
+       gtk_toggle_action_set_active (action, exists);
+       gtk_action_set_sensitive (GTK_ACTION (action), sensitive);
+
+       g_clear_object (&folder);
+}
+
+static void
+mail_reader_update_labels_menu (EMailReader *reader)
+{
+       EMailReaderPrivate *priv;
+       EMailLabelListStore *label_store;
+       EMailBackend *backend;
+       EMailSession *session;
+       GtkWindow *window;
+       GtkUIManager *ui_manager = NULL;
+       GtkActionGroup *action_group;
+       GtkTreeIter iter;
+       GPtrArray *uids;
+       const gchar *main_menu_path, *popup_menu_path;
+       gboolean valid;
+       gint ii = 0;
+
+       priv = E_MAIL_READER_GET_PRIVATE (reader);
+
+       window = e_mail_reader_get_window (reader);
+       g_return_if_fail (window != NULL);
+
+       if (E_IS_SHELL_WINDOW (window))
+               ui_manager = e_shell_window_get_ui_manager (E_SHELL_WINDOW (window));
+       else if (E_IS_MAIL_BROWSER (window))
+               ui_manager = e_mail_browser_get_ui_manager (E_MAIL_BROWSER (window));
+
+       g_return_if_fail (ui_manager != NULL);
+       g_return_if_fail (GTK_IS_UI_MANAGER (ui_manager));
+
+       backend = e_mail_reader_get_backend (reader);
+       session = e_mail_backend_get_session (backend);
+       label_store = e_mail_ui_session_get_label_store (E_MAIL_UI_SESSION (session));
+
+       action_group = e_mail_reader_get_action_group (reader, E_MAIL_READER_ACTION_GROUP_LABELS);
+       main_menu_path = 
"/main-menu/custom-menus/mail-message-menu/mail-mark-as-menu/mail-label-menu/mail-label-actions";
+       popup_menu_path = "/mail-message-popup/mail-label-menu/mail-label-actions";
+
+       /* Unmerge the previous menu items. */
+       if (priv->main_menu_label_merge_id)
+               gtk_ui_manager_remove_ui (ui_manager, priv->main_menu_label_merge_id);
+       else
+               priv->main_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
+
+       if (priv->popup_menu_label_merge_id)
+               gtk_ui_manager_remove_ui (ui_manager, priv->popup_menu_label_merge_id);
+       else
+               priv->popup_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
+
+       e_action_group_remove_all_actions (action_group);
+       gtk_ui_manager_ensure_update (ui_manager);
+
+       uids = e_mail_reader_get_selected_uids (reader);
+
+       valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (label_store), &iter);
+
+       while (valid) {
+               EMailLabelAction *label_action;
+               GtkAction *action;
+               gchar *action_name;
+               gchar *stock_id;
+               gchar *label;
+               gchar *tag;
+
+               label = e_mail_label_list_store_get_name (label_store, &iter);
+               stock_id = e_mail_label_list_store_get_stock_id (label_store, &iter);
+               tag = e_mail_label_list_store_get_tag (label_store, &iter);
+               action_name = g_strdup_printf ("mail-label-%d", ii);
+
+               /* XXX Add a tooltip! */
+               label_action = e_mail_label_action_new (action_name, label, NULL, stock_id);
+
+               g_object_set_data_full (
+                       G_OBJECT (label_action), "tag",
+                       tag, (GDestroyNotify) g_free);
+
+               /* Configure the action before we connect to signals. */
+               mail_reader_update_label_action (GTK_TOGGLE_ACTION (label_action), reader, uids, tag);
+
+               g_signal_connect (
+                       label_action, "toggled",
+                       G_CALLBACK (action_mail_label_cb), reader);
+
+               /* The action group takes ownership of the action. */
+               action = GTK_ACTION (label_action);
+
+               if (ii + 1 < 10) {
+                       gchar accel[5];
+
+                       accel[0] = '1' + ii;
+                       accel[1] = '\0';
+
+                       gtk_action_group_add_action_with_accel (action_group, action, accel);
+               } else {
+                       gtk_action_group_add_action (action_group, action);
+               }
+               g_object_unref (label_action);
+
+               gtk_ui_manager_add_ui (
+                       ui_manager, priv->main_menu_label_merge_id, main_menu_path,
+                       action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
+
+               gtk_ui_manager_add_ui (
+                       ui_manager, priv->popup_menu_label_merge_id, popup_menu_path,
+                       action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
+
+               g_free (label);
+               g_free (stock_id);
+               g_free (action_name);
+
+               valid = gtk_tree_model_iter_next (
+                       GTK_TREE_MODEL (label_store), &iter);
+               ii++;
+       }
+
+       g_ptr_array_unref (uids);
+}
+
 static void
 mail_reader_update_actions (EMailReader *reader,
                             guint32 state)
@@ -4336,6 +4681,8 @@ mail_reader_update_actions (EMailReader *reader,
        sensitive = single_message_selected;
        action = e_mail_reader_get_action (reader, action_name);
        gtk_action_set_sensitive (action, sensitive);
+
+       mail_reader_update_labels_menu (reader);
 }
 
 static gboolean
diff --git a/src/mail/e-mail-reader.h b/src/mail/e-mail-reader.h
index 7cf77432bc..3510163c25 100644
--- a/src/mail/e-mail-reader.h
+++ b/src/mail/e-mail-reader.h
@@ -65,6 +65,7 @@ typedef struct _EMailReaderInterface EMailReaderInterface;
 typedef enum {
        E_MAIL_READER_ACTION_GROUP_STANDARD,
        E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS,
+       E_MAIL_READER_ACTION_GROUP_LABELS,
        E_MAIL_READER_NUM_ACTION_GROUPS
 } EMailReaderActionGroup;
 
diff --git a/src/modules/mail/e-mail-shell-content.c b/src/modules/mail/e-mail-shell-content.c
index 03f4394c16..2ca0e53429 100644
--- a/src/modules/mail/e-mail-shell-content.c
+++ b/src/modules/mail/e-mail-shell-content.c
@@ -434,6 +434,9 @@ mail_shell_content_get_action_group (EMailReader *reader,
                case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
                        group_name = "search-folders";
                        break;
+               case E_MAIL_READER_ACTION_GROUP_LABELS:
+                       group_name = "mail-labels";
+                       break;
                default:
                        g_return_val_if_reached (NULL);
        }
@@ -578,6 +581,24 @@ mail_shell_content_set_folder (EMailReader *reader,
        e_mail_reader_set_folder (reader, folder);
 }
 
+static void
+mail_shell_content_update_actions (EMailReader *reader,
+                                  guint32 state)
+{
+       EMailShellContent *mail_shell_content;
+
+       mail_shell_content = E_MAIL_SHELL_CONTENT (reader);
+
+       if (!mail_shell_content->priv->mail_view)
+               return;
+
+       /* Forward this to our internal EMailView, which
+        * also implements the EMailReader interface. */
+       reader = E_MAIL_READER (mail_shell_content->priv->mail_view);
+
+       e_mail_reader_update_actions (reader, state);
+}
+
 static void
 mail_shell_content_reload (EMailReader *reader)
 {
@@ -683,6 +704,7 @@ e_mail_shell_content_reader_init (EMailReaderInterface *iface)
        iface->get_window = mail_shell_content_get_window;
        iface->set_folder = mail_shell_content_set_folder;
        iface->open_selected_mail = mail_shell_content_open_selected_mail;
+       iface->update_actions = mail_shell_content_update_actions;
        iface->reload = mail_shell_content_reload;
 }
 
diff --git a/src/modules/mail/e-mail-shell-view-actions.c b/src/modules/mail/e-mail-shell-view-actions.c
index 8924a84aeb..b9c43d6f87 100644
--- a/src/modules/mail/e-mail-shell-view-actions.c
+++ b/src/modules/mail/e-mail-shell-view-actions.c
@@ -1170,182 +1170,6 @@ action_mail_goto_folder_cb (GtkAction *action,
        g_clear_object (&folder);
 }
 
-static void
-action_mail_label_cb (GtkToggleAction *action,
-                      EMailShellView *mail_shell_view)
-{
-       EMailShellContent *mail_shell_content;
-       EMailReader *reader;
-       EMailView *mail_view;
-       CamelFolder *folder;
-       GPtrArray *uids;
-       const gchar *tag;
-       gint ii;
-
-       tag = g_object_get_data (G_OBJECT (action), "tag");
-       g_return_if_fail (tag != NULL);
-
-       mail_shell_content = mail_shell_view->priv->mail_shell_content;
-       mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
-       reader = E_MAIL_READER (mail_view);
-       folder = e_mail_reader_ref_folder (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
-
-       camel_folder_freeze (folder);
-       for (ii = 0; ii < uids->len; ii++) {
-               if (gtk_toggle_action_get_active (action))
-                       camel_folder_set_message_user_flag (
-                               folder, uids->pdata[ii], tag, TRUE);
-               else {
-                       camel_folder_set_message_user_flag (
-                               folder, uids->pdata[ii], tag, FALSE);
-                       camel_folder_set_message_user_tag (
-                               folder, uids->pdata[ii], "label", NULL);
-               }
-       }
-       camel_folder_thaw (folder);
-
-       g_clear_object (&folder);
-       g_ptr_array_unref (uids);
-}
-
-static void
-action_mail_label_new_cb (GtkAction *action,
-                          EMailShellView *mail_shell_view)
-{
-       EShellView *shell_view;
-       EShellWindow *shell_window;
-       EShellBackend *shell_backend;
-       EMailShellContent *mail_shell_content;
-       EMailLabelDialog *label_dialog;
-       EMailLabelListStore *label_store;
-       EMailBackend *backend;
-       EMailSession *session;
-       EMailReader *reader;
-       EMailView *mail_view;
-       CamelFolder *folder;
-       GtkTreeModel *model;
-       GtkTreeIter iter;
-       GtkWidget *dialog;
-       GPtrArray *uids;
-       GdkColor label_color;
-       const gchar *label_name;
-       gchar *label_tag;
-       gint n_children;
-       guint ii;
-
-       shell_view = E_SHELL_VIEW (mail_shell_view);
-       shell_window = e_shell_view_get_shell_window (shell_view);
-       shell_backend = e_shell_view_get_shell_backend (shell_view);
-
-       dialog = e_mail_label_dialog_new (GTK_WINDOW (shell_window));
-
-       gtk_window_set_title (GTK_WINDOW (dialog), _("Add Label"));
-
-       if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
-               goto exit;
-
-       backend = E_MAIL_BACKEND (shell_backend);
-       session = e_mail_backend_get_session (backend);
-       label_store = e_mail_ui_session_get_label_store (
-               E_MAIL_UI_SESSION (session));
-
-       label_dialog = E_MAIL_LABEL_DIALOG (dialog);
-       label_name = e_mail_label_dialog_get_label_name (label_dialog);
-       e_mail_label_dialog_get_label_color (label_dialog, &label_color);
-
-       e_mail_label_list_store_set (
-               label_store, NULL, label_name, &label_color);
-
-       /* XXX This is awkward.  We've added a new label to the list store
-        *     but we don't have the new label's tag nor an iterator to use
-        *     to fetch it.  We know the label was appended to the store,
-        *     so we have to dig it out manually.  EMailLabelListStore API
-        *     probably needs some rethinking. */
-       model = GTK_TREE_MODEL (label_store);
-       n_children = gtk_tree_model_iter_n_children (model, NULL);
-       g_warn_if_fail (gtk_tree_model_iter_nth_child (model, &iter, NULL, n_children - 1));
-       label_tag = e_mail_label_list_store_get_tag (label_store, &iter);
-
-       mail_shell_content = mail_shell_view->priv->mail_shell_content;
-       mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
-       reader = E_MAIL_READER (mail_view);
-       folder = e_mail_reader_ref_folder (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
-
-       for (ii = 0; ii < uids->len; ii++)
-               camel_folder_set_message_user_flag (
-                       folder, uids->pdata[ii], label_tag, TRUE);
-
-       g_clear_object (&folder);
-       g_ptr_array_unref (uids);
-
-       g_free (label_tag);
-
-exit:
-       gtk_widget_destroy (dialog);
-}
-
-static void
-action_mail_label_none_cb (GtkAction *action,
-                           EMailShellView *mail_shell_view)
-{
-       EShellView *shell_view;
-       EShellBackend *shell_backend;
-       EMailBackend *backend;
-       EMailSession *session;
-       EMailShellContent *mail_shell_content;
-       EMailLabelListStore *label_store;
-       EMailReader *reader;
-       EMailView *mail_view;
-       CamelFolder *folder;
-       GtkTreeIter iter;
-       GPtrArray *uids;
-       gboolean valid;
-       guint ii;
-
-       shell_view = E_SHELL_VIEW (mail_shell_view);
-       shell_backend = e_shell_view_get_shell_backend (shell_view);
-
-       backend = E_MAIL_BACKEND (shell_backend);
-       session = e_mail_backend_get_session (backend);
-       label_store = e_mail_ui_session_get_label_store (
-               E_MAIL_UI_SESSION (session));
-
-       mail_shell_content = mail_shell_view->priv->mail_shell_content;
-       mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
-       reader = E_MAIL_READER (mail_view);
-       folder = e_mail_reader_ref_folder (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
-
-       valid = gtk_tree_model_get_iter_first (
-               GTK_TREE_MODEL (label_store), &iter);
-
-       while (valid) {
-               gchar *tag;
-
-               tag = e_mail_label_list_store_get_tag (label_store, &iter);
-
-               for (ii = 0; ii < uids->len; ii++) {
-                       camel_folder_set_message_user_flag (
-                               folder, uids->pdata[ii], tag, FALSE);
-                       camel_folder_set_message_user_tag (
-                               folder, uids->pdata[ii], "label", NULL);
-               }
-
-               g_free (tag);
-
-               valid = gtk_tree_model_iter_next (
-                       GTK_TREE_MODEL (label_store), &iter);
-       }
-
-       g_clear_object (&folder);
-       g_ptr_array_unref (uids);
-}
-
 static void
 action_mail_send_receive_cb (GtkAction *action,
                              EMailShellView *mail_shell_view)
@@ -1766,22 +1590,6 @@ static GtkActionEntry mail_entries[] = {
          N_("Opens a dialog to select a folder to go to"),
          G_CALLBACK (action_mail_goto_folder_cb) },
 
-       { "mail-label-new",
-         NULL,
-         N_("_New Label"),
-         NULL,
-         NULL,  /* XXX Add a tooltip! */
-         G_CALLBACK (action_mail_label_new_cb) },
-
-       { "mail-label-none",
-         NULL,
-         /* Translators: "None" is used in the message label context menu.
-          *              It removes all labels from the selected messages. */
-         N_("N_one"),
-         "0",
-         NULL,  /* XXX Add a tooltip! */
-         G_CALLBACK (action_mail_label_none_cb) },
-
        /* This is the same as "mail-tools-subscriptions" but only
         * appears in the sidebar context menu when right-clicking
         * on a store that supports folder subscriptions.  No need
@@ -1889,13 +1697,6 @@ static GtkActionEntry mail_entries[] = {
          NULL,
          NULL },
 
-       { "mail-label-menu",
-         NULL,
-         N_("_Label"),
-         NULL,
-         NULL,
-         NULL },
-
        { "mail-preview-menu",
          NULL,
          N_("_Preview"),
@@ -2420,185 +2221,6 @@ e_mail_shell_view_actions_init (EMailShellView *mail_shell_view)
                G_BINDING_SYNC_CREATE);
 }
 
-/* Helper for e_mail_shell_view_update_popup_labels() */
-static void
-mail_shell_view_update_label_action (GtkToggleAction *action,
-                                     EMailReader *reader,
-                                     GPtrArray *uids,
-                                     const gchar *label_tag)
-{
-       CamelFolder *folder;
-       gboolean exists = FALSE;
-       gboolean not_exists = FALSE;
-       gboolean sensitive;
-       guint ii;
-
-       folder = e_mail_reader_ref_folder (reader);
-
-       /* Figure out the proper label action state for the selected
-        * messages.  If all the selected messages have the given label,
-        * make the toggle action active.  If all the selected message
-        * DO NOT have the given label, make the toggle action inactive.
-        * If some do and some don't, make the action insensitive. */
-
-       for (ii = 0; ii < uids->len && (!exists || !not_exists); ii++) {
-               const gchar *old_label;
-               gchar *new_label;
-
-               /* Check for new-style labels. */
-               if (camel_folder_get_message_user_flag (
-                       folder, uids->pdata[ii], label_tag)) {
-                       exists = TRUE;
-                       continue;
-               }
-
-               /* Check for old-style labels. */
-               old_label = camel_folder_get_message_user_tag (
-                       folder, uids->pdata[ii], "label");
-               if (old_label == NULL) {
-                       not_exists = TRUE;
-                       continue;
-               }
-
-               /* Convert old-style labels ("<name>") to "$Label<name>". */
-               new_label = g_alloca (strlen (old_label) + 10);
-               g_stpcpy (g_stpcpy (new_label, "$Label"), old_label);
-
-               if (strcmp (new_label, label_tag) == 0)
-                       exists = TRUE;
-               else
-                       not_exists = TRUE;
-       }
-
-       sensitive = !(exists && not_exists);
-       gtk_toggle_action_set_active (action, exists);
-       gtk_action_set_sensitive (GTK_ACTION (action), sensitive);
-
-       g_clear_object (&folder);
-}
-
-void
-e_mail_shell_view_update_popup_labels (EMailShellView *mail_shell_view)
-{
-       EShellView *shell_view;
-       EShellWindow *shell_window;
-       EShellBackend *shell_backend;
-       EMailShellContent *mail_shell_content;
-       EMailLabelListStore *label_store;
-       EMailBackend *backend;
-       EMailSession *session;
-       EMailReader *reader;
-       EMailView *mail_view;
-       GtkUIManager *ui_manager;
-       GtkActionGroup *action_group;
-       GtkTreeIter iter;
-       GPtrArray *uids;
-       const gchar *main_menu_path, *popup_menu_path;
-       gboolean valid;
-       gint ii = 0;
-
-       g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
-       shell_view = E_SHELL_VIEW (mail_shell_view);
-       shell_window = e_shell_view_get_shell_window (shell_view);
-       shell_backend = e_shell_view_get_shell_backend (shell_view);
-       ui_manager = e_shell_window_get_ui_manager (shell_window);
-
-       g_return_if_fail (ui_manager != NULL);
-       g_return_if_fail (GTK_IS_UI_MANAGER (ui_manager));
-
-       backend = E_MAIL_BACKEND (shell_backend);
-       session = e_mail_backend_get_session (backend);
-       label_store = e_mail_ui_session_get_label_store (
-               E_MAIL_UI_SESSION (session));
-
-       action_group = ACTION_GROUP (MAIL_LABEL);
-       main_menu_path = 
"/main-menu/custom-menus/mail-message-menu/mail-mark-as-menu/mail-label-menu/mail-label-actions";
-       popup_menu_path = "/mail-message-popup/mail-label-menu/mail-label-actions";
-
-       /* Unmerge the previous menu items. */
-       gtk_ui_manager_remove_ui (ui_manager, mail_shell_view->priv->main_menu_label_merge_id);
-       gtk_ui_manager_remove_ui (ui_manager, mail_shell_view->priv->popup_menu_label_merge_id);
-       e_action_group_remove_all_actions (action_group);
-       gtk_ui_manager_ensure_update (ui_manager);
-
-       mail_shell_content = mail_shell_view->priv->mail_shell_content;
-       mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
-       reader = E_MAIL_READER (mail_view);
-       uids = e_mail_reader_get_selected_uids (reader);
-
-       valid = gtk_tree_model_get_iter_first (
-               GTK_TREE_MODEL (label_store), &iter);
-
-       while (valid) {
-               EMailLabelAction *label_action;
-               GtkAction *action;
-               gchar *action_name;
-               gchar *stock_id;
-               gchar *label;
-               gchar *tag;
-
-               label = e_mail_label_list_store_get_name (
-                       label_store, &iter);
-               stock_id = e_mail_label_list_store_get_stock_id (
-                       label_store, &iter);
-               tag = e_mail_label_list_store_get_tag (
-                       label_store, &iter);
-               action_name = g_strdup_printf ("mail-label-%d", ii);
-
-               /* XXX Add a tooltip! */
-               label_action = e_mail_label_action_new (
-                       action_name, label, NULL, stock_id);
-
-               g_object_set_data_full (
-                       G_OBJECT (label_action), "tag",
-                       tag, (GDestroyNotify) g_free);
-
-               /* Configure the action before we connect to signals. */
-               mail_shell_view_update_label_action (
-                       GTK_TOGGLE_ACTION (label_action),
-                       reader, uids, tag);
-
-               g_signal_connect (
-                       label_action, "toggled",
-                       G_CALLBACK (action_mail_label_cb), mail_shell_view);
-
-               /* The action group takes ownership of the action. */
-               action = GTK_ACTION (label_action);
-
-               if (ii + 1 < 10) {
-                       gchar accel[5];
-
-                       accel[0] = '1' + ii;
-                       accel[1] = '\0';
-
-                       gtk_action_group_add_action_with_accel (action_group, action, accel);
-               } else {
-                       gtk_action_group_add_action (action_group, action);
-               }
-               g_object_unref (label_action);
-
-               gtk_ui_manager_add_ui (
-                       ui_manager, mail_shell_view->priv->main_menu_label_merge_id, main_menu_path,
-                       action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
-
-               gtk_ui_manager_add_ui (
-                       ui_manager, mail_shell_view->priv->popup_menu_label_merge_id, popup_menu_path,
-                       action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
-
-               g_free (label);
-               g_free (stock_id);
-               g_free (action_name);
-
-               valid = gtk_tree_model_iter_next (
-                       GTK_TREE_MODEL (label_store), &iter);
-               ii++;
-       }
-
-       g_ptr_array_unref (uids);
-}
-
 void
 e_mail_shell_view_update_search_filter (EMailShellView *mail_shell_view)
 {
diff --git a/src/modules/mail/e-mail-shell-view-actions.h b/src/modules/mail/e-mail-shell-view-actions.h
index 0c13472e3f..3a46a492cd 100644
--- a/src/modules/mail/e-mail-shell-view-actions.h
+++ b/src/modules/mail/e-mail-shell-view-actions.h
@@ -106,10 +106,6 @@
        E_SHELL_WINDOW_ACTION ((window), "mail-forward-inline")
 #define E_SHELL_WINDOW_ACTION_MAIL_FORWARD_QUOTED(window) \
        E_SHELL_WINDOW_ACTION ((window), "mail-forward-quoted")
-#define E_SHELL_WINDOW_ACTION_MAIL_LABEL_NEW(window) \
-       E_SHELL_WINDOW_ACTION ((window), "mail-label-new")
-#define E_SHELL_WINDOW_ACTION_MAIL_LABEL_NONE(window) \
-       E_SHELL_WINDOW_ACTION ((window), "mail-label-none")
 #define E_SHELL_WINDOW_ACTION_MAIL_LOAD_IMAGES(window) \
        E_SHELL_WINDOW_ACTION ((window), "mail-load-images")
 #define E_SHELL_WINDOW_ACTION_MAIL_MANAGE_SUBSCRIPTIONS(window) \
@@ -278,8 +274,6 @@
        E_SHELL_WINDOW_ACTION_GROUP ((window), "mail")
 #define E_SHELL_WINDOW_ACTION_GROUP_MAIL_FILTER(window) \
        E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-filter")
-#define E_SHELL_WINDOW_ACTION_GROUP_MAIL_LABEL(window) \
-       E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-label")
 #define E_SHELL_WINDOW_ACTION_GROUP_SEARCH_FOLDERS(window) \
        E_SHELL_WINDOW_ACTION_GROUP ((window), "search-folders")
 
diff --git a/src/modules/mail/e-mail-shell-view-private.c b/src/modules/mail/e-mail-shell-view-private.c
index 03e3bb977d..d3dd552c4b 100644
--- a/src/modules/mail/e-mail-shell-view-private.c
+++ b/src/modules/mail/e-mail-shell-view-private.c
@@ -417,20 +417,6 @@ mail_shell_view_reader_changed_cb (EMailShellView *mail_shell_view,
                shell_taskbar, G_CONNECT_SWAPPED);
 }
 
-static void
-mail_shell_view_reader_update_actions_cb (EMailReader *reader,
-                                          guint32 state,
-                                          EMailShellView *mail_shell_view)
-{
-       EMailShellContent *mail_shell_content;
-
-       g_return_if_fail (mail_shell_view != NULL);
-       g_return_if_fail (mail_shell_view->priv != NULL);
-
-       mail_shell_content = mail_shell_view->priv->mail_shell_content;
-       e_mail_reader_update_actions (E_MAIL_READER (mail_shell_content), state);
-}
-
 static void
 mail_shell_view_prepare_for_quit_cb (EMailShellView *mail_shell_view,
                                      EActivity *activity)
@@ -525,7 +511,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
        ERuleContext *context;
        EFilterRule *rule = NULL;
        GtkTreeSelection *selection;
-       GtkUIManager *ui_manager;
        GtkWidget *message_list;
        GSettings *settings;
        EMailLabelListStore *label_store;
@@ -544,8 +529,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
        shell_taskbar = e_shell_view_get_shell_taskbar (shell_view);
        shell_window = e_shell_view_get_shell_window (shell_view);
 
-       ui_manager = e_shell_window_get_ui_manager (shell_window);
-
        shell = e_shell_window_get_shell (shell_window);
 
        backend = E_MAIL_BACKEND (shell_backend);
@@ -555,16 +538,13 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
 
        e_shell_window_add_action_group (shell_window, "mail");
        e_shell_window_add_action_group (shell_window, "mail-filter");
-       e_shell_window_add_action_group (shell_window, "mail-label");
+       e_shell_window_add_action_group (shell_window, "mail-labels");
        e_shell_window_add_action_group (shell_window, "search-folders");
 
        g_signal_connect (
                shell_window, "set-focus",
                G_CALLBACK (e_mail_shell_view_update_labels_sensitivity), shell_view);
 
-       priv->main_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
-       priv->popup_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
-
        /* Cache these to avoid lots of awkward casting. */
        priv->mail_shell_backend = g_object_ref (shell_backend);
        priv->mail_shell_content = g_object_ref (shell_content);
@@ -634,11 +614,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
                G_CALLBACK (mail_shell_view_reader_changed_cb),
                mail_shell_view, G_CONNECT_SWAPPED);
 
-       g_signal_connect_object (
-               mail_view, "update-actions",
-               G_CALLBACK (mail_shell_view_reader_update_actions_cb),
-               mail_shell_view, 0);
-
        g_signal_connect_object (
                reader, "folder-loaded",
                G_CALLBACK (e_mail_view_update_view_instance),
@@ -1545,20 +1520,25 @@ e_mail_shell_view_update_send_receive_menus (EMailShellView *mail_shell_view)
 
 void
 e_mail_shell_view_update_labels_sensitivity (EShellWindow *shell_window,
-                                            GtkWidget *focused_widget)
+                                            GtkWidget *focused_widget,
+                                            EMailShellView *mail_shell_view)
 {
        GtkActionGroup *action_group;
        GtkAction *action;
        GtkWidget *widget;
+       EMailReader *reader;
        gboolean sensitive = FALSE;
 
        g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
+       g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
 
        /* It can be called also during the dispose of the GtkWindow,
           when the UI manager is already freed */
        if (!e_shell_window_get_ui_manager (shell_window))
                return;
 
+       reader = E_MAIL_READER (e_mail_shell_content_get_mail_view 
(mail_shell_view->priv->mail_shell_content));
+
        widget = focused_widget ? focused_widget : gtk_window_get_focus (GTK_WINDOW (shell_window));
 
        while (widget) {
@@ -1570,11 +1550,13 @@ e_mail_shell_view_update_labels_sensitivity (EShellWindow *shell_window,
                widget = gtk_widget_get_parent (widget);
        }
 
-       action_group = ACTION_GROUP (MAIL_LABEL);
+       reader = E_MAIL_READER (e_mail_shell_content_get_mail_view 
(mail_shell_view->priv->mail_shell_content));
+
+       action_group = e_mail_reader_get_action_group (reader, E_MAIL_READER_ACTION_GROUP_LABELS);
        if (action_group)
                gtk_action_group_set_sensitive (action_group, sensitive);
 
-       action = ACTION (MAIL_LABEL_NONE);
+       action = e_mail_reader_get_action (reader, "mail-label-none");
        if (action)
                gtk_action_set_sensitive (action, sensitive);
 }
diff --git a/src/modules/mail/e-mail-shell-view-private.h b/src/modules/mail/e-mail-shell-view-private.h
index 2c60f0c3f8..ecb7bbdf09 100644
--- a/src/modules/mail/e-mail-shell-view-private.h
+++ b/src/modules/mail/e-mail-shell-view-private.h
@@ -27,9 +27,6 @@
 #include <camel/camel-search-private.h>  /* for camel_search_word */
 
 #include <mail/e-mail-folder-create-dialog.h>
-#include <mail/e-mail-label-action.h>
-#include <mail/e-mail-label-dialog.h>
-#include <mail/e-mail-label-list-store.h>
 #include <mail/e-mail-reader.h>
 #include <mail/e-mail-reader-utils.h>
 #include <mail/e-mail-sidebar.h>
@@ -120,8 +117,6 @@ struct _EMailShellViewPrivate {
 
        /* For UI merging and unmerging. */
        guint merge_id;
-       guint main_menu_label_merge_id;
-       guint popup_menu_label_merge_id;
 
        /* Filter rules correspond to the search entry menu. */
        EFilterRule *search_rules[MAIL_NUM_SEARCH_RULES];
@@ -162,8 +157,6 @@ void                e_mail_shell_view_actions_init
                                        (EMailShellView *mail_shell_view);
 void           e_mail_shell_view_restore_state
                                        (EMailShellView *mail_shell_view);
-void           e_mail_shell_view_update_popup_labels
-                                       (EMailShellView *mail_shell_view);
 void           e_mail_shell_view_update_search_filter
                                        (EMailShellView *mail_shell_view);
 void           e_mail_shell_view_update_sidebar
@@ -174,7 +167,8 @@ GDBusProxy *        e_mail_shell_view_get_web_extension_proxy
                                        (EMailShellView *mail_shell_view);
 void           e_mail_shell_view_update_labels_sensitivity
                                        (EShellWindow *shell_window,
-                                        GtkWidget *focused_widget);
+                                        GtkWidget *focused_widget,
+                                        EMailShellView *mail_shell_view);
 
 G_END_DECLS
 
diff --git a/src/modules/mail/e-mail-shell-view.c b/src/modules/mail/e-mail-shell-view.c
index 7e31592e7e..1f4758f43b 100644
--- a/src/modules/mail/e-mail-shell-view.c
+++ b/src/modules/mail/e-mail-shell-view.c
@@ -438,15 +438,15 @@ mail_shell_view_toggled (EShellView *shell_view)
        basename = E_MAIL_READER_UI_DEFINITION;
 
        if (view_is_active && priv->merge_id == 0) {
-               EMailView *mail_view;
+               EMailReader *reader;
+
+               priv->merge_id = e_load_ui_manager_definition (ui_manager, basename);
 
-               priv->merge_id = e_load_ui_manager_definition (
-                       ui_manager, basename);
-               mail_view = e_mail_shell_content_get_mail_view (
-                       priv->mail_shell_content);
-               e_mail_reader_create_charset_menu (
-                       E_MAIL_READER (mail_view),
-                       ui_manager, priv->merge_id);
+               reader = E_MAIL_READER (e_mail_shell_content_get_mail_view (priv->mail_shell_content));
+               e_mail_reader_create_charset_menu (reader, ui_manager, priv->merge_id);
+
+               /* This also fills the Label menu */
+               e_mail_reader_update_actions (reader, e_mail_reader_check_state (reader));
        } else if (!view_is_active && priv->merge_id != 0) {
                gtk_ui_manager_remove_ui (ui_manager, priv->merge_id);
                gtk_ui_manager_ensure_update (ui_manager);
@@ -1461,9 +1461,7 @@ mail_shell_view_update_actions (EShellView *shell_view)
        action = ACTION (MAIL_VFOLDER_UNMATCHED_ENABLE);
        gtk_action_set_visible (action, folder_is_store && folder_is_virtual);
 
-       e_mail_shell_view_update_labels_sensitivity (shell_window, NULL);
-
-       e_mail_shell_view_update_popup_labels (mail_shell_view);
+       e_mail_shell_view_update_labels_sensitivity (shell_window, NULL, mail_shell_view);
 }
 
 static void



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