#include "modest-signature-editor-dialog.h"
#include "widgets/modest-ui-constants.h"
#include "modest-hildon-includes.h"
-#include "widgets/modest-serversecurity-combo-box.h"
-#include "widgets/modest-secureauth-combo-box.h"
#include "widgets/modest-validating-entry.h"
#include "modest-runtime.h"
#include <modest-account-mgr-helpers.h>
-#include <gtk/gtkcheckbutton.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtkvbox.h>
#include <gtk/gtktextview.h>
#include <gtk/gtklabel.h>
-#include <gtk/gtkscrolledwindow.h>
+#include <hildon/hildon-pannable-area.h>
#include <gtk/gtkstock.h>
#include <glib/gi18n.h>
#include <modest-maemo-utils.h>
+#include "modest-text-utils.h"
+#include <hildon/hildon-text-view.h>
G_DEFINE_TYPE (ModestSignatureEditorDialog, modest_signature_editor_dialog, GTK_TYPE_DIALOG);
{
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)
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);
}
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);
}
{
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*
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);
}
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);
+}
+