speed improvements
[claws.git] / src / summaryview.c
index 9b505bc70cc5c6e9e5ba7429ac8738d4cb12d290..eb6be15a66c877493e5651d4176eea4252129aed 100644 (file)
@@ -87,6 +87,7 @@
 #include "matcher_parser.h"
 #include "hooks.h"
 #include "description_window.h"
+#include "folder.h"
 
 #define SUMMARY_COL_MARK_WIDTH         10
 #define SUMMARY_COL_STATUS_WIDTH       13
@@ -307,7 +308,7 @@ static void summary_create_filter_cb        (SummaryView            *summaryview,
 
 static void summary_mark_clicked       (GtkWidget              *button,
                                         SummaryView            *summaryview);
-static void summary_unread_clicked     (GtkWidget              *button,
+static void summary_status_clicked     (GtkWidget              *button,
                                         SummaryView            *summaryview);
 static void summary_mime_clicked       (GtkWidget              *button,
                                         SummaryView            *summaryview);
@@ -992,7 +993,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                             || MSG_IS_LOCKED(msginfo->flags)
                             || CURRENTLY_DISPLAYED(msginfo))
                             && !MSG_IS_IGNORE_THREAD(msginfo->flags))
-                           not_killed = g_slist_append(not_killed, msginfo);
+                           not_killed = g_slist_prepend(not_killed, msginfo);
                        else
                                procmsg_msginfo_free(msginfo);
                }
@@ -1045,12 +1046,12 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        }
                        if (search_type != S_SEARCH_EXTENDED) {
                                if (searched_header && strcasestr(searched_header, search_string) != NULL)
-                                       not_killed = g_slist_append(not_killed, msginfo);
+                                       not_killed = g_slist_prepend(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);
+                                       not_killed = g_slist_prepend(not_killed, msginfo);
                                else
                                        procmsg_msginfo_free(msginfo);
                        }
@@ -1076,7 +1077,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
 
                        if (msginfo->score > kill_score)
-                               not_killed = g_slist_append(not_killed, msginfo);
+                               not_killed = g_slist_prepend(not_killed, msginfo);
                        else
                                procmsg_msginfo_free(msginfo);
                }
@@ -1642,7 +1643,7 @@ static GtkCTreeNode *summary_find_prev_msg(SummaryView *summaryview,
 
        for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
-               if (!MSG_IS_DELETED(msginfo->flags)) break;
+               if (msginfo && !MSG_IS_DELETED(msginfo->flags)) break;
        }
 
        return node;
@@ -1662,7 +1663,7 @@ static GtkCTreeNode *summary_find_next_msg(SummaryView *summaryview,
 
        for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
-               if (!MSG_IS_DELETED(msginfo->flags)) break;
+               if (msginfo && !MSG_IS_DELETED(msginfo->flags)) break;
        }
 
        return node;
@@ -1687,7 +1688,7 @@ static GtkCTreeNode *summary_find_prev_flagged_msg(SummaryView *summaryview,
 
        for (; node != NULL; node = GTK_CTREE_NODE_PREV(node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
-               if ((msginfo->flags.perm_flags & flags) != 0) break;
+               if (msginfo && (msginfo->flags.perm_flags & flags) != 0) break;
        }
 
        return node;
@@ -1715,7 +1716,7 @@ static GtkCTreeNode *summary_find_next_flagged_msg(SummaryView *summaryview,
                /* 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->flags.perm_flags & flags) != 0))
+                       (msginfo && (msginfo->flags.perm_flags & flags) != 0))
                        break;
        }
 
@@ -1733,7 +1734,7 @@ static GtkCTreeNode *summary_find_msg_by_msgnum(SummaryView *summaryview,
 
        for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
                msginfo = gtk_ctree_node_get_row_data(ctree, node);
-               if (msginfo->msgnum == msgnum) break;
+               if (msginfo && msginfo->msgnum == msgnum) break;
        }
 
        return node;
@@ -1919,8 +1920,12 @@ static void summary_status_show(SummaryView *summaryview)
                msginfo = gtk_ctree_node_get_row_data
                        (GTK_CTREE(summaryview->ctree),
                         GTK_CTREE_NODE(cur->data));
-               sel_size += msginfo->size;
-               n_selected++;
+               if (!msginfo)
+                       g_warning("summary_status_show(): msginfo == NULL\n");
+               else {
+                       sel_size += msginfo->size;
+                       n_selected++;
+               }
        }
 
        if (summaryview->folder_item->folder->type == F_NEWS) {
@@ -2259,7 +2264,6 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
        } else {
                gchar *text[N_SUMMARY_COLS];
 
-               mlist = g_slist_reverse(mlist);
                for (; mlist != NULL; mlist = mlist->next) {
                        msginfo = (MsgInfo *)mlist->data;
 
@@ -2279,7 +2283,6 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                                             msginfo->subject,
                                             node);
                }
-               mlist = g_slist_reverse(mlist);
        }
 
        if (prefs_common.enable_hscrollbar &&
@@ -2841,10 +2844,12 @@ void summary_mark_as_read(SummaryView *summaryview)
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GList *cur;
 
+       folder_item_update_freeze();
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
                summary_mark_row_as_read(summaryview,
                                         GTK_CTREE_NODE(cur->data));
-
+       folder_item_update_thaw();
+       
        summary_status_show(summaryview);
 }
 
@@ -2855,6 +2860,7 @@ void summary_mark_all_read(SummaryView *summaryview)
        GtkCTreeNode *node;
 
        gtk_clist_freeze(clist);
+       folder_item_update_freeze();
        for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list); node != NULL;
             node = gtkut_ctree_node_next(ctree, node))
                summary_mark_row_as_read(summaryview, node);
@@ -2864,6 +2870,7 @@ void summary_mark_all_read(SummaryView *summaryview)
                        summary_set_row_marks(summaryview, node);
        }
        gtk_clist_thaw(clist);
+       folder_item_update_thaw();
 
        summary_status_show(summaryview);
 }
@@ -2901,10 +2908,12 @@ void summary_mark_as_unread(SummaryView *summaryview)
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GList *cur;
 
+       folder_item_update_freeze();
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
                summary_mark_row_as_unread(summaryview,
                                           GTK_CTREE_NODE(cur->data));
-
+       folder_item_update_thaw();
+       
        summary_status_show(summaryview);
 }
 
@@ -3453,6 +3462,7 @@ gboolean summary_execute(SummaryView *summaryview)
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GtkCList *clist = GTK_CLIST(summaryview->ctree);
        GtkCTreeNode *node, *next;
+       GtkCTreeNode *new_selected = NULL;
 
        if (!summaryview->folder_item) return FALSE;
 
@@ -3471,19 +3481,36 @@ gboolean summary_execute(SummaryView *summaryview)
        folder_item_update_thaw();
 
        node = GTK_CTREE_NODE(clist->row_list);
-       while (node != NULL) {
+       for (; node != NULL; node = next) {
                next = gtkut_ctree_node_next(ctree, node);
-               if (gtk_ctree_node_get_row_data(ctree, node) == NULL) {
-                       if (node == summaryview->displayed) {
-                               messageview_clear(summaryview->messageview);
-                               summaryview->displayed = NULL;
-                       }
-                       if (GTK_CTREE_ROW(node)->children != NULL)
-                               g_warning("summary_execute(): children != NULL\n");
-                       else
-                               gtk_ctree_remove_node(ctree, node);
+               if (gtk_ctree_node_get_row_data(ctree, node) != NULL) continue;
+
+               if (node == summaryview->displayed) {
+                       messageview_clear(summaryview->messageview);
+                       summaryview->displayed = NULL;
                }
-               node = next;
+               if (GTK_CTREE_ROW(node)->children != NULL) {
+                       g_warning("summary_execute(): children != NULL\n");
+                       continue;
+               }
+
+               if (!new_selected &&
+                   gtkut_ctree_node_is_selected(ctree, node)) {
+                       gtk_sctree_unselect_all(GTK_SCTREE(ctree));
+                       new_selected = summary_find_next_msg(summaryview, node);
+                       if (!new_selected)
+                               new_selected = summary_find_prev_msg
+                                       (summaryview, node);
+               }
+
+               gtk_ctree_remove_node(ctree, node);
+       }
+
+       if (new_selected) {
+               gtk_sctree_select
+                       (GTK_SCTREE(ctree),
+                        summaryview->displayed ? summaryview->displayed
+                        : new_selected);
        }
 
        if (summaryview->threaded)
@@ -4142,7 +4169,7 @@ void summary_reply(SummaryView *summaryview, ComposeMode mode)
                }
                break;
        case COMPOSE_FORWARD_INLINE:
-               if (!sel->next) {
+               if (sel && !sel->next) {
                        compose_forward(NULL, msginfo, FALSE, text);
                        break;
                }
@@ -4446,7 +4473,7 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
                 summaryview)
 
        CLIST_BUTTON_SIGNAL_CONNECT(S_COL_MARK   , summary_mark_clicked);
-       CLIST_BUTTON_SIGNAL_CONNECT(S_COL_STATUS , summary_unread_clicked);
+       CLIST_BUTTON_SIGNAL_CONNECT(S_COL_STATUS , summary_status_clicked);
        CLIST_BUTTON_SIGNAL_CONNECT(S_COL_MIME   , summary_mime_clicked);
        CLIST_BUTTON_SIGNAL_CONNECT(S_COL_NUMBER , summary_num_clicked);
        CLIST_BUTTON_SIGNAL_CONNECT(S_COL_SIZE   , summary_size_clicked);
@@ -4748,7 +4775,7 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        summary_status_show(summaryview);
 
        if (GTK_CLIST(ctree)->selection &&
-            GTK_CLIST(ctree)->selection->next) {
+           GTK_CLIST(ctree)->selection->next) {
                summaryview->display_msg = FALSE;
                summary_set_menu_sensitive(summaryview);
                toolbar_main_set_sensitive(summaryview->mainwin);
@@ -4758,6 +4785,7 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        summaryview->selected = row;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
+       g_return_if_fail(msginfo != NULL);
 
        switch (column < 0 ? column : summaryview->col_state[column].type) {
        case S_COL_MARK:
@@ -4857,7 +4885,7 @@ static void summary_mark_clicked(GtkWidget *button, SummaryView *summaryview)
        summary_sort_by_column_click(summaryview, SORT_BY_MARK);
 }
 
-static void summary_unread_clicked(GtkWidget *button, SummaryView *summaryview)
+static void summary_status_clicked(GtkWidget *button, SummaryView *summaryview)
 {
        summary_sort_by_column_click(summaryview, SORT_BY_STATUS);
 }