diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/ChangeLog | 14 | ||||
-rw-r--r-- | mail/em-folder-browser.c | 10 | ||||
-rw-r--r-- | mail/message-list.c | 69 | ||||
-rw-r--r-- | mail/message-list.h | 1 |
4 files changed, 70 insertions, 24 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 83058385cb..b3ca18a6a1 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,17 @@ +2007-11-26 Nicholas Miell <nmiell@gmail.com> + + ** Fix for bug #216485 + Edit->Select thread menu fix and improvement. + + * em-folder-browser.c: (emfb_edit_select_subthread): new function, + (emfb_enable_map, emfb_verbs) hook it up + * message-list.c: (select_thread): new function based on + thread_select_foreach, (thread_select_foreach): remove the logic + now in select_thread, (message_list_select_thread): use + select_thread, (subthread_select_foreach): new function, + (message_list_select_subthread): new function + * message-list.h: (message_list_select_subthread): add prototype + 2007-11-23 Milan Crha <mcrha@redhat.com> ** Fix for bug #494414 diff --git a/mail/em-folder-browser.c b/mail/em-folder-browser.c index 8f479a15e1..5253101c67 100644 --- a/mail/em-folder-browser.c +++ b/mail/em-folder-browser.c @@ -150,6 +150,7 @@ static const EMFolderViewEnable emfb_enable_map[] = { { "EditInvertSelection", EM_POPUP_SELECT_FOLDER }, { "EditSelectAll", EM_POPUP_SELECT_FOLDER }, { "EditSelectThread", EM_FOLDER_VIEW_SELECT_THREADED }, + { "EditSelectSubthread", EM_FOLDER_VIEW_SELECT_THREADED }, { "FolderExpunge", EM_POPUP_SELECT_FOLDER }, { "FolderCopy", EM_POPUP_SELECT_FOLDER }, { "FolderMove", EM_POPUP_SELECT_FOLDER }, @@ -1300,6 +1301,14 @@ emfb_edit_select_thread(BonoboUIComponent *uid, void *data, const char *path) } static void +emfb_edit_select_subthread(BonoboUIComponent *uid, void *data, const char *path) +{ + EMFolderView *emfv = data; + + message_list_select_subthread (emfv->list); +} + +static void emfb_folder_properties(BonoboUIComponent *uid, void *data, const char *path) { EMFolderBrowser *emfb = data; @@ -1555,6 +1564,7 @@ static BonoboUIVerb emfb_verbs[] = { BONOBO_UI_UNSAFE_VERB ("EditInvertSelection", emfb_edit_invert_selection), BONOBO_UI_UNSAFE_VERB ("EditSelectAll", emfb_edit_select_all), BONOBO_UI_UNSAFE_VERB ("EditSelectThread", emfb_edit_select_thread), + BONOBO_UI_UNSAFE_VERB ("EditSelectSubthread", emfb_edit_select_subthread), BONOBO_UI_UNSAFE_VERB ("ChangeFolderProperties", emfb_folder_properties), BONOBO_UI_UNSAFE_VERB ("FolderExpunge", emfb_folder_expunge), /* HideDeleted is a toggle */ diff --git a/mail/message-list.c b/mail/message-list.c index b9d5cf56cb..e008301cee 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -718,30 +718,40 @@ select_node (ETreeModel *model, ETreePath path, gpointer user_data) } static void +select_thread (MessageList *message_list, void (*selector)(ETreePath, gpointer)) +{ + ETreeSelectionModel *etsm; + thread_select_info_t tsi; + + tsi.ml = message_list; + tsi.paths = g_ptr_array_new (); + + etsm = (ETreeSelectionModel *) e_tree_get_selection_model (message_list->tree); + + e_tree_selected_path_foreach (message_list->tree, selector, &tsi); + + e_tree_selection_model_select_paths (etsm, tsi.paths); + + g_ptr_array_free (tsi.paths, TRUE); +} + +static void thread_select_foreach (ETreePath path, gpointer user_data) { thread_select_info_t *tsi = (thread_select_info_t *) user_data; ETreeModel *model = tsi->ml->model; - ETreePath node; + ETreePath node, last; - /* @path part of the initial selection. If it has children, - * we select them as well. If it doesn't, we select its siblings and - * their children (ie, the current node must be inside the thread - * that the user wants to mark. - */ + node = path; - if (e_tree_model_node_get_first_child (model, path)) { - node = path; - } else { - node = e_tree_model_node_get_parent (model, path); + do { + last = node; + node = e_tree_model_node_get_parent (model, node); + } while (!e_tree_model_node_is_root (model, node)); - /* Let's make an exception: if no parent, then we're about - * to mark the whole tree. No. */ - if (e_tree_model_node_is_root (model, node)) - node = path; - } + g_ptr_array_add (tsi->paths, last); - e_tree_model_node_traverse (model, node, select_node, tsi); + e_tree_model_node_traverse (model, last, select_node, tsi); } /** @@ -753,17 +763,28 @@ thread_select_foreach (ETreePath path, gpointer user_data) void message_list_select_thread (MessageList *message_list) { - ETreeSelectionModel *etsm; - thread_select_info_t tsi; + select_thread (message_list, thread_select_foreach); +} - tsi.ml = message_list; - tsi.paths = g_ptr_array_new (); +static void +subthread_select_foreach (ETreePath path, gpointer user_data) +{ + thread_select_info_t *tsi = (thread_select_info_t *) user_data; + ETreeModel *model = tsi->ml->model; - etsm = (ETreeSelectionModel *) e_tree_get_selection_model (message_list->tree); + e_tree_model_node_traverse (model, path, select_node, tsi); +} - e_tree_selected_path_foreach (message_list->tree, thread_select_foreach, &tsi); - e_tree_selection_model_select_paths(etsm, tsi.paths); - g_ptr_array_free (tsi.paths, TRUE); +/** + * message_list_select_subthread: + * @message_list: Message List widget + * + * Selects all messages in the current subthread (based on cursor). + **/ +void +message_list_select_subthread (MessageList *message_list) +{ + select_thread (message_list, subthread_select_foreach); } /** diff --git a/mail/message-list.h b/mail/message-list.h index c1713dc4d4..5bec274ad6 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -198,6 +198,7 @@ void message_list_select_next_thread (MessageList *ml); /* selection manipulation */ void message_list_select_all (MessageList *ml); void message_list_select_thread (MessageList *ml); +void message_list_select_subthread (MessageList *ml); void message_list_invert_selection (MessageList *ml); /* clipboard stuff */ |