--- evolution.orig/mail/ChangeLog	2007-11-23 08:15:10.000000000 -0800
+++ evolution/mail/ChangeLog	2007-11-22 23:54:14.000000000 -0800
@@ -1,3 +1,14 @@
+2007-11-22 Nicholas Miell <nmiell@gmail.com>
+
+	* 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-22  Milan Crha  <mcrha@redhat.com>
 
 	** Fix for bug #498551
--- evolution.orig/mail/message-list.h	2007-11-23 08:15:10.000000000 -0800
+++ evolution/mail/message-list.h	2007-11-22 23:33:28.000000000 -0800
@@ -199,6 +199,7 @@
 /* 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 */
--- evolution.orig/mail/message-list.c	2007-11-23 08:15:10.000000000 -0800
+++ evolution/mail/message-list.c	2007-11-22 23:29:31.000000000 -0800
@@ -716,30 +716,40 @@
 }
 
 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;
-	
-	/* @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.
-	 */
+	ETreePath node, last;
 	
-	if (e_tree_model_node_get_first_child (model, path)) {
-		node = path;
-	} else {
-		node = e_tree_model_node_get_parent (model, path);
-		
-		/* 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;
-	}
-	
-	e_tree_model_node_traverse (model, node, select_node, tsi);
+	node = path;
+
+	do {
+		last = node;
+		node = e_tree_model_node_get_parent (model, node);
+	} while (!e_tree_model_node_is_root (model, node));
+
+	g_ptr_array_add (tsi->paths, last);
+
+	e_tree_model_node_traverse (model, last, select_node, tsi);
 }
 
 /**
@@ -751,17 +761,28 @@
 void
 message_list_select_thread (MessageList *message_list)
 {
-	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);
+	select_thread (message_list, thread_select_foreach);
+}
+
+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;
 	
-	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);
+	e_tree_model_node_traverse (model, path, select_node, tsi);
+}
+
+/**
+ * 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);
 }
 
 /**
--- evolution.orig/mail/em-folder-browser.c	2007-11-23 08:15:10.000000000 -0800
+++ evolution/mail/em-folder-browser.c	2007-11-22 23:30:30.000000000 -0800
@@ -152,6 +152,7 @@
 	{ "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 },
@@ -1320,6 +1321,14 @@
 }
 
 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;
@@ -1575,6 +1584,7 @@
 	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 */
--- evolution.orig/ui/ChangeLog	2007-11-23 08:15:10.000000000 -0800
+++ evolution/ui/ChangeLog	2007-11-22 23:54:41.000000000 -0800
@@ -1,3 +1,8 @@
+2007-11-22 Nicholas Miell <nmiell@gmail.com>
+
+	* evolution-mail-list.xml
+	Add Select Message Subthread
+
 2007-07-06  Matthew Barnes  <mbarnes@redhat.com>
 
 	** Fixes part of bug #446894
--- evolution.orig/ui/evolution-mail-list.xml	2007-11-23 08:15:10.000000000 -0800
+++ evolution/ui/evolution-mail-list.xml	2007-11-22 23:34:31.000000000 -0800
@@ -22,6 +22,10 @@
      _tip="Select all visible messages"
      accel="*Control*a"/>
 
+    <cmd name="EditSelectSubthread"
+     _tip="Select all replies to the currently selected message"
+     accel="*Control**Shift*h"/>
+
     <cmd name="EditSelectThread"
      _tip="Select all messages in the same thread as the selected message"
      accel="*Control*h"/>
@@ -113,6 +117,7 @@
         <placeholder name="MessagesInFolder">
           <menuitem name="EditSelectAll" verb="" _label="Select _All Messages"/>
           <menuitem name="EditSelectThread" verb="" _label="Select Message _Thread"/>
+          <menuitem name="EditSelectSubthread" verb="" _label="Select Message _Subthread"/>
           <menuitem name="MessageMarkAllAsRead" verb="" _label="Mar_k All Messages as Read"/>
           <menuitem name="FolderExpunge" verb="" _label="E_xpunge"/>
         </placeholder>
