evolution-data-server r9272 - trunk/libedataserverui
- From: mcrha svn gnome org
- To: svn-commits-list gnome org
- Subject: evolution-data-server r9272 - trunk/libedataserverui
- Date: Wed, 6 Aug 2008 08:24:24 +0000 (UTC)
Author: mcrha
Date: Wed Aug 6 08:24:23 2008
New Revision: 9272
URL: http://svn.gnome.org/viewvc/evolution-data-server?rev=9272&view=rev
Log:
2008-08-06 Milan Crha <mcrha redhat com>
** Fix for bug #207728
* e-name-selector-entry.c: (copy_or_cut_clipboard), (copy_clipboard),
(cut_clipboard), (e_name_selector_entry_init): Always cut/copy whole
address from the selector entry, when selected whole, thus paste will
be with correct address, not the text only.
Modified:
trunk/libedataserverui/ChangeLog
trunk/libedataserverui/e-name-selector-entry.c
Modified: trunk/libedataserverui/e-name-selector-entry.c
==============================================================================
--- trunk/libedataserverui/e-name-selector-entry.c (original)
+++ trunk/libedataserverui/e-name-selector-entry.c Wed Aug 6 08:24:23 2008
@@ -2098,7 +2098,6 @@
g_free (pemail);
g_signal_handlers_unblock_by_func (name_selector_entry, user_delete_text, name_selector_entry);
g_signal_handlers_unblock_by_func (name_selector_entry, user_insert_text, name_selector_entry);
-
}
static void
@@ -2293,6 +2292,95 @@
}
static void
+copy_or_cut_clipboard (ENameSelectorEntry *name_selector_entry, gboolean is_cut)
+{
+ gint i, start = 0, end = 0;
+ const gchar *text;
+ GHashTable *hash;
+ GHashTableIter iter;
+ gpointer key, value;
+ GString *addresses;
+
+ text = gtk_entry_get_text (GTK_ENTRY (name_selector_entry));
+
+ if (!gtk_editable_get_selection_bounds (GTK_EDITABLE (name_selector_entry), &start, &end)) {
+ start = gtk_editable_get_position (GTK_EDITABLE (name_selector_entry));
+ end = start;
+ }
+
+ /* do nothing when there is nothing selected */
+ if (start == end)
+ return;
+
+ hash = g_hash_table_new (g_direct_hash, g_direct_equal);
+ for (i = start; i <= end; i++) {
+ int index = get_index_at_position (text, i);
+
+ g_hash_table_insert (hash, GINT_TO_POINTER (index), NULL);
+ }
+
+ addresses = g_string_new ("");
+
+ g_hash_table_iter_init (&iter, hash);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ int index = GPOINTER_TO_INT (key);
+ EDestination *dest;
+ gint rstart, rend;
+
+ if (!get_range_by_index (text, index, &rstart, &rend))
+ continue;
+
+ if (rstart < start) {
+ if (addresses->str && *addresses->str)
+ g_string_append (addresses, ", ");
+
+ g_string_append_len (addresses, text + start, rend - start);
+ } else if (rend > end) {
+ if (addresses->str && *addresses->str)
+ g_string_append (addresses, ", ");
+
+ g_string_append_len (addresses, text + rstart, end - rstart);
+ } else {
+ /* the contact is whole selected */
+ dest = find_destination_by_index (name_selector_entry, index);
+ if (dest && e_destination_get_address (dest)) {
+ if (addresses->str && *addresses->str)
+ g_string_append (addresses, ", ");
+
+ g_string_append (addresses, e_destination_get_address (dest));
+
+ /* store the 'dest' as a value for the index */
+ g_hash_table_insert (hash, GINT_TO_POINTER (index), dest);
+ } else
+ g_string_append_len (addresses, text + rstart, rend - rstart);
+ }
+ }
+
+ if (is_cut)
+ gtk_editable_delete_text (GTK_EDITABLE (name_selector_entry), start, end);
+
+ g_hash_table_unref (hash);
+
+ gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (name_selector_entry), GDK_SELECTION_CLIPBOARD), addresses->str, -1);
+
+ g_string_free (addresses, TRUE);
+}
+
+static void
+copy_clipboard (GtkEntry *entry, ENameSelectorEntry *name_selector_entry)
+{
+ copy_or_cut_clipboard (name_selector_entry, FALSE);
+ g_signal_stop_emission_by_name (entry, "copy-clipboard");
+}
+
+static void
+cut_clipboard (GtkEntry *entry, ENameSelectorEntry *name_selector_entry)
+{
+ copy_or_cut_clipboard (name_selector_entry, TRUE);
+ g_signal_stop_emission_by_name (entry, "cut-clipboard");
+}
+
+static void
e_name_selector_entry_init (ENameSelectorEntry *name_selector_entry)
{
GtkCellRenderer *renderer;
@@ -2336,6 +2424,10 @@
g_signal_connect (name_selector_entry, "button-press-event", G_CALLBACK (prepare_popup_destination), name_selector_entry);
g_signal_connect (name_selector_entry, "populate-popup", G_CALLBACK (populate_popup), name_selector_entry);
+
+ /* Clipboard signals */
+ g_signal_connect (name_selector_entry, "copy-clipboard", G_CALLBACK (copy_clipboard), name_selector_entry);
+ g_signal_connect (name_selector_entry, "cut-clipboard", G_CALLBACK (cut_clipboard), name_selector_entry);
/* Completion */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]