2007-07-02 [colin] 2.10.0cvs2
authorColin Leroy <colin@colino.net>
Mon, 2 Jul 2007 18:15:53 +0000 (18:15 +0000)
committerColin Leroy <colin@colino.net>
Mon, 2 Jul 2007 18:15:53 +0000 (18:15 +0000)
* 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
PATCHSETS
configure.ac
src/folder.h
src/mainwindow.c
src/procmsg.h
src/summaryview.c

index f68b5d9aaf72231e7d59210e7466e459dc5d5477..a62ab9243fdd954964e2524d8f46422b15e52b7b 100644 (file)
--- 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
index 255697ff081ccf0eaf1ba53bdda285bcb9230d27..0ba47b18f9bb7bae5ed7ef60c1bea8c65b1dcc93 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( 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
index 09342dab545824749a9bc432dd59ffd57fa3bf2f..fe57790cf9d1a1a410cddc5060a903187c8eb4e7 100644 (file)
@@ -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=
 
index c988e871b5a6365b05d59e83f5dcea156d9b079e..29ead0067da92413054054b82c7c68e74442f6d3 100644 (file)
@@ -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
index f95ea4d8e05c5f738efd3ef3c1cf013e586f1e2b..a025a84fdaa06d514bb53e9d2392006f93a16d64 100644 (file)
@@ -576,6 +576,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_View/_Sort/by _number"),         NULL, sort_summary_cb, SORT_BY_NUMBER, "<RadioItem>"},
        {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;
index b042f2785d74bc4a808bc298c7de2faa4421ba15..c762a6838736fcf08c77bcef935f0e3d4be3d8b0 100644 (file)
@@ -195,6 +195,7 @@ struct _MsgInfo
        off_t  size;
        time_t mtime;
        time_t date_t;
+       time_t thread_date;
 
        MsgFlags flags;
 
index 3072f4608e84a1a94630b4298f632b400b429ec7..125fcae53bab98c62d0ca7a113ee62c368518707 100644 (file)
@@ -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