2005-10-13 [colin] 1.9.15cvs36
[claws.git] / src / folderview.c
index 8b8fd5a02a64458838a024bc9161d44e7e7a0f2a..6658267055b9fb45543772dc1a47c1442edd06f4 100644 (file)
@@ -64,6 +64,7 @@
 #include "folderutils.h"
 #include "partial_download.h"
 #include "prefs_folder_column.h"
+#include "filtering.h"
 
 #define COL_FOLDER_WIDTH       150
 #define COL_NUM_WIDTH          32
@@ -702,11 +703,25 @@ static void mark_all_read_cb(FolderView *folderview, guint action,
                              GtkWidget *widget)
 {
        FolderItem *item;
-
+       AlertValue val;
+       
        item = folderview_get_selected_item(folderview);
        if (item == NULL)
                return;
 
+       if (prefs_common.ask_mark_all_read) {
+               val = alertpanel_full(_("Mark all as read"),
+                       _("Do you really want to mark all mails in this "
+                         "folder as read ?"), GTK_STOCK_YES, GTK_STOCK_NO, NULL,
+                         TRUE, NULL, ALERT_QUESTION, G_ALERTDEFAULT);
+
+               if (val == G_ALERTALTERNATE ||
+                   val == (G_ALERTALTERNATE|G_ALERTDISABLE))
+                       return;
+               else if (val == (G_ALERTDEFAULT|G_ALERTDISABLE)) 
+                       prefs_common.ask_mark_all_read = FALSE;
+       }
+       
        summary_lock(folderview->summaryview);
        folder_item_update_freeze();
        if (folderview->summaryview->folder_item == item)
@@ -955,7 +970,7 @@ static GtkWidget *label_window_create(const gchar *str)
        return window;
 }
 
-void folderview_rescan_tree(Folder *folder)
+void folderview_rescan_tree(Folder *folder, gboolean rebuild)
 {
        GtkWidget *window;
 
@@ -963,11 +978,24 @@ void folderview_rescan_tree(Folder *folder)
 
        if (!folder->klass->scan_tree) return;
 
+       if (rebuild && 
+           alertpanel_full(_("Rebuild folder tree"), 
+                        _("Rebuilding the folder tree will remove "
+                          "local caches. Do you want to continue?"),
+                        GTK_STOCK_YES, GTK_STOCK_NO, NULL, FALSE,
+                        NULL, ALERT_WARNING, G_ALERTALTERNATE) 
+               != G_ALERTDEFAULT) {
+               return;
+       }
+
        inc_lock();
-       window = label_window_create(_("Rebuilding folder tree..."));
+       if (rebuild)
+               window = label_window_create(_("Rebuilding folder tree..."));
+       else 
+               window = label_window_create(_("Scanning folder tree..."));
 
        folder_set_ui_func(folder, folderview_scan_tree_func, NULL);
-       folder_scan_tree(folder);
+       folder_scan_tree(folder, rebuild);
        folder_set_ui_func(folder, NULL, NULL);
 
        folderview_set_all();
@@ -999,7 +1027,6 @@ gint folderview_check_new(Folder *folder)
 
                inc_lock();
                main_window_lock(folderview->mainwin);
-               gtk_widget_set_sensitive(folderview->ctree, FALSE);
 
                for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
                     node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
@@ -1024,7 +1051,6 @@ gint folderview_check_new(Folder *folder)
                        former_new_msgs += former_new;
                }
 
-               gtk_widget_set_sensitive(folderview->ctree, TRUE);
                main_window_unlock(folderview->mainwin);
                inc_unlock();
        }
@@ -1766,7 +1792,37 @@ static gboolean folderview_key_pressed(GtkWidget *widget, GdkEventKey *event,
        return FALSE;
 }
 
-gboolean folderview_process_open(gpointer data)
+static void summary_freeze_for_proc(gpointer data)
+{
+       FolderView *folderview = (FolderView *)data;
+       debug_print("freezing during processing...\n");
+       gtk_clist_freeze(GTK_CLIST(folderview->summaryview->ctree));
+}
+
+static void summary_thaw_for_proc(gpointer data)
+{
+       FolderView *folderview = (FolderView *)data;
+       debug_print("thawing after processing\n");
+       gtk_clist_thaw(GTK_CLIST(folderview->summaryview->ctree));
+}
+
+void folderview_process_open(FolderView *folderview, FolderItem *item)
+{
+       if (!item)
+               return;
+
+       folder_item_update_freeze();
+       folder_item_process_open(item, 
+               summary_freeze_for_proc,
+               summary_thaw_for_proc,
+               folderview);
+       folder_item_update_thaw();
+       
+       return; 
+}
+
+#if 0
+gboolean folderview_process_open_cb(gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
        FolderItem *item = NULL;
@@ -1782,12 +1838,11 @@ gboolean folderview_process_open(gpointer data)
        if (!item)
                return FALSE;
 
-       folder_item_update_freeze();
-       folder_item_process_open(item);
-       folder_item_update_thaw();
+       folderview_process_open(folderview, item);
        
        return FALSE;   
 }
+#endif
 
 static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                                gint column, FolderView *folderview)
@@ -1876,6 +1931,7 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                return;
         }
        
+       folderview_process_open(folderview, item);
 
        main_window_cursor_normal(folderview->mainwin);
 
@@ -1895,8 +1951,6 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                        gtk_ctree_node_moveto(ctree, row, -1, 0.5, 0);
        }
 
-       g_timeout_add(0, folderview_process_open, folderview);
-
        STATUSBAR_POP(folderview->mainwin);
 
        folderview->open_folder = FALSE;
@@ -2220,16 +2274,47 @@ void folderview_reflect_prefs_pixmap_theme(FolderView *folderview)
 
 void folderview_reflect_prefs(void)
 {
+       static gchar *last_font = NULL;
+       gboolean update_font = TRUE;
        FolderView *folderview = mainwindow_get_mainwindow()->folderview;
-       FolderItem *item = folderview_get_selected_item(folderview);    
-       normal_style = normal_color_style = bold_style = 
-               bold_color_style = bold_tgtfold_style = NULL;
+       FolderItem *item = folderview_get_selected_item(folderview);
+       GtkAdjustment *pos = gtk_scrolled_window_get_vadjustment(
+                               GTK_SCROLLED_WINDOW(folderview->scrolledwin));
+       gint height = pos->value;
 
-       folderview_init(folderview);
+       if (last_font && !strcmp(last_font, NORMAL_FONT))
+               update_font = FALSE;
+
+       if (last_font)
+               g_free(last_font);
+       
+       last_font = g_strdup(NORMAL_FONT);
+
+       if (update_font) {              
+               normal_style = normal_color_style = bold_style = 
+                       bold_color_style = bold_tgtfold_style = NULL;
+
+               folderview_init(folderview);
+       }
+       gtk_clist_freeze(GTK_CLIST(folderview->ctree));
        folderview_column_set_titles(folderview);
        folderview_set_all();
+
+       g_signal_handlers_block_by_func
+               (G_OBJECT(folderview->ctree),
+                G_CALLBACK(folderview_selected), folderview);
+
        if (item)
                folderview_select(folderview, item);
+
+       g_signal_handlers_unblock_by_func
+               (G_OBJECT(folderview->ctree),
+                G_CALLBACK(folderview_selected), folderview);
+
+       pos = gtk_scrolled_window_get_vadjustment(
+                               GTK_SCROLLED_WINDOW(folderview->scrolledwin));
+       gtk_adjustment_set_value(pos, height);
+       gtk_clist_thaw(GTK_CLIST(folderview->ctree));
 }
 
 static void drag_state_stop(FolderView *folderview)