[anjal] Moblin Bugzilla FIX #3745 - Support DnD of threads.



commit 9c800a75287ab06a6d359e24859eec41a16efd3c
Author: Srinivasa Ragavan <sragavan novell com>
Date:   Wed Jun 24 10:45:44 2009 +0530

    Moblin Bugzilla FIX #3745 - Support DnD of threads.

 src/mail-folder-view.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 54 insertions(+), 0 deletions(-)
---
diff --git a/src/mail-folder-view.c b/src/mail-folder-view.c
index b23ed91..e7afac2 100644
--- a/src/mail-folder-view.c
+++ b/src/mail-folder-view.c
@@ -30,6 +30,7 @@
 #include "mail/em-popup.h"
 #include "mail/mail-mt.h"
 #include "mail/mail-ops.h"
+#include "mail/em-utils.h"
 #ifdef EVOLUTION_2_26
 #include "mail/em-marshal.h"
 #else
@@ -1122,6 +1123,7 @@ mfv_tree_resize (GtkWidget *w, GtkAllocation *req, GtkTreeViewColumn *col)
 	if ((req->width - (gtk_tree_view_column_get_fixed_width(col)+66) > 10) && GTK_WIDGET_VISIBLE(shell->priv->folder_pane)) {
 		gtk_tree_view_column_set_fixed_width (col, req->width - 66);
 	}
+	g_signal_handlers_disconnect_by_func (w, mfv_tree_resize, col);
 }
 
 
@@ -1249,6 +1251,48 @@ mfv_key_pressed (GtkWidget *w, GdkEventKey *event, MailFolderView *mfv)
 	 return TRUE;
 }
 
+enum {
+	DND_X_UID_LIST,		/* x-uid-list */
+	DND_MESSAGE_RFC822,	/* message/rfc822 */
+	DND_TEXT_URI_LIST	/* text/uri-list */
+};
+
+static GtkTargetEntry ml_drag_types[] = {
+	{ (gchar *) "x-uid-list", 0, DND_X_UID_LIST },
+	{ (gchar *) "text/uri-list", 0, DND_TEXT_URI_LIST },
+};
+
+static void                
+mfv_drag_data_get (GtkWidget *widget, GdkDragContext *drag_context, GtkSelectionData *data, guint info, guint time, gpointer user_data)
+{
+	MailFolderView *mfv = (MailFolderView *)user_data;
+	GPtrArray *uids;
+	GtkTreeIter iter;
+	GtkTreeSelection *sel = gtk_tree_view_get_selection (mfv->tree);
+
+	gtk_tree_selection_get_selected (sel, NULL, &iter);
+	uids = em_tree_store_get_child_sorted_tree ((EMTreeStore *)mfv->model, &iter);
+
+	if (uids->len > 0) {
+		switch (info) {
+		case DND_X_UID_LIST:
+			em_utils_selection_set_uidlist(data, mfv->uri, uids);
+			break;
+		case DND_TEXT_URI_LIST:
+			em_utils_selection_set_urilist(data, mfv->priv->folder, uids);
+			break;
+		}
+	}
+
+	/* FIXME: Free uids*/
+}	
+
+static void
+mfv_drag_data_delete (GtkWidget *w, GdkDragContext *drag_context, gpointer data)
+{
+	g_signal_stop_emission_by_name (w, "drag-data-delete");
+}
+
 void
 mail_folder_view_construct (MailFolderView *shell)
 {
@@ -1300,6 +1344,16 @@ mail_folder_view_construct (MailFolderView *shell)
 	g_signal_connect (shell->tree, "button-press-event", G_CALLBACK(mfv_button_clicked), shell);
 	g_signal_connect (shell->tree, "key-press-event", G_CALLBACK(mfv_key_pressed), shell);
 
+	/* Setup DND */
+	gtk_drag_source_set(shell->tree, GDK_BUTTON1_MASK,
+			       ml_drag_types, sizeof(ml_drag_types)/sizeof(ml_drag_types[0]),
+			       GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_ASK);
+
+	g_signal_connect(shell->tree, "drag-data-get",
+			 G_CALLBACK(mfv_drag_data_get), shell);
+	g_signal_connect(shell->tree, "drag-data-delete",
+			 G_CALLBACK(mfv_drag_data_delete), shell);
+
 	/* Create the single column for flags  */
 	column = gtk_tree_view_column_new ();
 	gtk_tree_view_column_set_fixed_width (column, 24);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]