[evolution] Bug 761453 - Add 'Message Thread' filter option to Show combo



commit a4bea5c85f89b819ae69c3192f9ca0177c46ca1c
Author: Milan Crha <mcrha redhat com>
Date:   Fri Feb 12 12:11:10 2016 +0100

    Bug 761453 - Add 'Message Thread' filter option to Show combo

 modules/mail/e-mail-shell-view-actions.c |   10 ++++-
 modules/mail/e-mail-shell-view-actions.h |    2 +
 modules/mail/e-mail-shell-view-private.c |    3 +
 modules/mail/e-mail-shell-view-private.h |   16 ++++---
 modules/mail/e-mail-shell-view.c         |   72 ++++++++++++++++++++++++++++++
 5 files changed, 96 insertions(+), 7 deletions(-)
---
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 243e5a3..1247ca1 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -2113,7 +2113,15 @@ static GtkRadioActionEntry mail_filter_entries[] = {
          N_("Unread Messages"),
          NULL,
          NULL,  /* XXX Add a tooltip! */
-         MAIL_FILTER_UNREAD_MESSAGES }
+         MAIL_FILTER_UNREAD_MESSAGES },
+
+       { "mail-filter-message-thread",
+         NULL,
+         N_("Message Thread"),
+         NULL,
+         NULL,  /* XXX Add a tooltip! */
+         MAIL_FILTER_MESSAGE_THREAD }
+
 };
 
 static GtkRadioActionEntry mail_search_entries[] = {
diff --git a/modules/mail/e-mail-shell-view-actions.h b/modules/mail/e-mail-shell-view-actions.h
index ab61498..866cc98 100644
--- a/modules/mail/e-mail-shell-view-actions.h
+++ b/modules/mail/e-mail-shell-view-actions.h
@@ -228,6 +228,8 @@
        E_SHELL_WINDOW_ACTION ((window), "mail-filter-important-messages")
 #define E_SHELL_WINDOW_ACTION_MAIL_FILTER_LAST_5_DAYS_MESSAGES(window) \
        E_SHELL_WINDOW_ACTION ((window), "mail-filter-last-5-days-messages")
+#define E_SHELL_WINDOW_ACTION_MAIL_FILTER_MESSAGE_THREAD(window) \
+       E_SHELL_WINDOW_ACTION ((window), "mail-filter-message-thread")
 #define E_SHELL_WINDOW_ACTION_MAIL_FILTER_MESSAGES_NOT_JUNK(window) \
        E_SHELL_WINDOW_ACTION ((window), "mail-filter-messages-not-junk")
 #define E_SHELL_WINDOW_ACTION_MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS(window) \
diff --git a/modules/mail/e-mail-shell-view-private.c b/modules/mail/e-mail-shell-view-private.c
index 3be96db..caf2392 100644
--- a/modules/mail/e-mail-shell-view-private.c
+++ b/modules/mail/e-mail-shell-view-private.c
@@ -801,6 +801,9 @@ e_mail_shell_view_private_dispose (EMailShellView *mail_shell_view)
                g_object_unref (priv->search_account_cancel);
                priv->search_account_cancel = NULL;
        }
+
+       g_slist_free_full (priv->selected_uids, (GDestroyNotify) camel_pstring_free);
+       priv->selected_uids = NULL;
 }
 
 void
diff --git a/modules/mail/e-mail-shell-view-private.h b/modules/mail/e-mail-shell-view-private.h
index 86da1bf..4300742 100644
--- a/modules/mail/e-mail-shell-view-private.h
+++ b/modules/mail/e-mail-shell-view-private.h
@@ -78,12 +78,13 @@ enum {
        MAIL_FILTER_ALL_MESSAGES = -20,
        MAIL_FILTER_UNREAD_MESSAGES = -19,
        MAIL_FILTER_READ_MESSAGES = -18,
-       MAIL_FILTER_LAST_5_DAYS_MESSAGES = -17,
-       MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS = -16,
-       MAIL_FILTER_MESSAGES_WITH_NOTES = -15,
-       MAIL_FILTER_IMPORTANT_MESSAGES = -14,
-       MAIL_FILTER_MESSAGES_NOT_JUNK = -13,
-       MAIL_FILTER_NO_LABEL = -12
+       MAIL_FILTER_MESSAGE_THREAD = -17,
+       MAIL_FILTER_LAST_5_DAYS_MESSAGES = -16,
+       MAIL_FILTER_MESSAGES_WITH_ATTACHMENTS = -15,
+       MAIL_FILTER_MESSAGES_WITH_NOTES = -14,
+       MAIL_FILTER_IMPORTANT_MESSAGES = -13,
+       MAIL_FILTER_MESSAGES_NOT_JUNK = -12,
+       MAIL_FILTER_NO_LABEL = -11
        /* Labels go here */
 };
 
@@ -138,6 +139,9 @@ struct _EMailShellViewPrivate {
        GtkToolItem *send_receive_tool_separator;
 
        gboolean vfolder_allow_expunge;
+
+       /* Selected UIDs for MAIL_FILTER_MESSAGE_THREAD filter */
+       GSList *selected_uids;
 };
 
 void           e_mail_shell_view_private_init
diff --git a/modules/mail/e-mail-shell-view.c b/modules/mail/e-mail-shell-view.c
index 1deb5b0..e81a327 100644
--- a/modules/mail/e-mail-shell-view.c
+++ b/modules/mail/e-mail-shell-view.c
@@ -346,6 +346,65 @@ mail_shell_view_toggled (EShellView *shell_view)
                toggled (shell_view);
 }
 
+static gchar *
+mail_shell_view_construct_filter_message_thread (EMailShellView *mail_shell_view,
+                                                const gchar *with_query)
+{
+       EMailShellViewPrivate *priv;
+       GString *query;
+       GSList *link;
+
+       g_return_val_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view), NULL);
+
+       priv = E_MAIL_SHELL_VIEW_GET_PRIVATE (mail_shell_view);
+
+       if (!priv->selected_uids) {
+               EShellContent *shell_content;
+               EMailView *mail_view;
+               GPtrArray *uids;
+
+               shell_content = e_shell_view_get_shell_content (E_SHELL_VIEW (mail_shell_view));
+               mail_view = e_mail_shell_content_get_mail_view (E_MAIL_SHELL_CONTENT (shell_content));
+               uids = e_mail_reader_get_selected_uids (E_MAIL_READER (mail_view));
+
+               if (uids) {
+                       gint ii;
+
+                       for (ii = 0; ii < uids->len; ii++) {
+                               priv->selected_uids = g_slist_prepend (priv->selected_uids, (gpointer) 
camel_pstring_strdup (uids->pdata[ii]));
+                       }
+
+                       g_ptr_array_unref (uids);
+               }
+
+               if (!priv->selected_uids)
+                       priv->selected_uids = g_slist_prepend (priv->selected_uids, (gpointer) 
camel_pstring_strdup (""));
+       }
+
+       query = g_string_new ("");
+
+       if (with_query)
+               g_string_append_printf (query, "(and %s ", with_query);
+
+       g_string_append (query, "(match-threads \"all\" (match-all (uid");
+
+       for (link = priv->selected_uids; link; link = g_slist_next (link)) {
+               const gchar *uid = link->data;
+
+               g_string_append_c (query, ' ');
+               g_string_append_c (query, '\"');
+               g_string_append (query, uid);
+               g_string_append_c (query, '\"');
+       }
+
+       g_string_append (query, ")))");
+
+       if (with_query)
+               g_string_append (query, ")");
+
+       return g_string_free (query, FALSE);
+}
+
 static void
 mail_shell_view_execute_search (EShellView *shell_view)
 {
@@ -479,6 +538,12 @@ filter:
 
        combo_box = e_shell_searchbar_get_filter_combo_box (searchbar);
        value = e_action_combo_box_get_current_value (combo_box);
+
+       if (value != MAIL_FILTER_MESSAGE_THREAD) {
+               g_slist_free_full (priv->selected_uids, (GDestroyNotify) camel_pstring_free);
+               priv->selected_uids = NULL;
+       }
+
        switch (value) {
                case MAIL_FILTER_ALL_MESSAGES:
                        break;
@@ -576,6 +641,13 @@ filter:
                        query = temp;
                        break;
 
+               case MAIL_FILTER_MESSAGE_THREAD:
+                       temp = mail_shell_view_construct_filter_message_thread (
+                               E_MAIL_SHELL_VIEW (shell_view), query);
+                       g_free (query);
+                       query = temp;
+                       break;
+
                default:
                        /* The action value also serves as a path for
                         * the label list store.  That's why we number


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