[evolution] Bug 331305 - Can't drag email addresses to Contact List Editor



commit 0fbc7299d9f5c3ef7a27775e2a6414a3eb5253b7
Author: Matthew Barnes <mbarnes redhat com>
Date:   Wed Jun 23 08:25:17 2010 -0400

    Bug 331305 - Can't drag email addresses to Contact List Editor

 addressbook/gui/contact-list-editor/Makefile.am    |    6 +-
 .../gui/contact-list-editor/contact-list-editor.ui |    2 -
 .../contact-list-editor/e-contact-list-editor.c    |   88 ++++++++------------
 3 files changed, 40 insertions(+), 56 deletions(-)
---
diff --git a/addressbook/gui/contact-list-editor/Makefile.am b/addressbook/gui/contact-list-editor/Makefile.am
index 28015df..657bbf1 100644
--- a/addressbook/gui/contact-list-editor/Makefile.am
+++ b/addressbook/gui/contact-list-editor/Makefile.am
@@ -11,7 +11,8 @@ libecontactlisteditor_la_CPPFLAGS =			\
 	-DEVOLUTION_UIDIR=\""$(uidir)"\"		\
 	-DG_LOG_DOMAIN=\"contact-list-editor\"		\
 	$(GNOME_PLATFORM_CFLAGS)			\
-	$(EVOLUTION_ADDRESSBOOK_CFLAGS)
+	$(EVOLUTION_ADDRESSBOOK_CFLAGS)			\
+	$(CAMEL_CFLAGS)
 
 libecontactlisteditor_la_SOURCES = 		\
 	e-contact-list-editor.c			\
@@ -29,7 +30,8 @@ libecontactlisteditor_la_LIBADD =				\
 	$(top_builddir)/e-util/libeutil.la			\
 	$(top_builddir)/shell/libeshell.la			\
 	$(EVOLUTION_ADDRESSBOOK_LIBS)				\
-	$(GNOME_PLATFORM_LIBS)
+	$(GNOME_PLATFORM_LIBS)					\
+	$(CAMEL_LIBS)
 
 ui_DATA  = contact-list-editor.ui
 
diff --git a/addressbook/gui/contact-list-editor/contact-list-editor.ui b/addressbook/gui/contact-list-editor/contact-list-editor.ui
index 0c1e21c..956bd50 100644
--- a/addressbook/gui/contact-list-editor/contact-list-editor.ui
+++ b/addressbook/gui/contact-list-editor/contact-list-editor.ui
@@ -172,10 +172,8 @@
                                 <property name="visible">True</property>
                                 <property name="headers_visible">False</property>
                                 <property name="search_column">0</property>
-                                <signal handler="contact_list_editor_drag_motion_cb" name="drag_motion"/>
                                 <signal handler="contact_list_editor_tree_view_key_press_event_cb" name="key_press_event"/>
                                 <signal handler="contact_list_editor_drag_data_received_cb" name="drag_data_received"/>
-                                <signal handler="contact_list_editor_drag_drop_cb" name="drag_drop"/>
                               </object>
                             </child>
                           </object>
diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.c b/addressbook/gui/contact-list-editor/e-contact-list-editor.c
index 99ebfdd..81bf3a4 100644
--- a/addressbook/gui/contact-list-editor/e-contact-list-editor.c
+++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.c
@@ -35,6 +35,7 @@
 #include <glib/gi18n.h>
 #include <gdk/gdkkeysyms.h>
 
+#include <camel/camel.h>
 #include <libedataserverui/e-source-combo-box.h>
 
 #include "e-util/e-util.h"
@@ -438,6 +439,7 @@ contact_list_editor_drag_data_received_cb (GtkWidget *widget,
                                            guint info,
                                            guint time)
 {
+	CamelInternetAddress *address;
 	EContactListEditor *editor;
 	EContactListModel *model;
 	gboolean changed = FALSE;
@@ -445,13 +447,19 @@ contact_list_editor_drag_data_received_cb (GtkWidget *widget,
 	const guchar *data;
 	GList *list, *iter;
 	GdkAtom target;
+	gint n_addresses = 0;
+	gchar *text;
 
 	editor = contact_list_editor_extract (widget);
-
 	model = E_CONTACT_LIST_MODEL (editor->priv->model);
 
-	/* Sanity check the selection target. */
 	target = gtk_selection_data_get_target (selection_data);
+
+	/* Sanity check the selection target. */
+
+	if (gtk_targets_include_text (&target, 1))
+		goto handle_text;
+
 	if (!e_targets_include_directory (&target, 1))
 		goto exit;
 
@@ -493,66 +501,41 @@ contact_list_editor_drag_data_received_cb (GtkWidget *widget,
 		contact_list_editor_update (editor);
 	}
 
-exit:
-	gtk_drag_finish (context, handled, FALSE, time);
-}
+	goto exit;
 
-gboolean
-contact_list_editor_drag_drop_cb (GtkWidget *widget,
-                                  GdkDragContext *context,
-                                  gint x, gint y,
-                                  guint time);
-
-gboolean
-contact_list_editor_drag_drop_cb (GtkWidget *widget,
-                                  GdkDragContext *context,
-                                  gint x, gint y,
-                                  guint time)
-{
-	GList *targets;
-	GList *iter;
+handle_text:
 
-	targets = gdk_drag_context_list_targets (context);
+	address = camel_internet_address_new ();
+	text = (gchar *) gtk_selection_data_get_text (selection_data);
 
-	for (iter = targets; iter != NULL; iter = iter->next) {
-		GdkAtom target = GDK_POINTER_TO_ATOM (iter->data);
-
-		if (e_targets_include_directory (&target, 1)) {
-			gtk_drag_get_data (widget, context, target, time);
-			return TRUE;
-		}
+	/* See if Camel can parse a valid email address from the text. */
+	if (text != NULL && *text != '\0') {
+		camel_url_decode (text);
+		if (g_ascii_strncasecmp (text, "mailto:";, 7) == 0)
+			n_addresses = camel_address_decode (
+				CAMEL_ADDRESS (address), text + 7);
+		else
+			n_addresses = camel_address_decode (
+				CAMEL_ADDRESS (address), text);
 	}
 
-	return FALSE;
-}
+	if (n_addresses == 1) {
+		g_free (text);
 
-gboolean
-contact_list_editor_drag_motion_cb (GtkWidget *widget,
-                                    GdkDragContext *context,
-                                    gint x, gint y,
-                                    guint time);
-
-gboolean
-contact_list_editor_drag_motion_cb (GtkWidget *widget,
-                                    GdkDragContext *context,
-                                    gint x, gint y,
-                                    guint time)
-{
-	GList *targets;
-	GList *iter;
-
-	targets = gdk_drag_context_list_targets (context);
+		text = camel_address_format (CAMEL_ADDRESS (address));
+		e_contact_list_model_add_email (model, text);
 
-	for (iter = targets; iter != NULL; iter = iter->next) {
-		GdkAtom target = GDK_POINTER_TO_ATOM (iter->data);
+		contact_list_editor_scroll_to_end (editor);
+		editor->priv->changed = TRUE;
 
-		if (e_targets_include_directory (&target, 1)) {
-			gdk_drag_status (context, GDK_ACTION_LINK, time);
-			return TRUE;
-		}
+		contact_list_editor_update (editor);
+		handled = TRUE;
 	}
 
-	return FALSE;
+	g_free (text);
+
+exit:
+	gtk_drag_finish (context, handled, FALSE, time);
 }
 
 void
@@ -1315,6 +1298,7 @@ contact_list_editor_init (EContactListEditor *editor)
 
 	gtk_tree_view_enable_model_drag_dest (view, NULL, 0, GDK_ACTION_LINK);
 	e_drag_dest_add_directory_targets (WIDGET (TREE_VIEW));
+	gtk_drag_dest_add_text_targets (WIDGET (TREE_VIEW));
 
 	g_signal_connect (
 		priv->model, "row-deleted",



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