Final fix for NB#137187, problems parsing email addresses
[modest] / src / widgets / modest-recpt-editor.c
index 4ad939f..6e46a13 100644 (file)
@@ -196,7 +196,7 @@ modest_recpt_editor_add_recipients (ModestRecptEditor *recpt_editor, const gchar
        g_signal_handlers_block_by_func (buffer, modest_recpt_editor_on_insert_text_after, recpt_editor);
 
        gtk_text_buffer_insert (buffer, &iter, string_to_add, -1);
-       
+
        g_signal_handlers_unblock_by_func (buffer, modest_recpt_editor_on_insert_text, recpt_editor);
        g_signal_handlers_unblock_by_func (buffer, modest_recpt_editor_on_insert_text_after, recpt_editor);
 
@@ -232,10 +232,11 @@ modest_recpt_editor_add_resolved_recipient (ModestRecptEditor *recpt_editor, GSL
 
                gtk_text_buffer_get_bounds (buffer, &start, &end);
                buffer_contents = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+               g_strstrip (buffer_contents);
                if (!g_str_has_suffix (buffer_contents, "\n")) {
                        if (g_str_has_suffix (buffer_contents, ";")||(g_str_has_suffix (buffer_contents, ",")))
                                gtk_text_buffer_insert (buffer, &end, "\n", -1);
-                       else 
+                       else
                                gtk_text_buffer_insert (buffer, &end, ";\n", -1);
                }
                g_free (buffer_contents);
@@ -249,7 +250,7 @@ modest_recpt_editor_add_resolved_recipient (ModestRecptEditor *recpt_editor, GSL
                if ((recipient) && (strlen (recipient) != 0)) {
 
                        if (!is_first_recipient)
-                       gtk_text_buffer_insert (buffer, &iter, "\n", -1);
+                               gtk_text_buffer_insert (buffer, &iter, "\n", -1);
 
                        gtk_text_buffer_insert (buffer, &iter, recipient, -1);
                        gtk_text_buffer_insert (buffer, &iter, ";", -1);
@@ -305,7 +306,7 @@ modest_recpt_editor_replace_with_resolved_recipients (ModestRecptEditor *recpt_e
 
        gtk_text_buffer_delete (buffer, start, end);
 
-       while (email_lists_list) {
+       while (email_lists_list && recipient_ids_list) {
                gchar *recipient_id = (gchar *) recipient_ids_list->data;
                GSList *email_list = (GSList *) email_lists_list->data;
 
@@ -322,7 +323,7 @@ modest_recpt_editor_replace_with_resolved_recipients (ModestRecptEditor *recpt_e
 
                        if ((recipient) && (strlen (recipient) != 0)) {
 
-                               if (!is_first_recipient)
+                               if (!is_first_recipient || !gtk_text_iter_is_start(start))
                                        gtk_text_buffer_insert (buffer, start, "\n", -1);
 
                                gtk_text_buffer_insert_with_tags (buffer, start, recipient, -1, tag, NULL);
@@ -352,7 +353,6 @@ modest_recpt_editor_get_recipients (ModestRecptEditor *recpt_editor)
        ModestRecptEditorPrivate *priv;
        GtkTextBuffer *buffer = NULL;
        GtkTextIter start, end;
-       gchar *c;
 
        g_return_val_if_fail (MODEST_IS_RECPT_EDITOR (recpt_editor), NULL);
        priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor);
@@ -372,11 +372,6 @@ modest_recpt_editor_get_recipients (ModestRecptEditor *recpt_editor)
        gtk_text_buffer_get_end_iter (buffer, &end);
 
        priv->recipients = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
-       for (c = priv->recipients; *c != '\0'; c = g_utf8_next_char (c)) {
-               if (*c == '\n') {
-                       *c = ' ';
-               }
-       }
 
        return priv->recipients;
 
@@ -632,19 +627,32 @@ create_valid_text (const gchar *text, gint len)
                        next_c = g_utf8_get_char (g_utf8_next_char (current));
                else
                        next_c = 0;
-               if (c != 0x2022 && c != 0xfffc && 
+               if (c != 0x2022 && c != 0xfffc &&
                    c != g_utf8_get_char ("\n") &&
                    c != g_utf8_get_char ("\t"))
                        str = g_string_append_unichar (str, c);
                if (!quoted && ((c == g_utf8_get_char(",") || c == g_utf8_get_char (";")))) {
-                       if ((next_c != 0) && (next_c != g_utf8_get_char ("\n")))
-                               str = g_string_append_c (str, '\n');
+                       if ((next_c != 0) && (next_c != g_utf8_get_char ("\n"))) {
+                               gchar *last_separator = MAX (g_utf8_strrchr(str->str, -1, g_utf8_get_char (",")),
+                                                            g_utf8_strrchr(str->str, -1, g_utf8_get_char (";")));
+                               if (last_separator) {
+                                       gchar *last_at = g_utf8_strrchr (str->str, -1, g_utf8_get_char ("@"));
+                                       if (last_at) {
+                                               if (last_at < last_separator)
+                                                       str = g_string_append_c (str, '\n');
+                                       }
+                               } else {
+                                       if (g_utf8_strrchr (str->str, -1, g_utf8_get_char ("@")))
+                                               str = g_string_append_c (str, '\n');
+                               }
+                       }
                }
                if (c == g_utf8_get_char ("\""))
                        quoted = !quoted;
                current = g_utf8_next_char (current);
                i = current - text;
        }
+
        return g_string_free (str, FALSE);
 }
 
@@ -662,17 +670,20 @@ modest_recpt_editor_on_insert_text_after (GtkTextBuffer *buffer,
        ModestRecptEditorPrivate *priv = MODEST_RECPT_EDITOR_GET_PRIVATE (editor);
 
        prev = *location;
-       if (!gtk_text_iter_backward_char (&prev))
+       /* We must go backwards twice as location points to the next
+          valid position to insert text */
+       if (!gtk_text_iter_backward_chars (&prev, 2))
                return;
 
        prev_char = gtk_text_iter_get_char (&prev);
        g_signal_handlers_block_by_func (buffer, modest_recpt_editor_on_insert_text, editor);
        g_signal_handlers_block_by_func (buffer, modest_recpt_editor_on_insert_text_after, editor);
-       if ((prev_char == ';'||prev_char == ',')&&(!quote_opened(location))) {
+       if ((prev_char == ';'||prev_char == ',')&&(!quote_opened(&prev))) {
                GtkTextMark *insert;
-               gtk_text_buffer_insert (buffer, location, "\n",-1);
+               gtk_text_iter_forward_char (&prev);
+               gtk_text_buffer_insert (buffer, &prev, "\n",-1);
                insert = gtk_text_buffer_get_insert (buffer);
-               gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (priv->text_view), location, 0.0,TRUE, 0.0, 1.0);
+               gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (priv->text_view), &prev, 0.0,TRUE, 0.0, 1.0);
        }
        g_signal_handlers_unblock_by_func (buffer, modest_recpt_editor_on_insert_text, editor);
        g_signal_handlers_unblock_by_func (buffer, modest_recpt_editor_on_insert_text_after, editor);