preventive fix (missing check) found by Alfons
[claws.git] / src / folderview.c
index e0031ecab532b2885cfd6493aaaee357e0985a41..cb042557795f291fc3d069d58ceed32001507587 100644 (file)
@@ -258,12 +258,14 @@ static void folderview_drag_data_get     (GtkWidget        *widget,
 
 void folderview_create_folder_node       (FolderView       *folderview, 
                                          FolderItem       *item);
+void folderview_update_item             (FolderItem       *item,
+                                          gboolean         update_summary,
+                                         gpointer          data);
 
 static void folderview_scoring_cb(FolderView *folderview, guint action,
                                  GtkWidget *widget);
 static void folderview_processing_cb(FolderView *folderview, guint action,
                                     GtkWidget *widget);
-
 static GtkItemFactoryEntry folderview_mbox_popup_entries[] =
 {
        {N_("/Create _new folder..."),  NULL, folderview_new_mbox_folder_cb,    0, NULL},
@@ -492,6 +494,9 @@ FolderView *folderview_create(void)
        folderview->mbox_popup   = mbox_popup;
        folderview->mbox_factory = mbox_factory;
 
+       folderview->folder_item_update_callback_id =
+               folder_item_update_callback_register(folderview_update_item, (gpointer) folderview);
+
        gtk_widget_show_all(scrolledwin);
 
        folderview_list = g_list_append(folderview_list, folderview);
@@ -813,7 +818,6 @@ void folderview_rescan_tree(Folder *folder)
        folder_scan_tree(folder);
        folder_set_ui_func(folder, NULL, NULL);
 
-       folder_write_list();
        folderview_set_all();
 
        folderview_check_new(folder);
@@ -1240,80 +1244,25 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
                folderview_update_node(folderview, node);
 }
 
-void folderview_update_item(FolderItem *item, gboolean update_summary)
+void folderview_update_item(FolderItem *item, gboolean update_summary, gpointer data)
 {
-       GList *list;
-       FolderView *folderview;
+       FolderView *folderview = (FolderView *)data;
        GtkCTree *ctree;
        GtkCTreeNode *node;
 
+       g_return_if_fail(folderview != NULL);
        g_return_if_fail(item != NULL);
 
-       for (list = folderview_list; list != NULL; list = list->next) {
-               folderview = (FolderView *)list->data;
-               ctree = GTK_CTREE(folderview->ctree);
-
-               node = gtk_ctree_find_by_row_data(ctree, NULL, item);
-               if (node) {
-                       folderview_update_node(folderview, node);
-                       if (update_summary && folderview->opened == node)
-                               summary_show(folderview->summaryview, item);
-               }
-       }
-}
+       ctree = GTK_CTREE(folderview->ctree);
 
-static void folderview_update_item_recursive (FolderItem *item, gboolean update_summary)
-{
-       GNode *node = item->folder->node;       
-       node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
-       node = node->children;
-       folderview_update_item(item, update_summary);
-       while (node != NULL) {
-               if (node && node->data) {
-                       FolderItem *next_item = (FolderItem*) node->data;
-                       folderview_update_item(next_item, update_summary);
-               }
-               node = node->next;
-       }
-}
-
-void folderview_update_items_when_required(gboolean update_summary)
-{
-       GList *list;
-       FolderView *folderview;
-       GtkCTree *ctree;
-       GtkCTreeNode *node;
-       FolderItem *item;
-
-       for (list = folderview_list; list != NULL; list = list->next) {
-               folderview = (FolderView *)list->data;
-               ctree = GTK_CTREE(folderview->ctree);
-
-               for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
-                    node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
-                       item = gtk_ctree_node_get_row_data(ctree, node);
-
-                       if (item->need_update) {
-                               folderview_update_node(folderview, node);
-                               if (update_summary && folderview->opened == node)
-                                       summary_show(folderview->summaryview, item);
-                       }
-               }
+       node = gtk_ctree_find_by_row_data(ctree, NULL, item);
+       if (node) {
+               folderview_update_node(folderview, node);
+               if (update_summary && folderview->opened == node)
+                       summary_show(folderview->summaryview, item);
        }
 }
 
-static void folderview_update_item_foreach_func(gpointer key, gpointer val,
-                                               gpointer data)
-{
-       folderview_update_item((FolderItem *)key, (gboolean)data);
-}
-
-void folderview_update_item_foreach(GHashTable *table, gboolean update_summary)
-{
-       g_hash_table_foreach(table, folderview_update_item_foreach_func,
-                            (gpointer)update_summary);
-}
-
 static gboolean folderview_gnode_func(GtkCTree *ctree, guint depth,
                                      GNode *gnode, GtkCTreeNode *cnode,
                                      gpointer data)
@@ -1683,6 +1632,7 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
        static gboolean can_select = TRUE;      /* exclusive lock */
        gboolean opened;
        FolderItem *item;
+       gchar *buf;
 
        folderview->selected = row;
 
@@ -1712,8 +1662,8 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                olditem = gtk_ctree_node_get_row_data(ctree, folderview->opened);
                if (olditem) {
                        /* will be null if we just moved the previously opened folder */
-                       folder_item_write_cache(olditem);
                        summary_save_prefs_to_folderitem(folderview->summaryview, olditem);
+                       folder_item_close(olditem);
                }
        }
 
@@ -1741,28 +1691,25 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                        gdk_pointer_ungrab(GDK_CURRENT_TIME);
        }
 
-       if(((item->folder->type == F_IMAP) && !item->no_select) || (item->folder->type == F_NEWS)) {
-               folder_item_scan(item);
-       }
+       /* Open Folder */
+       buf = g_strdup_printf(_("Opening Folder %s..."), item->path);
+       debug_print("%s\n", buf);
+       STATUSBAR_PUSH(folderview->mainwin, buf);
+       g_free(buf);
 
-       /* Processing */
-       if(item->prefs->processing != NULL) {
-               gchar *buf;
-               
-               buf = g_strdup_printf(_("Processing (%s)..."), item->path);
-               debug_print("%s\n", buf);
-               STATUSBAR_PUSH(folderview->mainwin, buf);
-               g_free(buf);
-       
-               main_window_cursor_wait(folderview->mainwin);
-       
-               folder_item_apply_processing(item);
+       main_window_cursor_wait(folderview->mainwin);
 
-               debug_print("done.\n");
-               STATUSBAR_POP(folderview->mainwin);
+       if (folder_item_open(item) != 0) {
                main_window_cursor_normal(folderview->mainwin);
-       }
-               
+               STATUSBAR_POP(folderview->mainwin);
+
+               alertpanel_error(_("Folder could not be opened."));
+
+               return;
+        }
+
+       main_window_cursor_normal(folderview->mainwin);
+
        /* Show messages */
        summary_set_prefs_from_folderitem(folderview->summaryview, item);
        opened = summary_show(folderview->summaryview, item);
@@ -1779,6 +1726,8 @@ static void folderview_selected(GtkCTree *ctree, GtkCTreeNode *row,
                        gtk_ctree_node_moveto(ctree, row, -1, 0.5, 0);
        }
 
+       STATUSBAR_POP(folderview->mainwin);
+
        folderview->open_folder = FALSE;
        can_select = TRUE;
 }
@@ -1881,7 +1830,7 @@ static void folderview_update_tree_cb(FolderView *folderview, guint action,
        if (folderview->opened) {
                item = gtk_ctree_node_get_row_data(ctree, folderview->opened);
                if (item)
-                       folderview_update_item(item, TRUE);
+                       folder_update_item(item, TRUE);
        }
 }
 
@@ -2072,8 +2021,8 @@ static void folderview_rename_folder_cb(FolderView *folderview, guint action,
        }
        g_free(new_folder);
 
-       if (FOLDER_TYPE(item->folder) == F_MH)
-               prefs_filtering_rename_path(old_path, item->path);
+       /* if (FOLDER_TYPE(item->folder) == F_MH)
+               prefs_filtering_rename_path(old_path, item->path); */
        new_id = folder_item_get_identifier(item);
        prefs_filtering_rename_path(old_id, new_id);
 
@@ -2195,10 +2144,8 @@ static void folderview_delete_folder_cb(FolderView *folderview, guint action,
                return;
        }
 
-       if (FOLDER_TYPE(item->folder) == F_MH)
-               prefs_filtering_delete_path(old_path);
-       prefs_filtering_delete_path(old_id);
-       g_free(old_id);
+       /* if (FOLDER_TYPE(item->folder) == F_MH)
+               prefs_filtering_delete_path(old_path); */
 
        if (folderview->opened == folderview->selected ||
            gtk_ctree_is_ancestor(ctree,
@@ -2210,6 +2157,10 @@ static void folderview_delete_folder_cb(FolderView *folderview, guint action,
 
        gtk_ctree_remove_node(ctree, folderview->selected);
        folder_write_list();
+
+       prefs_filtering_delete_path(old_id);
+       g_free(old_id);
+
 }
 
 static void folderview_remove_mailbox_cb(FolderView *folderview, guint action,
@@ -2669,6 +2620,7 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
                /* comes from folderview */
                char *source;
                char *buf;
+               gint status;
                GtkCTreeNode *src_node;
                FolderItem *new_item, *src_parent;
                
@@ -2683,7 +2635,7 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
                item = gtk_ctree_node_get_row_data(GTK_CTREE(widget), node);
                src_item = folder_find_item_from_path(source);
 
-               if (!src_item || src_item->stype != F_NORMAL) {
+               if (!item || !src_item || src_item->stype != F_NORMAL) {
                        gtk_drag_finish(drag_context, FALSE, FALSE, time);                      
                        return;
                }
@@ -2693,8 +2645,14 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
                buf = g_strdup_printf(_("Moving %s to %s..."), src_item->name, item->name);
                STATUSBAR_PUSH(folderview->mainwin, buf);
                g_free(buf);
+               summary_clear_all(folderview->summaryview);
+               folderview->opened = NULL;
+               folderview->selected = NULL;
+               gtk_widget_set_sensitive(folderview->ctree, FALSE);
+               inc_lock();
                main_window_cursor_wait(folderview->mainwin);
-               if ((new_item = folder_item_move_to(src_item, item)) != NULL) {
+               if ((status = folder_item_move_to(src_item, item, &new_item)) == F_MOVE_OK) {
+                       main_window_cursor_normal(folderview->mainwin);
                        gtk_drag_finish(drag_context, TRUE, TRUE, time);
                
                        if (src_node)
@@ -2702,23 +2660,32 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
                        else 
                                debug_print("can't remove src node: is null\n");
 
+                       STATUSBAR_POP(folderview->mainwin);
                        folderview_create_folder_node_recursive(folderview, new_item);
-                       folderview_update_item(src_parent, TRUE);
-                       folderview_update_item_recursive(new_item, TRUE);
-                       gtk_sctree_sort_recursive(GTK_CTREE(widget)
+                       folder_update_item(src_parent, TRUE);
+                       folder_update_item_recursive(new_item, TRUE); 
+                       folderview_sort_folders(folderview
                                gtk_ctree_find_by_row_data(GTK_CTREE(widget), 
-                                       NULL, new_item->parent));
-                       STATUSBAR_PUSH(folderview->mainwin, _("Done."));
-                       main_window_cursor_normal(folderview->mainwin);
-                       summary_clear_all(folderview->summaryview);
-                       folderview->opened = NULL;
-                       folderview->selected = NULL;
+                                       NULL, new_item->parent), new_item->folder);
                        folderview_select(folderview, new_item);
                } else {
-                       gtk_drag_finish(drag_context, FALSE, FALSE, time);
-                       STATUSBAR_PUSH(folderview->mainwin, _("Done."));
                        main_window_cursor_normal(folderview->mainwin);
-               }                       
+                       gtk_drag_finish(drag_context, FALSE, FALSE, time);
+                       STATUSBAR_POP(folderview->mainwin);
+                       switch (status) {
+                       case F_MOVE_FAILED_DEST_IS_PARENT:
+                               alertpanel_error(_("Source and destination are the same."));
+                               break;
+                       case F_MOVE_FAILED_DEST_IS_CHILD:
+                               alertpanel_error(_("Can't move a folder to one of its children."));
+                               break;
+                       default:
+                               alertpanel_error(_("Move failed!"));
+                               break;
+                       }
+               }       
+               inc_unlock();           
+               gtk_widget_set_sensitive(folderview->ctree, TRUE);
        }
 }