X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-signature-editor-dialog.c;h=69cd063b854190d43ffbe66c86736e817bf422e5;hb=86c4b693d6773178fab408d3c2f9dbfdc49562c8;hp=2eb606904fe5a318f52627675bcc7366513611fa;hpb=71af7294c7147e8a1acf8b8e655e7005127fc2bd;p=modest diff --git a/src/hildon2/modest-signature-editor-dialog.c b/src/hildon2/modest-signature-editor-dialog.c index 2eb6069..69cd063 100644 --- a/src/hildon2/modest-signature-editor-dialog.c +++ b/src/hildon2/modest-signature-editor-dialog.c @@ -33,15 +33,16 @@ #include "widgets/modest-validating-entry.h" #include "modest-runtime.h" #include -#include #include #include #include #include -#include +#include #include #include #include +#include "modest-text-utils.h" +#include G_DEFINE_TYPE (ModestSignatureEditorDialog, modest_signature_editor_dialog, GTK_TYPE_DIALOG); @@ -54,10 +55,15 @@ struct _ModestSignatureEditorDialogPrivate { GtkWidget *checkbox_use; GtkWidget *label; - GtkWidget *scrolledwindow; + GtkWidget *pannable; GtkWidget *textview; + + guint correct_scroll_idle; }; +static void text_buffer_end_user_action (GtkTextBuffer *buffer, + ModestSignatureEditorDialog *userdata); + static void modest_signature_editor_dialog_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) @@ -88,6 +94,14 @@ modest_signature_editor_dialog_dispose (GObject *object) static void modest_signature_editor_dialog_finalize (GObject *object) { + ModestSignatureEditorDialogPrivate *priv; + + priv = SIGNATURE_EDITOR_DIALOG_GET_PRIVATE (object); + + if (priv->correct_scroll_idle > 0) { + g_source_remove (priv->correct_scroll_idle); + priv->correct_scroll_idle = 0; + } G_OBJECT_CLASS (modest_signature_editor_dialog_parent_class)->finalize (object); } @@ -110,9 +124,9 @@ enable_widgets (ModestSignatureEditorDialog *self) ModestSignatureEditorDialogPrivate *priv = SIGNATURE_EDITOR_DIALOG_GET_PRIVATE (self); - const gboolean enable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->checkbox_use)); + const gboolean enable = hildon_check_button_get_active (HILDON_CHECK_BUTTON (priv->checkbox_use)); gtk_widget_set_sensitive (priv->label, enable); - gtk_widget_set_sensitive (priv->scrolledwindow, enable); + gtk_widget_set_sensitive (priv->textview, enable); gtk_text_view_set_editable (GTK_TEXT_VIEW (priv->textview), enable); } @@ -128,53 +142,64 @@ modest_signature_editor_dialog_init (ModestSignatureEditorDialog *self) { ModestSignatureEditorDialogPrivate *priv = SIGNATURE_EDITOR_DIALOG_GET_PRIVATE (self); + GtkWidget *top_box, *align; gtk_window_set_title (GTK_WINDOW (self), _("mcen_ti_email_signatures_edit_title")); GtkWidget *box = GTK_DIALOG(self)->vbox; /* gtk_vbox_new (FALSE, MODEST_MARGIN_HALF); */ - gtk_container_set_border_width (GTK_CONTAINER (box), MODEST_MARGIN_HALF); - - priv->checkbox_use = gtk_check_button_new_with_label ( - _("mcen_fi_email_signatures_use_signature")); - gtk_box_pack_start (GTK_BOX (box), priv->checkbox_use, FALSE, FALSE, MODEST_MARGIN_HALF); + top_box = gtk_vbox_new (FALSE, 0); + + priv->checkbox_use = hildon_check_button_new (HILDON_SIZE_FINGER_HEIGHT); + gtk_button_set_label (GTK_BUTTON (priv->checkbox_use), + _("mcen_fi_email_signatures_use_signature")); + gtk_button_set_alignment (GTK_BUTTON (priv->checkbox_use), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (top_box), priv->checkbox_use, FALSE, FALSE, 0); gtk_widget_show (priv->checkbox_use); g_signal_connect (G_OBJECT (priv->checkbox_use), "toggled", - G_CALLBACK (on_toggle_button_changed), self); - + G_CALLBACK (on_toggle_button_changed), self); priv->label = gtk_label_new (""); /* Set in modest_signature_editor_dialog_set_settings(). */ - gtk_box_pack_start (GTK_BOX (box), priv->label, FALSE, FALSE, MODEST_MARGIN_HALF); + gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.0); + gtk_misc_set_padding (GTK_MISC (priv->label), MODEST_MARGIN_DOUBLE, MODEST_MARGIN_DOUBLE); + gtk_box_pack_start (GTK_BOX (top_box), priv->label, FALSE, FALSE, 0); gtk_widget_show (priv->label); - priv->scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (priv->scrolledwindow), MODEST_MARGIN_DEFAULT); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolledwindow), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scrolledwindow), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (box), priv->scrolledwindow, FALSE, FALSE, MODEST_MARGIN_HALF); - gtk_widget_show (priv->scrolledwindow); - - priv->textview = gtk_text_view_new (); - gtk_container_add (GTK_CONTAINER (priv->scrolledwindow), priv->textview); + priv->textview = hildon_text_view_new (); gtk_widget_show (priv->textview); - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->textview)); - gtk_text_buffer_set_text (buffer, "--\n", -1); /* Default, as per the UI spec. */ + GtkTextBuffer *buffer = hildon_text_view_get_buffer (HILDON_TEXT_VIEW (priv->textview)); + gtk_text_buffer_set_text (buffer, _("mcen_va_default_signature_tablet"), -1); /* Default, as per the UI spec. */ + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (priv->textview), GTK_WRAP_WORD_CHAR); + gtk_box_pack_start (GTK_BOX (top_box), priv->textview, TRUE, TRUE, 0); + + g_signal_connect (G_OBJECT (buffer), "end-user-action", + G_CALLBACK (text_buffer_end_user_action), self); /* Add the buttons: */ - gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_dialog_ok"), GTK_RESPONSE_OK); - gtk_dialog_add_button (GTK_DIALOG (self), _("mcen_bd_dialog_cancel"), GTK_RESPONSE_CANCEL); + gtk_dialog_add_button (GTK_DIALOG (self), _HL("wdgt_bd_save"), GTK_RESPONSE_OK); + + align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0); + gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, MODEST_MARGIN_DOUBLE, 0); + gtk_widget_show (align); + gtk_container_add (GTK_CONTAINER (align), top_box); + gtk_widget_show (top_box); + + priv->pannable = hildon_pannable_area_new (); + hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (priv->pannable), align); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (self)->vbox), priv->pannable); + gtk_widget_show (priv->pannable); + gtk_widget_show (box); - gtk_widget_set_size_request (GTK_WIDGET (self), 480, -1); + gtk_widget_set_size_request (GTK_WIDGET (self), -1, MODEST_DIALOG_WINDOW_MAX_HEIGHT); /* When this window is shown, hibernation should not be possible, * because there is no sensible way to save the state: */ modest_window_mgr_prevent_hibernation_while_window_is_shown ( modest_runtime_get_window_mgr (), GTK_WINDOW (self)); + + priv->correct_scroll_idle = 0; - hildon_help_dialog_help_enable (GTK_DIALOG(self), "applications_email_signatureeditor", - modest_maemo_utils_get_osso_context()); } ModestSignatureEditorDialog* @@ -198,13 +223,13 @@ modest_signature_editor_dialog_set_settings ( gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END); g_free (label_text); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->checkbox_use), use_signature); + hildon_check_button_set_active (HILDON_CHECK_BUTTON (priv->checkbox_use), use_signature); - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->textview)); - if (signature) + GtkTextBuffer *buffer = hildon_text_view_get_buffer (HILDON_TEXT_VIEW (priv->textview)); + if (signature && signature[0] != '\0') gtk_text_buffer_set_text (buffer, signature, -1); else - gtk_text_buffer_set_text (buffer, "--\n", -1); /* Default, as per the UI spec. */ + gtk_text_buffer_set_text (buffer, _("mcen_va_default_signature_tablet"), -1); /* Default, as per the UI spec. */ enable_widgets (window); } @@ -220,11 +245,88 @@ modest_signature_editor_dialog_get_settings ( g_assert(use_signature); - *use_signature = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->checkbox_use)); + *use_signature = hildon_check_button_get_active (HILDON_CHECK_BUTTON (priv->checkbox_use)); - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->textview)); + GtkTextBuffer *buffer = hildon_text_view_get_buffer (HILDON_TEXT_VIEW (priv->textview)); GtkTextIter start, end; gtk_text_buffer_get_bounds (buffer, &start, &end); return gtk_text_buffer_get_text (buffer, &start, &end, TRUE); } + +static gboolean +correct_scroll_idle_func (gpointer userdata) +{ + ModestSignatureEditorDialog *self = (ModestSignatureEditorDialog *) userdata; + ModestSignatureEditorDialogPrivate *priv; + GtkTextBuffer *buffer; + GtkTextIter iter; + GdkRectangle rectangle; + gint offset_min, offset_max; + GtkTextMark *insert; + GtkAdjustment *vadj; + + /* It could happen that the window was already closed */ + if (!GTK_WIDGET_VISIBLE (self)) + return FALSE; + + priv = SIGNATURE_EDITOR_DIALOG_GET_PRIVATE(self); + buffer = hildon_text_view_get_buffer (HILDON_TEXT_VIEW (priv->textview)); + + insert = gtk_text_buffer_get_insert (buffer); + gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert); + + gtk_text_view_get_iter_location (GTK_TEXT_VIEW (priv->textview), &iter, &rectangle); + offset_min = priv->textview->allocation.y + rectangle.y; + offset_max = offset_min + rectangle.height; + + vadj = hildon_pannable_area_get_vadjustment (HILDON_PANNABLE_AREA (priv->pannable)); + offset_min = MAX (offset_min - 48, 0); + offset_max = MIN (offset_max + 48, vadj->upper); + + if ((offset_min < vadj->value) || (offset_max > vadj->value + vadj->page_size)) { + /* We check if the current center of the visible area is already matching the center + of the selection */ + gint offset_center; + gint center_top, center_bottom; + + offset_center = (offset_min + offset_max) / 2; + center_top = vadj->value + vadj->page_size / 3; + center_bottom = vadj->value + vadj->page_size * 2 / 3; + + if ((offset_center < center_top) || + (offset_center > center_bottom)) + hildon_pannable_area_scroll_to (HILDON_PANNABLE_AREA (priv->pannable), -1, offset_center); + } + + priv->correct_scroll_idle = 0; + return FALSE; +} + +static void correct_scroll (ModestSignatureEditorDialog *self) +{ + ModestSignatureEditorDialogPrivate *priv; + + priv = SIGNATURE_EDITOR_DIALOG_GET_PRIVATE(self); + + if (!gtk_widget_is_focus (priv->textview)) + return; + + if (priv->correct_scroll_idle > 0) { + return; + } + + priv->correct_scroll_idle = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + (GSourceFunc) correct_scroll_idle_func, + g_object_ref (self), + g_object_unref); +} + +static void +text_buffer_end_user_action (GtkTextBuffer *buffer, + ModestSignatureEditorDialog *userdata) +{ + + correct_scroll (userdata); +} +