evolution r35732 - trunk/mail



Author: mcrha
Date: Wed Jul  9 07:53:24 2008
New Revision: 35732
URL: http://svn.gnome.org/viewvc/evolution?rev=35732&view=rev

Log:
2008-07-09  Milan Crha  <mcrha redhat com>

	** Fix for bug #207802 (Patch suggested by Veerapuram Varadhan.)

	* message-list.c: (struct search_child_struct), (search_child_cb),
	(is_tree_widget_children), (ml_tree_drag_motion): Do not allow drop
	messages to the same message list as is the source. Also do not
	allow drop over message list if it doesn't have set a folder.



Modified:
   trunk/mail/ChangeLog
   trunk/mail/message-list.c

Modified: trunk/mail/message-list.c
==============================================================================
--- trunk/mail/message-list.c	(original)
+++ trunk/mail/message-list.c	Wed Jul  9 07:53:24 2008
@@ -2100,12 +2100,50 @@
 	}
 }
 
+struct search_child_struct {
+	gboolean found;
+	gconstpointer looking_for;
+};
+
+static void
+search_child_cb (GtkWidget *widget, gpointer data)
+{
+	struct search_child_struct *search = (struct search_child_struct *) data;
+
+	search->found = search->found || g_direct_equal (widget, search->looking_for);
+}
+
+static gboolean
+is_tree_widget_children (ETree *tree, gconstpointer widget)
+{
+	struct search_child_struct search;
+
+	search.found = FALSE;
+	search.looking_for = widget;
+
+	gtk_container_foreach (GTK_CONTAINER (tree), search_child_cb, &search);
+
+	return search.found;
+}
+
 static gboolean
 ml_tree_drag_motion(ETree *tree, GdkDragContext *context, gint x, gint y, guint time, MessageList *ml)
 {
 	GList *targets;
 	GdkDragAction action, actions = 0;
 
+	/* If drop target is name of the account/store and not actual folder, don't allow any action */
+	if (!ml->folder) {
+		gdk_drag_status (context, 0, time);
+		return TRUE;
+	}
+
+	/* If source widget is packed under 'tree', don't allow any action */
+	if (is_tree_widget_children (tree, gtk_drag_get_source_widget (context))) {
+		gdk_drag_status (context, 0, time);
+		return TRUE;
+	}
+
 	for (targets = context->targets; targets; targets = targets->next) {
 		int i;
 



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