* src/summaryview.c
[claws.git] / src / summaryview.c
index ed655f1718553b654a9f709cedddcb3212a8b26f..f5fbb8ae2e3fafcdeee55e27e7cfce66f9119c42 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"
@@ -221,8 +219,8 @@ static void summary_execute_delete_func     (GtkCTree               *ctree,
                                         gpointer                data);
 
 static void summary_thread_init                (SummaryView            *summaryview);
-static void summary_ignore_thread      (SummaryView  *summaryview);
-static void summary_unignore_thread    (SummaryView *summaryview);
+static void summary_ignore_thread      (SummaryView            *summaryview);
+static void summary_unignore_thread    (SummaryView            *summaryview);
 
 static void summary_unthread_for_exec          (SummaryView    *summaryview);
 static void summary_unthread_for_exec_func     (GtkCTree       *ctree,
@@ -648,7 +646,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 +659,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 +788,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) {
@@ -1022,7 +1020,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();
@@ -1064,10 +1062,6 @@ void summary_clear_list(SummaryView *summaryview)
                summaryview->subject_table = NULL;
        }
        summaryview->mlist = NULL;
-       if (summaryview->folder_table) {
-               g_hash_table_destroy(summaryview->folder_table);
-               summaryview->folder_table = NULL;
-       }
 
        gtk_clist_clear(clist);
        if (summaryview->col_pos[S_COL_SUBJECT] == N_SUMMARY_COLS - 1) {
@@ -1799,7 +1793,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 {
@@ -2113,14 +2107,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;
 
@@ -2135,6 +2121,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
 
                g_node_destroy(root);
 
+               folder_update_items_when_required(FALSE);
+
                summary_thread_init(summaryview);
        } else {
                gchar *text[N_SUMMARY_COLS];
@@ -2285,14 +2273,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);
@@ -2333,6 +2313,7 @@ static void summary_display_msg_full(SummaryView *summaryview,
                if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
                        procmsg_msginfo_unset_flags
                                (msginfo, MSG_NEW | MSG_UNREAD, 0);
+                       folder_update_item(msginfo->folder, FALSE);
                        summary_set_row_marks(summaryview, row);
                        gtk_clist_thaw(GTK_CLIST(ctree));
                        summary_status_show(summaryview);
@@ -2455,11 +2436,11 @@ void summary_step(SummaryView *summaryview, GtkScrollType type)
 
        gtk_signal_emit_by_name(GTK_OBJECT(ctree), "scroll_vertical",
                                type, 0.0);
-       
-       if(summaryview->selected) {
-               gtk_sctree_reanchor (GTK_SCTREE(ctree), summaryview->selected);
-       }
 
+       if (GTK_CLIST(ctree)->selection)
+               gtk_sctree_set_anchor_row
+                       (GTK_SCTREE(ctree),
+                        GTK_CTREE_NODE(GTK_CLIST(ctree)->selection->data));
 
 }
 
@@ -2658,7 +2639,7 @@ static void summary_mark_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);
@@ -2688,7 +2669,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);
@@ -2739,6 +2720,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));
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -2759,6 +2741,7 @@ void summary_mark_all_read(SummaryView *summaryview)
                        summary_set_row_marks(summaryview, node);
        }
        gtk_clist_thaw(clist);
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -2795,6 +2778,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));
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -2874,7 +2858,7 @@ static void summary_delete_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_MARKED, MSG_MOVE | MSG_COPY);
@@ -3030,7 +3014,7 @@ static void summary_unmark_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_MARKED | MSG_DELETED, MSG_MOVE | MSG_COPY);
@@ -3065,7 +3049,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;
                        }
                }
@@ -3089,7 +3073,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);
                }
        }
 
@@ -3124,8 +3108,16 @@ 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 */
+               GtkCTreeNode *node = gtk_ctree_node_nth (GTK_CTREE(summaryview->ctree), 
+                                                        GTK_CLIST(summaryview->ctree)->rows - 1);
+               if (node)
+                       summary_select_node(summaryview, node, TRUE, TRUE);
+       }
+
 }
 
 void summary_move_to(SummaryView *summaryview)
@@ -3154,7 +3146,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;
                        }
                }
@@ -3178,7 +3170,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);
                }
        }
 
@@ -3213,7 +3205,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);
        }
 }
 
@@ -3440,8 +3432,6 @@ static void summary_execute_move(SummaryView *summaryview)
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GSList *cur;
 
-       summaryview->folder_table = g_hash_table_new(NULL, NULL);
-
        /* search moving messages and execute */
        gtk_ctree_pre_recursive(ctree, NULL, summary_execute_move_func,
                                summaryview);
@@ -3449,7 +3439,7 @@ static void summary_execute_move(SummaryView *summaryview)
        if (summaryview->mlist) {
                procmsg_move_messages(summaryview->mlist);
 
-               folderview_update_item_foreach(summaryview->folder_table, FALSE);
+               folder_update_items_when_required(FALSE);
 
                for (cur = summaryview->mlist; cur != NULL; cur = cur->next)
                        procmsg_msginfo_free((MsgInfo *)cur->data);
@@ -3457,9 +3447,7 @@ 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;
+       folder_update_item(summaryview->folder_item, FALSE);
 }
 
 static void summary_execute_move_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -3475,9 +3463,6 @@ static void summary_execute_move_func(GtkCTree *ctree, GtkCTreeNode *node,
                    msginfo->to_folder->op_count > 0)
                        msginfo->to_folder->op_count--;
 
-               g_hash_table_insert(summaryview->folder_table,
-                                   msginfo->to_folder, GINT_TO_POINTER(1));
-
                summaryview->mlist =
                        g_slist_append(summaryview->mlist, msginfo);
                gtk_ctree_node_set_row_data(ctree, node, NULL);
@@ -3494,8 +3479,6 @@ static void summary_execute_copy(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
 
-       summaryview->folder_table = g_hash_table_new(NULL, NULL);
-
        /* search copying messages and execute */
        gtk_ctree_pre_recursive(ctree, NULL, summary_execute_copy_func,
                                summaryview);
@@ -3503,15 +3486,11 @@ static void summary_execute_copy(SummaryView *summaryview)
        if (summaryview->mlist) {
                procmsg_copy_messages(summaryview->mlist);
 
-               /* folder_item_scan_foreach(summaryview->folder_table); */
-               folderview_update_item_foreach(summaryview->folder_table, FALSE);
+               folder_update_items_when_required(FALSE);
 
                g_slist_free(summaryview->mlist);
                summaryview->mlist = NULL;
        }
-
-       g_hash_table_destroy(summaryview->folder_table);
-       summaryview->folder_table = NULL;
 }
 
 static void summary_execute_copy_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -3527,9 +3506,6 @@ static void summary_execute_copy_func(GtkCTree *ctree, GtkCTreeNode *node,
                    msginfo->to_folder->op_count > 0)
                        msginfo->to_folder->op_count--;
 
-               g_hash_table_insert(summaryview->folder_table,
-                                   msginfo->to_folder, GINT_TO_POINTER(1));
-
                summaryview->mlist =
                        g_slist_append(summaryview->mlist, msginfo);
 
@@ -3568,9 +3544,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,
@@ -3831,7 +3807,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;
        }
@@ -3859,19 +3835,13 @@ void summary_filter(SummaryView *summaryview)
                        summary_status_show(summaryview);
        }
        else {
-               summaryview->folder_table = g_hash_table_new(NULL, NULL);
-
                gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree), NULL,
                                        GTK_CTREE_FUNC(summary_filter_func),
                                        summaryview);
 
                gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
 
-               /* folder_item_scan_foreach(summaryview->folder_table); */
-               folderview_update_item_foreach(summaryview->folder_table, FALSE);
-
-               g_hash_table_destroy(summaryview->folder_table);
-               summaryview->folder_table = NULL;
+               folder_update_items_when_required(FALSE);
        }
 
        debug_print("done.\n");
@@ -3893,21 +3863,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, summaryview->folder_table);
+       filter_message_by_msginfo(global_processing, msginfo);
 }
 
 void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
@@ -3955,14 +3912,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:
@@ -4026,10 +3977,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)
@@ -4563,7 +4511,7 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        if (!summaryview->selected) {
                node = gtk_ctree_node_nth(ctree, 0);
                if (node)
-                       gtk_ctree_select(ctree, node);
+                       gtk_sctree_select(GTK_SCTREE(ctree), node);
                else
                        return;
        }
@@ -5060,6 +5008,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);
+                               folder_update_item(msginfo->folder, FALSE);
                                procmsg_msginfo_set_flags(msginfo, mff->account->crosspost_col, 0);
                        }
                        g_hash_table_remove(mff->newsart, key);
@@ -5122,6 +5071,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);
        }
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -5153,6 +5103,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);
        }
+       folder_update_items_when_required(FALSE);
 
        summary_status_show(summaryview);
 }
@@ -5339,6 +5290,15 @@ void summary_set_prefs_from_folderitem(SummaryView *summaryview, FolderItem *ite
 
        /* Threading */
        summaryview->threaded = item->threaded;
+
+       /* Scoring */
+       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;
+       }
 }
 
 void summary_save_prefs_to_folderitem(SummaryView *summaryview, FolderItem *item)