0.9.4claws73
[claws.git] / src / folderview.c
index c41f12139de4a6d22e1b4fa77f27cdd6b333f3e3..6269ac12db0fb2eda5328d0c857a33118f7b2d97 100644 (file)
@@ -1852,6 +1852,8 @@ void folderview_create_folder_node(FolderView *folderview, FolderItem *item)
        GtkCTreeNode *node, *parent_node;
        
        parent_node = gtk_ctree_find_by_row_data(ctree, NULL, item->parent);
+       if (parent_node == NULL)
+               return;
 
        gtk_clist_freeze(GTK_CLIST(ctree));
 
@@ -1918,8 +1920,6 @@ static void folderview_new_folder_cb(FolderView *folderview, guint action,
        } 
        g_free(new_folder);
 
-       folderview_create_folder_node(folderview, new_item);
-
        folder_write_list();
 }
 
@@ -1954,8 +1954,6 @@ static void folderview_new_mbox_folder_cb(FolderView *folderview, guint action,
        g_free(new_folder);
        if (!new_item) return;
 
-       folderview_create_folder_node(folderview, new_item);
-
        folder_write_list();
 }
 
@@ -2128,6 +2126,14 @@ static void folderview_delete_folder_cb(FolderView *folderview, guint action,
        Xstrdup_a(old_path, item->path, return);
        old_id = folder_item_get_identifier(item);
 
+       if (folderview->opened == folderview->selected ||
+           gtk_ctree_is_ancestor(ctree,
+                                 folderview->selected,
+                                 folderview->opened)) {
+               summary_clear_all(folderview->summaryview);
+               folderview->opened = NULL;
+       }
+
        if (item->folder->klass->remove_folder(item->folder, item) < 0) {
                alertpanel_error(_("Can't remove the folder `%s'."), name);
                if (folderview->opened == folderview->selected)
@@ -2137,18 +2143,6 @@ static void folderview_delete_folder_cb(FolderView *folderview, guint action,
                return;
        }
 
-       /* if (FOLDER_TYPE(item->folder) == F_MH)
-               prefs_filtering_delete_path(old_path); */
-
-       if (folderview->opened == folderview->selected ||
-           gtk_ctree_is_ancestor(ctree,
-                                 folderview->selected,
-                                 folderview->opened)) {
-               summary_clear_all(folderview->summaryview);
-               folderview->opened = NULL;
-       }
-
-       gtk_ctree_remove_node(ctree, folderview->selected);
        folder_write_list();
 
        prefs_filtering_delete_path(old_id);
@@ -2184,10 +2178,11 @@ static void folderview_remove_mailbox_cb(FolderView *folderview, guint action,
        g_free(message);
        if (avalue != G_ALERTDEFAULT) return;
 
-       folder_destroy(item->folder);
-       summary_clear_all(folderview->summaryview);
        folderview_unselect(folderview);
+       summary_clear_all(folderview->summaryview);
        gtk_ctree_remove_node(ctree, node);
+
+       folder_destroy(item->folder);
        folder_write_list();
 }
 
@@ -2244,8 +2239,6 @@ static void folderview_new_imap_folder_cb(FolderView *folderview, guint action,
        }
        g_free(new_folder);
 
-       folderview_create_folder_node(folderview, new_item);
-
        folder_write_list();
 }
 
@@ -2574,8 +2567,6 @@ static void folderview_move_to(FolderView *folderview, FolderItem *from_folder,
                else 
                        debug_print("can't remove src node: is null\n");
 
-               folderview_create_folder_node_recursive(folderview, new_folder);
-
                folder_item_update_recursive(new_folder, F_ITEM_UPDATE_MSGCNT);
 
                folderview_sort_folders(folderview, 
@@ -2777,9 +2768,16 @@ gboolean folderview_update_folder(gpointer source, gpointer userdata)
        ctree = folderview->ctree;
        g_return_val_if_fail(ctree != NULL, FALSE);
 
-       if (hookdata->update_flags & FOLDER_TREE_CHANGED) {
+       if (hookdata->update_flags & FOLDER_NEW_FOLDERITEM)
+               folderview_create_folder_node(folderview, hookdata->item);
+       else if (hookdata->update_flags & FOLDER_REMOVE_FOLDERITEM) {
+               GtkCTreeNode *node;
+
+               node = gtk_ctree_find_by_row_data(GTK_CTREE(ctree), NULL, hookdata->item);
+               if (node != NULL)
+                       gtk_ctree_remove_node(GTK_CTREE(ctree), node);
+       } else if (hookdata->update_flags & FOLDER_TREE_CHANGED)
                folderview_set(folderview);
-       }
 
        return FALSE;
 }
@@ -2947,4 +2945,3 @@ static void folderview_drag_end_cb(GtkWidget          *widget,
        g_slist_free(folderview->nodes_to_recollapse);
        folderview->nodes_to_recollapse = NULL;
 }
-