Re: [evolution-patches] Improvements to the e-name-selector-entry



On Wed, 2005-06-08 at 10:31 +0800, Not Zed wrote:
> Well, it doesn't look too fine to me!
> 
> Please, you must stick to the proper formatting and style.  It is quite
> important although it doesn't seem like it.
> 
> It is explained in some detail in the evolution/HACKING file.  From
> various patches I've seen, I think it would be good for the bangalore
> team to review it if they haven't already.

Relax :)! It wasn't yet committed and still in pre-testing/mind-sharing
status. I attached a new version of the same patch with the two
coding-style problems removed.

Sushma Rai didn't yet review this version of the patch. And the (two)
coding-style errors weren't introduced in any previous version. He
didn't approve this version.

-- 
Philip Van Hoof, Software Developer @ Cronos
home: me at pvanhoof dot be
gnome: pvanhoof at gnome dot org
work: philip dot vanhoof at cronos dot be
junk: philip dot vanhoof at gmail dot com
http://www.pvanhoof.be/
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/libedataserverui/ChangeLog,v
retrieving revision 1.43
diff -u -r1.43 ChangeLog
--- ChangeLog	7 Jun 2005 06:31:50 -0000	1.43
+++ ChangeLog	8 Jun 2005 07:57:02 -0000
@@ -1,3 +1,7 @@
+2005-06-06  Philip Van Hoof  <pvanhoof gnome org
+
+	* e-name-selector-entry.c: Making it more easy to remove destinations
+
 2005-06-07  Sushma Rai  <rsushma novell com>
 
 	* e-name-selector-dialog.c (e_name_selector_dialog_init): Making the
Index: e-name-selector-entry.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/libedataserverui/e-name-selector-entry.c,v
retrieving revision 1.17
diff -u -r1.17 e-name-selector-entry.c
--- e-name-selector-entry.c	4 May 2005 08:43:58 -0000	1.17
+++ e-name-selector-entry.c	8 Jun 2005 07:57:04 -0000
@@ -906,14 +906,16 @@
 	EDestination *destination;
 
 	destination = find_destination_at_position (name_selector_entry, pos);
-	g_assert (destination);
+	if (destination) {
+		g_assert (destination);
 
-	g_signal_handlers_block_by_func (name_selector_entry->destination_store,
+		g_signal_handlers_block_by_func (name_selector_entry->destination_store,
 					 destination_row_deleted, name_selector_entry);
-	e_destination_store_remove_destination (name_selector_entry->destination_store,
+		e_destination_store_remove_destination (name_selector_entry->destination_store,
 						destination);
-	g_signal_handlers_unblock_by_func (name_selector_entry->destination_store,
+		g_signal_handlers_unblock_by_func (name_selector_entry->destination_store,
 					   destination_row_deleted, name_selector_entry);
+	}
 }
 
 static void
@@ -967,14 +969,16 @@
 	EDestination *destination;
 
 	destination = find_destination_by_index (name_selector_entry, index);
-	g_assert (destination);
+	if (destination) {
+		g_assert (destination);
 
-	g_signal_handlers_block_by_func (name_selector_entry->destination_store,
+		g_signal_handlers_block_by_func (name_selector_entry->destination_store,
 					 destination_row_deleted, name_selector_entry);
-	e_destination_store_remove_destination (name_selector_entry->destination_store,
+		e_destination_store_remove_destination (name_selector_entry->destination_store,
 						destination);
-	g_signal_handlers_unblock_by_func (name_selector_entry->destination_store,
+		g_signal_handlers_unblock_by_func (name_selector_entry->destination_store,
 					   destination_row_deleted, name_selector_entry);
+	}
 }
 
 /* Returns the number of characters inserted */
@@ -1123,7 +1127,7 @@
 {
 	const gchar *text;
 	gint         index_start, index_end;
-	gunichar     str_context [2];
+	gunichar     str_context [2], str_b_context [2];
 	gchar        buf [7];
 	gint         len;
 	gint         i;
@@ -1134,6 +1138,7 @@
 	text = gtk_entry_get_text (GTK_ENTRY (name_selector_entry));
 	len = g_utf8_strlen (text, -1);
 	get_utf8_string_context (text, start_pos, str_context, 2);
+	get_utf8_string_context (text, end_pos-1, str_b_context, 2);
 
 	g_signal_handlers_block_by_func (name_selector_entry, user_delete_text, name_selector_entry);
 
@@ -1146,13 +1151,42 @@
 		}
 	}
 
-	if (str_context [0] == ',' && str_context [1] == ' ') {
-		/* If we're deleting the trailing space in ", ", delete the whole ", " sequence. */
-		start_pos--;
-	}
-
 	index_start = get_index_at_position (text, start_pos);
 	index_end   = get_index_at_position (text, end_pos);
+	
+	g_signal_stop_emission_by_name (name_selector_entry, "delete_text");
+	
+	/* If the user is trying to delete a ','-character, we assume the user 
+	 * wants to remove the entire destination.
+	 */
+	
+	if ((str_b_context [0] == ',' && str_b_context [1] == ' ') || str_b_context [1] == ',') {
+	
+	  EDestination *dest = find_destination_at_position (name_selector_entry, end_pos-1);
+	  const char *email = e_destination_get_email (dest);
+	  if (email && (strcmp (email, "")!=0)) {
+	  
+		/* Therefore, in case it's a real destination, we select it. 
+		 * Deleting this selection afterwards will leave the destination
+		 * empty. */
+	 
+		gint t = (str_b_context [1]==',')?end_pos-1:end_pos-2, b=t;
+		do {
+			t--;
+		} while (t >= 1 && text[t-1] != ',');
+		
+		gtk_editable_select_region (GTK_EDITABLE(name_selector_entry), t, b);
+
+		/* Since this is a special-case, we don't want the rest of this method
+		 * to happen. However, we do need to reenable the signal which we
+		 * disabled above! */
+		
+		goto end_of_user_delete_text;
+		
+	  }
+	}
+	
+
 
 	/* If the deletion touches more than one destination, the first one is changed
 	 * and the rest are removed. If the last destination wasn't completely deleted,
@@ -1162,15 +1196,17 @@
 	 * Here, we let the model know about removals. */
 	for (i = index_end; i > index_start; i--)
 		remove_destination_by_index (name_selector_entry, i);
-
+	
 	/* Do the actual deletion */
+	
+	
 	gtk_editable_delete_text (GTK_EDITABLE (name_selector_entry),
 				  start_pos, end_pos);
-	g_signal_stop_emission_by_name (name_selector_entry, "delete_text");
+	
 
 	/* Let model know about changes */
 	text = gtk_entry_get_text (GTK_ENTRY (name_selector_entry));
-	if (!*text) {
+	if (!*text || strlen(text) <= 0) {
 		/* If the entry was completely cleared, remove the initial destination too */
 		remove_destination_by_index (name_selector_entry, 0);
 		generate_attribute_list (name_selector_entry);
@@ -1187,7 +1223,8 @@
 		g_source_remove (name_selector_entry->type_ahead_complete_cb_id);
 		name_selector_entry->type_ahead_complete_cb_id = 0;
 	}
-
+	
+end_of_user_delete_text:
 	g_signal_handlers_unblock_by_func (name_selector_entry, user_delete_text, name_selector_entry);
 }
 


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