[evolution] Bug #630969 - Implement also Message->Go to->Previous Thread



commit 92e6052e56b0e81e9718bdd665ada8356f90dbc1
Author: Milan Crha <mcrha redhat com>
Date:   Wed Oct 20 11:14:19 2010 +0200

    Bug #630969 - Implement also Message->Go to->Previous Thread

 mail/e-mail-reader.c        |   18 ++++++++++++++++++
 mail/message-list.c         |   37 +++++++++++++++++++++++++++++++++++++
 mail/message-list.h         |    1 +
 ui/evolution-mail-reader.ui |    1 +
 4 files changed, 57 insertions(+), 0 deletions(-)
---
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index a45301f..dedacb8 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -1058,6 +1058,17 @@ action_mail_previous_important_cb (GtkAction *action,
 }
 
 static void
+action_mail_previous_thread_cb (GtkAction *action,
+                            EMailReader *reader)
+{
+	GtkWidget *message_list;
+
+	message_list = e_mail_reader_get_message_list (reader);
+
+	message_list_select_prev_thread (MESSAGE_LIST (message_list));
+}
+
+static void
 action_mail_previous_unread_cb (GtkAction *action,
                                 EMailReader *reader)
 {
@@ -2036,6 +2047,13 @@ static GtkActionEntry mail_reader_entries[] = {
 	  N_("Display the previous important message"),
 	  G_CALLBACK (action_mail_previous_important_cb) },
 
+	{ "mail-previous-thread",
+	  NULL,
+	  N_("Previous T_hread"),
+	  NULL,
+	  N_("Display the previous thread"),
+	  G_CALLBACK (action_mail_previous_thread_cb) },
+
 	{ "mail-previous-unread",
 	  NULL,
 	  N_("P_revious Unread Message"),
diff --git a/mail/message-list.c b/mail/message-list.c
index 31a3221..974eb1c 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -782,6 +782,43 @@ message_list_select_next_thread (MessageList *ml)
 	}
 }
 
+void
+message_list_select_prev_thread (MessageList *ml)
+{
+	ETreePath node;
+	ETreeTableAdapter *etta;
+	gint i, row;
+	gboolean skip_first;
+
+	etta = e_tree_get_table_adapter (E_TREE (ml));
+
+	if (!ml->cursor_uid
+	    || (node = g_hash_table_lookup (ml->uid_nodemap, ml->cursor_uid)) == NULL)
+		return;
+
+	row = e_tree_table_adapter_row_of_node (etta, node);
+	if (row == -1)
+		return;
+
+	/* skip first found if in the middle of the thread */
+	skip_first = !e_tree_model_node_is_root (ml->model, e_tree_model_node_get_parent (ml->model, node));
+
+	/* find the previous node which has a root parent (i.e. toplevel node) */
+	for (i = row - 1; i >= 0; i--) {
+		node = e_tree_table_adapter_node_at_row (etta, i);
+		if (node
+		    && e_tree_model_node_is_root (ml->model, e_tree_model_node_get_parent (ml->model, node))) {
+			if (skip_first) {
+				skip_first = FALSE;
+				continue;
+			}
+
+			select_path (ml, node);
+			return;
+		}
+	}
+}
+
 static gboolean
 message_list_select_all_timeout_cb (MessageList *message_list)
 {
diff --git a/mail/message-list.h b/mail/message-list.h
index 3e455a6..4ca9015 100644
--- a/mail/message-list.h
+++ b/mail/message-list.h
@@ -206,6 +206,7 @@ void		message_list_select_uid		(MessageList *message_list,
 						 const gchar *uid,
 						 gboolean with_fallback);
 void		message_list_select_next_thread	(MessageList *message_list);
+void		message_list_select_prev_thread	(MessageList *message_list);
 void		message_list_select_all		(MessageList *message_list);
 void		message_list_select_thread	(MessageList *message_list);
 void		message_list_select_subthread	(MessageList *message_list);
diff --git a/ui/evolution-mail-reader.ui b/ui/evolution-mail-reader.ui
index 55f2b8a..ec07d3d 100644
--- a/ui/evolution-mail-reader.ui
+++ b/ui/evolution-mail-reader.ui
@@ -58,6 +58,7 @@
           <menuitem action='mail-previous'/>
           <menuitem action='mail-previous-unread'/>
           <menuitem action='mail-previous-important'/>
+          <menuitem action='mail-previous-thread'/>
           <separator/>
           <menuitem action='mail-goto-folder'/>
           <menuitem action='mail-goto-nexttab'/>



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