From 92e6052e56b0e81e9718bdd665ada8356f90dbc1 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Wed, 20 Oct 2010 11:14:19 +0200 Subject: 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(+) diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index a45301f3fe..dedacb8451 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -1057,6 +1057,17 @@ action_mail_previous_important_cb (GtkAction *action, MESSAGE_LIST (message_list), direction, flags, mask); } +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 31a3221d23..974eb1c295 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 3e455a68ac..4ca9015490 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 55f2b8aa37..ec07d3d6cf 100644 --- a/ui/evolution-mail-reader.ui +++ b/ui/evolution-mail-reader.ui @@ -58,6 +58,7 @@ + -- cgit v1.2.3