2005-10-25 [wwp] 1.9.15cvs102
[claws.git] / src / folderview.c
index 6658267055b9fb45543772dc1a47c1442edd06f4..0fb729e689c68aeaeee354863c7f356f9e854b4b 100644 (file)
@@ -895,7 +895,7 @@ void folderview_append_item(FolderItem *item)
                                gtk_clist_freeze(GTK_CLIST(ctree));
 
                                text[col_pos[F_COL_FOLDER]] = item->name;
-                               child = gtk_ctree_insert_node
+                               child = gtk_sctree_insert_node
                                        (ctree, node, NULL, text,
                                         FOLDER_SPACING,
                                         folderxpm, folderxpmmask,
@@ -947,29 +947,6 @@ static void folderview_scan_tree_func(Folder *folder, FolderItem *item,
        }
 }
 
-static GtkWidget *label_window_create(const gchar *str)
-{
-       GtkWidget *window;
-       GtkWidget *label;
-
-       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-       gtk_widget_set_size_request(window, 380, 60);
-       gtk_container_set_border_width(GTK_CONTAINER(window), 8);
-       gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
-       gtk_window_set_title(GTK_WINDOW(window), str);
-       gtk_window_set_modal(GTK_WINDOW(window), TRUE);
-       gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
-       manage_window_set_transient(GTK_WINDOW(window));
-
-       label = gtk_label_new(str);
-       gtk_container_add(GTK_CONTAINER(window), label);
-       gtk_widget_show(label);
-
-       gtk_widget_show_now(window);
-
-       return window;
-}
-
 void folderview_rescan_tree(Folder *folder, gboolean rebuild)
 {
        GtkWidget *window;
@@ -1019,7 +996,7 @@ gint folderview_check_new(Folder *folder)
        GtkCTreeNode *node;
        gint new_msgs = 0;
        gint former_new_msgs = 0;
-       gint former_new = 0;
+       gint former_new = 0, former_unread = 0, former_total;
 
        for (list = folderview_list; list != NULL; list = list->next) {
                folderview = (FolderView *)list->data;
@@ -1038,7 +1015,9 @@ gint folderview_check_new(Folder *folder)
                        if (!item->prefs->newmailcheck) continue;
 
                        folderview_scan_tree_func(item->folder, item, NULL);
-                       former_new = item->new_msgs;
+                       former_new    = item->new_msgs;
+                       former_unread = item->unread_msgs;
+                       former_total  = item->total_msgs;
 
                        if (folder_item_scan(item) < 0) {
                                summaryview_unlock(folderview->summaryview, item);
@@ -1046,7 +1025,11 @@ gint folderview_check_new(Folder *folder)
                                        break;
                        }
 
-                       folderview_update_node(folderview, node);
+                       if (former_new    != item->new_msgs ||
+                           former_unread != item->unread_msgs ||
+                           former_total  != item->total_msgs)
+                               folderview_update_node(folderview, node);
+
                        new_msgs += item->new_msgs;
                        former_new_msgs += former_new;
                }
@@ -1210,6 +1193,43 @@ static gboolean folderview_have_matching_children(FolderView *folderview,
        return folderview_have_matching_children_sub(folderview, item, FALSE);
 }
 
+static gboolean folderview_have_marked_children_sub(FolderView *folderview,
+                                                   FolderItem *item,
+                                                   gboolean in_sub)
+{
+       GNode *node = NULL;
+       
+       if (!item || !item->folder || !item->folder->node)
+               return FALSE;
+               
+       node = item->folder->node;
+       
+       node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
+       node = node->children;
+
+       if (item->marked_msgs != 0) {
+               return TRUE;
+       }
+
+       while (node != NULL) {
+               if (node && node->data) {
+                       FolderItem *next_item = (FolderItem*) node->data;
+                       node = node->next;
+                       if (folderview_have_marked_children_sub(folderview,
+                                                               next_item, TRUE))
+                               return TRUE;
+               }
+       }
+
+       return FALSE;
+}
+
+static gboolean folderview_have_marked_children(FolderView *folderview,
+                                            FolderItem *item)
+{
+       return folderview_have_marked_children_sub(folderview, item, FALSE);
+}
+
 static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
 {
        GtkCTree *ctree = GTK_CTREE(folderview->ctree);
@@ -1232,7 +1252,10 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
        item = gtk_ctree_node_get_row_data(ctree, node);
        g_return_if_fail(item != NULL);
 
-       mark = (item->marked_msgs != 0);
+       if (!GTK_CTREE_ROW(node)->expanded)
+               mark = folderview_have_marked_children(folderview, item);
+       else
+               mark = (item->marked_msgs != 0);
 
        stype = item->stype;
        if (stype == F_NORMAL) {
@@ -1348,7 +1371,7 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
            prefs_common.display_folder_unread) {
                str = g_strdup_printf("%s (%d%s)", name, item->total_msgs,
                                      add_unread_mark ? "+" : "");
-               gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
+               gtk_sctree_set_node_info(ctree, node, str, FOLDER_SPACING,
                                        xpm, mask, openxpm, openmask,
                                        FALSE, GTK_CTREE_ROW(node)->expanded);
                g_free(str);
@@ -1362,7 +1385,7 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
                                              item->unreadmarked_msgs > 0 ? "!":"");
                else
                        str = g_strdup_printf("%s (+)", name);
-               gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
+               gtk_sctree_set_node_info(ctree, node, str, FOLDER_SPACING,
                                        xpm, mask, openxpm, openmask,
                                        FALSE, GTK_CTREE_ROW(node)->expanded);
                g_free(str);
@@ -1370,7 +1393,7 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
                str = g_strdup_printf("%s%s", name, 
                                      item->unreadmarked_msgs > 0 ? " (!)":"");
        
-               gtk_ctree_set_node_info(ctree, node, str, FOLDER_SPACING,
+               gtk_sctree_set_node_info(ctree, node, str, FOLDER_SPACING,
                                        xpm, mask, openxpm, openmask,
                                        FALSE, GTK_CTREE_ROW(node)->expanded);
                g_free(str);
@@ -1792,58 +1815,6 @@ static gboolean folderview_key_pressed(GtkWidget *widget, GdkEventKey *event,
        return FALSE;
 }
 
-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;
-       
-       if (!folderview || !folderview->opened) {
-               debug_print("opened NULL\n");
-               return FALSE;
-       }
-       item = gtk_ctree_node_get_row_data(
-               GTK_CTREE(folderview->ctree), 
-               folderview->opened);
-       
-       if (!item)
-               return FALSE;
-
-       folderview_process_open(folderview, item);
-       
-       return FALSE;   
-}
-#endif
-
 static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                                gint column, FolderView *folderview)
 {
@@ -1931,8 +1902,6 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                return;
         }
        
-       folderview_process_open(folderview, item);
-
        main_window_cursor_normal(folderview->mainwin);
 
        /* Show messages */
@@ -2031,7 +2000,7 @@ void folderview_create_folder_node(FolderView *folderview, FolderItem *item)
        gtk_clist_freeze(GTK_CLIST(ctree));
 
        text[col_pos[F_COL_FOLDER]] = item->name;
-       node = gtk_ctree_insert_node(ctree, parent_node, NULL, text,
+       node = gtk_sctree_insert_node(ctree, parent_node, NULL, text,
                                     FOLDER_SPACING,
                                     folderxpm, folderxpmmask,
                                     folderopenxpm, folderopenxpmmask,
@@ -2268,13 +2237,18 @@ void folderview_set_target_folder_color(gint color_op)
        }
 }
 
+static gchar *last_font = NULL;
 void folderview_reflect_prefs_pixmap_theme(FolderView *folderview)
 {
+       /* force reinit */
+       if (last_font) 
+               g_free(last_font);
+       last_font = NULL;
+       
 }
 
 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);
@@ -2304,8 +2278,13 @@ void folderview_reflect_prefs(void)
                (G_OBJECT(folderview->ctree),
                 G_CALLBACK(folderview_selected), folderview);
 
-       if (item)
+       if (item) {
+               GtkCTreeNode *node = gtk_ctree_find_by_row_data(
+                       GTK_CTREE(folderview->ctree), NULL, item);
+
                folderview_select(folderview, item);
+               folderview->selected = node;
+       }
 
        g_signal_handlers_unblock_by_func
                (G_OBJECT(folderview->ctree),