[evolution] Bug 262328 - Selecting collapsed threads only selects the first message



commit ad32bd159acf512e2ec989b63e6c1b6e62014275
Author: Milan Crha <mcrha redhat com>
Date:   Thu Nov 30 12:49:58 2017 +0100

    Bug 262328 - Selecting collapsed threads only selects the first message

 src/mail/e-mail-reader-utils.c |    6 ++--
 src/mail/e-mail-reader.c       |   50 +++++++++++++++++++++++++++++----------
 src/mail/e-mail-reader.h       |    7 +++++
 src/mail/message-list.c        |   46 +++++++++++++++++++++++++++++++++---
 src/mail/message-list.h        |    2 +
 5 files changed, 91 insertions(+), 20 deletions(-)
---
diff --git a/src/mail/e-mail-reader-utils.c b/src/mail/e-mail-reader-utils.c
index 34c0ad4..7e2f4d7 100644
--- a/src/mail/e-mail-reader-utils.c
+++ b/src/mail/e-mail-reader-utils.c
@@ -1033,7 +1033,7 @@ e_mail_reader_mark_selected (EMailReader *reader,
 
                camel_folder_freeze (folder);
 
-               uids = e_mail_reader_get_selected_uids (reader);
+               uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
 
                for (ii = 0; ii < uids->len; ii++)
                        camel_folder_set_message_flags (
@@ -1323,7 +1323,7 @@ e_mail_reader_mark_selected_ignore_thread (EMailReader *reader,
                GPtrArray *uids;
                guint ii;
 
-               uids = e_mail_reader_get_selected_uids (reader);
+               uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
                if (uids && uids->len > 0) {
                        MarkIgnoreThreadData *mit;
                        EAlertSink *alert_sink;
@@ -1881,7 +1881,7 @@ e_mail_reader_remove_duplicates (EMailReader *reader)
 
        g_return_if_fail (E_IS_MAIL_READER (reader));
 
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        g_return_if_fail (uids != NULL);
 
        /* Find duplicate messages asynchronously. */
diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c
index 8930024..bead182 100644
--- a/src/mail/e-mail-reader.c
+++ b/src/mail/e-mail-reader.c
@@ -309,7 +309,7 @@ action_mail_check_for_junk_cb (GtkAction *action,
 
        folder = e_mail_reader_ref_folder (reader);
        backend = e_mail_reader_get_backend (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
 
        session = e_mail_backend_get_session (backend);
 
@@ -341,7 +341,7 @@ mail_reader_copy_or_move_selected_messages (EMailReader *reader,
 
        folder = e_mail_reader_ref_folder (reader);
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
 
        model = em_folder_tree_model_get_default ();
 
@@ -605,7 +605,7 @@ action_mail_filters_apply_cb (GtkAction *action,
 
        folder = e_mail_reader_ref_folder (reader);
        backend = e_mail_reader_get_backend (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
 
        session = e_mail_backend_get_session (backend);
 
@@ -649,7 +649,7 @@ action_mail_flag_clear_cb (GtkAction *action,
 
        folder = e_mail_reader_ref_folder (reader);
        display = e_mail_reader_get_mail_display (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        window = e_mail_reader_get_window (reader);
 
        em_utils_flag_for_followup_clear (window, folder, uids);
@@ -671,7 +671,7 @@ action_mail_flag_completed_cb (GtkAction *action,
 
        folder = e_mail_reader_ref_folder (reader);
        display = e_mail_reader_get_mail_display (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        window = e_mail_reader_get_window (reader);
 
        em_utils_flag_for_followup_completed (window, folder, uids);
@@ -690,7 +690,7 @@ action_mail_flag_for_followup_cb (GtkAction *action,
        GPtrArray *uids;
 
        folder = e_mail_reader_ref_folder (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
 
        em_utils_flag_for_followup (reader, folder, uids);
 
@@ -706,7 +706,7 @@ action_mail_forward_cb (GtkAction *action,
        GPtrArray *uids;
 
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        g_return_if_fail (uids != NULL);
 
        if (em_utils_ask_open_many (window, uids->len)) {
@@ -732,7 +732,7 @@ action_mail_forward_attached_cb (GtkAction *action,
        GPtrArray *uids;
 
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        g_return_if_fail (uids != NULL);
 
        if (em_utils_ask_open_many (window, uids->len)) {
@@ -758,7 +758,7 @@ action_mail_forward_inline_cb (GtkAction *action,
        GPtrArray *uids;
 
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        g_return_if_fail (uids != NULL);
 
        if (em_utils_ask_open_many (window, uids->len)) {
@@ -784,7 +784,7 @@ action_mail_forward_quoted_cb (GtkAction *action,
        GPtrArray *uids;
 
        window = e_mail_reader_get_window (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        g_return_if_fail (uids != NULL);
 
        if (em_utils_ask_open_many (window, uids->len)) {
@@ -1070,7 +1070,7 @@ action_mail_archive_cb (GtkAction *action,
        backend = e_mail_reader_get_backend (reader);
        session = e_mail_backend_get_session (backend);
 
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
        g_return_if_fail (uids != NULL);
 
        folder = e_mail_reader_ref_folder (reader);
@@ -1924,7 +1924,7 @@ action_mail_toggle_important_cb (GtkAction *action,
        guint ii;
 
        folder = e_mail_reader_ref_folder (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
 
        camel_folder_freeze (folder);
 
@@ -3439,6 +3439,16 @@ mail_reader_get_selected_uids (EMailReader *reader)
        return message_list_get_selected (MESSAGE_LIST (message_list));
 }
 
+static GPtrArray *
+mail_reader_get_selected_uids_with_collapsed_threads (EMailReader *reader)
+{
+       GtkWidget *message_list;
+
+       message_list = e_mail_reader_get_message_list (reader);
+
+       return message_list_get_selected_with_collapsed_threads (MESSAGE_LIST (message_list));
+}
+
 static CamelFolder *
 mail_reader_ref_folder (EMailReader *reader)
 {
@@ -4146,6 +4156,7 @@ e_mail_reader_default_init (EMailReaderInterface *iface)
 
        iface->get_alert_sink = mail_reader_get_alert_sink;
        iface->get_selected_uids = mail_reader_get_selected_uids;
+       iface->get_selected_uids_with_collapsed_threads = 
mail_reader_get_selected_uids_with_collapsed_threads;
        iface->ref_folder = mail_reader_ref_folder;
        iface->set_folder = mail_reader_set_folder;
        iface->set_message = mail_reader_set_message;
@@ -4615,7 +4626,7 @@ e_mail_reader_check_state (EMailReader *reader)
                E_MAIL_UI_SESSION (mail_session));
 
        folder = e_mail_reader_ref_folder (reader);
-       uids = e_mail_reader_get_selected_uids (reader);
+       uids = e_mail_reader_get_selected_uids_with_collapsed_threads (reader);
 
        if (folder != NULL) {
                gchar *archive_folder;
@@ -4964,6 +4975,19 @@ e_mail_reader_get_selected_uids (EMailReader *reader)
        return iface->get_selected_uids (reader);
 }
 
+GPtrArray *
+e_mail_reader_get_selected_uids_with_collapsed_threads (EMailReader *reader)
+{
+       EMailReaderInterface *iface;
+
+       g_return_val_if_fail (E_IS_MAIL_READER (reader), NULL);
+
+       iface = E_MAIL_READER_GET_INTERFACE (reader);
+       g_return_val_if_fail (iface->get_selected_uids_with_collapsed_threads != NULL, NULL);
+
+       return iface->get_selected_uids_with_collapsed_threads (reader);
+}
+
 GtkWindow *
 e_mail_reader_get_window (EMailReader *reader)
 {
diff --git a/src/mail/e-mail-reader.h b/src/mail/e-mail-reader.h
index 6f3fb26..63c2f12 100644
--- a/src/mail/e-mail-reader.h
+++ b/src/mail/e-mail-reader.h
@@ -108,6 +108,8 @@ struct _EMailReaderInterface {
        GtkMenu *       (*get_popup_menu)       (EMailReader *reader);
        EPreviewPane *  (*get_preview_pane)     (EMailReader *reader);
        GPtrArray *     (*get_selected_uids)    (EMailReader *reader);
+       GPtrArray *     (*get_selected_uids_with_collapsed_threads)
+                                               (EMailReader *reader);
        GtkWindow *     (*get_window)           (EMailReader *reader);
 
        CamelFolder *   (*ref_folder)           (EMailReader *reader);
@@ -131,6 +133,9 @@ struct _EMailReaderInterface {
        void            (*show_search_bar)      (EMailReader *reader);
        void            (*update_actions)       (EMailReader *reader,
                                                 guint32 state);
+
+       /* Padding for future expansion */
+       gpointer reserved[4];
 };
 
 GType          e_mail_reader_get_type          (void);
@@ -157,6 +162,8 @@ guint               e_mail_reader_open_selected_mail
 GtkMenu *      e_mail_reader_get_popup_menu    (EMailReader *reader);
 EPreviewPane * e_mail_reader_get_preview_pane  (EMailReader *reader);
 GPtrArray *    e_mail_reader_get_selected_uids (EMailReader *reader);
+GPtrArray *    e_mail_reader_get_selected_uids_with_collapsed_threads
+                                               (EMailReader *reader);
 GtkWindow *    e_mail_reader_get_window        (EMailReader *reader);
 CamelFolder *  e_mail_reader_ref_folder        (EMailReader *reader);
 void           e_mail_reader_set_folder        (EMailReader *reader,
diff --git a/src/mail/message-list.c b/src/mail/message-list.c
index 0a1e80e..1b107af 100644
--- a/src/mail/message-list.c
+++ b/src/mail/message-list.c
@@ -1474,7 +1474,7 @@ message_list_copy (MessageList *message_list,
 
        clear_selection (message_list, &priv->clipboard);
 
-       uids = message_list_get_selected (message_list);
+       uids = message_list_get_selected_with_collapsed_threads (message_list);
 
        if (uids->len > 0) {
                if (cut) {
@@ -2506,7 +2506,7 @@ ml_tree_drag_data_get (ETree *tree,
        GPtrArray *uids;
 
        folder = message_list_ref_folder (message_list);
-       uids = message_list_get_selected (message_list);
+       uids = message_list_get_selected_with_collapsed_threads (message_list);
 
        if (uids->len > 0) {
                switch (info) {
@@ -5386,9 +5386,27 @@ on_click (ETree *tree,
 
 struct _ml_selected_data {
        MessageList *message_list;
+       ETreeTableAdapter *adapter;
+       gboolean with_collapsed_threads;
        GPtrArray *uids;
 };
 
+static gboolean
+ml_getselected_collapsed_cb (ETreeModel *tree_model,
+                            ETreePath path,
+                            gpointer user_data)
+{
+       struct _ml_selected_data *data = user_data;
+       const gchar *uid;
+       GNode *node = (GNode *) path;
+
+       uid = get_message_uid (data->message_list, node);
+       g_return_val_if_fail (uid != NULL, FALSE);
+       g_ptr_array_add (data->uids, g_strdup (uid));
+
+       return FALSE;
+}
+
 static void
 ml_getselected_cb (GNode *node,
                    gpointer user_data)
@@ -5402,10 +5420,16 @@ ml_getselected_cb (GNode *node,
        uid = get_message_uid (data->message_list, node);
        g_return_if_fail (uid != NULL);
        g_ptr_array_add (data->uids, g_strdup (uid));
+
+       if (data->with_collapsed_threads && g_node_first_child (node) &&
+           !e_tree_table_adapter_node_is_expanded (data->adapter, node)) {
+               e_tree_model_node_traverse (E_TREE_MODEL (data->message_list), node, 
ml_getselected_collapsed_cb, data);
+       }
 }
 
-GPtrArray *
-message_list_get_selected (MessageList *message_list)
+static GPtrArray *
+message_list_get_selected_full (MessageList *message_list,
+                               gboolean with_collapsed_threads)
 {
        CamelFolder *folder;
        ESelectionModel *selection;
@@ -5417,6 +5441,8 @@ message_list_get_selected (MessageList *message_list)
 
        g_return_val_if_fail (IS_MESSAGE_LIST (message_list), NULL);
 
+       data.adapter = e_tree_get_table_adapter (E_TREE (message_list));
+       data.with_collapsed_threads = with_collapsed_threads;
        data.uids = g_ptr_array_new ();
        g_ptr_array_set_free_func (data.uids, (GDestroyNotify) g_free);
 
@@ -5436,6 +5462,18 @@ message_list_get_selected (MessageList *message_list)
        return data.uids;
 }
 
+GPtrArray *
+message_list_get_selected (MessageList *message_list)
+{
+       return message_list_get_selected_full (message_list, FALSE);
+}
+
+GPtrArray *
+message_list_get_selected_with_collapsed_threads (MessageList *message_list)
+{
+       return message_list_get_selected_full (message_list, TRUE);
+}
+
 void
 message_list_set_selected (MessageList *message_list,
                            GPtrArray *uids)
diff --git a/src/mail/message-list.h b/src/mail/message-list.h
index 801e88d..255185a 100644
--- a/src/mail/message-list.h
+++ b/src/mail/message-list.h
@@ -191,6 +191,8 @@ void                message_list_set_thread_subject (MessageList *message_list,
 void           message_list_freeze             (MessageList *message_list);
 void           message_list_thaw               (MessageList *message_list);
 GPtrArray *    message_list_get_selected       (MessageList *message_list);
+GPtrArray *    message_list_get_selected_with_collapsed_threads
+                                               (MessageList *message_list);
 void           message_list_set_selected       (MessageList *message_list,
                                                 GPtrArray *uids);
 gboolean       message_list_select             (MessageList *message_list,


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