* src/modest-text-utils.[ch]:
authorJose Dapena Paz <jdapena@igalia.com>
Mon, 30 Apr 2007 14:19:27 +0000 (14:19 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Mon, 30 Apr 2007 14:19:27 +0000 (14:19 +0000)
        * Added modest_text_utils_validate_recipient. This validates
          addresses in a@b.c format, but also in "name" <a@b.c> and
          name <a@b.c> 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
src/modest-text-utils.c
src/modest-text-utils.h
src/widgets/modest-recpt-editor.c

index e141e68..bc0dd5b 100644 (file)
@@ -39,6 +39,7 @@
 #include <modest-runtime.h>
 #include <modest-window-priv.h>
 #include <modest-tny-folder.h>
 #include <modest-runtime.h>
 #include <modest-window-priv.h>
 #include <modest-tny-folder.h>
+#include <modest-text-utils.h>
 #include "modest-hildon-includes.h"
 #include <gtkhtml/gtkhtml-search.h>
 #include <gdk/gdkkeysyms.h>
 #include "modest-hildon-includes.h"
 #include <gtkhtml/gtkhtml-search.h>
 #include <gdk/gdkkeysyms.h>
@@ -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_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 {
 
 /* list my signals */
 enum {
@@ -106,6 +111,8 @@ struct _ModestMsgViewWindowPrivate {
 
        GtkTreeModel *header_model;
        GtkTreeIter   iter;
 
        GtkTreeModel *header_model;
        GtkTreeIter   iter;
+
+       guint clipboard_change_handler;
 };
 
 #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
 };
 
 #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->msg_view      = NULL;
        priv->header_model  = NULL;
+       priv->clipboard_change_handler = 0;
 }
 
 static void
 }
 
 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);
        
        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);
 }      
        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;
        }
                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);
 }
 
        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));
        }
 }
                        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);
+       
+}
index 60ee401..4159c15 100644 (file)
@@ -976,7 +976,74 @@ modest_text_utils_validate_email_address (const gchar *email_address)
        return (count >= 1) ? TRUE : FALSE;
 }
 
        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 *
 
 
 gchar *
index 0a047f4..8b00746 100644 (file)
@@ -254,6 +254,19 @@ gchar * modest_text_utils_get_display_size (guint size);
 gboolean     modest_text_utils_validate_email_address (const gchar *email_address);
 
 /**
 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 &lt; and &gt; 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
  *
  * modest_text_utils_split_addresses_list:
  * @addresses: a string
  *
index 150153c..6f4d1a1 100644 (file)
@@ -636,7 +636,10 @@ modest_recpt_editor_on_key_press_event (GtkTextView *text_view,
                        return TRUE;
                }
                #else
                        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);
                #endif
 
                tag = prev_iter_has_recipient (&location);