sync with 0.7.4cvs26
[claws.git] / src / summaryview.c
index ff17523bbf9905695d8dc0c2b2f86f0780b3da72..75fc8e25d9769c396a306731531ad10eb3647984 100644 (file)
@@ -452,9 +452,11 @@ SummaryView *summary_create(void)
        GtkWidget *scrolledwin;
        GtkWidget *ctree;
        GtkWidget *hbox;
+       GtkWidget *hbox_l;
        GtkWidget *statlabel_folder;
        GtkWidget *statlabel_select;
        GtkWidget *statlabel_msgs;
+       GtkWidget *hbox_spc;
        GtkWidget *toggle_view_btn;
        GtkWidget *toggle_view_arrow;
        GtkWidget *popupmenu;
@@ -487,10 +489,13 @@ SummaryView *summary_create(void)
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
+       hbox_l = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(hbox), hbox_l, TRUE, TRUE, 0);
+
        statlabel_folder = gtk_label_new("");
-       gtk_box_pack_start(GTK_BOX(hbox), statlabel_folder, FALSE, FALSE, 2);
+       gtk_box_pack_start(GTK_BOX(hbox_l), statlabel_folder, FALSE, FALSE, 2);
        statlabel_select = gtk_label_new("");
-       gtk_box_pack_start(GTK_BOX(hbox), statlabel_select, FALSE, FALSE, 16);
+       gtk_box_pack_start(GTK_BOX(hbox_l), statlabel_select, FALSE, FALSE, 12);
 
        /* toggle view buttons */
        toggle_view_btn = gtk_button_new();
@@ -504,6 +509,9 @@ SummaryView *summary_create(void)
        statlabel_msgs = gtk_label_new("");
        gtk_box_pack_end(GTK_BOX(hbox), statlabel_msgs, FALSE, FALSE, 4);
 
+       hbox_spc = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_end(GTK_BOX(hbox), hbox_spc, FALSE, FALSE, 6);
+
        /* create popup menu */
        n_entries = sizeof(summary_popup_entries) /
                sizeof(summary_popup_entries[0]);
@@ -515,6 +523,7 @@ SummaryView *summary_create(void)
        summaryview->scrolledwin = scrolledwin;
        summaryview->ctree = ctree;
        summaryview->hbox = hbox;
+       summaryview->hbox_l = hbox_l;
        summaryview->statlabel_folder = statlabel_folder;
        summaryview->statlabel_select = statlabel_select;
        summaryview->statlabel_msgs = statlabel_msgs;
@@ -594,9 +603,9 @@ void summary_init(SummaryView *summaryview)
        gtk_widget_set_style(summaryview->statlabel_select, style);
        gtk_widget_set_style(summaryview->statlabel_msgs, style);
 
-       pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_DIR_OPEN);
-       gtk_box_pack_start(GTK_BOX(summaryview->hbox), pixmap, FALSE, FALSE, 4);
-       gtk_box_reorder_child(GTK_BOX(summaryview->hbox), pixmap, 0);
+       pixmap = stock_pixmap_widget(summaryview->hbox_l, STOCK_PIXMAP_DIR_OPEN);
+       gtk_box_pack_start(GTK_BOX(summaryview->hbox_l), pixmap, FALSE, FALSE, 4);
+       gtk_box_reorder_child(GTK_BOX(summaryview->hbox_l), pixmap, 0);
        gtk_widget_show(pixmap);
        summaryview->folder_pixmap = pixmap;
 
@@ -847,12 +856,6 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item,
 
        g_slist_free(mlist);
 
-       summaryview->folder_item->new    = summaryview->newmsgs;
-       summaryview->folder_item->unread = summaryview->unread;
-       summaryview->folder_item->total  = summaryview->messages;
-       folderview_update_msg_num(summaryview->folderview,
-                                 summaryview->folderview->opened);
-
        summary_write_cache(summaryview);
 
        gtk_signal_handler_unblock_by_data(GTK_OBJECT(ctree), summaryview);
@@ -1678,10 +1681,6 @@ static void summary_status_show(SummaryView *summaryview)
                return;
        }
 
-       summaryview->newmsgs    = summaryview->folder_item->new;
-       summaryview->unread     = summaryview->folder_item->unread;
-       summaryview->messages   = summaryview->folder_item->total;
-
        rowlist = GTK_CLIST(summaryview->ctree)->selection;
        for (cur = rowlist; cur != NULL; cur = cur->next) {
                msginfo = gtk_ctree_node_get_row_data
@@ -1691,11 +1690,16 @@ static void summary_status_show(SummaryView *summaryview)
                n_selected++;
        }
 
-       gtk_label_set(GTK_LABEL(summaryview->statlabel_folder),
-                     summaryview->folder_item &&
-                     summaryview->folder_item->folder->type == F_NEWS
-                     ? g_basename(summaryview->folder_item->path)
-                     : summaryview->folder_item->path);
+       if (summaryview->folder_item->folder->type == F_NEWS) {
+               gchar *group;
+               group = get_abbrev_newsgroup_name
+                       (g_basename(summaryview->folder_item->path));
+               gtk_label_set(GTK_LABEL(summaryview->statlabel_folder), group);
+               g_free(group);
+       } else {
+               gtk_label_set(GTK_LABEL(summaryview->statlabel_folder),
+                             summaryview->folder_item->path);
+       }
 
        if (summaryview->deleted)
                del = g_strdup_printf(_("%d deleted"), summaryview->deleted);
@@ -1755,6 +1759,13 @@ static void summary_status_show(SummaryView *summaryview)
        }
        gtk_label_set(GTK_LABEL(summaryview->statlabel_msgs), str);
        g_free(str);
+
+       summaryview->folder_item->new    = summaryview->newmsgs;
+       summaryview->folder_item->unread = summaryview->unread;
+       summaryview->folder_item->total  = summaryview->messages;
+
+       folderview_update_msg_num(summaryview->folderview,
+                                 summaryview->folderview->opened);
 }
 
 static void summary_set_column_titles(SummaryView *summaryview)
@@ -2189,6 +2200,28 @@ static void summary_write_cache_func(GtkCTree *ctree, GtkCTreeNode *node,
        procmsg_write_flags(msginfo, fps->mark_fp);
 }
 
+static gchar *summary_complete_address(const gchar *addr)
+{
+       gint count;
+       gchar *res, *tmp, *email_addr;
+
+       Xstrdup_a(email_addr, addr, return NULL);
+       extract_address(email_addr);
+       g_return_val_if_fail(*email_addr, NULL);
+
+       /*
+        * completion stuff must be already initialized
+        */
+       res = NULL;
+       if (1 < (count = complete_address(email_addr))) {
+               tmp = get_complete_address(1);
+               res = procheader_get_fromname(tmp);
+               g_free(tmp);    
+       }
+       
+       return res;
+}
+
 static void summary_set_header(SummaryView *summaryview, gchar *text[],
                               MsgInfo *msginfo)
 {
@@ -2228,34 +2261,37 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
                _("(No From)");
        if (prefs_common.swap_from && msginfo->from && msginfo->to &&
            !MSG_IS_NEWS(msginfo->flags)) {
-               gchar *from;
+               gchar *addr = NULL;
 
-               Xstrdup_a(from, msginfo->from, return);
-               extract_address(from);
-               if (account_find_from_address(from)) {
+               if (prefs_common.use_addr_book) {
+                       Xstrdup_a(addr, msginfo->from, return);
+                       extract_address(addr);
+               }
+
+               if (account_find_from_address(addr)) {
+                       addr = summary_complete_address(msginfo->to);
                        g_free(to);
-                       to = g_strconcat("-->", msginfo->to, NULL);
+                       to   = g_strconcat("-->", addr == NULL ? msginfo->to : addr, NULL);
                        text[col_pos[S_COL_FROM]] = to;
                }
        }
 
-       if ((text[col_pos[S_COL_FROM]] != to) && prefs_common.use_addr_book &&
-           msginfo->from) {
-               gint count;
+       /*
+        * CLAWS: note that the "text[col_pos[S_COL_FROM]] != to" is really a hack, 
+        * checking whether the above block (which handles the special case of
+        * the --> in sent boxes) was executed.
+        */
+       if (text[col_pos[S_COL_FROM]] != to && prefs_common.use_addr_book && msginfo->from) {
                gchar *from;
-  
-               Xstrdup_a(from, msginfo->from, return);
-               extract_address(from);
-               if (*from) {
-                       count = complete_address(from);
-                       if (count > 1) {
-                               g_free(from_name);
-                               from = get_complete_address(1);
-                               from_name = procheader_get_fromname(from);
-                               g_free(from);
-                               text[col_pos[S_COL_FROM]] = from_name;
-                       }
-               }
+               from = summary_complete_address(msginfo->from);
+               if (from) {
+                       /*
+                        * FIXME: this text[col_pos[S_COL_FROM]] should be freed
+                        * but may have been assigned _("No From"). Should be
+                        * freed??? 
+                        */
+                       text[col_pos[S_COL_FROM]] = from;
+               }       
        }
 
        if (prefs->enable_simplify_subject 
@@ -2310,16 +2346,19 @@ static void summary_display_msg_full(SummaryView *summaryview,
        }
        g_free(filename);
 
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->unread--;
-*/
-       procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
-       summary_set_row_marks(summaryview, row);
-       gtk_clist_thaw(GTK_CLIST(ctree));
-       summary_status_show(summaryview);
+       if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags) || 
+           MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+               if (MSG_IS_IMAP(msginfo->flags))
+                       imap_msg_unset_perm_flags(msginfo, MSG_NEW | MSG_UNREAD);
+               summary_set_row_marks(summaryview, row);
+               gtk_clist_thaw(GTK_CLIST(ctree));
+               summary_status_show(summaryview);
+       }
 
        flags = msginfo->flags;
 
@@ -2347,6 +2386,14 @@ static void summary_display_msg_full(SummaryView *summaryview,
                gtkut_ctree_node_move_if_on_the_edge(ctree, row);
        }
 
+       if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags) ||
+           (MSG_IS_MIME(msginfo->flags) - MSG_IS_MIME(flags) != 0)) {
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+               CHANGE_FLAGS(msginfo);
+               summary_set_row_marks(summaryview, row);
+               gtk_clist_thaw(GTK_CLIST(ctree));
+               summary_status_show(summaryview);
+       }
        summary_set_menu_sensitive(summaryview);
        main_window_set_toolbar_sensitive(summaryview->mainwin);
 
@@ -2709,8 +2756,12 @@ static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE | MSG_COPY);
-       procmsg_msginfo_set_flags(msginfo, MSG_MARKED, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_set_perm_flags(msginfo, MSG_MARKED);
+       CHANGE_FLAGS(msginfo);
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %s/%d is marked\n"), msginfo->folder->path, msginfo->msgnum);
 }
@@ -2739,8 +2790,12 @@ static void summary_lock_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE | MSG_COPY);
-       procmsg_msginfo_set_flags(msginfo, MSG_LOCKED, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_LOCKED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_set_perm_flags(msginfo, MSG_LOCKED);
+       CHANGE_FLAGS(msginfo);
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %d is locked\n"), msginfo->msgnum);
 }
@@ -2764,16 +2819,20 @@ static void summary_mark_row_as_read(SummaryView *summaryview,
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->unread--;
-*/
-       procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
-       summary_set_row_marks(summaryview, row);
-       debug_print(_("Message %d is marked as read\n"),
-               msginfo->msgnum);
+       if (MSG_IS_NEW(msginfo->flags) ||
+           MSG_IS_UNREAD(msginfo->flags)) {
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+               if (MSG_IS_IMAP(msginfo->flags))
+                       imap_msg_unset_perm_flags(msginfo, MSG_NEW | MSG_UNREAD);
+               CHANGE_FLAGS(msginfo);
+               summary_set_row_marks(summaryview, row);
+               debug_print(_("Message %d is marked as read\n"),
+                           msginfo->msgnum);
+       }
 }
 
 void summary_mark_as_read(SummaryView *summaryview)
@@ -2817,18 +2876,22 @@ static void summary_mark_row_as_unread(SummaryView *summaryview,
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
        if (MSG_IS_DELETED(msginfo->flags)) {
                msginfo->to_folder = NULL;
-               procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, 0);
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
                summaryview->deleted--;
        }
-/* NOT NEEDED ANYMORE
-       if (!MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_REPLIED | MSG_FORWARDED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_REPLIED);
+       if (!MSG_IS_UNREAD(msginfo->flags)) {
+               MSG_SET_PERM_FLAGS(msginfo->flags, MSG_UNREAD);
+               if (MSG_IS_IMAP(msginfo->flags))
+                       imap_msg_set_perm_flags(msginfo, MSG_UNREAD);
                summaryview->unread++;
-*/
+               debug_print(_("Message %d is marked as unread\n"),
+                           msginfo->msgnum);
+       }
 
-       procmsg_msginfo_unset_flags(msginfo, MSG_REPLIED | MSG_FORWARDED, 0);
-       procmsg_msginfo_set_flags(msginfo, MSG_UNREAD, 0);
-       debug_print(_("Message %d is marked as unread\n"),
-               msginfo->msgnum);
+       CHANGE_FLAGS(msginfo);
 
        summary_set_row_marks(summaryview, row);
 }
@@ -2923,8 +2986,12 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED, MSG_MOVE | MSG_COPY);
-       procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
+       CHANGE_FLAGS(msginfo);
        summaryview->deleted++;
 
        if (!prefs_common.immediate_exec && 
@@ -3050,7 +3117,11 @@ static void summary_unmark_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE | MSG_COPY);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       CHANGE_FLAGS(msginfo);
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %s/%d is unmarked\n"),
                    msginfo->folder->path, msginfo->msgnum);
@@ -3094,9 +3165,12 @@ static void summary_move_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (!prefs_common.immediate_exec)
                        msginfo->to_folder->op_count--;
        }
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_COPY);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_COPY);
        if (!MSG_IS_MOVE(msginfo->flags)) {
-               procmsg_msginfo_set_flags(msginfo, 0, MSG_MOVE);
+               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MOVE);
                summaryview->moved++;
                changed = TRUE;
        }
@@ -3183,9 +3257,12 @@ static void summary_copy_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (!prefs_common.immediate_exec)
                        msginfo->to_folder->op_count--;
        }
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE);
        if (!MSG_IS_COPY(msginfo->flags)) {
-               procmsg_msginfo_set_flags(msginfo, 0, MSG_COPY);
+               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_COPY);
                summaryview->copied++;
                changed = TRUE;
        }
@@ -3307,7 +3384,10 @@ void summary_save_as(SummaryView *summaryview)
        }
 
        src = procmsg_get_message_file(msginfo);
-       copy_file(src, dest);
+       if (copy_file(src, dest) < 0) {
+               alertpanel_error(_("Can't save the file `%s'."),
+                                g_basename(dest));
+       }
        g_free(src);
 }
 
@@ -3429,7 +3509,6 @@ static void summary_execute_move(SummaryView *summaryview)
                summaryview->mlist = NULL;
        }
 
-       folderview_update_item(summaryview->folder_item, FALSE);
        g_hash_table_destroy(summaryview->folder_table);
        summaryview->folder_table = NULL;
 }
@@ -3497,7 +3576,7 @@ static void summary_execute_copy_func(GtkCTree *ctree, GtkCTreeNode *node,
                summaryview->mlist =
                        g_slist_append(summaryview->mlist, msginfo);
 
-               procmsg_msginfo_unset_flags(msginfo, 0, MSG_COPY);
+               MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_COPY);
                summary_set_row_marks(summaryview, node);
        }
 }
@@ -3534,8 +3613,8 @@ static void summary_execute_delete(SummaryView *summaryview)
 
        if ((summaryview->folder_item != trash) && (trash != NULL)) {
                folder_item_scan(trash);
+               folderview_update_item(trash, FALSE);
        }
-       folderview_update_item(summaryview->folder_item, FALSE);
 }
 
 static void summary_execute_delete_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -3890,23 +3969,42 @@ static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
 
 void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
 {
-       static HeaderEntry hentry[] = {{"List-Id:",        NULL, FALSE},
+       static HeaderEntry hentry[] = {{"X-BeenThere:",    NULL, FALSE},
                                       {"X-ML-Name:",      NULL, FALSE},
                                       {"X-List:",         NULL, FALSE},
                                       {"X-Mailing-list:", NULL, FALSE},
+                                      {"List-Id:",        NULL, FALSE},
                                       {NULL,              NULL, FALSE}};
+
+       static gchar *header_strs[] = {"From", "from", "To", "to", "Subject", "subject"};
+
+       static gchar *hentry_strs[]   = {"X-BeenThere", "X-ML-Name", "X-List",
+                                        "X-Mailing-List", "List-Id",
+                                        "header \"X-BeenThere\"", "header \"X-ML-Name\"",
+                                        "header \"X-List\"", "header \"X-Mailing-List\"",
+                                        "header \"List-Id\""};
        enum
        {
-               H_LIST_ID        = 0,
+               H_X_BEENTHERE    = 0,
                H_X_ML_NAME      = 1,
                H_X_LIST         = 2,
-               H_X_MAILING_LIST = 3
+               H_X_MAILING_LIST = 3,
+               H_LIST_ID        = 4
+       };
+
+       enum
+       {
+               H_FROM    = 0,
+               H_TO      = 2,
+               H_SUBJECT = 4
        };
 
        MsgInfo *msginfo;
        gchar *header = NULL;
        gchar *key = NULL;
        FILE *fp;
+       int header_offset;
+       int hentry_offset;
 
        if (!summaryview->selected) return;
 
@@ -3914,6 +4012,15 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
                                              summaryview->selected);
        if (!msginfo) return;
 
+       if (global_processing) {
+               header_offset = 1;
+               hentry_offset = 5;
+       }
+       else {
+               header_offset = 0;
+               hentry_offset = 0;
+       }
+
        switch (type) {
        case FILTER_BY_NONE:
                break;
@@ -3922,50 +4029,58 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
                procheader_get_header_fields(fp, hentry);
                fclose(fp);
 
-               if (hentry[H_LIST_ID].body != NULL) {
-                       header = "List-Id";
-                       Xstrdup_a(key, hentry[H_LIST_ID].body, );
+               if (hentry[H_X_BEENTHERE].body != NULL) {
+                       header = hentry_strs[H_X_BEENTHERE + hentry_offset];
+                       Xstrdup_a(key, hentry[H_X_BEENTHERE].body, );
                } else if (hentry[H_X_ML_NAME].body != NULL) {
-                       header = "X-ML-Name";
+                       header = hentry_strs[H_X_ML_NAME + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_ML_NAME].body, );
                } else if (hentry[H_X_LIST].body != NULL) {
-                       header = "X-List";
+                       header = hentry_strs[H_X_LIST + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_LIST].body, );
                } else if (hentry[H_X_MAILING_LIST].body != NULL) {
-                       header = "X-Mailing-list";
+                       header = hentry_strs[H_X_MAILING_LIST + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_MAILING_LIST].body, );
+               } else if (hentry[H_LIST_ID].body != NULL) {
+                       header = hentry_strs[H_LIST_ID + hentry_offset];
+                       Xstrdup_a(key, hentry[H_LIST_ID].body, );
                } else if (msginfo->subject) {
-                       header = "Subject";
+                       header = header_strs[H_SUBJECT + header_offset];
                        key = msginfo->subject;
                }
 
-               g_free(hentry[H_LIST_ID].body);
-               hentry[H_LIST_ID].body = NULL;
+               g_free(hentry[H_X_BEENTHERE].body);
+               hentry[H_X_BEENTHERE].body = NULL;
                g_free(hentry[H_X_ML_NAME].body);
                hentry[H_X_ML_NAME].body = NULL;
                g_free(hentry[H_X_LIST].body);
                hentry[H_X_LIST].body = NULL;
                g_free(hentry[H_X_MAILING_LIST].body);
                hentry[H_X_MAILING_LIST].body = NULL;
+               g_free(hentry[H_LIST_ID].body);
+               hentry[H_LIST_ID].body = NULL;
 
                break;
        case FILTER_BY_FROM:
-               header = "From";
+               header = header_strs[H_FROM + header_offset];
                key = msginfo->from;
                break;
        case FILTER_BY_TO:
-               header = "To";
+               header = header_strs[H_TO + header_offset];
                key = msginfo->to;
                break;
        case FILTER_BY_SUBJECT:
-               header = "Subject";
+               header = header_strs[H_SUBJECT + header_offset];
                key = msginfo->subject;
                break;
        default:
                break;
        }
 
-       prefs_filter_open(header, key);
+       if (global_processing)
+               prefs_filtering_open(NULL, header, key);
+       else
+               prefs_filter_open(header, key);
 }
 
 void summary_reply(SummaryView *summaryview, ComposeMode mode)
@@ -4087,8 +4202,8 @@ void summary_set_colorlabel_color(GtkCTree *ctree, GtkCTreeNode *node,
        gint color_index;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, node);
-       procmsg_msginfo_unset_flags(msginfo, MSG_CLABEL_FLAG_MASK, 0);
-       procmsg_msginfo_set_flags(msginfo, MSG_COLORLABEL_TO_FLAGS(labelcolor), 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_CLABEL_FLAG_MASK);
+       MSG_SET_COLORLABEL_VALUE(msginfo->flags, labelcolor);
 
        color_index = labelcolor == 0 ? -1 : (gint)labelcolor - 1;
        ctree_style = gtk_widget_get_style(GTK_WIDGET(ctree));
@@ -4563,7 +4678,10 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        switch (column < 0 ? column : summaryview->col_state[column].type) {
        case S_COL_MARK:
                if (MSG_IS_MARKED(msginfo->flags)) {
-                       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED, 0);
+                       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
+                       if (MSG_IS_IMAP(msginfo->flags))
+                               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+                       CHANGE_FLAGS(msginfo);
                        summary_set_row_marks(summaryview, row);
                } else
                        summary_mark_row(summaryview, row);
@@ -4580,7 +4698,8 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                break;
        case S_COL_LOCKED:
                if (MSG_IS_LOCKED(msginfo->flags)) {
-                       procmsg_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
+                       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_LOCKED);
+                       CHANGE_FLAGS(msginfo);
                        summary_set_row_marks(summaryview, row);
                }
                else
@@ -4968,13 +5087,13 @@ static void summary_ignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpoin
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags))
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags))
                summaryview->unread--;
-*/
-       procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
+
+       CHANGE_FLAGS(msginfo);
 
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %d is marked as ignore thread\n"),
@@ -5000,14 +5119,14 @@ static void summary_unignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpo
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags))
                summaryview->newmsgs++;
        if (MSG_IS_UNREAD(msginfo->flags))
                summaryview->unread++;
-*/
-       procmsg_msginfo_unset_flags(msginfo, MSG_IGNORE_THREAD, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
 
+       CHANGE_FLAGS(msginfo);
+               
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %d is marked as unignore thread\n"),
            msginfo->msgnum);