From 850bcc46fdd95e24bd1d6867d067155f5c518881 Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Mon, 30 Apr 2007 14:19:27 +0000 Subject: [PATCH] * src/modest-text-utils.[ch]: * Added modest_text_utils_validate_recipient. This validates addresses in a@b.c format, but also in "name" and name formats. * src/maemo/modest-msg-view-window.c: * Now add to contacts menu option is dimmed if the clipboard does not contain a valid recipient. * src/widgets/modest-recpt-editor.c: * Added an implementation of backspace valid for gtk < 2.10. pmo-trunk-r1723 --- src/maemo/modest-msg-view-window.c | 36 +++++++++++++++++++ src/modest-text-utils.c | 67 ++++++++++++++++++++++++++++++++++++ src/modest-text-utils.h | 13 +++++++ src/widgets/modest-recpt-editor.c | 5 ++- 4 files changed, 120 insertions(+), 1 deletion(-) diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index e141e68..bc0dd5b 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -39,6 +39,7 @@ #include #include #include +#include #include "modest-hildon-includes.h" #include #include @@ -75,6 +76,10 @@ static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window) static void modest_msg_view_window_show_toolbar (ModestWindow *window, gboolean show_toolbar); +static void modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard, + GdkEvent *event, + ModestMsgViewWindow *window); + /* list my signals */ enum { @@ -106,6 +111,8 @@ struct _ModestMsgViewWindowPrivate { GtkTreeModel *header_model; GtkTreeIter iter; + + guint clipboard_change_handler; }; #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -169,6 +176,7 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) priv->msg_view = NULL; priv->header_model = NULL; + priv->clipboard_change_handler = 0; } static void @@ -245,6 +253,8 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg) g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj); g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj); + priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj); + modest_msg_view_window_clipboard_owner_change (gtk_clipboard_get (GDK_SELECTION_PRIMARY), NULL, obj); gtk_widget_show_all (GTK_WIDGET(main_vbox)); gtk_box_pack_end (GTK_BOX (main_vbox), priv->find_toolbar, FALSE, FALSE, 0); } @@ -260,6 +270,10 @@ modest_msg_view_window_finalize (GObject *obj) g_object_unref (priv->header_model); priv->header_model = NULL; } + if (priv->clipboard_change_handler > 0) { + g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_PRIMARY), priv->clipboard_change_handler); + priv->clipboard_change_handler = 0; + } G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -970,3 +984,25 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar)); } } + +static void +modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard, + GdkEvent *event, + ModestMsgViewWindow *window) +{ + ModestWindowPrivate *parent_priv; + GtkAction *action; + gboolean is_address; + gchar *selection; + + parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + selection = gtk_clipboard_wait_for_text (clipboard); + + g_message ("SELECTION %s", selection); + is_address = ((selection != NULL) && (modest_text_utils_validate_recipient (selection))); + g_free (selection); + + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsAddToContactsMenu"); + gtk_action_set_sensitive (action, is_address); + +} diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 60ee401..4159c15 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -976,7 +976,74 @@ modest_text_utils_validate_email_address (const gchar *email_address) return (count >= 1) ? TRUE : FALSE; } +gboolean +modest_text_utils_validate_recipient (const gchar *recipient) +{ + gchar *stripped; + gchar *right_part; + gint i = 0; + gboolean has_error = FALSE; + + if (modest_text_utils_validate_email_address (recipient)) + return TRUE; + stripped = g_strdup (recipient); + stripped = g_strstrip (stripped); + + if (stripped[0] == '\0') { + g_free (stripped); + return FALSE; + } + /* quoted string */ + if (stripped[0] == '\"') { + i = 1; + has_error = TRUE; + for (i = 1; stripped[i] != '\0'; i++) { + if (stripped[i] == '\\') { + if (stripped[i+1] >=0) { + i++; + } else { + has_error = TRUE; + break; + } + } else if (stripped[i] == '\"') { + has_error = FALSE; + break; + } + } + } else { + has_error = TRUE; + for (i = 0; stripped[i] != '\0'; i++) { + if (stripped[i] == ' ') { + has_error = FALSE; + break; + } + } + } + + if (has_error) { + g_free (stripped); + return FALSE; + } + + right_part = g_strdup (stripped + i); + g_free (stripped); + right_part = g_strstrip (right_part); + if (g_str_has_prefix (right_part, "<") && + g_str_has_suffix (right_part, ">")) { + gchar *address; + gboolean valid; + + address = g_strndup (right_part+1, strlen (right_part) - 2); + g_free (right_part); + valid = modest_text_utils_validate_email_address (address); + g_free (address); + return valid; + } else { + g_free (right_part); + return FALSE; + } +} gchar * diff --git a/src/modest-text-utils.h b/src/modest-text-utils.h index 0a047f4..8b00746 100644 --- a/src/modest-text-utils.h +++ b/src/modest-text-utils.h @@ -254,6 +254,19 @@ gchar * modest_text_utils_get_display_size (guint size); gboolean modest_text_utils_validate_email_address (const gchar *email_address); /** + * modest_text_utils_validate_recipient: + * @recipient: a string + * + * validates @recipient as a valid recipient field for header. + * It's different from modest_text_utils_validate_email_address() + * as it validates a whole recipient, and not only the part between + * the < and > symbols. + * + * Returns: %TRUE if the recipient is valid, FALSE otherwise + **/ +gboolean modest_text_utils_validate_recipient (const gchar *recipient); + +/** * modest_text_utils_split_addresses_list: * @addresses: a string * diff --git a/src/widgets/modest-recpt-editor.c b/src/widgets/modest-recpt-editor.c index 150153c..6f4d1a1 100644 --- a/src/widgets/modest-recpt-editor.c +++ b/src/widgets/modest-recpt-editor.c @@ -636,7 +636,10 @@ modest_recpt_editor_on_key_press_event (GtkTextView *text_view, return TRUE; } #else - /* TODO: Alternative code. */ + if (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL)) { + gtk_text_buffer_delete_selection (buffer, TRUE, TRUE); + return TRUE; + } #endif tag = prev_iter_has_recipient (&location); -- 1.7.9.5