2006-03-20 [colin] 2.0.0cvs159
[claws.git] / src / summaryview.c
index 2d94f8dd4f9c0205a24bf5632734b2ccbd68c4fa..0e509cb31743f0209a001cc3c68f43bbe14e3fa8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2005 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -87,6 +87,7 @@
 #include "partial_download.h"
 #include "timing.h"
 #include "gedit-print.h"
+#include "log.h"
 
 #define SUMMARY_COL_MARK_WIDTH         10
 #define SUMMARY_COL_STATUS_WIDTH       13
@@ -118,6 +119,8 @@ static GdkPixmap *ignorethreadxpm;
 static GdkBitmap *ignorethreadxpmmask;
 static GdkPixmap *lockedxpm;
 static GdkBitmap *lockedxpmmask;
+static GdkPixmap *spamxpm;
+static GdkBitmap *spamxpmmask;
 
 static GdkPixmap *clipxpm;
 static GdkBitmap *clipxpmmask;
@@ -137,7 +140,7 @@ static void summary_set_marks_func  (GtkCTree               *ctree,
                                         GtkCTreeNode           *node,
                                         gpointer                data);
 
-static void summary_set_menu_sensitive (SummaryView            *summaryview);
+void summary_set_menu_sensitive        (SummaryView            *summaryview);
 
 static void summary_set_hide_read_msgs_menu (SummaryView *summaryview,
                                             guint action);
@@ -177,7 +180,7 @@ static void summary_set_ctree_from_list     (SummaryView            *summaryview,
 static void summary_set_header         (SummaryView            *summaryview,
                                         gchar                  *text[],
                                         MsgInfo                *msginfo,
-                                        gboolean               *free_from_to);
+                                        gboolean               *free_from);
 static void summary_display_msg                (SummaryView            *summaryview,
                                         GtkCTreeNode           *row);
 static void summary_display_msg_full   (SummaryView            *summaryview,
@@ -234,12 +237,7 @@ static void summary_unthread_for_exec_func (GtkCTree       *ctree,
 void summary_simplify_subject(SummaryView *summaryview, gchar * rexp,
                              GSList * mlist);
 
-#if 0
-void summary_processing(SummaryView *summaryview, GSList * mlist);
-#endif
-static void summary_filter_func                (GtkCTree               *ctree,
-                                        GtkCTreeNode           *node,
-                                        gpointer                data);
+static void summary_filter_func                (MsgInfo *msginfo);
 
 static void summary_colorlabel_menu_item_activate_cb
                                          (GtkWidget    *widget,
@@ -247,7 +245,8 @@ static void summary_colorlabel_menu_item_activate_cb
 static void summary_colorlabel_menu_item_activate_item_cb
                                          (GtkMenuItem  *label_menu_item,
                                           gpointer      data);
-static void summary_colorlabel_menu_create(SummaryView *summaryview);
+static void summary_colorlabel_menu_create(SummaryView *summaryview,
+                                          gboolean  refresh);
 
 static GtkWidget *summary_ctree_create (SummaryView    *summaryview);
 
@@ -336,6 +335,20 @@ static void summary_drag_data_get       (GtkWidget        *widget,
                                         guint             info,
                                         guint             time,
                                         SummaryView      *summaryview);
+static void summary_drag_data_received(GtkWidget        *widget,
+                                       GdkDragContext   *drag_context,
+                                       gint              x,
+                                       gint              y,
+                                       GtkSelectionData *data,
+                                       guint             info,
+                                       guint             time,
+                                       SummaryView       *summaryview);
+static gboolean summary_drag_motion_cb(GtkWidget      *widget,
+                                         GdkDragContext *context,
+                                         gint            x,
+                                         gint            y,
+                                         guint           time,
+                                         SummaryView    *summaryview);
 
 /* custom compare functions for sorting */
 
@@ -392,9 +405,10 @@ static void summary_find_answers   (SummaryView    *summaryview,
 
 static gboolean summary_update_msg     (gpointer source, gpointer data);
 
-GtkTargetEntry summary_drag_types[1] =
+GtkTargetEntry summary_drag_types[2] =
 {
-       {"text/plain", GTK_TARGET_SAME_APP, TARGET_DUMMY}
+       {"text/uri-list", 0, TARGET_MAIL_URI_LIST},
+       {"sylpheed-claws/internal", GTK_TARGET_SAME_APP, TARGET_DUMMY}
 };
 
 static GtkItemFactoryEntry summary_popup_entries[] =
@@ -424,6 +438,10 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/_Mark/Mark all read"),    NULL, summary_mark_all_read, 0, NULL},
        {N_("/_Mark/Ignore thread"),    NULL, summary_ignore_thread, 0, NULL},
        {N_("/_Mark/Unignore thread"),  NULL, summary_unignore_thread, 0, NULL},
+       {N_("/_Mark/---"),              NULL, NULL, 0, "<Separator>"},
+       {N_("/_Mark/Mark as _spam"),    NULL, summary_mark_as_spam, 1, NULL},
+       {N_("/_Mark/Mark as _ham"),     NULL, summary_mark_as_spam, 0, NULL},
+       {N_("/_Mark/---"),              NULL, NULL, 0, "<Separator>"},
        {N_("/_Mark/Lock"),             NULL, summary_msgs_lock, 0, NULL},
        {N_("/_Mark/Unlock"),           NULL, summary_msgs_unlock, 0, NULL},
        {N_("/Color la_bel"),           NULL, NULL,             0, NULL},
@@ -618,7 +636,7 @@ SummaryView *summary_create(void)
        summaryview->msginfo_update_callback_id =
                hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, summary_update_msg, (gpointer) summaryview);
 
-       summaryview->target_list = gtk_target_list_new(summary_drag_types, 1);
+       summaryview->target_list = gtk_target_list_new(summary_drag_types, 2);
 
        summaryview->quicksearch = quicksearch;
 
@@ -707,6 +725,8 @@ void summary_init(SummaryView *summaryview)
                         &gpgsignedxpm, &gpgsignedxpmmask);
        stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_CLIP_GPG_SIGNED,
                         &clipgpgsignedxpm, &clipgpgsignedxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_SPAM,
+                        &spamxpm, &spamxpmmask);
 
        summary_set_fonts(summaryview);
 
@@ -730,78 +750,74 @@ void summary_init(SummaryView *summaryview)
 
        summary_clear_list(summaryview);
        summary_set_column_titles(summaryview);
-       summary_colorlabel_menu_create(summaryview);
+       summary_colorlabel_menu_create(summaryview, FALSE);
        summary_set_menu_sensitive(summaryview);
 
 }
 
-#if 0
-GtkCTreeNode * summary_find_next_important_score(SummaryView *summaryview,
-                                                GtkCTreeNode *current_node)
+#define CURRENTLY_DISPLAYED(m) \
+( (m->msgnum == displayed_msgnum) \
+  && (!g_ascii_strcasecmp(m->folder->name,item->name)) )
+
+static void summary_switch_from_to(SummaryView *summaryview, FolderItem *item)
 {
+       gboolean show_from = FALSE, show_to = FALSE;
+       gboolean showing_from = FALSE, showing_to = FALSE;
+       gint from_pos = 0, to_pos = 0;
+       SummaryColumnState *col_state = summaryview->col_state;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
-       GtkCTreeNode *node;
-       MsgInfo *msginfo;
-       gint best_score = MIN_SCORE;
-       GtkCTreeNode *best_node = NULL;
-
-       if (current_node)
-               /*node = current_node;*/
-               node = GTK_CTREE_NODE_NEXT(current_node);
+       
+       if (!item)
+               return;
+       if (folder_has_parent_of_type(item, F_OUTBOX)
+       ||  folder_has_parent_of_type(item, F_DRAFT)
+       ||  folder_has_parent_of_type(item, F_QUEUE))
+               show_to = TRUE;
        else
-               node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
+               show_from = TRUE;
+       
+       from_pos = summaryview->col_pos[S_COL_FROM];
+       to_pos = summaryview->col_pos[S_COL_TO];
+       showing_from = col_state[from_pos].visible;
+       showing_to = col_state[to_pos].visible;
+       
+       if (showing_from && showing_to) {
+               debug_print("showing both\n");
+               return;
+       }
 
-       for (; node != NULL; node = GTK_CTREE_NODE_NEXT(node)) {
-               msginfo = gtk_ctree_node_get_row_data(ctree, node);
-               if (msginfo->score >= summaryview->important_score)
-                       break;
-               if (msginfo->score > best_score) {
-                       best_score = msginfo->score;
-                       best_node = node;
-               }
+       if (!showing_from && !showing_to) {
+               debug_print("showing none\n");
+               return;
        }
 
-       if (node != NULL)
-               return node;
-       else
-               return best_node;
-}
+       debug_print("showing %s %s, must show %s %s\n", 
+               showing_from?"From":"",
+               showing_to?"To":"",
+               show_from?"From":"",
+               show_to?"To":"");
 
-GtkCTreeNode * summary_find_prev_important_score(SummaryView *summaryview,
-                                                GtkCTreeNode *current_node)
-{
-       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
-       GtkCTreeNode *node;
-       MsgInfo *msginfo;
-       gint best_score = MIN_SCORE;
-       GtkCTreeNode *best_node = NULL;
+       if (showing_from == show_from && showing_to == show_to)
+               return;
+       /* else we'll switch both */
 
-       if (current_node)
-               /*node = current_node;*/
-               node = GTK_CTREE_NODE_PREV(current_node);
-       else
-               node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
+       debug_print("switching columns\n");
+       col_state[from_pos].type = S_COL_TO;
+       col_state[from_pos].visible = show_to;
 
-       for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
-               msginfo = gtk_ctree_node_get_row_data(ctree, node);
-               if (msginfo->score >= summaryview->important_score)
-                       break;
-               if (msginfo->score > best_score) {
-                       best_score = msginfo->score;
-                       best_node = node;
-               }
-       }
+       col_state[to_pos].type = S_COL_FROM;
+       col_state[to_pos].visible = show_from;
 
-       if (node != NULL)
-               return node;
-       else
-               return best_node;
-}
-#endif
+       summaryview->col_pos[S_COL_TO] = from_pos;
+       summaryview->col_pos[S_COL_FROM] = to_pos;
 
-#define CURRENTLY_DISPLAYED(m) \
-( (m->msgnum == displayed_msgnum) \
-  && (!g_ascii_strcasecmp(m->folder->name,item->name)) )
+       gtk_clist_set_column_visibility
+               (GTK_CLIST(ctree), from_pos, col_state[from_pos].visible);
+       gtk_clist_set_column_visibility
+               (GTK_CLIST(ctree), to_pos, col_state[to_pos].visible);
+
+       summary_set_column_titles(summaryview);
+}
 
 gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 {
@@ -821,6 +837,8 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
        if (!summaryview->mainwin)
                return FALSE;
 
+       summary_switch_from_to(summaryview, item);
+
        inc_lock();
        summary_lock(summaryview);
 
@@ -848,14 +866,14 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                gboolean changed = FALSE;
 
                val = alertpanel(_("Process mark"),
-                                _("Some marks are left. Process it?"),
-                                GTK_STOCK_YES, GTK_STOCK_NO, GTK_STOCK_CANCEL);
-               if (G_ALERTDEFAULT == val) {
+                                _("Some marks are left. Process them?"),
+                                GTK_STOCK_NO, GTK_STOCK_YES, GTK_STOCK_CANCEL);
+               if (G_ALERTALTERNATE == val) {
                        summary_unlock(summaryview);
                        summary_execute(summaryview);
                        summary_lock(summaryview);
                        changed = TRUE;
-               } else if (G_ALERTALTERNATE == val) {
+               } else if (G_ALERTDEFAULT == val) {
                        /* DO NOTHING */
                } else {
                        summary_unlock(summaryview);
@@ -942,16 +960,28 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        if (quicksearch_is_active(summaryview->quicksearch)) {
                GSList *not_killed;
-               
+               gint num = 0, total = summaryview->folder_item->total_msgs;
+               statusbar_print_all(_("Searching in %s... \n"), 
+                       summaryview->folder_item->path ? 
+                       summaryview->folder_item->path : "(null)");
                not_killed = NULL;
                for (cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
 
+                       statusbar_progress_all(num++,total, 50);
+
                        if (!msginfo->hidden && quicksearch_match(summaryview->quicksearch, msginfo))
                                not_killed = g_slist_prepend(not_killed, msginfo);
                        else
                                procmsg_msginfo_free(msginfo);
+                       GTK_EVENTS_FLUSH();
+                       if (!quicksearch_is_active(summaryview->quicksearch)) {
+                               break;
+                       }
                }
+               statusbar_progress_all(0,0,0);
+               statusbar_pop_all();
+               
                hidden_removed = TRUE;
                if (quicksearch_is_running(summaryview->quicksearch)) {
                        /* only scan subfolders when quicksearch changed,
@@ -963,7 +993,17 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                                              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));
+                       STATUSBAR_POP(summaryview->mainwin);
+                       main_window_cursor_normal(summaryview->mainwin);
+                       summary_unlock(summaryview);
+                       inc_unlock();
+                       summary_show(summaryview, summaryview->folder_item);
+                       return FALSE;
+               }
                g_slist_free(mlist);
                mlist = not_killed;
        }
@@ -1051,7 +1091,6 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
        toolbar_main_set_sensitive(summaryview->mainwin);
        
        gtk_clist_thaw(GTK_CLIST(ctree));
-
        debug_print("\n");
        STATUSBAR_PUSH(summaryview->mainwin, _("Done."));
        STATUSBAR_POP(summaryview->mainwin);
@@ -1204,7 +1243,7 @@ GSList *summary_get_msg_list(SummaryView *summaryview)
        return mlist;
 }
 
-static void summary_set_menu_sensitive(SummaryView *summaryview)
+void summary_set_menu_sensitive(SummaryView *summaryview)
 {
        GtkItemFactory *ifactory = summaryview->popupfactory;
        SensitiveCond state;
@@ -1239,6 +1278,8 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/Mark/Ignore thread"          , M_TARGET_EXIST},
                {"/Mark/Lock"                   , M_TARGET_EXIST},
                {"/Mark/Unlock"                 , M_TARGET_EXIST},
+               {"/Mark/Mark as spam"           , M_TARGET_EXIST|M_CAN_LEARN_SPAM},
+               {"/Mark/Mark as ham"            , M_TARGET_EXIST|M_CAN_LEARN_SPAM},
                {"/Color label"                 , M_TARGET_EXIST},
 
                {"/Add sender to address book"  , M_SINGLE_TARGET_EXIST},
@@ -1297,19 +1338,19 @@ void summary_select_prev_unread(SummaryView *summaryview)
                                val = alertpanel(_("No more unread messages"),
                                                 _("No unread message found. "
                                                   "Search from the end?"),
-                                                GTK_STOCK_YES, GTK_STOCK_NO, NULL);
+                                                GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
                                break;
                        case NEXTUNREADMSGDIALOG_ASSUME_YES:
-                               val = G_ALERTDEFAULT;
+                               val = G_ALERTALTERNATE;
                                break;
                        case NEXTUNREADMSGDIALOG_ASSUME_NO:
-                               val = !G_ALERTDEFAULT;
+                               val = !G_ALERTALTERNATE;
                                break;
                        default:
                                debug_print(
                                        _("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
                }
-               if (val != G_ALERTDEFAULT) return;
+               if (val != G_ALERTALTERNATE) return;
                node = summary_find_prev_flagged_msg(summaryview, NULL,
                                                     MSG_UNREAD, FALSE);
        }
@@ -1349,10 +1390,10 @@ void summary_select_next_unread(SummaryView *summaryview)
                                        val = alertpanel(_("No more unread messages"),
                                                         _("No unread message found. "
                                                           "Go to next folder?"),
-                                                        GTK_STOCK_YES, GTK_STOCK_NO, NULL);
+                                                        GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
                                        break;
                                case NEXTUNREADMSGDIALOG_ASSUME_YES:
-                                       val = G_ALERTDEFAULT;
+                                       val = G_ALERTALTERNATE;
                                        break;
                                case NEXTUNREADMSGDIALOG_ASSUME_NO:
                                        val = G_ALERTOTHER;
@@ -1362,7 +1403,7 @@ void summary_select_next_unread(SummaryView *summaryview)
                                                _("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
                        }
 
-                       if (val == G_ALERTDEFAULT) {
+                       if (val == G_ALERTALTERNATE) {
                                folderview_select_next_unread(summaryview->folderview);
                                return;
                        } 
@@ -1396,19 +1437,19 @@ void summary_select_prev_new(SummaryView *summaryview)
                                val = alertpanel(_("No more new messages"),
                                                 _("No new message found. "
                                                   "Search from the end?"),
-                                                GTK_STOCK_YES, GTK_STOCK_NO, NULL);
+                                                GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
                                break;
                        case NEXTUNREADMSGDIALOG_ASSUME_YES:
-                               val = G_ALERTDEFAULT;
+                               val = G_ALERTALTERNATE;
                                break;
                        case NEXTUNREADMSGDIALOG_ASSUME_NO:
-                               val = !G_ALERTDEFAULT;
+                               val = !G_ALERTALTERNATE;
                                break;
                        default:
                                debug_print(
                                        _("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
                }
-               if (val != G_ALERTDEFAULT) return;
+               if (val != G_ALERTALTERNATE) return;
                node = summary_find_prev_flagged_msg(summaryview, NULL,
                                                     MSG_NEW, FALSE);
        }
@@ -1448,10 +1489,10 @@ void summary_select_next_new(SummaryView *summaryview)
                                        val = alertpanel(_("No more new messages"),
                                                         _("No new message found. "
                                                           "Go to next folder?"),
-                                                        GTK_STOCK_YES, GTK_STOCK_NO, NULL);
+                                                        GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
                                        break;
                                case NEXTUNREADMSGDIALOG_ASSUME_YES:
-                                       val = G_ALERTDEFAULT;
+                                       val = G_ALERTALTERNATE;
                                        break;
                                case NEXTUNREADMSGDIALOG_ASSUME_NO:
                                        val = G_ALERTOTHER;
@@ -1461,7 +1502,7 @@ void summary_select_next_new(SummaryView *summaryview)
                                                _("Internal error: unexpected value for prefs_common.next_unread_msg_dialog\n"));
                        }
 
-                       if (val == G_ALERTDEFAULT) {
+                       if (val == G_ALERTALTERNATE) {
                                folderview_select_next_new(summaryview->folderview);
                                return;
                        } 
@@ -1486,8 +1527,8 @@ void summary_select_prev_marked(SummaryView *summaryview)
                val = alertpanel(_("No more marked messages"),
                                 _("No marked message found. "
                                   "Search from the end?"),
-                                GTK_STOCK_YES, GTK_STOCK_NO, NULL);
-               if (val != G_ALERTDEFAULT) return;
+                                GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
+               if (val != G_ALERTALTERNATE) return;
                node = summary_find_prev_flagged_msg(summaryview, NULL,
                                                     MSG_MARKED, TRUE);
        }
@@ -1511,8 +1552,8 @@ void summary_select_next_marked(SummaryView *summaryview)
                val = alertpanel(_("No more marked messages"),
                                 _("No marked message found. "
                                   "Search from the beginning?"),
-                                GTK_STOCK_YES, GTK_STOCK_NO, NULL);
-               if (val != G_ALERTDEFAULT) return;
+                                GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
+               if (val != G_ALERTALTERNATE) return;
                node = summary_find_next_flagged_msg(summaryview, NULL,
                                                     MSG_MARKED, TRUE);
        }
@@ -1536,8 +1577,8 @@ void summary_select_prev_labeled(SummaryView *summaryview)
                val = alertpanel(_("No more labeled messages"),
                                 _("No labeled message found. "
                                   "Search from the end?"),
-                                GTK_STOCK_YES, GTK_STOCK_NO, NULL);
-               if (val != G_ALERTDEFAULT) return;
+                                GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
+               if (val != G_ALERTALTERNATE) return;
                node = summary_find_prev_flagged_msg(summaryview, NULL,
                                                     MSG_CLABEL_FLAG_MASK, TRUE);
        }
@@ -1561,8 +1602,8 @@ void summary_select_next_labeled(SummaryView *summaryview)
                val = alertpanel(_("No more labeled messages"),
                                 _("No labeled message found. "
                                   "Search from the beginning?"),
-                                GTK_STOCK_YES, GTK_STOCK_NO, NULL);
-               if (val != G_ALERTDEFAULT) return;
+                                GTK_STOCK_NO, "+"GTK_STOCK_YES, NULL);
+               if (val != G_ALERTALTERNATE) return;
                node = summary_find_next_flagged_msg(summaryview, NULL,
                                                     MSG_CLABEL_FLAG_MASK, TRUE);
        }
@@ -1726,8 +1767,9 @@ static GtkCTreeNode *summary_find_next_flagged_msg(SummaryView *summaryview,
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
                /* Find msg with matching flags but ignore messages with
                   ignore flags, if searching for new or unread messages */
-               if (!(((flags & (MSG_NEW | MSG_UNREAD)) != 0) && MSG_IS_IGNORE_THREAD(msginfo->flags)) && 
-                       (msginfo && (msginfo->flags.perm_flags & flags) != 0))
+               if ((msginfo && (msginfo->flags.perm_flags & flags) != 0) &&
+                   !(((flags & (MSG_NEW | MSG_UNREAD)) != 0) && MSG_IS_IGNORE_THREAD(msginfo->flags)) 
+                       )
                        break;
        }
 
@@ -2230,9 +2272,9 @@ gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *gnode,
        gint *col_pos = summaryview->col_pos;
        const gchar *msgid = msginfo->msgid;
        GHashTable *msgid_table = summaryview->msgid_table;
-       gboolean free_from_to = FALSE;
+       gboolean free_from = FALSE;
        
-       summary_set_header(summaryview, text, msginfo, &free_from_to);
+       summary_set_header(summaryview, text, msginfo, &free_from);
 
        gtk_sctree_set_node_info(ctree, cnode, text[col_pos[S_COL_SUBJECT]], 2,
                                NULL, NULL, NULL, NULL, FALSE,
@@ -2249,11 +2291,9 @@ gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *gnode,
        SET_TEXT(S_COL_TO);
        /* SET_TEXT(S_COL_SUBJECT);  already set by node info */
 
-       if (free_from_to) {
+       if (free_from) {
                g_free(text[col_pos[S_COL_FROM]]);
-               g_free(text[col_pos[S_COL_TO]]);
                text[col_pos[S_COL_FROM]] = NULL;
-               text[col_pos[S_COL_TO]] = NULL;
        }
 
 #undef SET_TEXT
@@ -2313,24 +2353,22 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                summary_thread_init(summaryview);
        } else {
                gchar *text[N_SUMMARY_COLS];
-               gboolean free_from_to = FALSE;
+               gboolean free_from = FALSE;
                gint *col_pos = summaryview->col_pos;
 
                cur = mlist;
                for (; mlist != NULL; mlist = mlist->next) {
                        msginfo = (MsgInfo *)mlist->data;
 
-                       summary_set_header(summaryview, text, msginfo, &free_from_to);
+                       summary_set_header(summaryview, text, msginfo, &free_from);
 
                        node = gtk_sctree_insert_node
                                (ctree, NULL, node, text, 2,
                                 NULL, NULL, NULL, NULL,
                                 FALSE, FALSE);
-                       if (free_from_to) {
+                       if (free_from) {
                                g_free(text[col_pos[S_COL_FROM]]);
-                               g_free(text[col_pos[S_COL_TO]]);
                                text[col_pos[S_COL_FROM]] = NULL;
-                               text[col_pos[S_COL_TO]] = NULL;
                        }
                        GTKUT_CTREE_NODE_SET_ROW_DATA(node, msginfo);
                        summary_set_marks_func(ctree, node, summaryview);
@@ -2413,7 +2451,7 @@ static gchar *summary_complete_address(const gchar *addr)
 }
 
 static void summary_set_header(SummaryView *summaryview, gchar *text[],
-                              MsgInfo *msginfo, gboolean *free_from_to)
+                              MsgInfo *msginfo, gboolean *free_from)
 {
        static gchar date_modified[80];
        static gchar col_score[11];
@@ -2444,7 +2482,8 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
        else
                text[col_pos[S_COL_DATE]] = _("(No Date)");
 
-       if (prefs_common.swap_from && msginfo->from && msginfo->to) {
+       if (prefs_common.swap_from && msginfo->from && msginfo->to
+       &&  !summaryview->col_state[summaryview->col_pos[S_COL_TO]].visible) {
                gchar *addr = NULL;
                
                addr = g_strdup(msginfo->from);
@@ -2475,17 +2514,15 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
                     )
                   );
 
+       text[col_pos[S_COL_TO]] = to_text;
        if (!should_swap) {
                text[col_pos[S_COL_FROM]] = from_text;
-               text[col_pos[S_COL_TO]] = to_text;
-               *free_from_to = FALSE;
+               *free_from = FALSE;
        } else {
                gchar *tmp = NULL;
                tmp = g_strconcat("-->", to_text, NULL);
                text[col_pos[S_COL_FROM]] = tmp;
-               tmp = g_strconcat("<--", from_text, NULL);
-               text[col_pos[S_COL_TO]] = tmp;
-               *free_from_to = TRUE;
+               *free_from = TRUE;
        }
        
        if (summaryview->simplify_subject_preg != NULL)
@@ -2654,7 +2691,7 @@ static void summary_display_msg_full(SummaryView *summaryview,
        GTK_EVENTS_FLUSH();
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-
+       
        if (new_window) {
                MessageView *msgview;
 
@@ -2859,6 +2896,9 @@ static void summary_set_row_marks(SummaryView *summaryview, GtkCTreeNode *row)
        if (MSG_IS_IGNORE_THREAD(flags)) {
                gtk_ctree_node_set_pixmap(ctree, row, col_pos[S_COL_STATUS],
                                          ignorethreadxpm, ignorethreadxpmmask);
+       } else if (MSG_IS_SPAM(flags)) {
+               gtk_ctree_node_set_pixmap(ctree, row, col_pos[S_COL_STATUS],
+                                         spamxpm, spamxpmmask);
        } else if (MSG_IS_NEW(flags)) {
                gtk_ctree_node_set_pixmap(ctree, row, col_pos[S_COL_STATUS],
                                          newxpm, newxpmmask);
@@ -2915,15 +2955,6 @@ static void summary_set_row_marks(SummaryView *summaryview, GtkCTreeNode *row)
                }
                        gtk_ctree_node_set_foreground
                                (ctree, row, &summaryview->color_marked);
-#if 0
-       } else if ((global_scoring ||
-                 summaryview->folder_item->prefs->scoring) &&
-                (msginfo->score >= summaryview->important_score) &&
-                (MSG_IS_MARKED(msginfo->flags) || MSG_IS_MOVE(msginfo->flags) || MSG_IS_COPY(msginfo->flags))) {
-               gtk_ctree_node_set_text(ctree, row, S_COL_MARK, "!");
-               gtk_ctree_node_set_foreground(ctree, row,
-                                             &summaryview->color_important);
-#endif
        } else {
                gtk_ctree_node_set_text(ctree, row, col_pos[S_COL_MARK], "");
        }
@@ -3117,6 +3148,56 @@ void summary_mark_all_read(SummaryView *summaryview)
        summary_status_show(summaryview);
 }
 
+void summary_mark_as_spam(SummaryView *summaryview, guint action, GtkWidget *widget)
+{
+       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       GList *cur;
+       gboolean is_spam = action;
+       GSList *msgs = NULL;
+       gboolean immediate_exec = prefs_common.immediate_exec;
+       gboolean moved = FALSE;
+       prefs_common.immediate_exec = FALSE;
+
+       START_LONG_OPERATION(summaryview);
+
+       for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
+               GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
+               MsgInfo *msginfo = gtk_ctree_node_get_row_data(ctree, row);
+               msgs = g_slist_prepend(msgs, msginfo);
+       }
+       
+       if (procmsg_spam_learner_learn(NULL, msgs, is_spam) == 0) {
+               for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
+                       GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
+                       MsgInfo *msginfo = gtk_ctree_node_get_row_data(ctree, row);
+                       if (is_spam) {
+                               summary_msginfo_change_flags(msginfo, MSG_SPAM, 0, MSG_NEW|MSG_UNREAD, 0);
+                               if (procmsg_spam_get_folder() != summaryview->folder_item) {
+                                       summary_move_row_to(summaryview, row, procmsg_spam_get_folder());
+                                       moved = TRUE;
+                               }
+                       } else {
+                               summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
+                       }
+               }
+       } else {
+               log_error(_("An error happened while learning.\n"));
+       }
+
+       g_slist_free(msgs);
+       
+       prefs_common.immediate_exec = immediate_exec;
+
+       END_LONG_OPERATION(summaryview);
+
+       if (prefs_common.immediate_exec && moved) {
+               summary_execute(summaryview);
+       }
+
+       summary_status_show(summaryview);       
+}
+
+
 static void summary_mark_row_as_unread(SummaryView *summaryview,
                                       GtkCTreeNode *row)
 {
@@ -3277,8 +3358,8 @@ void summary_delete(SummaryView *summaryview)
 
        aval = alertpanel(_("Delete message(s)"),
                          _("Do you really want to delete selected message(s)?"),
-                         GTK_STOCK_YES, GTK_STOCK_NO, NULL);
-       if (aval != G_ALERTDEFAULT) return;
+                         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) {
@@ -3651,7 +3732,7 @@ void summary_save_as(SummaryView *summaryview)
        if (GTK_CLIST(ctree)->selection->next) {
                GList *item;
                for (item = GTK_CLIST(ctree)->selection->next; item != NULL; item=item->next) {
-                       msginfo = gtk_ctree_node_get_row_data(ctree, (GtkCTreeNode*)item->data);
+                       msginfo = gtk_ctree_node_get_row_data(ctree, GTK_CTREE_NODE(item->data));
                        if (!msginfo) break;
                        src = procmsg_get_message_file(msginfo);
                        if (append_file(src, dest, TRUE) < 0)
@@ -3671,8 +3752,10 @@ static void print_mimeview(MimeView *mimeview)
        ||  !mimeview->textview->text)
                alertpanel_warning(_("Cannot print: the message doesn't "
                                     "contain text."));
-       else
+       else {
+               gtk_widget_realize(mimeview->textview->text);
                gedit_print(GTK_TEXT_VIEW(mimeview->textview->text));
+       }
 }
 #endif
 
@@ -3752,6 +3835,8 @@ gboolean summary_execute(SummaryView *summaryview)
 
        gtk_clist_freeze(clist);
 
+       main_window_cursor_wait(summaryview->mainwin);
+
        if (summaryview->threaded)
                summary_unthread_for_exec(summaryview);
 
@@ -3820,7 +3905,9 @@ gboolean summary_execute(SummaryView *summaryview)
        gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 
        summary_unlock(summaryview);
-       
+
+       main_window_cursor_normal(summaryview->mainwin);
+
        if (move_val < 0) 
                summary_show(summaryview, summaryview->folder_item);
        return TRUE;
@@ -3842,8 +3929,9 @@ static gint summary_execute_move(SummaryView *summaryview)
                        procmsg_msginfo_free((MsgInfo *)cur->data);
                g_slist_free(summaryview->mlist);
                summaryview->mlist = NULL;
+               return val;
        }
-       return val;
+       return 0;
 }
 
 static void summary_execute_move_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -4186,6 +4274,7 @@ void summary_collapse_threads(SummaryView *summaryview)
 
 void summary_filter(SummaryView *summaryview, gboolean selected_only)
 {
+       GSList *mlist = NULL, *cur_list;
        summary_lock(summaryview);
 
        folder_item_update_freeze();
@@ -4201,15 +4290,23 @@ void summary_filter(SummaryView *summaryview, gboolean selected_only)
 
                for (cur = GTK_CLIST(summaryview->ctree)->selection;
                     cur != NULL && cur->data != NULL; cur = cur->next) {
-                       summary_filter_func(GTK_CTREE(summaryview->ctree),
-                                           GTK_CTREE_NODE(cur->data),
-                                           summaryview);
+                       mlist = g_slist_prepend(mlist, 
+                                procmsg_msginfo_new_ref(
+                                 GTKUT_CTREE_NODE_GET_ROW_DATA(cur->data)));
                }
+               mlist = g_slist_reverse(mlist);
        } else {
-               gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
-                                       GTK_CTREE_FUNC(summary_filter_func),
-                                       summaryview);
+               mlist = folder_item_get_msg_list(summaryview->folder_item);
+       }
+       for (cur_list = mlist; cur_list; cur_list = cur_list->next) {
+               summary_filter_func((MsgInfo *)cur_list->data);
+       }
+       filtering_move_and_copy_msgs(mlist);
+       for (cur_list = mlist; cur_list; cur_list = cur_list->next) {
+               procmsg_msginfo_free((MsgInfo *)cur_list->data);
        }
+       g_slist_free(mlist);
+
        gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
 
        folder_item_update_thaw();
@@ -4226,11 +4323,9 @@ void summary_filter(SummaryView *summaryview, gboolean selected_only)
        summary_show(summaryview, summaryview->folder_item);
 }
 
-static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
-                               gpointer data)
+static void summary_filter_func(MsgInfo *msginfo)
 {
        MailFilteringData mail_filtering_data;
-       MsgInfo *msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(node);
 
        mail_filtering_data.msginfo = msginfo;
        if (hooks_invoke(MAIL_MANUAL_FILTERING_HOOKLIST, &mail_filtering_data))
@@ -4385,6 +4480,7 @@ static void summary_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item
        if (!sel) return;
 
        menu = GTK_MENU_SHELL(summaryview->colorlabel_menu);
+       
        g_return_if_fail(menu != NULL);
 
        Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
@@ -4429,7 +4525,7 @@ static void summary_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item
                          GINT_TO_POINTER(0));
 }
 
-static void summary_colorlabel_menu_create(SummaryView *summaryview)
+static void summary_colorlabel_menu_create(SummaryView *summaryview, gboolean refresh)
 {
        GtkWidget *label_menuitem;
        GtkWidget *menu;
@@ -4458,13 +4554,19 @@ static void summary_colorlabel_menu_create(SummaryView *summaryview)
        g_object_set_data(G_OBJECT(item), "summaryview", summaryview);
        gtk_widget_show(item);
 
+       gtk_widget_add_accelerator(item, "activate", 
+                                  summaryview->popupfactory->accel_group, 
+                                  GDK_0, GDK_CONTROL_MASK,
+                                  GTK_ACCEL_LOCKED | GTK_ACCEL_VISIBLE);
+
        item = gtk_menu_item_new();
        gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
        gtk_widget_show(item);
 
        /* create pixmap/label menu items */
        for (i = 0; i < N_COLOR_LABELS; i++) {
-               item = colorlabel_create_check_color_menu_item(i);
+               item = colorlabel_create_check_color_menu_item(
+                       i, refresh, SUMMARY_COLORMENU);
                gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
                g_signal_connect(G_OBJECT(item), "activate",
                                 G_CALLBACK(summary_colorlabel_menu_item_activate_cb),
@@ -4542,11 +4644,6 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
        gtk_ctree_set_line_style(GTK_CTREE(ctree), GTK_CTREE_LINES_DOTTED);
        gtk_ctree_set_expander_style(GTK_CTREE(ctree),
                                     GTK_CTREE_EXPANDER_SQUARE);
-#if 0
-       gtk_ctree_set_line_style(GTK_CTREE(ctree), GTK_CTREE_LINES_NONE);
-       gtk_ctree_set_expander_style(GTK_CTREE(ctree),
-                                    GTK_CTREE_EXPANDER_TRIANGLE);
-#endif
        gtk_ctree_set_indent(GTK_CTREE(ctree), 12);
        g_object_set_data(G_OBJECT(ctree), "summaryview", (gpointer)summaryview); 
 
@@ -4610,6 +4707,18 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
                         G_CALLBACK(summary_drag_data_get),
                         summaryview);
 
+       gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL & ~GTK_DEST_DEFAULT_HIGHLIGHT,
+                         summary_drag_types, 2,
+                         GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_DEFAULT);
+
+       g_signal_connect(G_OBJECT(ctree), "drag_data_received",
+                        G_CALLBACK(summary_drag_data_received),
+                        summaryview);
+
+       g_signal_connect(G_OBJECT(ctree), "drag_motion",
+                        G_CALLBACK(summary_drag_motion_cb),
+                        summaryview);
+
        return ctree;
 }
 
@@ -4904,6 +5013,10 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
        g_return_if_fail(msginfo != NULL);
 
+       toolbar_set_learn_button
+               (summaryview->mainwin->toolbar,
+                MSG_IS_SPAM(msginfo->flags)?LEARN_HAM:LEARN_SPAM);
+
        switch (column < 0 ? column : summaryview->col_state[column].type) {
        case S_COL_MARK:
                if (!MSG_IS_DELETED(msginfo->flags) &&
@@ -4920,6 +5033,11 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                if (MSG_IS_UNREAD(msginfo->flags)) {
                        summary_mark_row_as_read(summaryview, row);
                        summary_status_show(summaryview);
+               } else if (MSG_IS_SPAM(msginfo->flags)) {
+                               if (procmsg_spam_learner_learn(msginfo, NULL, FALSE) == 0)
+                                       summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
+                               else
+                                       log_error(_("An error happened while learning.\n"));
                } else if (!MSG_IS_REPLIED(msginfo->flags) &&
                         !MSG_IS_FORWARDED(msginfo->flags)) {
                        marked_unread = TRUE;
@@ -5096,12 +5214,18 @@ static void summary_date_clicked(GtkWidget *button, SummaryView *summaryview)
 
 static void summary_from_clicked(GtkWidget *button, SummaryView *summaryview)
 {
-       summary_sort_by_column_click(summaryview, SORT_BY_FROM);
+       if (summaryview->col_state[summaryview->col_pos[S_COL_FROM]].visible)
+               summary_sort_by_column_click(summaryview, SORT_BY_FROM);
+       else
+               summary_sort_by_column_click(summaryview, SORT_BY_TO);
 }
 
 static void summary_to_clicked(GtkWidget *button, SummaryView *summaryview)
 {
-       summary_sort_by_column_click(summaryview, SORT_BY_TO);
+       if (summaryview->col_state[summaryview->col_pos[S_COL_TO]].visible)
+               summary_sort_by_column_click(summaryview, SORT_BY_TO);
+       else
+               summary_sort_by_column_click(summaryview, SORT_BY_FROM);
 }
 
 static void summary_subject_clicked(GtkWidget *button,
@@ -5156,7 +5280,24 @@ static void summary_drag_data_get(GtkWidget        *widget,
                                (ctree, GTK_CTREE_NODE(cur->data));
                        tmp2 = procmsg_get_message_file(msginfo);
                        if (!tmp2) continue;
-                       tmp1 = g_strconcat("file://", tmp2, NULL);
+                       if (msginfo->subject) {
+                               gchar *san_subject = g_strdup(msginfo->subject);
+                               gchar *dest = NULL;
+                               subst_for_filename(san_subject);
+                               dest = g_strdup_printf("%s%s%s.%d.txt",
+                                               get_tmp_dir(),
+                                               G_DIR_SEPARATOR_S,
+                                               san_subject, msginfo->msgnum);
+                               g_free(san_subject);
+                               san_subject = g_filename_from_utf8(dest, -1, NULL, NULL, NULL);
+                               g_free(dest);
+                               dest = san_subject;
+                               if (copy_file(tmp2, dest, TRUE) == 0) {
+                                       g_free(tmp2);
+                                       tmp2 = dest;
+                               }
+                       } 
+                       tmp1 = g_strconcat("file://", tmp2, "\r\n", NULL);
                        g_free(tmp2);
 
                        if (!mail_list) {
@@ -5184,6 +5325,54 @@ static void summary_drag_data_get(GtkWidget        *widget,
        }
 }
 
+static gboolean summary_drag_motion_cb(GtkWidget      *widget,
+                                         GdkDragContext *context,
+                                         gint            x,
+                                         gint            y,
+                                         guint           time,
+                                         SummaryView    *summaryview)
+{
+       FolderItem *item = summaryview->folder_item;
+       if (!(item && item->folder && folder_item_parent(item) != NULL
+                   && FOLDER_CLASS(item->folder)->add_msg != NULL)) {
+               gdk_drag_status(context, 0, time);
+               return FALSE;
+       } else if (gtk_drag_get_source_widget(context) ==
+               mainwindow_get_mainwindow()->folderview->ctree) {
+               /* no folders */
+               gdk_drag_status(context, 0, time);
+               return FALSE;
+       } else if (gtk_drag_get_source_widget(context) ==
+               summaryview->ctree) {
+               /* not from same folder */
+               gdk_drag_status(context, 0, time);
+               return FALSE;
+       } else {
+               gdk_drag_status(context, GDK_ACTION_COPY, time);
+               return TRUE;
+       }
+}
+
+static void summary_drag_data_received(GtkWidget        *widget,
+                                       GdkDragContext   *drag_context,
+                                       gint              x,
+                                       gint              y,
+                                       GtkSelectionData *data,
+                                       guint             info,
+                                       guint             time,
+                                       SummaryView       *summaryview)
+{
+       if (info == TARGET_MAIL_URI_LIST) {
+               FolderItem *item = summaryview->folder_item;
+               if (!item) {
+                       gtk_drag_finish(drag_context, FALSE, FALSE, time);                      
+                       return;
+               } else {
+                       folderview_finish_dnd(data->data, drag_context, time, item);
+               }
+       }
+}
+
 
 /* custom compare functions for sorting */
 
@@ -5448,65 +5637,6 @@ void summary_toggle_ignore_thread(SummaryView *summaryview)
                summary_ignore_thread(summaryview);
 }
 
-#if 0 /* OLD PROCESSING */
-static gboolean processing_apply_func(GNode *node, gpointer data)
-{
-       FolderItem *item;
-       GSList * processing;
-       SummaryView * summaryview = (SummaryView *) data;
-       
-       if (node == NULL)
-               return FALSE;
-
-       item = node->data;
-       /* prevent from the warning */
-       if (item->path == NULL)
-               return FALSE;
-       processing = item->prefs->processing;
-
-
-       if (processing != NULL) {
-               gchar * buf;
-               GSList * mlist;
-               GSList * cur;
-
-               buf = g_strdup_printf(_("Processing (%s)..."), item->path);
-               debug_print(buf);
-               STATUSBAR_PUSH(summaryview->mainwin, buf);
-               g_free(buf);
-
-               mlist = folder_item_get_msg_list(item);
-               for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = cur->next) {
-                       MsgInfo * msginfo;
-                       
-                       msginfo = (MsgInfo *) cur->data;
-                       filter_message_by_msginfo(processing, msginfo, NULL);
-                       procmsg_msginfo_free(msginfo);
-               }
-
-               g_slist_free(mlist);
-               
-               STATUSBAR_POP(summaryview->mainwin);
-       }
-
-
-       return FALSE;
-}
-
-void processing_apply(SummaryView * summaryview)
-{
-       GList * cur;
-
-       for (cur = folder_get_list() ; cur != NULL && cur->data != NULL ; cur = g_list_next(cur)) {
-               Folder *folder;
-
-               folder = (Folder *) cur->data;
-               g_node_traverse(folder->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
-                               processing_apply_func, summaryview);
-       }
-}
-#endif
-
 void summary_toggle_show_read_messages(SummaryView *summaryview)
 {
        FolderItemUpdateData source;
@@ -5556,6 +5686,7 @@ void summary_reflect_prefs_pixmap_theme(SummaryView *summaryview)
        stock_pixmap_gdk(ctree, STOCK_PIXMAP_KEY, &keyxpm, &keyxpmmask);
        stock_pixmap_gdk(ctree, STOCK_PIXMAP_GPG_SIGNED, &gpgsignedxpm, &gpgsignedxpmmask);
        stock_pixmap_gdk(ctree, STOCK_PIXMAP_CLIP_GPG_SIGNED, &clipgpgsignedxpm, &clipgpgsignedxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_SPAM, &spamxpm, &spamxpmmask);
 
        pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_DIR_OPEN);
        gtk_box_pack_start(GTK_BOX(summaryview->hbox), pixmap, FALSE, FALSE, 4);
@@ -5575,6 +5706,22 @@ void summary_reflect_prefs_pixmap_theme(SummaryView *summaryview)
        summary_set_column_titles(summaryview);
 }
 
+void summary_reflect_prefs_custom_colors(SummaryView *summaryview)
+{
+       GtkMenuShell *menu;
+       GList *cur;
+
+       /* re-create colorlabel submenu */
+       menu = GTK_MENU_SHELL(summaryview->colorlabel_menu);
+       g_return_if_fail(menu != NULL);
+
+       /* clear items. get item pointers. */
+       for (cur = menu->children; cur != NULL && cur->data != NULL; cur = cur->next) {
+               gtk_menu_item_remove_submenu(GTK_MENU_ITEM(cur->data));
+       }
+       summary_colorlabel_menu_create(summaryview, TRUE);
+}
+
 /*
  * Harvest addresses for selected messages in summary view.
  */
@@ -5638,15 +5785,6 @@ void summary_set_prefs_from_folderitem(SummaryView *summaryview, FolderItem *ite
        summaryview->thread_collapsed = item->thread_collapsed;
 
        /* Scoring */
-#if 0
-       if (global_scoring || item->prefs->scoring) {
-               summaryview->important_score = prefs_common.important_score;
-               if (item->prefs->important_score >
-                   summaryview->important_score)
-                       summaryview->important_score =
-                               item->prefs->important_score;
-       }
-#endif
 }
 
 void summary_save_prefs_to_folderitem(SummaryView *summaryview, FolderItem *item)