preventive fix (missing check) found by Alfons
[claws.git] / src / folderview.c
index 69fca85201a44113f6bc1d552c418b736603025b..cb042557795f291fc3d069d58ceed32001507587 100644 (file)
@@ -1632,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;
 
@@ -1661,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);
                }
        }
 
@@ -1690,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);
@@ -1728,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;
 }
@@ -2620,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;
                
@@ -2634,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;
                }
@@ -2644,10 +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);
-               main_window_cursor_wait(folderview->mainwin);
+               summary_clear_all(folderview->summaryview);
+               folderview->opened = NULL;
+               folderview->selected = NULL;
                gtk_widget_set_sensitive(folderview->ctree, FALSE);
                inc_lock();
-               if ((new_item = folder_item_move_to(src_item, item)) != NULL) {
+               main_window_cursor_wait(folderview->mainwin);
+               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)
@@ -2655,22 +2660,29 @@ 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);
                        folder_update_item(src_parent, TRUE);
-                       folder_update_item_recursive(new_item, 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), new_item->folder);
-                       STATUSBAR_PUSH(folderview->mainwin, _("Done."));
-                       main_window_cursor_normal(folderview->mainwin);
-                       summary_clear_all(folderview->summaryview);
-                       folderview->opened = NULL;
-                       folderview->selected = NULL;
                        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);