* src/summaryview.c
[claws.git] / src / summaryview.c
index d29e39509538f0866ada061faf95ea557e5b8d54..bec3c1c9a188cb8388d958d351cafa07b68e2b72 100644 (file)
@@ -61,7 +61,6 @@
 #include "sourcewindow.h"
 #include "prefs_common.h"
 #include "prefs_summary_column.h"
-#include "prefs_filter.h"
 #include "prefs_filtering.h"
 #include "account.h"
 #include "compose.h"
@@ -72,7 +71,6 @@
 #include "alertpanel.h"
 #include "inputdialog.h"
 #include "statusbar.h"
-#include "filter.h"
 #include "folder.h"
 #include "colorlabel.h"
 #include "inc.h"
@@ -85,6 +83,9 @@
 #include "string_match.h"
 #include "toolbar.h"
 #include "news.h"
+#include "matcher.h"
+#include "matcher_parser.h"
+#include "hooks.h"
 
 #define SUMMARY_COL_MARK_WIDTH         10
 #define SUMMARY_COL_UNREAD_WIDTH       13
@@ -265,6 +266,9 @@ static void summary_key_pressed             (GtkWidget              *ctree,
 static void summary_searchbar_pressed  (GtkWidget              *ctree,
                                         GdkEventKey            *event,
                                         SummaryView            *summaryview);
+static void summary_searchbar_focus_evt        (GtkWidget              *ctree,
+                                        GdkEventFocus          *event,
+                                        SummaryView            *summaryview);
 static void summary_searchtype_changed (GtkMenuItem            *widget, 
                                         gpointer                data);
 static void summary_open_row           (GtkSCTree              *sctree,
@@ -379,6 +383,7 @@ static void news_flag_crosspost             (MsgInfo *msginfo);
 static void tog_searchbar_cb           (GtkWidget      *w,
                                         gpointer        data);
 
+static gboolean summary_update_msg     (gpointer source, gpointer data);
 
 GtkTargetEntry summary_drag_types[1] =
 {
@@ -484,7 +489,8 @@ SummaryView *summary_create(void)
        debug_print("Creating summary view...\n");
        summaryview = g_new0(SummaryView, 1);
 
-       vbox = gtk_vbox_new(FALSE, 3);
+#define SUMMARY_VBOX_SPACING 3
+       vbox = gtk_vbox_new(FALSE, SUMMARY_VBOX_SPACING);
        
        /* create status label */
        hbox = gtk_hbox_new(FALSE, 0);
@@ -560,11 +566,18 @@ SummaryView *summary_create(void)
                           GTK_SIGNAL_FUNC(summary_searchtype_changed),
                           summaryview);
        MENUITEM_ADD (search_type, menuitem, _("To"), S_SEARCH_TO);
+       gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                          GTK_SIGNAL_FUNC(summary_searchtype_changed),
+                          summaryview);
+       MENUITEM_ADD (search_type, menuitem, _("Extended"), S_SEARCH_EXTENDED);
        gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
                           GTK_SIGNAL_FUNC(summary_searchtype_changed),
                           summaryview);
 
        gtk_option_menu_set_menu(GTK_OPTION_MENU(search_type_opt), search_type);
+       
+       gtk_option_menu_set_history(GTK_OPTION_MENU(search_type_opt), prefs_common.summary_quicksearch_type);
+       
        gtk_widget_show(search_type);
        
        search_string = gtk_entry_new();
@@ -578,8 +591,16 @@ SummaryView *summary_create(void)
                           GTK_SIGNAL_FUNC(summary_searchbar_pressed),
                           summaryview);
 
+       gtk_signal_connect(GTK_OBJECT(search_string), "focus_in_event",
+                          GTK_SIGNAL_FUNC(summary_searchbar_focus_evt),
+                          summaryview);
+
+       gtk_signal_connect(GTK_OBJECT(search_string), "focus_out_event",
+                          GTK_SIGNAL_FUNC(summary_searchbar_focus_evt),
+                          summaryview);
+
        gtk_signal_connect (GTK_OBJECT(toggle_search), "toggled",
-                        GTK_SIGNAL_FUNC(tog_searchbar_cb), hbox_search);
+                        GTK_SIGNAL_FUNC(tog_searchbar_cb), summaryview);
 
        /* create popup menu */
        n_entries = sizeof(summary_popup_entries) /
@@ -606,6 +627,8 @@ SummaryView *summary_create(void)
        summaryview->search_type_opt = search_type_opt;
        summaryview->search_type = search_type;
        summaryview->search_string = search_string;
+       summaryview->msginfo_update_callback_id =
+               hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, summary_update_msg, (gpointer) summaryview);
 
        /* CLAWS: need this to get the SummaryView * from
         * the CList */
@@ -648,7 +671,7 @@ void summary_init(SummaryView *summaryview)
                small_style = gtk_style_copy
                        (gtk_widget_get_style(summaryview->ctree));
                if (!smallfont)
-                       smallfont = gdk_fontset_load(SMALL_FONT);
+                       smallfont = gtkut_font_load(SMALL_FONT);
                small_style->font = smallfont;
                small_marked_style = gtk_style_copy(small_style);
                small_marked_style->fg[GTK_STATE_NORMAL] =
@@ -661,7 +684,7 @@ void summary_init(SummaryView *summaryview)
                bold_style = gtk_style_copy
                        (gtk_widget_get_style(summaryview->ctree));
                if (!boldfont)
-                       boldfont = gdk_fontset_load(BOLD_FONT);
+                       boldfont = gtkut_font_load(BOLD_FONT);
                bold_style->font = boldfont;
                bold_marked_style = gtk_style_copy(bold_style);
                bold_marked_style->fg[GTK_STATE_NORMAL] =
@@ -790,7 +813,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                gtk_entry_set_text(GTK_ENTRY(summaryview->search_string), "");
        }
        
-       STATUSBAR_POP(summaryview->mainwin);
+       /* STATUSBAR_POP(summaryview->mainwin); */
 
        is_refresh = (item == summaryview->folder_item) ? TRUE : FALSE;
        if (is_refresh) {
@@ -912,7 +935,20 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                                   GTK_MENU(summaryview->search_type))))));
                gchar *search_string = gtk_entry_get_text(GTK_ENTRY(summaryview->search_string));
                gchar *searched_header = NULL;
+               MatcherList * tmp_list = NULL;
                
+               if (search_type == S_SEARCH_EXTENDED) {
+                       char *newstr = NULL;
+
+                       newstr = expand_search_string(search_string);
+                       if (newstr) {
+                               tmp_list = matcher_parser_get_cond(newstr);
+                               g_free(newstr);
+                       }
+                       else
+                               tmp_list = NULL;
+               }
+
                not_killed = NULL;
                for (cur = mlist ; cur != NULL ; cur = g_slist_next(cur)) {
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
@@ -927,15 +963,29 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        case S_SEARCH_TO:
                                searched_header = msginfo->to;
                                break;
+                       case S_SEARCH_EXTENDED:
+                               break;
                        default:
                                debug_print("unknown search type (%d)\n", search_type);
                                break;
                        }
-                       if (searched_header && strcasestr(searched_header, search_string) != NULL)
-                               not_killed = g_slist_append(not_killed, msginfo);
-                       else
-                               procmsg_msginfo_free(msginfo);
+                       if (search_type != S_SEARCH_EXTENDED) {
+                               if (searched_header && strcasestr(searched_header, search_string) != NULL)
+                                       not_killed = g_slist_append(not_killed, msginfo);
+                               else
+                                       procmsg_msginfo_free(msginfo);
+                       } else {
+                               if ((tmp_list != NULL) && matcherlist_match(tmp_list, msginfo))
+                                       not_killed = g_slist_append(not_killed, msginfo);
+                               else
+                                       procmsg_msginfo_free(msginfo);
+                       }
                }
+               if (search_type == S_SEARCH_EXTENDED && tmp_list != NULL) {
+                       matcherlist_free(tmp_list);
+                       tmp_list = NULL;
+               }
+
                g_slist_free(mlist);
                mlist = not_killed;
        }
@@ -1022,7 +1072,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        debug_print("\n");
        STATUSBAR_PUSH(summaryview->mainwin, _("Done."));
-
+       STATUSBAR_POP(summaryview->mainwin);
        main_window_cursor_normal(summaryview->mainwin);
        summary_unlock(summaryview);
        inc_unlock();
@@ -1725,6 +1775,10 @@ static void summary_set_marks_func(GtkCTree *ctree, GtkCTreeNode *node,
                summaryview->newmsgs++;
        if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->unread++;
+       if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
+       && procmsg_msg_has_marked_parent(msginfo))
+               summaryview->unreadmarked++;
+
        if (MSG_IS_DELETED(msginfo->flags))
                summaryview->deleted++;
 
@@ -1752,6 +1806,9 @@ static void summary_update_status(SummaryView *summaryview)
                        summaryview->newmsgs++;
                if (MSG_IS_UNREAD(msginfo->flags)&& !MSG_IS_IGNORE_THREAD(msginfo->flags))
                        summaryview->unread++;
+               if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
+               && procmsg_msg_has_marked_parent(msginfo))
+                       summaryview->unreadmarked++;
                if (MSG_IS_DELETED(msginfo->flags))
                        summaryview->deleted++;
                if (MSG_IS_MOVE(msginfo->flags))
@@ -1795,7 +1852,7 @@ static void summary_status_show(SummaryView *summaryview)
            prefs_common.ng_abbrev_len < strlen(summaryview->folder_item->path)) {
                gchar *group;
                group = get_abbrev_newsgroup_name
-                       (g_basename(summaryview->folder_item->path));
+                       (g_basename(summaryview->folder_item->path), prefs_common.ng_abbrev_len);
                gtk_label_set(GTK_LABEL(summaryview->statlabel_folder), group);
                g_free(group);
        } else {
@@ -2109,14 +2166,6 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                msginfo->threadscore = msginfo->score;
        }
 
-       if (global_scoring || summaryview->folder_item->prefs->scoring) {
-               summaryview->important_score = prefs_common.important_score;
-               if (summaryview->folder_item->prefs->important_score >
-                   summaryview->important_score)
-                       summaryview->important_score =
-                               summaryview->folder_item->prefs->important_score;
-       }
-
        if (summaryview->threaded) {
                GNode *root, *gnode;
 
@@ -2131,7 +2180,7 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
 
                g_node_destroy(root);
 
-               folderview_update_items_when_required(FALSE);
+               folder_update_items_when_required(FALSE);
 
                summary_thread_init(summaryview);
        } else {
@@ -2176,7 +2225,7 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
 
        debug_print("done.\n");
        STATUSBAR_POP(summaryview->mainwin);
-       if (debug_mode) {
+       if (debug_get_mode()) {
                debug_print("\tmsgid hash table size = %d\n",
                            g_hash_table_size(msgid_table));
                debug_print("\tsubject hash table size = %d\n",
@@ -2283,14 +2332,6 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
                        _("(No Subject)");
 }
 
-#define CHANGE_FLAGS(msginfo) \
-{ \
-if (msginfo->folder->folder->change_flags != NULL) \
-msginfo->folder->folder->change_flags(msginfo->folder->folder, \
-                                     msginfo->folder, \
-                                     msginfo); \
-}
-
 static void summary_display_msg(SummaryView *summaryview, GtkCTreeNode *row)
 {
        summary_display_msg_full(summaryview, row, FALSE, FALSE);
@@ -2328,10 +2369,13 @@ static void summary_display_msg_full(SummaryView *summaryview,
                        summaryview->newmsgs--;
                if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                        summaryview->unread--;
+               if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags) 
+               && procmsg_msg_has_marked_parent(msginfo))
+                       summaryview->unreadmarked--;
                if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
                        procmsg_msginfo_unset_flags
                                (msginfo, MSG_NEW | MSG_UNREAD, 0);
-                       folderview_update_item(msginfo->folder, FALSE);
+                       folder_update_item(msginfo->folder, FALSE);
                        summary_set_row_marks(summaryview, row);
                        gtk_clist_thaw(GTK_CLIST(ctree));
                        summary_status_show(summaryview);
@@ -2460,12 +2504,6 @@ void summary_step(SummaryView *summaryview, GtkScrollType type)
                        (GTK_SCTREE(ctree),
                         GTK_CTREE_NODE(GTK_CLIST(ctree)->selection->data));
 
-#if 0
-       if(summaryview->selected) {
-               gtk_sctree_reanchor (GTK_SCTREE(ctree), summaryview->selected);
-       }
-#endif
-
 }
 
 void summary_toggle_view(SummaryView *summaryview)
@@ -2643,6 +2681,25 @@ void summary_set_marks_selected(SummaryView *summaryview)
                summary_set_row_marks(summaryview, GTK_CTREE_NODE(cur->data));
 }
 
+static gboolean summary_update_unread_children (SummaryView *summaryview, MsgInfo *info, gboolean newly_marked)
+{
+       GSList *children = procmsg_find_children(info);
+       GSList *cur;
+       gboolean changed = FALSE;
+       for (cur = children; cur != NULL; cur = g_slist_next(cur)) {
+               MsgInfo *tmp = (MsgInfo *)cur->data;
+               if(MSG_IS_UNREAD(tmp->flags) && !MSG_IS_IGNORE_THREAD(tmp->flags)) {
+                       if(newly_marked) 
+                               summaryview->unreadmarked++;
+                       else
+                               summaryview->unreadmarked--;
+                       changed = TRUE;
+               }
+               procmsg_msginfo_free(tmp);
+       }
+       return changed;
+}
+
 static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
 {
        gboolean changed = FALSE;
@@ -2655,16 +2712,19 @@ static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
        if (MSG_IS_MOVE(msginfo->flags)) {
                summaryview->moved--;
                changed = TRUE;
+               msginfo->to_folder->op_count--;
+               if (msginfo->to_folder->op_count == 0)
+                       folder_update_item(msginfo->to_folder, FALSE);
        }
        if (MSG_IS_COPY(msginfo->flags)) {
                summaryview->copied--;
                changed = TRUE;
-       }
-       if (changed && !prefs_common.immediate_exec) {
                msginfo->to_folder->op_count--;
                if (msginfo->to_folder->op_count == 0)
-                       folderview_update_item(msginfo->to_folder, 0);
+                       folder_update_item(msginfo->to_folder, FALSE);
        }
+       changed |= summary_update_unread_children (summaryview, msginfo, TRUE);
+
        msginfo->to_folder = NULL;
        procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE | MSG_COPY);
        procmsg_msginfo_set_flags(msginfo, MSG_MARKED, 0);
@@ -2693,7 +2753,7 @@ static void summary_lock_row(SummaryView *summaryview, GtkCTreeNode *row)
        if (changed && !prefs_common.immediate_exec) {
                msginfo->to_folder->op_count--;
                if (msginfo->to_folder->op_count == 0)
-                       folderview_update_item(msginfo->to_folder, 0);
+                       folder_update_item(msginfo->to_folder, FALSE);
        }
        msginfo->to_folder = NULL;
        procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE | MSG_COPY);
@@ -2729,6 +2789,9 @@ static void summary_mark_row_as_read(SummaryView *summaryview,
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->unread--;
+       if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
+       && procmsg_msg_has_marked_parent(msginfo))
+               summaryview->unreadmarked--;
 
        procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
        summary_set_row_marks(summaryview, row);
@@ -2744,7 +2807,7 @@ void summary_mark_as_read(SummaryView *summaryview)
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
                summary_mark_row_as_read(summaryview,
                                         GTK_CTREE_NODE(cur->data));
-       folderview_update_items_when_required(FALSE);
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -2765,7 +2828,7 @@ void summary_mark_all_read(SummaryView *summaryview)
                        summary_set_row_marks(summaryview, node);
        }
        gtk_clist_thaw(clist);
-       folderview_update_items_when_required(FALSE);
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -2786,6 +2849,10 @@ static void summary_mark_row_as_unread(SummaryView *summaryview,
        if (!MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->unread++;
 
+       if (!MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)
+       && procmsg_msg_has_marked_parent(msginfo))
+               summaryview->unreadmarked++;
+
        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",
@@ -2802,7 +2869,7 @@ void summary_mark_as_unread(SummaryView *summaryview)
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
                summary_mark_row_as_unread(summaryview,
                                           GTK_CTREE_NODE(cur->data));
-       folderview_update_items_when_required(FALSE);
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -2874,16 +2941,19 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
        if (MSG_IS_MOVE(msginfo->flags)) {
                summaryview->moved--;
                changed = TRUE;
+               msginfo->to_folder->op_count--;
+               if (msginfo->to_folder->op_count == 0)
+                       folder_update_item(msginfo->to_folder, FALSE);
        }
        if (MSG_IS_COPY(msginfo->flags)) {
                summaryview->copied--;
                changed = TRUE;
-       }
-       if (changed && !prefs_common.immediate_exec) {
                msginfo->to_folder->op_count--;
                if (msginfo->to_folder->op_count == 0)
-                       folderview_update_item(msginfo->to_folder, 0);
+                       folder_update_item(msginfo->to_folder, FALSE);
        }
+       changed |= summary_update_unread_children (summaryview, msginfo, FALSE);
+
        msginfo->to_folder = NULL;
        procmsg_msginfo_unset_flags(msginfo, MSG_MARKED, MSG_MOVE | MSG_COPY);
        procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
@@ -3009,13 +3079,19 @@ static void summary_delete_duplicated_func(GtkCTree *ctree, GtkCTreeNode *node,
 {
        GtkCTreeNode *found;
        MsgInfo *msginfo = GTK_CTREE_ROW(node)->row.data;
-
+       MsgInfo *dup_msginfo;
+       
        if (!msginfo->msgid || !*msginfo->msgid) return;
 
        found = g_hash_table_lookup(summaryview->msgid_table, msginfo->msgid);
-
-       if (found && found != node)
-               summary_delete_row(summaryview, node);
+       
+       if (found && found != node) {
+               dup_msginfo = gtk_ctree_node_get_row_data(ctree, found);
+               /* prefer to delete the unread one */
+               if ((MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_UNREAD(dup_msginfo->flags))
+               ||  (MSG_IS_UNREAD(msginfo->flags) == MSG_IS_UNREAD(dup_msginfo->flags)))
+                       summary_delete_row(summaryview, node);
+       }
 }
 
 static void summary_unmark_row(SummaryView *summaryview, GtkCTreeNode *row)
@@ -3028,18 +3104,25 @@ static void summary_unmark_row(SummaryView *summaryview, GtkCTreeNode *row)
        if (MSG_IS_DELETED(msginfo->flags))
                summaryview->deleted--;
        if (MSG_IS_MOVE(msginfo->flags)) {
+               if (!prefs_common.immediate_exec) {
+                       msginfo->to_folder->op_count--;
+                       if (msginfo->to_folder->op_count == 0)
+                               folder_update_item(msginfo->to_folder, FALSE);
+               }
                summaryview->moved--;
                changed = TRUE;
        }
        if (MSG_IS_COPY(msginfo->flags)) {
+               if (!prefs_common.immediate_exec) {
+                       msginfo->to_folder->op_count--;
+                       if (msginfo->to_folder->op_count == 0)
+                               folder_update_item(msginfo->to_folder, FALSE);
+               }
                summaryview->copied--;
                changed = TRUE;
        }
-       if (changed && !prefs_common.immediate_exec) {
-               msginfo->to_folder->op_count--;
-               if (msginfo->to_folder->op_count == 0)
-                       folderview_update_item(msginfo->to_folder, 0);
-       }
+       changed |= summary_update_unread_children (summaryview, msginfo, FALSE);
+
        msginfo->to_folder = NULL;
        procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE | MSG_COPY);
        summary_set_row_marks(summaryview, row);
@@ -3073,7 +3156,7 @@ static void summary_move_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (!prefs_common.immediate_exec) {
                        msginfo->to_folder->op_count--;
                        if (msginfo->to_folder->op_count == 0) {
-                               folderview_update_item(msginfo->to_folder, 0);
+                               folder_update_item(msginfo->to_folder, FALSE);
                                changed = TRUE;
                        }
                }
@@ -3097,7 +3180,7 @@ static void summary_move_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (changed) {
                        msginfo->to_folder->op_count++;
                        if (msginfo->to_folder->op_count == 1)
-                               folderview_update_item(msginfo->to_folder, 0);
+                               folder_update_item(msginfo->to_folder, FALSE);
                }
        }
 
@@ -3132,7 +3215,7 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
        else {
                summary_status_show(summaryview);
 
-               folderview_update_item(to_folder, 0);
+               folder_update_item(to_folder, FALSE);
        }
        
        if (!summaryview->selected) { /* this was the last message */
@@ -3170,7 +3253,7 @@ static void summary_copy_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (!prefs_common.immediate_exec) {
                        msginfo->to_folder->op_count--;
                        if (msginfo->to_folder->op_count == 0) {
-                               folderview_update_item(msginfo->to_folder, 0);
+                               folder_update_item(msginfo->to_folder, FALSE);
                                changed = TRUE;
                        }
                }
@@ -3194,7 +3277,7 @@ static void summary_copy_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (changed) {
                        msginfo->to_folder->op_count++;
                        if (msginfo->to_folder->op_count == 1)
-                               folderview_update_item(msginfo->to_folder, 0);
+                               folder_update_item(msginfo->to_folder, FALSE);
                }
        }
 
@@ -3229,7 +3312,7 @@ void summary_copy_selected_to(SummaryView *summaryview, FolderItem *to_folder)
        else {
                summary_status_show(summaryview);
 
-               folderview_update_item(to_folder, 0);
+               folder_update_item(to_folder, FALSE);
        }
 }
 
@@ -3308,7 +3391,7 @@ void summary_save_as(SummaryView *summaryview)
        gchar *filename = NULL;
        gchar *src, *dest;
 
-       AlertValue aval;
+       AlertValue aval = 0;
 
        if (!summaryview->selected) return;
        msginfo = gtk_ctree_node_get_row_data(ctree, summaryview->selected);
@@ -3324,7 +3407,8 @@ void summary_save_as(SummaryView *summaryview)
                aval = alertpanel(_("Append or Overwrite"),
                                  _("Append or overwrite existing file?"),
                                  _("Append"), _("Overwrite"), _("Cancel"));
-               if (aval!=0 && aval!=1) return;
+               if (aval != 0 && aval != 1)
+                       return;
        }
 
        src = procmsg_get_message_file(msginfo);
@@ -3463,7 +3547,7 @@ static void summary_execute_move(SummaryView *summaryview)
        if (summaryview->mlist) {
                procmsg_move_messages(summaryview->mlist);
 
-               folderview_update_items_when_required(FALSE);
+               folder_update_items_when_required(FALSE);
 
                for (cur = summaryview->mlist; cur != NULL; cur = cur->next)
                        procmsg_msginfo_free((MsgInfo *)cur->data);
@@ -3471,7 +3555,7 @@ static void summary_execute_move(SummaryView *summaryview)
                summaryview->mlist = NULL;
        }
 
-       folderview_update_item(summaryview->folder_item, FALSE);
+       folder_update_item(summaryview->folder_item, FALSE);
 }
 
 static void summary_execute_move_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -3510,7 +3594,7 @@ static void summary_execute_copy(SummaryView *summaryview)
        if (summaryview->mlist) {
                procmsg_copy_messages(summaryview->mlist);
 
-               folderview_update_items_when_required(FALSE);
+               folder_update_items_when_required(FALSE);
 
                g_slist_free(summaryview->mlist);
                summaryview->mlist = NULL;
@@ -3568,9 +3652,9 @@ static void summary_execute_delete(SummaryView *summaryview)
        summaryview->mlist = NULL;
 
        if ((summaryview->folder_item != trash) && (trash != NULL)) {
-               folderview_update_item(trash, FALSE);
+               folder_update_item(trash, FALSE);
        }
-       folderview_update_item(summaryview->folder_item, FALSE);
+       folder_update_item(summaryview->folder_item, FALSE);
 }
 
 static void summary_execute_delete_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -3588,9 +3672,16 @@ static void summary_execute_delete_func(GtkCTree *ctree, GtkCTreeNode *node,
 
                if (msginfo->msgid && *msginfo->msgid &&
                    node == g_hash_table_lookup(summaryview->msgid_table,
-                                               msginfo->msgid))
+                                               msginfo->msgid)) {
                        g_hash_table_remove(summaryview->msgid_table,
                                            msginfo->msgid);
+               }                                          
+               if (msginfo->subject && *msginfo->subject && 
+                   node == g_hash_table_lookup(summaryview->subject_table,
+                                               msginfo->subject)) {
+                       g_hash_table_remove(summaryview->subject_table,
+                                           msginfo->subject);
+               }                                           
        }
 }
 
@@ -3656,6 +3747,8 @@ void summary_thread_build(SummaryView *summaryview)
                node = next;
        }
 
+       gtkut_ctree_set_focus_row(ctree, summaryview->selected);
+
        gtk_clist_thaw(GTK_CLIST(ctree));
        gtk_signal_handler_unblock_by_func(GTK_OBJECT(ctree),
                                           summary_tree_expanded, summaryview);
@@ -3831,7 +3924,7 @@ void summary_collapse_threads(SummaryView *summaryview)
 
 void summary_filter(SummaryView *summaryview)
 {
-       if (!prefs_common.fltlist && !global_processing) {
+       if (!global_processing) {
                alertpanel_error(_("No filter rules defined."));
                return;
        }
@@ -3865,7 +3958,7 @@ void summary_filter(SummaryView *summaryview)
 
                gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
 
-               folderview_update_items_when_required(FALSE);
+               folder_update_items_when_required(FALSE);
        }
 
        debug_print("done.\n");
@@ -3887,21 +3980,8 @@ static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
                                gpointer data)
 {
        MsgInfo *msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(node);
-       SummaryView *summaryview = data;
-       gchar *file;
-       FolderItem *dest;
 
-       if (global_processing == NULL) {
-               /* old filtering */
-               file = procmsg_get_message_file(msginfo);
-               dest = filter_get_dest_folder(prefs_common.fltlist, file);
-               g_free(file);
-
-               if (dest && strcmp2(dest->path, FILTER_NOT_RECEIVE) != 0 &&
-                   summaryview->folder_item != dest)
-                       summary_move_row_to(summaryview, node, dest);
-       } else 
-               filter_message_by_msginfo(global_processing, msginfo);
+       filter_message_by_msginfo(global_processing, msginfo);
 }
 
 void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
@@ -3949,14 +4029,8 @@ 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;
-       }
+       header_offset = 1;
+       hentry_offset = 5;
 
        switch (type) {
        case FILTER_BY_NONE:
@@ -4020,10 +4094,7 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
         * and have set entries. Otherwise we're hosed.  
         */
 
-       if (global_processing)
-               prefs_filtering_open(NULL, header, key);
-       else
-               prefs_filter_open(header, key);
+       prefs_filtering_open(NULL, header, key);
 }
 
 void summary_reply(SummaryView *summaryview, ComposeMode mode)
@@ -4172,8 +4243,6 @@ 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);
 
        color_index = labelcolor == 0 ? -1 : (gint)labelcolor - 1;
        ctree_style = gtk_widget_get_style(GTK_WIDGET(ctree));
@@ -4203,16 +4272,26 @@ void summary_set_colorlabel_color(GtkCTree *ctree, GtkCTreeNode *node,
        gtk_ctree_node_set_row_style(ctree, node, style);
 }
 
+static void summary_set_row_colorlable(SummaryView *summaryview, GtkCTreeNode *row, guint labelcolor)
+{
+       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       MsgInfo *msginfo;
+
+       msginfo = gtk_ctree_node_get_row_data(ctree, row);
+
+       procmsg_msginfo_unset_flags(msginfo, MSG_CLABEL_FLAG_MASK, 0);
+       procmsg_msginfo_set_flags(msginfo, MSG_COLORLABEL_TO_FLAGS(labelcolor), 0);
+}
+
 void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor,
                            GtkWidget *widget)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
-       GtkCList *clist = GTK_CLIST(summaryview->ctree);
        GList *cur;
 
-       for (cur = clist->selection; cur != NULL; cur = cur->next)
-               summary_set_colorlabel_color(ctree, GTK_CTREE_NODE(cur->data),
-                                            labelcolor);
+       for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+               summary_set_row_colorlable(summaryview,
+                                          GTK_CTREE_NODE(cur->data), labelcolor);
 }
 
 static void summary_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
@@ -4615,21 +4694,59 @@ static void summary_searchbar_pressed(GtkWidget *widget, GdkEventKey *event,
                summary_show(summaryview, summaryview->folder_item);
 }
 
+static void summary_searchbar_focus_evt(GtkWidget *widget, GdkEventFocus *event,
+                               SummaryView *summaryview)
+{
+       if (event != NULL && event->in)
+               gtk_signal_handler_block_by_func(GTK_OBJECT(summaryview->mainwin->window), 
+                                                GTK_SIGNAL_FUNC(mainwindow_key_pressed),
+                                                summaryview->mainwin);
+       else
+               gtk_signal_handler_unblock_by_func(GTK_OBJECT(summaryview->mainwin->window), 
+                                                  GTK_SIGNAL_FUNC(mainwindow_key_pressed),
+                                                  summaryview->mainwin);
+}
+
 static void summary_searchtype_changed(GtkMenuItem *widget, gpointer data)
 {
        SummaryView *sw = (SummaryView *)data;
+       prefs_common.summary_quicksearch_type = GPOINTER_TO_INT(gtk_object_get_user_data(
+                                  GTK_OBJECT(GTK_MENU_ITEM(gtk_menu_get_active(
+                                  GTK_MENU(sw->search_type))))));
+
        if (gtk_entry_get_text(GTK_ENTRY(sw->search_string)))
                summary_show(sw, sw->folder_item);
 }
 
 static void tog_searchbar_cb(GtkWidget *w, gpointer data)
 {
+       SummaryView *summaryview = (SummaryView *)data;
+       GtkWidget *hbox= summaryview->hbox_search;
+       GtkAllocation size = hbox->allocation;
+       GtkAllocation msgview_size = summaryview->messageview->vbox->allocation;
+       GtkAllocation parent_size = summaryview->vbox->allocation;
        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) {
                prefs_common.show_searchbar = TRUE;
-               gtk_widget_show(GTK_WIDGET(data));
+               gtk_widget_show(hbox);
+               if (!prefs_common.sep_msg && messageview_is_visible(summaryview->messageview)
+               &&  msgview_size.height > 1 && parent_size.height > 1) {
+                       gtk_widget_set_usize(GTK_WIDGET(summaryview->messageview->vbox),
+                                               -1,msgview_size.height - size.height - SUMMARY_VBOX_SPACING);
+                       gtk_widget_set_usize(GTK_WIDGET(summaryview->vbox),
+                                               -1,parent_size.height + size.height + SUMMARY_VBOX_SPACING);
+                       gtk_paned_set_position(GTK_PANED(summaryview->vbox->parent),-1);
+               }
        } else {
                prefs_common.show_searchbar = FALSE;
-               gtk_widget_hide(GTK_WIDGET(data));
+               gtk_widget_hide(hbox);
+               if (!prefs_common.sep_msg && messageview_is_visible(summaryview->messageview)
+               &&  msgview_size.height > 1 && parent_size.height > 1) {
+                       gtk_widget_set_usize(GTK_WIDGET(summaryview->messageview->vbox),
+                                               -1,msgview_size.height + size.height + SUMMARY_VBOX_SPACING);
+                       gtk_widget_set_usize(GTK_WIDGET(summaryview->vbox),
+                                               -1,parent_size.height - size.height - SUMMARY_VBOX_SPACING);
+                       gtk_paned_set_position(GTK_PANED(summaryview->vbox->parent),-1);
+               }
        }
 }
 
@@ -4679,8 +4796,7 @@ 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);
-                       summary_set_row_marks(summaryview, row);
+                       summary_unmark_row(summaryview, row);
                } else
                        summary_mark_row(summaryview, row);
                break;
@@ -5054,7 +5170,7 @@ static void news_flag_crosspost(MsgInfo *msginfo)
                        debug_print(" <%s>", (gchar *)value);
                        if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
                                procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
-                               folderview_update_item(msginfo->folder, FALSE);
+                               folder_update_item(msginfo->folder, FALSE);
                                procmsg_msginfo_set_flags(msginfo, mff->account->crosspost_col, 0);
                        }
                        g_hash_table_remove(mff->newsart, key);
@@ -5101,6 +5217,8 @@ static void summary_ignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpoin
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags))
                summaryview->unread--;
+       if (MSG_IS_UNREAD(msginfo->flags) && procmsg_msg_has_marked_parent(msginfo))
+               summaryview->unreadmarked--;
 
        procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
 
@@ -5117,7 +5235,7 @@ static void summary_ignore_thread(SummaryView *summaryview)
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next) {
                gtk_ctree_pre_recursive(ctree, GTK_CTREE_NODE(cur->data), GTK_CTREE_FUNC(summary_ignore_thread_func), summaryview);
        }
-       folderview_update_items_when_required(FALSE);
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -5133,6 +5251,8 @@ static void summary_unignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpo
                summaryview->newmsgs++;
        if (MSG_IS_UNREAD(msginfo->flags))
                summaryview->unread++;
+       if (MSG_IS_UNREAD(msginfo->flags) && procmsg_msg_has_marked_parent(msginfo))
+               summaryview->unreadmarked++;
 
        procmsg_msginfo_unset_flags(msginfo, MSG_IGNORE_THREAD, 0);
 
@@ -5149,7 +5269,7 @@ static void summary_unignore_thread(SummaryView *summaryview)
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next) {
                gtk_ctree_pre_recursive(ctree, GTK_CTREE_NODE(cur->data), GTK_CTREE_FUNC(summary_unignore_thread_func), summaryview);
        }
-       folderview_update_items_when_required(FALSE);
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -5336,6 +5456,15 @@ void summary_set_prefs_from_folderitem(SummaryView *summaryview, FolderItem *ite
 
        /* Threading */
        summaryview->threaded = item->threaded;
+
+       /* Scoring */
+       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;
+       }
 }
 
 void summary_save_prefs_to_folderitem(SummaryView *summaryview, FolderItem *item)
@@ -5348,6 +5477,22 @@ void summary_save_prefs_to_folderitem(SummaryView *summaryview, FolderItem *item
        item->threaded = summaryview->threaded;
 }
 
+static gboolean summary_update_msg(gpointer source, gpointer data) {
+       MsgInfoUpdate *msginfo_update = (MsgInfoUpdate *) source;
+       SummaryView *summaryview = (SummaryView *)data;
+       GtkCTreeNode *node;
+
+       g_return_val_if_fail(msginfo_update != NULL, TRUE);
+       g_return_val_if_fail(summaryview != NULL, FALSE);
+
+       node = gtk_ctree_find_by_row_data(GTK_CTREE(summaryview->ctree), NULL, msginfo_update->msginfo);
+       
+       if (node) 
+               summary_set_row_marks(summaryview, node);
+
+       return FALSE;
+}
+
 /*
  * End of Source.
  */