enable IMAP folder dnd
[claws.git] / src / folderview.c
index d78aab2bbf6680955f5714ad8c04d6b50eb86848..ede1f1a3eb6ecee4dd916935263b1c40f497525e 100644 (file)
@@ -2510,6 +2510,26 @@ static void folderview_property_cb(FolderView *folderview, guint action,
 #endif 
 }
 
+static void folderview_recollapse_nodes(FolderView *folderview, GtkCTreeNode *node)
+{
+       GSList *list = NULL;
+       GSList *done = NULL;
+       GtkCTree *ctree = GTK_CTREE(folderview->ctree);
+       
+       for (list = folderview->nodes_to_recollapse; list != NULL; list = g_slist_next(list)) {
+               if (!gtkut_ctree_node_is_parent(GTK_CTREE_NODE(list->data), node)
+               &&  list->data != node) {
+                       gtk_ctree_collapse(ctree, GTK_CTREE_NODE(list->data));
+                       done = g_slist_append(done, GTK_CTREE_NODE(list->data));
+               }
+       }
+       for (list = done; list != NULL; list = g_slist_next(list)) {
+               folderview->nodes_to_recollapse = g_slist_remove(folderview->nodes_to_recollapse, 
+                                                                list->data);
+       }
+       g_slist_free(done);
+}
+
 static gboolean folderview_drag_motion_cb(GtkWidget      *widget,
                                          GdkDragContext *context,
                                          gint            x,
@@ -2547,6 +2567,16 @@ static gboolean folderview_drag_motion_cb(GtkWidget      *widget,
                        
        }
 
+       if (acceptable || (src_item && src_item == item)) {
+               folderview_recollapse_nodes(folderview, node);
+               if (item->collapsed) {
+                       gtk_ctree_expand(GTK_CTREE(widget), node);
+                       folderview->nodes_to_recollapse = g_slist_append(
+                                                               folderview->nodes_to_recollapse,
+                                                               node);
+               }
+       }
+               
        if (acceptable) {
                gtk_signal_handler_block_by_func
                        (GTK_OBJECT(widget),
@@ -2639,7 +2669,7 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
                }
                node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
                item = gtk_ctree_node_get_row_data(GTK_CTREE(widget), node);
-               src_item = folder_find_item_from_path(source);
+               src_item = folder_find_item_from_identifier(source);
 
                if (!item || !src_item || src_item->stype != F_NORMAL) {
                        gtk_drag_finish(drag_context, FALSE, FALSE, time);                      
@@ -2693,6 +2723,7 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
                inc_unlock();           
                gtk_widget_set_sensitive(folderview->ctree, TRUE);
        }
+       folderview->nodes_to_recollapse = NULL;
 }
 
 static gint folderview_clist_compare(GtkCList *clist,
@@ -2788,6 +2819,8 @@ static void folderview_start_drag(GtkWidget *widget, gint button, GdkEvent *even
 
        list = gtk_target_list_new(folderview_drag_types, 1);
 
+       folderview->nodes_to_recollapse = NULL; /* in case the last drag has been cancelled */
+       
        context = gtk_drag_begin(widget, list,
                                 GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_DEFAULT, button, event);
        gtk_drag_set_icon_default(context);
@@ -2810,7 +2843,7 @@ static void folderview_drag_data_get(GtkWidget        *widget,
                        (GTK_CTREE(folderview->ctree), 
                         GTK_CTREE_NODE(cur->data));
                if (item) {
-                       source = g_strdup_printf ("FROM_OTHER_FOLDER%s", item->path);
+                       source = g_strdup_printf ("FROM_OTHER_FOLDER%s", folder_item_get_identifier(item));
                        gtk_selection_data_set(selection_data,
                                               selection_data->target, 8,
                                               source, strlen(source));