X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwidgets%2Fmodest-recpt-editor.c;h=3e60a02b3853e67b211115457330d81329115f44;hb=f8a806f78f538409b502f58f09f969186e908258;hp=6f4d1a15d723c8858b08e425ed7649726d9963a9;hpb=850bcc46fdd95e24bd1d6867d067155f5c518881;p=modest diff --git a/src/widgets/modest-recpt-editor.c b/src/widgets/modest-recpt-editor.c index 6f4d1a1..3e60a02 100644 --- a/src/widgets/modest-recpt-editor.c +++ b/src/widgets/modest-recpt-editor.c @@ -99,7 +99,7 @@ static gunichar iter_previous_char (GtkTextIter *iter); static GtkTextTag *prev_iter_has_recipient (GtkTextIter *iter); /* static GtkTextTag *next_iter_has_recipient (GtkTextIter *iter); */ static void select_tag_of_iter (GtkTextIter *iter, GtkTextTag *tag); - +static gboolean quote_opened (GtkTextIter *iter); /** * modest_recpt_editor_new: @@ -231,6 +231,52 @@ modest_recpt_editor_add_resolved_recipient (ModestRecptEditor *recpt_editor, GSL } +void +modest_recpt_editor_replace_with_resolved_recipient (ModestRecptEditor *recpt_editor, + GtkTextIter *start, GtkTextIter *end, + GSList *email_list, const gchar * recipient_id) +{ + ModestRecptEditorPrivate *priv; + GtkTextBuffer *buffer; + GtkTextTag *tag; + GSList *node; + gboolean is_first_recipient = TRUE; + + g_return_if_fail (MODEST_IS_RECPT_EDITOR (recpt_editor)); + priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor); + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->text_view)); + g_signal_handlers_block_by_func (buffer, modest_recpt_editor_on_insert_text, recpt_editor); + + gtk_text_buffer_delete (buffer, start, end); + + tag = gtk_text_buffer_create_tag (buffer, NULL, + "underline", PANGO_UNDERLINE_SINGLE, + "wrap-mode", GTK_WRAP_NONE, + "editable", TRUE, NULL); + + g_object_set_data (G_OBJECT (tag), "recipient-tag-id", GINT_TO_POINTER (RECIPIENT_TAG_ID)); + g_object_set_data_full (G_OBJECT (tag), "recipient-id", g_strdup (recipient_id), (GDestroyNotify) g_free); + + for (node = email_list; node != NULL; node = g_slist_next (node)) { + gchar *recipient = (gchar *) node->data; + + if ((recipient) && (strlen (recipient) != 0)) { + + if (!is_first_recipient) + gtk_text_buffer_insert (buffer, start, "\n", -1); + + gtk_text_buffer_insert_with_tags (buffer, start, recipient, -1, tag, NULL); + + if (node->next != NULL) + gtk_text_buffer_insert (buffer, start, ";", -1); + is_first_recipient = FALSE; + } + } + g_signal_handlers_unblock_by_func (buffer, modest_recpt_editor_on_insert_text, recpt_editor); + +} + const gchar * modest_recpt_editor_get_recipients (ModestRecptEditor *recpt_editor) @@ -254,9 +300,10 @@ 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++) { - if (*c == '\n') + for (c = priv->recipients; *c != '\0'; c = g_utf8_next_char (c)) { + if (*c == '\n') { *c = ' '; + } } return priv->recipients; @@ -277,12 +324,15 @@ modest_recpt_editor_instance_init (GTypeInstance *instance, gpointer g_class) gtk_button_set_focus_on_click (GTK_BUTTON (priv->abook_button), FALSE); GTK_WIDGET_UNSET_FLAGS (priv->abook_button, GTK_CAN_FOCUS); gtk_button_set_alignment (GTK_BUTTON (priv->abook_button), 1.0, 1.0); - abook_icon = gtk_image_new_from_icon_name ("qgn_list_gene_contacts", GTK_ICON_SIZE_BUTTON); + abook_icon = gtk_image_new_from_icon_name ("qgn_list_addressbook", GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (priv->abook_button), abook_icon); priv->text_view = gtk_text_view_new (); + priv->recipients = NULL; + priv->scrolled_window = modest_scroll_text_new (GTK_TEXT_VIEW (priv->text_view), 5); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window), GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scrolled_window), GTK_SHADOW_IN); /* gtk_container_add (GTK_CONTAINER (priv->scrolled_window), priv->text_view); */ @@ -359,7 +409,6 @@ modest_recpt_editor_on_button_release_event (GtkWidget *widget, buffer = modest_recpt_editor_get_buffer (recpt_editor); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &location, mark); - g_message ("RELEASE OFFSET %d", gtk_text_iter_get_offset (&location)); gtk_text_buffer_get_selection_bounds (buffer, &start, &end); @@ -388,10 +437,53 @@ modest_recpt_editor_on_focus_in (GtkTextView *text_view, ModestRecptEditor *editor) { ModestRecptEditorPrivate *priv = MODEST_RECPT_EDITOR_GET_PRIVATE (editor); - modest_recpt_editor_move_cursor_to_end (editor); gtk_text_view_place_cursor_onscreen (GTK_TEXT_VIEW (priv->text_view)); } +static gboolean +is_valid_insert (const gchar *text, gint len) +{ + gunichar c; + gint i= 0; + const gchar *current; + if (text == NULL) + return TRUE; + current = text; + + while (((len == -1)||(i < len)) && (*text != '\0')) { + c = g_utf8_get_char (current); + if (c == 0x2022 || c == 0xfffc) + return FALSE; + current = g_utf8_next_char (current); + i = current - text; + } + return TRUE; +} + +static gchar * +create_valid_text (const gchar *text, gint len) +{ + gunichar c; + gint i= 0; + GString *str; + const gchar *current; + + if (text == NULL) + return NULL; + + str = g_string_new (""); + current = text; + + while (((len == -1)||(i < len)) && (*text != '\0')) { + c = g_utf8_get_char (current); + if (c != 0x2022 && c != 0xfffc) + str = g_string_append_unichar (str, c); + current = g_utf8_next_char (current); + i = current - text; + } + return g_string_free (str, FALSE); +} + static void modest_recpt_editor_on_insert_text (GtkTextBuffer *buffer, GtkTextIter *location, @@ -403,6 +495,13 @@ modest_recpt_editor_on_insert_text (GtkTextBuffer *buffer, gunichar prev_char; ModestRecptEditorPrivate *priv = MODEST_RECPT_EDITOR_GET_PRIVATE (editor); + if (!is_valid_insert (text, len)) { + gchar *new_text = create_valid_text (text, len); + g_signal_stop_emission_by_name (G_OBJECT (buffer), "insert-text"); + gtk_text_buffer_insert (buffer, location, new_text, -1); + g_free (new_text); + } + if (iter_has_recipient (location)) { gtk_text_buffer_get_end_iter (buffer, location); gtk_text_buffer_place_cursor (buffer, location); @@ -417,7 +516,7 @@ modest_recpt_editor_on_insert_text (GtkTextBuffer *buffer, return; prev_char = gtk_text_iter_get_char (&prev); g_signal_handlers_block_by_func (buffer, modest_recpt_editor_on_insert_text, editor); - if (prev_char == ';'||prev_char == ',') { + if ((prev_char == ';'||prev_char == ',')&&(!quote_opened(location))) { GtkTextMark *insert; gtk_text_buffer_insert (buffer, location, "\n",-1); insert = gtk_text_buffer_get_insert (buffer); @@ -502,6 +601,31 @@ select_tag_of_iter (GtkTextIter *iter, GtkTextTag *tag) gtk_text_buffer_select_range (gtk_text_iter_get_buffer (iter), &start, &end); } +static gboolean +quote_opened (GtkTextIter *iter) +{ + GtkTextIter start; + GtkTextBuffer *buffer; + gboolean opened = FALSE; + + buffer = gtk_text_iter_get_buffer (iter); + gtk_text_buffer_get_start_iter (buffer, &start); + + while (!gtk_text_iter_equal (&start, iter)) { + gunichar current_char = gtk_text_iter_get_char (&start); + if (current_char == '"') + opened = !opened; + else if (current_char == '\\') + gtk_text_iter_forward_char (&start); + if (!gtk_text_iter_equal (&start, iter)) + gtk_text_iter_forward_char (&start); + + } + return opened; + +} + + static gboolean modest_recpt_editor_on_key_press_event (GtkTextView *text_view, GdkEventKey *key, @@ -543,7 +667,6 @@ modest_recpt_editor_on_key_press_event (GtkTextView *text_view, gboolean cursor_ready = FALSE; while (!cursor_ready) { if (iter_previous_char (&location) == '\n') { - g_message ("INTRO FOUND"); gtk_text_iter_backward_char (&location); } else { cursor_ready = TRUE; @@ -646,7 +769,6 @@ modest_recpt_editor_on_key_press_event (GtkTextView *text_view, if (tag != NULL) { GtkTextIter iter_in_tag; iter_in_tag = location; - g_message ("DELETE PREV SELECTION"); gtk_text_iter_backward_char (&iter_in_tag); select_tag_of_iter (&iter_in_tag, tag); gtk_text_buffer_delete_selection (buffer, TRUE, TRUE); @@ -688,6 +810,14 @@ modest_recpt_editor_grab_focus (ModestRecptEditor *recpt_editor) static void modest_recpt_editor_finalize (GObject *object) { + ModestRecptEditorPrivate *priv; + priv = MODEST_RECPT_EDITOR_GET_PRIVATE (object); + + if (priv->recipients) { + g_free (priv->recipients); + priv->recipients = NULL; + } + (*parent_class->finalize) (object); return;