X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-recpt-editor.c;h=c713db9089ad9cfe370e4d17337c8cd099edcdb2;hp=39bf1cc5af7d0a9fc6cb780f7bca0867fa588121;hb=bc0af9ec72e2b7f4c5aee427f22d36befebef8e7;hpb=49e762881c9d6bd463c6eb88d9bb2b76b40ff3b6 diff --git a/src/widgets/modest-recpt-editor.c b/src/widgets/modest-recpt-editor.c index 39bf1cc..c713db9 100644 --- a/src/widgets/modest-recpt-editor.c +++ b/src/widgets/modest-recpt-editor.c @@ -100,6 +100,8 @@ 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); +static gboolean is_valid_insert (const gchar *text, gint len); +static gchar *create_valid_text (const gchar *text, gint len); /** * modest_recpt_editor_new: @@ -122,14 +124,17 @@ modest_recpt_editor_set_recipients (ModestRecptEditor *recpt_editor, const gchar { ModestRecptEditorPrivate *priv; GtkTextBuffer *buffer = NULL; + gchar *valid_recipients = NULL; 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)); + valid_recipients = create_valid_text (recipients, -1); g_signal_handlers_block_by_func (buffer, modest_recpt_editor_on_insert_text, recpt_editor); - gtk_text_buffer_set_text (buffer, recipients, -1); + gtk_text_buffer_set_text (buffer, valid_recipients, -1); + g_free (valid_recipients); if (GTK_WIDGET_REALIZED (recpt_editor)) gtk_widget_queue_resize (GTK_WIDGET (recpt_editor)); g_signal_handlers_unblock_by_func (buffer, modest_recpt_editor_on_insert_text, recpt_editor); @@ -328,8 +333,11 @@ modest_recpt_editor_instance_init (GTypeInstance *instance, gpointer g_class) gtk_container_add (GTK_CONTAINER (priv->abook_button), abook_icon); priv->text_view = gtk_text_view_new (); - 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); + priv->recipients = NULL; + + priv->scrolled_window = modest_scroll_text_new (GTK_TEXT_VIEW (priv->text_view), 1024); + 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); */ @@ -437,6 +445,84 @@ modest_recpt_editor_on_focus_in (GtkTextView *text_view, gtk_text_view_place_cursor_onscreen (GTK_TEXT_VIEW (priv->text_view)); } +static gboolean +is_valid_insert (const gchar *text, gint len) +{ + gunichar c; + gunichar next_c; + gint i= 0; + gboolean quoted = FALSE; + const gchar *current, *next_current; + if (text == NULL) + return TRUE; + current = text; + + while (((len == -1)||(i < len)) && (*current != '\0')) { + c = g_utf8_get_char (current); + next_current = g_utf8_next_char (current); + if (next_current && *next_current != '\0') + next_c = g_utf8_get_char (g_utf8_next_char (current)); + else + next_c = 0; + if (!quoted && ((c == g_utf8_get_char(",") || c == g_utf8_get_char (";")))) { + if ((next_c != 0) && (next_c != g_utf8_get_char ("\n"))) + return FALSE; + else { + current = g_utf8_next_char (next_current); + continue; + } + } + if (c == 0x2022 || c == 0xfffc || + c == g_utf8_get_char ("\n") || + c == g_utf8_get_char ("\t")) + return FALSE; + if (c == g_utf8_get_char ("\"")) + quoted = !quoted; + current = g_utf8_next_char (current); + i = current - text; + } + return TRUE; +} + +static gchar * +create_valid_text (const gchar *text, gint len) +{ + gunichar c; + gunichar next_c; + gint i= 0; + GString *str; + gboolean quoted = FALSE; + const gchar *current, *next_current; + + if (text == NULL) + return NULL; + + str = g_string_new (""); + current = text; + + while (((len == -1)||(i < len)) && (*current != '\0')) { + c = g_utf8_get_char (current); + next_current = g_utf8_next_char (current); + if (next_current && *next_current != '\0') + next_c = g_utf8_get_char (g_utf8_next_char (current)); + else + next_c = 0; + 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 (c == g_utf8_get_char ("\"")) + quoted = !quoted; + 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, @@ -448,6 +534,14 @@ 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); + return; + } + if (iter_has_recipient (location)) { gtk_text_buffer_get_end_iter (buffer, location); gtk_text_buffer_place_cursor (buffer, location); @@ -753,9 +847,28 @@ modest_recpt_editor_grab_focus (ModestRecptEditor *recpt_editor) gtk_widget_grab_focus (priv->text_view); } +gboolean +modest_recpt_editor_has_focus (ModestRecptEditor *recpt_editor) +{ + ModestRecptEditorPrivate *priv; + + g_return_val_if_fail (MODEST_IS_RECPT_EDITOR (recpt_editor), FALSE); + priv = MODEST_RECPT_EDITOR_GET_PRIVATE (recpt_editor); + + return gtk_widget_is_focus (priv->text_view); +} + 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;