2006-10-04 [colin] 2.5.2cvs42
[claws.git] / src / summaryview.c
index 7135d3f106d0be10592cb501bec99ab1ed01e932..9c4d4548d22add50fee172176f6f1652f129dbd9 100644 (file)
@@ -493,12 +493,38 @@ static const gchar *const col_label[N_SUMMARY_COLS] = {
        "",             /* S_COL_LOCKED  */
 };
 
+void summary_freeze(SummaryView *summaryview)
+{
+       if (summaryview)
+               gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
+}
+
+void summary_thaw(SummaryView *summaryview)
+{
+       if (summaryview)
+               gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+}
+
+void summary_grab_focus(SummaryView *summaryview)
+{
+       if (summaryview)
+               gtk_widget_grab_focus(summaryview->ctree);
+}
+
+GtkWidget *summary_get_main_widget(SummaryView *summaryview)
+{
+       if (summaryview)
+               return summaryview->ctree;
+       else
+               return NULL;
+}
+
 #define START_LONG_OPERATION(summaryview,force_freeze) {       \
        summary_lock(summaryview);                              \
        main_window_cursor_wait(summaryview->mainwin);          \
        if (force_freeze || sc_g_list_bigger(GTK_CLIST(summaryview->ctree)->selection, 1)) {\
                froze = TRUE;                                           \
-               gtk_clist_freeze(GTK_CLIST(summaryview->ctree));        \
+               summary_freeze(summaryview);    \
        }                                                       \
        folder_item_update_freeze();                            \
        inc_lock();                                             \
@@ -509,7 +535,7 @@ static const gchar *const col_label[N_SUMMARY_COLS] = {
        inc_unlock();                                           \
        folder_item_update_thaw();                              \
        if (froze)                                              \
-               gtk_clist_thaw(GTK_CLIST(summaryview->ctree));  \
+               summary_thaw(summaryview);      \
        main_window_cursor_normal(summaryview->mainwin);        \
        summary_unlock(summaryview);                            \
        summaryview->msginfo_update_callback_id =               \
@@ -954,7 +980,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        folder_update_op_count();
        }
        
-       gtk_clist_freeze(GTK_CLIST(ctree));
+       summary_freeze(summaryview);
 
        summary_clear_list(summaryview);
 
@@ -969,7 +995,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                summary_set_hide_read_msgs_menu(summaryview, FALSE);
                summary_clear_all(summaryview);
                summaryview->folder_item = item;
-               gtk_clist_thaw(GTK_CLIST(ctree));
+               summary_thaw(summaryview);
                summary_unlock(summaryview);
                inc_unlock();
                if (item && quicksearch_is_running(summaryview->quicksearch)) {
@@ -1041,33 +1067,37 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        if (quicksearch_is_active(summaryview->quicksearch)) {
                GSList *not_killed;
+               gint interval = quicksearch_is_fast(summaryview->quicksearch) ? 1000:100;
                START_TIMING("quicksearch");
                gint num = 0, total = summaryview->folder_item->total_msgs;
                statusbar_print_all(_("Searching in %s... \n"), 
                        summaryview->folder_item->path ? 
                        summaryview->folder_item->path : "(null)");
                not_killed = NULL;
+               folder_item_update_freeze();
                for (cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
 
-                       statusbar_progress_all(num++,total, 50);
+                       statusbar_progress_all(num++,total, interval);
 
                        if (!msginfo->hidden && quicksearch_match(summaryview->quicksearch, msginfo))
                                not_killed = g_slist_prepend(not_killed, msginfo);
                        else
                                procmsg_msginfo_free(msginfo);
-                       GTK_EVENTS_FLUSH();
+                       if (num % interval == 0)
+                               GTK_EVENTS_FLUSH();
                        if (!quicksearch_is_active(summaryview->quicksearch)) {
                                break;
                        }
                }
+               folder_item_update_thaw();
                statusbar_progress_all(0,0,0);
                statusbar_pop_all();
                
                hidden_removed = TRUE;
                if (!quicksearch_is_active(summaryview->quicksearch)) {
                        debug_print("search cancelled!\n");
-                       gtk_clist_thaw(GTK_CLIST(ctree));
+                       summary_thaw(summaryview);
                        STATUSBAR_POP(summaryview->mainwin);
                        main_window_cursor_normal(summaryview->mainwin);
                        summary_unlock(summaryview);
@@ -1219,7 +1249,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
        summary_set_menu_sensitive(summaryview);
        toolbar_main_set_sensitive(summaryview->mainwin);
        
-       gtk_clist_thaw(GTK_CLIST(ctree));
+       summary_thaw(summaryview);
        debug_print("\n");
        STATUSBAR_PUSH(summaryview->mainwin, _("Done."));
        STATUSBAR_POP(summaryview->mainwin);
@@ -1238,7 +1268,7 @@ void summary_clear_list(SummaryView *summaryview)
        GtkCList *clist = GTK_CLIST(summaryview->ctree);
        gint optimal_width;
 
-       gtk_clist_freeze(clist);
+       summary_freeze(summaryview);
 
        gtk_ctree_pre_recursive(GTK_CTREE(summaryview->ctree),
                                NULL, summary_free_msginfo_func, NULL);
@@ -1274,7 +1304,7 @@ void summary_clear_list(SummaryView *summaryview)
                         optimal_width);
        }
 
-       gtk_clist_thaw(clist);
+       summary_thaw(summaryview);
 }
 
 void summary_clear_all(SummaryView *summaryview)
@@ -2053,7 +2083,7 @@ void summary_attract_by_subject(SummaryView *summaryview)
                       _("Attracting messages by subject..."));
 
        main_window_cursor_wait(summaryview->mainwin);
-       gtk_clist_freeze(clist);
+       summary_freeze(summaryview);
 
        subject_table = g_hash_table_new(attract_hash_func,
                                         attract_compare_func);
@@ -2092,7 +2122,7 @@ void summary_attract_by_subject(SummaryView *summaryview)
 
        gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 
-       gtk_clist_thaw(clist);
+       summary_thaw(summaryview);
 
        debug_print("done.\n");
        STATUSBAR_POP(summaryview->mainwin);
@@ -2399,7 +2429,7 @@ void summary_sort(SummaryView *summaryview,
        START_TIMING("");
        g_signal_handlers_block_by_func(G_OBJECT(summaryview->ctree),
                                       G_CALLBACK(summary_tree_expanded), summaryview);
-       gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
+       summary_freeze(summaryview);
 
        switch (sort_key) {
        case SORT_BY_MARK:
@@ -2463,7 +2493,6 @@ void summary_sort(SummaryView *summaryview,
 
                main_window_cursor_wait(summaryview->mainwin);
 
-                gtk_clist_freeze(clist);
                gtk_clist_set_compare_func(clist, cmp_func);
 
                gtk_clist_set_sort_type(clist, (GtkSortType)sort_type);
@@ -2472,13 +2501,12 @@ void summary_sort(SummaryView *summaryview,
                gtk_ctree_node_moveto(ctree, summaryview->selected, 0, 0.5, 0);
 
                main_window_cursor_normal(summaryview->mainwin);
-                gtk_clist_thaw(clist);
 
                debug_print("done.\n");
                STATUSBAR_POP(summaryview->mainwin);
        }
 unlock:
-       gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+       summary_thaw(summaryview);
        g_signal_handlers_unblock_by_func(G_OBJECT(summaryview->ctree),
                                       G_CALLBACK(summary_tree_expanded), summaryview);
        END_TIMING();
@@ -2534,7 +2562,7 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
        MsgInfo *msginfo;
        GtkCTreeNode *node = NULL;
        GHashTable *msgid_table;
-       GHashTable *subject_table;
+       GHashTable *subject_table = NULL;
        GSList * cur;
        START_TIMING("");
        
@@ -2550,8 +2578,13 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
 
        msgid_table = g_hash_table_new(g_str_hash, g_str_equal);
        summaryview->msgid_table = msgid_table;
-       subject_table = g_hash_table_new(g_str_hash, g_str_equal);
-       summaryview->subject_table = subject_table;
+
+       if (prefs_common.thread_by_subject) {
+               subject_table = g_hash_table_new(g_str_hash, g_str_equal);
+               summaryview->subject_table = subject_table;
+       } else {
+               summaryview->subject_table = NULL;
+       }
 
        if (prefs_common.use_addr_book)
                start_address_completion(NULL);
@@ -2592,7 +2625,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                                g_hash_table_insert(msgid_table,
                                                    msginfo->msgid, node);
 
-                       subject_table_insert(subject_table,
+                       if (prefs_common.thread_by_subject)
+                               subject_table_insert(subject_table,
                                             msginfo->subject,
                                             node);
                }
@@ -2619,7 +2653,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
        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",
+               if (prefs_common.thread_by_subject)
+                       debug_print("\tsubject hash table size = %d\n",
                            g_hash_table_size(subject_table));
        }
 
@@ -3616,7 +3651,6 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
 void summary_cancel(SummaryView *summaryview)
 {
        MsgInfo * msginfo;
-       GtkCList *clist = GTK_CLIST(summaryview->ctree);
 
        msginfo = gtk_ctree_node_get_row_data(GTK_CTREE(summaryview->ctree),
                                              summaryview->selected);
@@ -3631,12 +3665,12 @@ void summary_cancel(SummaryView *summaryview)
 
        summary_lock(summaryview);
 
-       gtk_clist_freeze(clist);
+       summary_freeze(summaryview);
 
        summary_update_status(summaryview);
        summary_status_show(summaryview);
 
-       gtk_clist_thaw(clist);
+       summary_thaw(summaryview);
 
        summary_unlock(summaryview);
 }
@@ -4037,10 +4071,10 @@ void summary_save_as(SummaryView *summaryview)
 
        if ( aval==0 ) { /* append */
                if (append_file(src, dest, TRUE) < 0) 
-                       alertpanel_error(_("Can't save the file '%s'."), tmp);
+                       alertpanel_error(_("Couldn't save the file '%s'."), tmp);
        } else { /* overwrite */
                if (copy_file(src, dest, TRUE) < 0)
-                       alertpanel_error(_("Can't save the file '%s'."), tmp);
+                       alertpanel_error(_("Couldn't save the file '%s'."), tmp);
        }
        g_free(src);
        
@@ -4055,7 +4089,7 @@ void summary_save_as(SummaryView *summaryview)
                        if (!msginfo) break;
                        src = procmsg_get_message_file(msginfo);
                        if (append_file(src, dest, TRUE) < 0)
-                               alertpanel_error(_("Can't save the file '%s'."), tmp);
+                               alertpanel_error(_("Couldn't save the file '%s'."), tmp);
                }
                g_free(src);
        }
@@ -4124,7 +4158,7 @@ gboolean summary_execute(SummaryView *summaryview)
        if (summary_is_locked(summaryview)) return FALSE;
        summary_lock(summaryview);
 
-       gtk_clist_freeze(clist);
+       summary_freeze(summaryview);
 
        main_window_cursor_wait(summaryview->mainwin);
 
@@ -4186,7 +4220,7 @@ gboolean summary_execute(SummaryView *summaryview)
                summary_thread_init(summaryview);
        }
 
-       gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+       summary_thaw(summaryview);
 
        summaryview->selected = clist->selection ?
                GTK_CTREE_NODE(clist->selection->data) : NULL;
@@ -4256,7 +4290,8 @@ static void summary_execute_move_func(GtkCTree *ctree, GtkCTreeNode *node,
                                                msginfo->msgid))
                        g_hash_table_remove(summaryview->msgid_table,
                                            msginfo->msgid);
-               if (msginfo->subject && *msginfo->subject && 
+               if (prefs_common.thread_by_subject &&
+                   msginfo->subject && *msginfo->subject && 
                    node == subject_table_lookup(summaryview->subject_table,
                                                 msginfo->subject)) {
                        subject_table_remove(summaryview->subject_table,
@@ -4350,7 +4385,8 @@ static void summary_execute_delete_func(GtkCTree *ctree, GtkCTreeNode *node,
                        g_hash_table_remove(summaryview->msgid_table,
                                            msginfo->msgid);
                }       
-               if (msginfo->subject && *msginfo->subject && 
+               if (prefs_common.thread_by_subject &&
+                   msginfo->subject && *msginfo->subject && 
                    node == subject_table_lookup(summaryview->subject_table,
                                                 msginfo->subject)) {
                        subject_table_remove(summaryview->subject_table,
@@ -4378,7 +4414,7 @@ void summary_thread_build(SummaryView *summaryview)
 
        g_signal_handlers_block_by_func(G_OBJECT(ctree),
                                       G_CALLBACK(summary_tree_expanded), summaryview);
-       gtk_clist_freeze(GTK_CLIST(ctree));
+       summary_freeze(summaryview);
 
        node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
        while (node) {
@@ -4417,7 +4453,7 @@ void summary_thread_build(SummaryView *summaryview)
 
        gtkut_ctree_set_focus_row(ctree, summaryview->selected);
 
-       gtk_clist_thaw(GTK_CLIST(ctree));
+       summary_thaw(summaryview);
        g_signal_handlers_unblock_by_func(G_OBJECT(ctree),
                                         G_CALLBACK(summary_tree_expanded), summaryview);
 
@@ -4531,7 +4567,7 @@ void summary_expand_threads(SummaryView *summaryview)
 
        g_signal_handlers_block_by_func(G_OBJECT(ctree),
                                       G_CALLBACK(summary_tree_expanded), summaryview);
-       gtk_clist_freeze(GTK_CLIST(ctree));
+       summary_freeze(summaryview);
 
        while (node) {
                if (GTK_CTREE_ROW(node)->children) {
@@ -4541,7 +4577,7 @@ void summary_expand_threads(SummaryView *summaryview)
                node = GTK_CTREE_NODE_NEXT(node);
        }
 
-       gtk_clist_thaw(GTK_CLIST(ctree));
+       summary_thaw(summaryview);
        g_signal_handlers_unblock_by_func(G_OBJECT(ctree),
                                         G_CALLBACK(summary_tree_expanded), summaryview);
 
@@ -4555,7 +4591,7 @@ void summary_collapse_threads(SummaryView *summaryview)
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GtkCTreeNode *node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
 
-       gtk_clist_freeze(GTK_CLIST(ctree));
+       summary_freeze(summaryview);
 
        while (node) {
                if (GTK_CTREE_ROW(node)->children)
@@ -4563,7 +4599,7 @@ void summary_collapse_threads(SummaryView *summaryview)
                node = GTK_CTREE_ROW(node)->sibling;
        }
 
-       gtk_clist_thaw(GTK_CLIST(ctree));
+       summary_thaw(summaryview);
        
        summaryview->thread_collapsed = TRUE;
 
@@ -4598,7 +4634,7 @@ gboolean summary_filter_get_mode(void)
                                                        _("Apply these rules regardless of the account they belong to"));
        account_rules_user_current = gtk_radio_button_new_with_label_from_widget
                                                        (GTK_RADIO_BUTTON(account_rules_skip),
-                                                       _("Use current account for these rules"));
+                                                       _("Apply these rules if they apply to the current account"));
        gtk_box_pack_start (GTK_BOX (vbox), account_rules_skip, FALSE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (vbox), account_rules_force, FALSE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (vbox), account_rules_user_current, FALSE, FALSE, 0);
@@ -4660,7 +4696,7 @@ void summary_filter(SummaryView *summaryview, gboolean selected_only)
        STATUSBAR_PUSH(summaryview->mainwin, _("Filtering..."));
        main_window_cursor_wait(summaryview->mainwin);
 
-       gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
+       summary_freeze(summaryview);
 
        if (selected_only) {
                GList *cur;
@@ -4684,7 +4720,7 @@ void summary_filter(SummaryView *summaryview, gboolean selected_only)
        }
        g_slist_free(mlist);
 
-       gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+       summary_thaw(summaryview);
 
        folder_item_update_thaw();
        debug_print("done.\n");
@@ -5297,7 +5333,7 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                                g_list_length(GTK_CLIST(ctree)->row_list)-1);
                        if (next) {
                                gtk_sctree_select_with_state
-                                       (GTK_SCTREE(ctree), next, event->state);
+                                       (GTK_SCTREE(ctree), next, (event->state & ~GDK_CONTROL_MASK) );
 
                                /* Deprecated - what are the non-deprecated equivalents? */
                                if (gtk_ctree_node_is_visible(GTK_CTREE(ctree), next) != GTK_VISIBILITY_FULL)
@@ -5611,7 +5647,7 @@ static void summary_sort_by_column_click(SummaryView *summaryview,
 
        node = GTK_CTREE_NODE(GTK_CLIST(summaryview->ctree)->row_list);
 
-       gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
+       summary_freeze(summaryview);
        if (prefs_common.bold_unread) {
                while (node) {
                        GtkCTreeNode *next = GTK_CTREE_NODE_NEXT(node);
@@ -5620,7 +5656,7 @@ static void summary_sort_by_column_click(SummaryView *summaryview,
                        node = next;
                }
        }
-       gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+       summary_thaw(summaryview);
        END_TIMING();
 }
 
@@ -6180,6 +6216,8 @@ static regex_t *summary_compile_simplify_regexp(gchar *simplify_subject_regexp)
 
 void summary_set_prefs_from_folderitem(SummaryView *summaryview, FolderItem *item)
 {
+       FolderSortKey sort_key;
+       FolderSortType sort_type;
        g_return_if_fail(summaryview != NULL);
        g_return_if_fail(item != NULL);
 
@@ -6194,9 +6232,13 @@ void summary_set_prefs_from_folderitem(SummaryView *summaryview, FolderItem *ite
                summaryview->simplify_subject_preg = summary_compile_simplify_regexp(item->prefs->simplify_subject_regexp);
 
        /* Sorting */
-       summaryview->sort_key = item->sort_key;
-       summaryview->sort_type = item->sort_type;
-
+       if (folder_get_sort_type(item->folder, &sort_key, &sort_type)) {
+               summaryview->sort_key = sort_key;
+               summaryview->sort_type = sort_type;
+       } else {
+               summaryview->sort_key = item->sort_key;
+               summaryview->sort_type = item->sort_type;
+       }
        /* Threading */
        summaryview->threaded = item->threaded;
        summaryview->thread_collapsed = item->thread_collapsed;