Fix marking all as (un)read recursively when the confirmation
[claws.git] / src / summaryview.c
index c2a9362119b163d78900abd880291df534437f15..5fa3e7fd8573f350a754b3782997690e3c3bf810 100644 (file)
@@ -423,31 +423,31 @@ GtkTargetEntry summary_drag_types[3] =
 
 static GtkActionEntry summary_popup_entries[] =
 {
-       {"SummaryViewPopup",                            NULL, "SummaryViewPopup" },
-       {"SummaryViewPopup/ReplyTo",                    NULL, N_("Repl_y to") },
-       {"SummaryViewPopup/Mark",                       NULL, N_("_Mark") },
-       {"SummaryViewPopup/ColorLabel",                 NULL, N_("Color la_bel") },
-       {"SummaryViewPopup/Tags",                       NULL, N_("Ta_gs") },
-       {"SummaryViewPopup/CreateFilterRule",           NULL, N_("Create _filter rule") },
+       {"SummaryViewPopup",                      NULL, "SummaryViewPopup", NULL, NULL, NULL },
+       {"SummaryViewPopup/ReplyTo",              NULL, N_("Repl_y to"), NULL, NULL, NULL },
+       {"SummaryViewPopup/Mark",                 NULL, N_("_Mark"), NULL, NULL, NULL },
+       {"SummaryViewPopup/ColorLabel",           NULL, N_("Color la_bel"), NULL, NULL, NULL },
+       {"SummaryViewPopup/Tags",                 NULL, N_("Ta_gs"), NULL, NULL, NULL },
+       {"SummaryViewPopup/CreateFilterRule",     NULL, N_("Create _filter rule"), NULL, NULL, NULL },
 #ifndef GENERIC_UMPC
-       {"SummaryViewPopup/CreateProcessingRule",       NULL, N_("Create processing rule") },
+       {"SummaryViewPopup/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
 #endif
-       {"SummaryViewPopup/View",                       NULL, N_("_View") },
+       {"SummaryViewPopup/View",                 NULL, N_("_View"), NULL, NULL, NULL },
 };
 
 static const gchar *const col_label[N_SUMMARY_COLS] = {
-       "",             /* S_COL_MARK    */
-       N_("S"),        /* S_COL_STATUS  */
-       "",             /* S_COL_MIME    */
-       N_("Subject"),  /* S_COL_SUBJECT */
-       N_("From"),     /* S_COL_FROM    */
-       N_("To"),       /* S_COL_TO      */
-       N_("Date"),     /* S_COL_DATE    */
-       N_("Size"),     /* S_COL_SIZE    */
-       N_("#"),        /* S_COL_NUMBER  */
-       N_("Score"),    /* S_COL_SCORE   */
-       "",             /* S_COL_LOCKED  */
-       N_("Tags"),     /* S_COL_TAGS    */
+       "",            /* S_COL_MARK    */
+       N_("S"),       /* S_COL_STATUS  */
+       "",            /* S_COL_MIME    */
+       N_("Subject"), /* S_COL_SUBJECT */
+       N_("From"),    /* S_COL_FROM    */
+       N_("To"),      /* S_COL_TO      */
+       N_("Date"),    /* S_COL_DATE    */
+       N_("Size"),    /* S_COL_SIZE    */
+       N_("#"),       /* S_COL_NUMBER  */
+       N_("Score"),   /* S_COL_SCORE   */
+       "",            /* S_COL_LOCKED  */
+       N_("Tags"),    /* S_COL_TAGS    */
 };
 
 void summary_freeze(SummaryView *summaryview)
@@ -1558,7 +1558,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                                else
                                        open_selected = 0;
                        }
-                       summary_select_node(summaryview, node, open_selected);
+                       summary_select_node_no_mark_read(summaryview, node, open_selected);
                }
 
                summary_lock(summaryview);
@@ -1814,7 +1814,10 @@ void summary_select_prev(SummaryView *summaryview)
        GtkCMCTreeNode *node = summaryview->selected;
        GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
 
-       node = gtkut_ctree_node_prev(ctree, node);
+       if (summaryview->sort_type == SORT_ASCENDING)
+               node = gtkut_ctree_node_prev(ctree, node);
+       else
+               node = gtkut_ctree_node_next(ctree, node);
 
        if (node && node != summaryview->selected)
                summary_select_node(summaryview, node, -1);
@@ -1825,7 +1828,10 @@ void summary_select_next(SummaryView *summaryview)
        GtkCMCTreeNode *node = summaryview->selected;
        GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
 
-       node = gtkut_ctree_node_next(ctree, node);
+       if (summaryview->sort_type == SORT_ASCENDING)
+               node = gtkut_ctree_node_next(ctree, node);
+       else
+               node = gtkut_ctree_node_prev(ctree, node);
 
        if (node && node != summaryview->selected)
                summary_select_node(summaryview, node, -1);
@@ -2211,8 +2217,25 @@ static gboolean summary_select_retry(void *data)
  * 1, display the corresponding message in the message view, if
  * @force_display is -1, obey prefs_common.always_show_msg.
  **/
+static void summary_select_node_real(SummaryView *summaryview, GtkCMCTreeNode *node,
+                        gint force_display, gboolean ignore_mark_read);
+
 void summary_select_node(SummaryView *summaryview, GtkCMCTreeNode *node,
                         gint force_display)
+{
+       summary_select_node_real(summaryview, node, force_display, FALSE);
+
+}
+
+void summary_select_node_no_mark_read(SummaryView *summaryview, GtkCMCTreeNode *node,
+                        gint force_display, gboolean ignore_mark_read)
+{
+       summary_select_node_real(summaryview, node, force_display, TRUE);
+
+}
+
+static void summary_select_node_real(SummaryView *summaryview, GtkCMCTreeNode *node,
+                        gint force_display, gboolean ignore_mark_read)
 {
        GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
        gboolean display_msg;
@@ -2245,7 +2268,8 @@ void summary_select_node(SummaryView *summaryview, GtkCMCTreeNode *node,
        if (!summaryview->folder_item)
                return;
        if (node) {
-               summary_cancel_mark_read_timeout(summaryview);
+               if (!ignore_mark_read)
+                       summary_cancel_mark_read_timeout(summaryview);
                gtkut_ctree_expand_parent_all(ctree, node);
 
                summary_lock(summaryview);
@@ -4117,14 +4141,16 @@ void summary_msgs_unlock(SummaryView *summaryview)
        summary_status_show(summaryview);
 }
 
-void summary_mark_all_read(SummaryView *summaryview)
+void summary_mark_all_read(SummaryView *summaryview, gboolean ask_if_needed)
 {
        GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
        GtkCMCTreeNode *node;
        AlertValue val;
        gboolean froze = FALSE;
 
-       if (prefs_common.ask_mark_all_read) {
+       /* ask_if_needed is FALSE when user-asking is performed by caller,
+          commonly when the caller is a mark-as-read-recursive func */
+       if (ask_if_needed && prefs_common.ask_mark_all_read) {
                val = alertpanel_full(_("Mark all as read"),
                          _("Do you really want to mark all mails in this folder as read?"),
                          GTK_STOCK_NO, GTK_STOCK_YES, NULL,
@@ -4154,15 +4180,17 @@ void summary_mark_all_read(SummaryView *summaryview)
        summary_status_show(summaryview);
 }
 
-void summary_mark_all_unread(SummaryView *summaryview)
+void summary_mark_all_unread(SummaryView *summaryview, gboolean ask_if_needed)
 {
        GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
        GtkCMCTreeNode *node;
        AlertValue val;
        gboolean froze = FALSE;
 
-       if (prefs_common.ask_mark_all_read) {
-               val = alertpanel_full(_("Mark all as unread"),
+       /* ask_if_needed is FALSE when user-asking is performed by caller,
+          commonly when the caller is a mark-as-unread-recursive func */
+       if (ask_if_needed && prefs_common.ask_mark_all_read) {
+               val = alertpanel_full(_("FOO Mark all as unread"),
                          _("Do you really want to mark all mails in this folder as unread?"),
                          GTK_STOCK_NO, GTK_STOCK_YES, NULL,
                          TRUE, NULL, ALERT_QUESTION, G_ALERTDEFAULT);