+ /* Drags from the header view */
+ if ((target_type == TARGET_TREE_ROW) && (source_widget != widget)) {
+
+ /* TODO: do the mail operation */
+
+ success = TRUE;
+ } else {
+ GtkTreeRowReference *source_row_reference;
+ GtkTreeIter parent_iter, iter;
+ TnyFolder *folder;
+ TnyFolderStore *parent_folder;
+ gboolean done;
+
+ /* Check if the drag is possible */
+ if (!gtk_tree_path_compare (source_row, child_dest_row))
+ goto out;
+
+ if (!gtk_tree_drag_dest_row_drop_possible (GTK_TREE_DRAG_DEST (dest_model),
+ child_dest_row,
+ selection_data))
+ goto out;
+
+ /* Do the mail operation */
+ gtk_tree_model_get_iter (source_model, &parent_iter, child_dest_row);
+ gtk_tree_model_get_iter (source_model, &iter, source_row);
+ gtk_tree_model_get (source_model, &parent_iter,
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
+ &parent_folder, -1);
+ gtk_tree_model_get (source_model, &iter,
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
+ &folder, -1);
+
+ g_signal_emit (G_OBJECT (widget), signals[FOLDER_MOVED_SIGNAL], 0,
+ folder, parent_folder, &done);
+ if (!done)
+ goto out;
+
+ /* Get a row reference to the source path because the path
+ could change after the insertion. The gtk_drag_finish() is
+ not able to delete the source because that, so we have to
+ do it manually */
+ source_row_reference = gtk_tree_row_reference_new (source_model, source_row);
+ gtk_tree_path_free (source_row);
+
+ /* Insert the dragged row as a child of the dest row */
+ gtk_tree_path_down (child_dest_row);
+ if (gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (dest_model),
+ child_dest_row,
+ selection_data)) {
+
+ source_row = gtk_tree_row_reference_get_path (source_row_reference);
+
+ success = TRUE;
+ }
+ gtk_tree_row_reference_free (source_row_reference);
+
+ if (folder)
+ g_object_unref (G_OBJECT(folder));
+ if (parent_folder)
+ g_object_unref (G_OBJECT(parent_folder));
+