Original patch by Dmitry Kazachkov
[modest] / src / widgets / modest-recpt-editor.c
index fad88cc..c1e2fef 100644 (file)
@@ -71,7 +71,8 @@ struct _ModestRecptEditorPrivate
        GtkWidget *abook_button;
        GtkWidget *scrolled_window;
        gchar *recipients;
-
+       gulong on_mark_set_handler;
+       gboolean show_abook;
 };
 
 #define MODEST_RECPT_EDITOR_GET_PRIVATE(o)     \
@@ -264,6 +265,25 @@ modest_recpt_editor_replace_with_resolved_recipient (ModestRecptEditor *recpt_ed
                                                     GtkTextIter *start, GtkTextIter *end,
                                                     GSList *email_list, const gchar * recipient_id)
 {
+       GSList *email_lists_list;
+       GSList *recipient_ids_list;
+
+       email_lists_list = g_slist_append (NULL, email_list);
+       recipient_ids_list = g_slist_append (NULL, (gpointer) recipient_id);
+
+       modest_recpt_editor_replace_with_resolved_recipients (recpt_editor, start, end,
+                                                             email_lists_list, recipient_ids_list);
+
+       g_slist_free (email_lists_list);
+       g_slist_free (recipient_ids_list);
+
+}
+
+void 
+modest_recpt_editor_replace_with_resolved_recipients (ModestRecptEditor *recpt_editor, 
+                                                    GtkTextIter *start, GtkTextIter *end,
+                                                    GSList *email_lists_list, GSList * recipient_ids_list)
+{
        ModestRecptEditorPrivate *priv;
        GtkTextBuffer *buffer;
        GtkTextTag *tag;
@@ -282,7 +302,10 @@ modest_recpt_editor_replace_with_resolved_recipient (ModestRecptEditor *recpt_ed
 
        gtk_text_buffer_delete (buffer, start, end);
 
-       if (email_list) {
+       while (email_lists_list) {
+               gchar *recipient_id = (gchar *) recipient_ids_list->data;
+               GSList *email_list = (GSList *) email_lists_list->data;
+               
          
                tag = gtk_text_buffer_create_tag (buffer, NULL, 
                                                  "underline", PANGO_UNDERLINE_SINGLE,
@@ -307,6 +330,9 @@ modest_recpt_editor_replace_with_resolved_recipient (ModestRecptEditor *recpt_ed
                                is_first_recipient = FALSE;
                        }
                }
+
+               email_lists_list = g_slist_next (email_lists_list);
+               recipient_ids_list = g_slist_next (recipient_ids_list);
        }
        g_signal_handlers_unblock_by_func (buffer, modest_recpt_editor_on_insert_text, recpt_editor);
 
@@ -359,7 +385,10 @@ modest_recpt_editor_instance_init (GTypeInstance *instance, gpointer g_class)
 
        priv = MODEST_RECPT_EDITOR_GET_PRIVATE (instance);
 
+       priv->show_abook = TRUE;
        priv->abook_button = gtk_button_new ();
+       gtk_widget_set_no_show_all (GTK_WIDGET (priv->abook_button), TRUE);
+       gtk_widget_show (priv->abook_button);
 #ifdef MODEST_TOOLKIT_HILDON2
        gtk_widget_set_size_request (priv->abook_button, RECPT_BUTTON_WIDTH_HILDON2, -1);
 #else
@@ -424,9 +453,10 @@ modest_recpt_editor_instance_init (GTypeInstance *instance, gpointer g_class)
        g_signal_connect (G_OBJECT (priv->text_view), "key-press-event", G_CALLBACK (modest_recpt_editor_on_key_press_event), instance);
        g_signal_connect (G_OBJECT (priv->text_view), "focus-in-event", G_CALLBACK (modest_recpt_editor_on_focus_in), instance);
        g_signal_connect (G_OBJECT (buffer), "insert-text", G_CALLBACK (modest_recpt_editor_on_insert_text), instance);
-       g_signal_connect (G_OBJECT (buffer), "mark-set", G_CALLBACK (modest_recpt_editor_on_mark_set), instance);
 
-/*     gtk_container_set_focus_child (GTK_CONTAINER (instance), priv->text_view); */
+       priv->on_mark_set_handler = g_signal_connect (G_OBJECT (buffer), "mark-set", 
+                                                     G_CALLBACK (modest_recpt_editor_on_mark_set), 
+                                                     instance);
 
        return;
 }
@@ -481,7 +511,7 @@ modest_recpt_editor_on_mark_set (GtkTextBuffer *buffer,
        GtkTextMark *selection_bound;
        GtkTextTag *tag;
        gboolean selection_changed = FALSE;
-       
+
        priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor);
 
        buffer = modest_recpt_editor_get_buffer (recpt_editor);
@@ -497,17 +527,23 @@ modest_recpt_editor_on_mark_set (GtkTextBuffer *buffer,
                if (!gtk_text_iter_begins_tag (&start, tag)) {
                        gtk_text_iter_backward_to_tag_toggle (&start, tag);
                        selection_changed = TRUE;
-               } 
+               }
 
        tag = iter_has_recipient (&end);
-       if (tag != NULL) 
+       if (tag != NULL)
                if (!gtk_text_iter_ends_tag (&end, tag)) {
                        gtk_text_iter_forward_to_tag_toggle (&end, tag);
                        selection_changed = TRUE;
                }
 
        if (selection_changed) {
+               /* We block this signal handler in order to prevent a
+                  stack overflow caused by recursive calls to this
+                  handler as the select_range call could issue a
+                  "mark-set" signal */
+               g_signal_handler_block (buffer, priv->on_mark_set_handler);
                gtk_text_buffer_select_range (buffer, &start, &end);
+               g_signal_handler_unblock (buffer, priv->on_mark_set_handler);
        }
 }
 
@@ -962,12 +998,44 @@ modest_recpt_editor_has_focus (ModestRecptEditor *recpt_editor)
                gtk_widget_is_focus (priv->text_view);
 }
 
+void 
+modest_recpt_editor_set_show_abook_button (ModestRecptEditor *recpt_editor, gboolean show)
+{
+       ModestRecptEditorPrivate *priv;
+       
+       g_return_if_fail (MODEST_IS_RECPT_EDITOR (recpt_editor));
+       priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor);
+
+       priv->show_abook = show;
+
+       if (show)
+               gtk_widget_show (priv->abook_button);
+       else
+               gtk_widget_hide (priv->abook_button);
+}
+
+gboolean
+modest_recpt_editor_get_show_abook_button (ModestRecptEditor *recpt_editor, gboolean show)
+{
+       ModestRecptEditorPrivate *priv;
+       
+       g_return_val_if_fail (MODEST_IS_RECPT_EDITOR (recpt_editor), FALSE);
+       priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor);
+
+       return priv->show_abook;
+       
+}
+
 static void
 modest_recpt_editor_finalize (GObject *object)
 {
        ModestRecptEditorPrivate *priv;
        priv = MODEST_RECPT_EDITOR_GET_PRIVATE (object);
 
+       if (g_signal_handler_is_connected (object, priv->on_mark_set_handler))
+               g_signal_handler_disconnect (object, priv->on_mark_set_handler);
+       priv->on_mark_set_handler = 0;
+
        if (priv->recipients) {
                g_free (priv->recipients);
                priv->recipients = NULL;
@@ -982,11 +1050,9 @@ static void
 modest_recpt_editor_class_init (ModestRecptEditorClass *klass)
 {
        GObjectClass *object_class;
-       GtkWidgetClass *widget_class;
 
        parent_class = g_type_class_peek_parent (klass);
        object_class = (GObjectClass*) klass;
-       widget_class = GTK_WIDGET_CLASS (klass);
 
        object_class->finalize = modest_recpt_editor_finalize;