From b621584a62dfa66d3136cc7500a811382beb77f2 Mon Sep 17 00:00:00 2001 From: Colin Leroy Date: Mon, 2 Jul 2007 18:15:53 +0000 Subject: [PATCH] 2007-07-02 [colin] 2.10.0cvs2 * src/folder.h * src/mainwindow.c * src/procmsg.h * src/summaryview.c Add View/Sort/by Thread date Fixes bug 1233, 'Capability to sort threads by most recent message' --- ChangeLog | 10 +++++++++ PATCHSETS | 1 + configure.ac | 2 +- src/folder.h | 3 ++- src/mainwindow.c | 5 +++++ src/procmsg.h | 1 + src/summaryview.c | 55 ++++++++++++++++++++++++++++++++++++++++++++--- 7 files changed, 72 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index f68b5d9aa..a62ab9243 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-07-02 [colin] 2.10.0cvs2 + + * src/folder.h + * src/mainwindow.c + * src/procmsg.h + * src/summaryview.c + Add View/Sort/by Thread date + Fixes bug 1233, 'Capability to sort + threads by most recent message' + 2007-07-02 [colin] 2.10.0cvs1 * src/Makefile.am diff --git a/PATCHSETS b/PATCHSETS index 255697ff0..0ba47b18f 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -2655,3 +2655,4 @@ ( cvs diff -u -r 1.100.2.50 -r 1.100.2.51 AUTHORS; ) > 2.9.2cvs77.patchset ( cvs diff -u -r 1.58.2.31 -r 1.58.2.32 po/de.po; cvs diff -u -r 1.12.2.14 -r 1.12.2.15 po/en_GB.po; cvs diff -u -r 1.60.2.44 -r 1.60.2.45 po/es.po; cvs diff -u -r 1.42.2.31 -r 1.42.2.32 po/fr.po; cvs diff -u -r 1.5.2.5 -r 1.5.2.6 po/hu.po; cvs diff -u -r 1.50.2.25 -r 1.50.2.26 po/pt_BR.po; cvs diff -u -r 1.17.2.14 -r 1.17.2.15 po/ru.po; cvs diff -u -r 1.5.2.23 -r 1.5.2.24 po/zh_CN.po; ) > 2.9.2cvs78.patchset ( cvs diff -u -r 1.155.2.65 -r 1.155.2.66 src/Makefile.am; cvs diff -u -r 1.382.2.391 -r 1.382.2.392 src/compose.c; diff -u /dev/null src/edittags.c; diff -u /dev/null src/edittags.h; cvs diff -u -r 1.60.2.32 -r 1.60.2.33 src/filtering.c; cvs diff -u -r 1.213.2.145 -r 1.213.2.146 src/folder.c; cvs diff -u -r 1.87.2.41 -r 1.87.2.42 src/folder.h; cvs diff -u -r 1.8.2.20 -r 1.8.2.21 src/headerview.c; cvs diff -u -r 1.2.2.2 -r 1.2.2.3 src/headerview.h; cvs diff -u -r 1.115.2.155 -r 1.115.2.156 src/main.c; cvs diff -u -r 1.274.2.191 -r 1.274.2.192 src/mainwindow.c; cvs diff -u -r 1.39.2.37 -r 1.39.2.38 src/mainwindow.h; cvs diff -u -r 1.8.2.6 -r 1.8.2.7 src/manual.h; cvs diff -u -r 1.75.2.41 -r 1.75.2.42 src/matcher.c; cvs diff -u -r 1.39.2.12 -r 1.39.2.13 src/matcher.h; cvs diff -u -r 1.25.2.28 -r 1.25.2.29 src/matcher_parser_parse.y; cvs diff -u -r 1.83.2.107 -r 1.83.2.108 src/mimeview.c; cvs diff -u -r 1.16.2.50 -r 1.16.2.51 src/msgcache.c; cvs diff -u -r 1.5.2.5 -r 1.5.2.6 src/msgcache.h; cvs diff -u -r 1.204.2.137 -r 1.204.2.138 src/prefs_common.c; cvs diff -u -r 1.103.2.84 -r 1.103.2.85 src/prefs_common.h; cvs diff -u -r 1.1.4.36 -r 1.1.4.37 src/prefs_filtering_action.c; cvs diff -u -r 1.43.2.57 -r 1.43.2.58 src/prefs_matcher.c; cvs diff -u -r 1.10.2.17 -r 1.10.2.18 src/prefs_summary_column.c; cvs diff -u -r 1.150.2.98 -r 1.150.2.99 src/procmsg.c; cvs diff -u -r 1.60.2.43 -r 1.60.2.44 src/procmsg.h; cvs diff -u -r 1.8.2.19 -r 1.8.2.20 src/quote_fmt.c; cvs diff -u -r 1.8.2.11 -r 1.8.2.12 src/quote_fmt_lex.l; cvs diff -u -r 1.22.2.32 -r 1.22.2.33 src/quote_fmt_parse.y; cvs diff -u -r 1.395.2.305 -r 1.395.2.306 src/summaryview.c; cvs diff -u -r 1.68.2.37 -r 1.68.2.38 src/summaryview.h; cvs diff -u -r 1.96.2.173 -r 1.96.2.174 src/textview.c; cvs diff -u -r 1.24.2.13 -r 1.24.2.14 src/common/Makefile.am; cvs diff -u -r 1.9.2.38 -r 1.9.2.39 src/common/defs.h; diff -u /dev/null src/common/tags.c; diff -u /dev/null src/common/tags.h; cvs diff -u -r 1.1.2.72 -r 1.1.2.73 src/gtk/quicksearch.c; cvs diff -u -r 1.1.2.14 -r 1.1.2.15 src/gtk/quicksearch.h; ) > 2.10.0cvs1.patchset +( cvs diff -u -r 1.87.2.42 -r 1.87.2.43 src/folder.h; cvs diff -u -r 1.274.2.192 -r 1.274.2.193 src/mainwindow.c; cvs diff -u -r 1.60.2.44 -r 1.60.2.45 src/procmsg.h; cvs diff -u -r 1.395.2.306 -r 1.395.2.307 src/summaryview.c; ) > 2.10.0cvs2.patchset diff --git a/configure.ac b/configure.ac index 09342dab5..fe57790cf 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=10 MICRO_VERSION=0 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=1 +EXTRA_VERSION=2 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/folder.h b/src/folder.h index c988e871b..29ead0067 100644 --- a/src/folder.h +++ b/src/folder.h @@ -81,7 +81,8 @@ typedef enum SORT_BY_MIME, SORT_BY_TO, SORT_BY_LOCKED, - SORT_BY_TAGS + SORT_BY_TAGS, + SORT_BY_THREAD_DATE } FolderSortKey; typedef enum diff --git a/src/mainwindow.c b/src/mainwindow.c index f95ea4d8e..a025a84fd 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -576,6 +576,7 @@ static GtkItemFactoryEntry mainwin_entries[] = {N_("/_View/_Sort/by _number"), NULL, sort_summary_cb, SORT_BY_NUMBER, ""}, {N_("/_View/_Sort/by S_ize"), NULL, sort_summary_cb, SORT_BY_SIZE, "/View/Sort/by number"}, {N_("/_View/_Sort/by _Date"), NULL, sort_summary_cb, SORT_BY_DATE, "/View/Sort/by number"}, + {N_("/_View/_Sort/by Thread date"), NULL, sort_summary_cb, SORT_BY_THREAD_DATE, "/View/Sort/by number"}, {N_("/_View/_Sort/by _From"), NULL, sort_summary_cb, SORT_BY_FROM, "/View/Sort/by number"}, {N_("/_View/_Sort/by _To"), NULL, sort_summary_cb, SORT_BY_TO, "/View/Sort/by number"}, {N_("/_View/_Sort/by S_ubject"), NULL, sort_summary_cb, SORT_BY_SUBJECT, "/View/Sort/by number"}, @@ -2595,6 +2596,8 @@ void main_window_set_menu_sensitive(MainWindow *mainwin) menu_path = "/View/Sort/by Size"; break; case SORT_BY_DATE: menu_path = "/View/Sort/by Date"; break; + case SORT_BY_THREAD_DATE: + menu_path = "/View/Sort/by Thread date"; break; case SORT_BY_FROM: menu_path = "/View/Sort/by From"; break; case SORT_BY_TO: @@ -2613,6 +2616,8 @@ void main_window_set_menu_sensitive(MainWindow *mainwin) menu_path = "/View/Sort/by score"; break; case SORT_BY_LOCKED: menu_path = "/View/Sort/by locked"; break; + case SORT_BY_TAGS: + menu_path = "/View/Sort/by tag"; break; case SORT_BY_NONE: default: menu_path = "/View/Sort/Don't sort"; break; diff --git a/src/procmsg.h b/src/procmsg.h index b042f2785..c762a6838 100644 --- a/src/procmsg.h +++ b/src/procmsg.h @@ -195,6 +195,7 @@ struct _MsgInfo off_t size; time_t mtime; time_t date_t; + time_t thread_date; MsgFlags flags; diff --git a/src/summaryview.c b/src/summaryview.c index 3072f4608..125fcae53 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -399,6 +399,9 @@ static gint summary_cmp_by_size (GtkCList *clist, static gint summary_cmp_by_date (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2); +static gint summary_cmp_by_thread_date (GtkCList *clist, + gconstpointer ptr1, + gconstpointer ptr2); static gint summary_cmp_by_from (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2); @@ -2449,7 +2452,8 @@ static void summary_set_column_titles(SummaryView *summaryview) SORT_BY_NUMBER, SORT_BY_SCORE, SORT_BY_LOCKED, - SORT_BY_TAGS + SORT_BY_TAGS, + SORT_BY_THREAD_DATE }; for (pos = 0; pos < N_SUMMARY_COLS; pos++) { @@ -2618,6 +2622,9 @@ void summary_sort(SummaryView *summaryview, case SORT_BY_DATE: cmp_func = (GtkCListCompareFunc)summary_cmp_by_date; break; + case SORT_BY_THREAD_DATE: + cmp_func = (GtkCListCompareFunc)summary_cmp_by_thread_date; + break; case SORT_BY_FROM: cmp_func = (GtkCListCompareFunc)summary_cmp_by_from; break; @@ -2683,6 +2690,31 @@ unlock: END_TIMING(); } +static gboolean summary_update_thread_age(GNode *node, gpointer data) +{ + MsgInfo *msginfo = node->data; + time_t *most_recent = (time_t *)data; + + if (msginfo->date_t > *most_recent) { + *most_recent = msginfo->date_t; + } + return FALSE; +} + +static void summary_find_thread_age(GNode *gnode) +{ + MsgInfo *msginfo = (MsgInfo *)gnode->data; + time_t most_recent; + gchar b[256],b2[256]; + if (!msginfo) + return; + most_recent = msginfo->thread_date = msginfo->date_t; + + g_node_traverse(gnode, G_IN_ORDER, G_TRAVERSE_ALL, -1, summary_update_thread_age, &most_recent); + + msginfo->thread_date = most_recent; +} + static gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *gnode, GtkCTreeNode *cnode, gpointer data) { @@ -2767,8 +2799,10 @@ static void summary_set_ctree_from_list(SummaryView *summaryview, START_TIMING("threaded"); root = procmsg_get_thread_tree(mlist); + for (gnode = root->children; gnode != NULL; gnode = gnode->next) { + summary_find_thread_age(gnode); node = gtk_sctree_insert_gnode (ctree, NULL, node, gnode, summary_insert_gnode_func, summaryview); @@ -6419,6 +6453,20 @@ static gint summary_cmp_by_subject(GtkCList *clist, (msginfo1->subject, msginfo2->subject); } +static gint summary_cmp_by_thread_date(GtkCList *clist, + gconstpointer ptr1, + gconstpointer ptr2) +{ + MsgInfo *msginfo1 = ((GtkCListRow *)ptr1)->data; + MsgInfo *msginfo2 = ((GtkCListRow *)ptr2)->data; + gint thread_diff = msginfo1->thread_date - msginfo2->thread_date; + + if (msginfo1->thread_date > 0 && msginfo2->thread_date > 0) + return thread_diff; + else + return msginfo1->date_t - msginfo2->date_t; +} + static gint summary_cmp_by_from(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2) { @@ -6470,7 +6518,7 @@ static gint summary_cmp_by_tags(GtkCList *clist, gconstpointer ptr1, const GtkCListRow *r1 = (const GtkCListRow *) ptr1; const GtkCListRow *r2 = (const GtkCListRow *) ptr2; const SummaryView *sv = g_object_get_data(G_OBJECT(clist), "summaryview"); - + gint res; g_return_val_if_fail(sv, -1); str1 = GTK_CELL_TEXT(r1->cell[sv->col_pos[S_COL_TAGS]])->text; @@ -6482,7 +6530,8 @@ static gint summary_cmp_by_tags(GtkCList *clist, gconstpointer ptr1, if (!str2) return -1; - return g_utf8_collate(str1, str2); + res = g_utf8_collate(str1, str2); + return (res != 0)? res: summary_cmp_by_date(clist, ptr1, ptr2); } static gint summary_cmp_by_simplified_subject -- 2.25.1