2006-07-31 [wwp] 2.4.0cvs3
[claws.git] / src / summaryview.c
index cf50837d7a69f1b4772ec08838f810cb6637b66d..7c11a321075653eed317186556a72804656c1033 100644 (file)
@@ -88,6 +88,7 @@
 #include "timing.h"
 #include "gedit-print.h"
 #include "log.h"
+#include "manual.h"
 
 #define SUMMARY_COL_MARK_WIDTH         10
 #define SUMMARY_COL_STATUS_WIDTH       13
@@ -828,6 +829,17 @@ static void summary_switch_from_to(SummaryView *summaryview, FolderItem *item)
        summary_set_column_titles(summaryview);
 }
 
+static gboolean summaryview_quicksearch_recurse(gpointer data)
+{
+       SummaryView *summaryview = (SummaryView *)data;
+       main_window_cursor_wait(summaryview->mainwin);
+       quicksearch_reset_cur_folder_item(summaryview->quicksearch);
+       quicksearch_search_subfolders(summaryview->quicksearch, 
+                             summaryview->folderview,
+                             summaryview->folder_item);
+       main_window_cursor_normal(summaryview->mainwin);
+       return FALSE;
+}
 gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
@@ -1000,17 +1012,6 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                statusbar_pop_all();
                
                hidden_removed = TRUE;
-               if (quicksearch_is_running(summaryview->quicksearch)) {
-                       /* only scan subfolders when quicksearch changed,
-                        * not when search is the same and folder changed */
-                       main_window_cursor_wait(summaryview->mainwin);
-                       quicksearch_reset_cur_folder_item(summaryview->quicksearch);
-                       quicksearch_search_subfolders(summaryview->quicksearch, 
-                                             summaryview->folderview,
-                                             summaryview->folder_item);
-                       main_window_cursor_normal(summaryview->mainwin);
-               }
-
                if (!quicksearch_is_active(summaryview->quicksearch)) {
                        debug_print("search cancelled!\n");
                        gtk_clist_thaw(GTK_CLIST(ctree));
@@ -1049,6 +1050,13 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        g_slist_free(mlist);
 
+       if (quicksearch_is_active(summaryview->quicksearch) &&
+           quicksearch_is_running(summaryview->quicksearch)) {
+               /* only scan subfolders when quicksearch changed,
+                * not when search is the same and folder changed */
+               g_timeout_add(100, summaryview_quicksearch_recurse, summaryview);
+       }
+
        if (is_refresh) {
                summaryview->displayed =
                        summary_find_msg_by_msgnum(summaryview,
@@ -1606,27 +1614,56 @@ void summary_select_prev_marked(SummaryView *summaryview)
 
 void summary_select_next_marked(SummaryView *summaryview)
 {
-       GtkCTreeNode *node;
+       GtkCTreeNode *node = summaryview->selected;
+       gboolean skip_cur = FALSE;
+       
+       if (summaryview->displayed 
+       &&  summaryview->selected == summaryview->displayed) {
+               debug_print("skipping cur (%p %p)\n",
+                       summaryview->displayed, summaryview->selected);
+               skip_cur = TRUE;
+       }
+
 
        node = summary_find_next_flagged_msg
-               (summaryview, summaryview->selected, MSG_MARKED, TRUE);
+               (summaryview, node, MSG_MARKED, skip_cur);
+       
+       if (node)
+               summary_select_node(summaryview, node, TRUE, FALSE);
+       else {
+               node = summary_find_next_flagged_msg
+                       (summaryview, NULL, MSG_MARKED, FALSE);
+               if (node == NULL || node == summaryview->selected) {
+                       AlertValue val = 0;
 
-       if (!node) {
-               AlertValue val;
+                       switch (prefs_common.next_unread_msg_dialog) {
+                               case NEXTUNREADMSGDIALOG_ALWAYS:
+                                       val = alertpanel(_("No more marked messages"),
+                                                        _("No marked message found. "
+                                                          "Go to next folder?"),
+                                                        GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
+                                       break;
+                               case NEXTUNREADMSGDIALOG_ASSUME_YES:
+                                       val = G_ALERTALTERNATE;
+                                       break;
+                               case NEXTUNREADMSGDIALOG_ASSUME_NO:
+                                       val = G_ALERTOTHER;
+                                       break;
+                               default:
+                                       debug_print(
+                                               _("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
+                       }
 
-               val = alertpanel(_("No more marked messages"),
-                                _("No marked message found. "
-                                  "Search from the beginning?"),
-                                GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
-               if (val != G_ALERTALTERNATE) return;
-               node = summary_find_next_flagged_msg(summaryview, NULL,
-                                                    MSG_MARKED, TRUE);
-       }
+                       if (val == G_ALERTALTERNATE) {
+                               folderview_select_next_marked(summaryview->folderview);
+                               return;
+                       } 
+                       else
+                               return;
+               } else
+                       summary_select_node(summaryview, node, TRUE, FALSE);
 
-       if (!node)
-               alertpanel_notice(_("No marked messages."));
-       else
-               summary_select_node(summaryview, node, TRUE, FALSE);
+       }
 }
 
 void summary_select_prev_labeled(SummaryView *summaryview)
@@ -1786,7 +1823,8 @@ static GtkCTreeNode *summary_find_next_msg(SummaryView *summaryview,
 
        for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
-               if (msginfo && !MSG_IS_DELETED(msginfo->flags)) break;
+               if (msginfo && !MSG_IS_DELETED(msginfo->flags) 
+               && !MSG_IS_MOVE(msginfo->flags)) break;
        }
 
        return node;
@@ -2409,7 +2447,7 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
        summaryview->subject_table = subject_table;
 
        if (prefs_common.use_addr_book)
-               start_address_completion();
+               start_address_completion(NULL);
        
        if (summaryview->threaded) {
                GNode *root, *gnode;
@@ -2594,11 +2632,17 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
                                msginfo->fromname :
                                _("(No From)");
        } else {
-               /* this leaks */
+               gchar buf[BUFFSIZE];
                gchar *tmp = summary_complete_address(msginfo->from);
-               from_text = tmp ? tmp : (msginfo->fromname ?
-                                        msginfo->fromname: 
-                                               _("(No From)"));
+               if (tmp) {
+                       strncpy2(buf, tmp, sizeof(buf));
+                       g_free(tmp);
+                       from_text = buf;
+               } else {
+                       from_text = (msginfo->fromname) ?
+                                       msginfo->fromname: 
+                                       _("(No From)");
+               }
        }
        
        to_text = msginfo->to ? msginfo->to : 
@@ -2885,7 +2929,7 @@ void summary_reedit(SummaryView *summaryview)
                                              summaryview->selected);
        if (!msginfo) return;
 
-       compose_reedit(msginfo);
+       compose_reedit(msginfo, FALSE);
 }
 
 gboolean summary_step(SummaryView *summaryview, GtkScrollType type)
@@ -3472,10 +3516,12 @@ void summary_delete(SummaryView *summaryview)
 
        if (!summaryview->folder_item) return;
 
-       aval = alertpanel(_("Delete message(s)"),
-                         _("Do you really want to delete selected message(s)?"),
-                         GTK_STOCK_CANCEL, "+"GTK_STOCK_DELETE, NULL);
-       if (aval != G_ALERTALTERNATE) return;
+       if (!prefs_common.live_dangerously) {
+               aval = alertpanel(_("Delete message(s)"),
+                                 _("Do you really want to delete selected message(s)?"),
+                                 GTK_STOCK_CANCEL, "+"GTK_STOCK_DELETE, NULL);
+               if (aval != G_ALERTALTERNATE) return;
+       }
 
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; 
             cur = cur->next) {
@@ -3612,7 +3658,7 @@ static void summary_move_row_to(SummaryView *summaryview, GtkCTreeNode *row,
 void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
 {
        GList *cur;
-
+       GtkCTreeNode *sel_last = NULL;
        if (!to_folder) return;
        if (!summaryview->folder_item ||
            FOLDER_TYPE(summaryview->folder_item->folder) == F_NEWS) return;
@@ -3627,10 +3673,11 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
        START_LONG_OPERATION(summaryview); 
 
        for (cur = GTK_CLIST(summaryview->ctree)->selection;
-            cur != NULL && cur->data != NULL; cur = cur->next)
+            cur != NULL && cur->data != NULL; cur = cur->next) {
+               sel_last = GTK_CTREE_NODE(cur->data);
                summary_move_row_to
                        (summaryview, GTK_CTREE_NODE(cur->data), to_folder);
-
+       }
        END_LONG_OPERATION(summaryview);
 
        summaryview->display_msg = prefs_common.always_show_msg;
@@ -3638,6 +3685,10 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
        if (prefs_common.immediate_exec) {
                summary_execute(summaryview);
        } else {
+               GtkCTreeNode *node = summary_find_next_msg(summaryview, sel_last);
+               if (!node)
+                       node = summary_find_prev_msg(summaryview, sel_last);
+               summary_select_node(summaryview, node, prefs_common.always_show_msg, TRUE);
                summary_status_show(summaryview);
        }
        
@@ -4459,7 +4510,7 @@ static void summary_filter_func(MsgInfo *msginfo)
        if (hooks_invoke(MAIL_MANUAL_FILTERING_HOOKLIST, &mail_filtering_data))
                return;
 
-       filter_message_by_msginfo(filtering_rules, msginfo);
+       filter_message_by_msginfo(filtering_rules, msginfo, NULL);
 }
 
 void summary_msginfo_filter_open(FolderItem * item, MsgInfo *msginfo,
@@ -4474,16 +4525,19 @@ void summary_msginfo_filter_open(FolderItem * item, MsgInfo *msginfo,
                if (item == NULL)
                        prefs_filtering_open(&pre_global_processing,
                                             _("Processing rules to apply before folder rules"),
-                                            header, key);
+                                            MANUAL_ANCHOR_PROCESSING,
+                                            header, key, FALSE);
                else
                        prefs_filtering_open(&item->prefs->processing,
                                             _("Processing configuration"),
-                                            header, key);
+                                            MANUAL_ANCHOR_PROCESSING,
+                                            header, key, FALSE);
        }
        else {
                prefs_filtering_open(&filtering_rules,
-                                    _("Filtering configuration"),
-                                      header, key);
+                               _("Filtering configuration"),
+                               MANUAL_ANCHOR_FILTERING,
+                               header, key, TRUE);
        }
        
        g_free(header);
@@ -4566,6 +4620,7 @@ void summary_set_colorlabel_color(GtkCTree *ctree, GtkCTreeNode *node,
        }
 
        gtk_ctree_node_set_row_style(ctree, node, style);
+       gtk_style_unref(style);
 }
 
 static void summary_set_row_colorlabel(SummaryView *summaryview, GtkCTreeNode *row, guint labelcolor)