Added new wptextview child to support hildon style panning
authorJose Dapena Paz <jdapena@igalia.com>
Mon, 9 Mar 2009 14:11:25 +0000 (14:11 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Mon, 9 Mar 2009 14:11:25 +0000 (14:11 +0000)
pmo-trunk-r7900

src/hildon2/Makefile.am
src/hildon2/modest-wp-text-view.c [new file with mode: 0644]
src/hildon2/modest-wp-text-view.h [new file with mode: 0644]

index dc91fb8..4e017e5 100644 (file)
@@ -65,6 +65,8 @@ libmodest_ui_la_SOURCES=              \
        modest-icon-names.h           \
        modest-hildon2-global-settings-dialog.c \
        modest-hildon2-global-settings-dialog.h \
+       modest-wp-text-view.c \
+       modest-wp-text-view.h \
        modest-maemo-security-options-view.c \
        modest-main-window.c          \
        modest-main-window-ui.h       \
diff --git a/src/hildon2/modest-wp-text-view.c b/src/hildon2/modest-wp-text-view.c
new file mode 100644 (file)
index 0000000..10a13a0
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation, all rights reserved.
+ *
+ */
+
+#include                                        "modest-wp-text-view.h"
+#include <math.h>
+
+#define MODEST_WP_TEXT_VIEW_DRAG_THRESHOLD 16.0
+
+G_DEFINE_TYPE                                   (ModestWpTextView, modest_wp_text_view, WP_TYPE_TEXT_VIEW);
+
+#define                                         MODEST_WP_TEXT_VIEW_GET_PRIVATE(obj) \
+                                                (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
+                                                MODEST_TYPE_WP_TEXT_VIEW, ModestWpTextViewPrivate));
+
+typedef struct                                  _ModestWpTextViewPrivate ModestWpTextViewPrivate;
+
+struct                                          _ModestWpTextViewPrivate
+{
+    gdouble x;                                                      /* tap x position */
+    gdouble y;                                                      /* tap y position */
+};
+
+GtkWidget *
+modest_wp_text_view_new                            (void)
+{
+    GtkWidget *entry = g_object_new (MODEST_TYPE_WP_TEXT_VIEW, NULL);
+
+    return entry;
+}
+
+static gint
+modest_wp_text_view_button_press_event (GtkWidget        *widget,
+                                       GdkEventButton   *event)
+{
+    ModestWpTextViewPrivate *priv = MODEST_WP_TEXT_VIEW_GET_PRIVATE (widget);
+
+    if (GTK_TEXT_VIEW (widget)->editable &&
+        hildon_gtk_im_context_filter_event (GTK_TEXT_VIEW (widget)->im_context, (GdkEvent*)event)) {
+        GTK_TEXT_VIEW (widget)->need_im_reset = TRUE;
+        return TRUE;
+    }
+
+    if (event->button == 1 && event->type == GDK_BUTTON_PRESS) {
+        priv->x = event->x;
+        priv->y = event->y;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static gint
+modest_wp_text_view_button_release_event (GtkWidget        *widget,
+                                         GdkEventButton   *event)
+{
+    GtkTextView *text_view = GTK_TEXT_VIEW (widget);
+    ModestWpTextViewPrivate *priv = MODEST_WP_TEXT_VIEW_GET_PRIVATE (widget);
+    GtkTextIter iter;
+    gint x, y;
+
+    if (text_view->editable &&
+        hildon_gtk_im_context_filter_event (text_view->im_context, (GdkEvent*)event)) {
+        text_view->need_im_reset = TRUE;
+        return TRUE;
+    }
+
+    if (event->button == 1 && event->type == GDK_BUTTON_RELEASE) {
+        if (fabs (priv->x - event->x) < MODEST_WP_TEXT_VIEW_DRAG_THRESHOLD &&
+            fabs (priv->y - event->y) < MODEST_WP_TEXT_VIEW_DRAG_THRESHOLD) {
+            GtkTextWindowType window_type;
+           GtkTextBuffer *buffer;
+
+            window_type = gtk_text_view_get_window_type (text_view, event->window);
+            gtk_text_view_window_to_buffer_coords (text_view,
+                                                   window_type,
+                                                   event->x, event->y,
+                                                   &x, &y);
+            gtk_text_view_get_iter_at_location (text_view, &iter, x, y);
+           buffer = gtk_text_view_get_buffer (text_view);
+            if (gtk_text_buffer_get_char_count (buffer))
+                gtk_text_buffer_place_cursor (buffer, &iter);
+
+            gtk_widget_grab_focus (GTK_WIDGET (text_view));
+
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+static void
+modest_wp_text_view_finalize                       (GObject *object)
+{
+    if (G_OBJECT_CLASS (modest_wp_text_view_parent_class)->finalize)
+        G_OBJECT_CLASS (modest_wp_text_view_parent_class)->finalize (object);
+}
+
+static void
+modest_wp_text_view_class_init                     (ModestWpTextViewClass *klass)
+{
+    GObjectClass *gobject_class = (GObjectClass *)klass;
+    GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
+
+    gobject_class->finalize = modest_wp_text_view_finalize;
+    widget_class->motion_notify_event = NULL;
+    widget_class->button_press_event = modest_wp_text_view_button_press_event;
+    widget_class->button_release_event = modest_wp_text_view_button_release_event;
+
+    g_type_class_add_private (klass, sizeof (ModestWpTextViewPrivate));
+}
+
+static void
+modest_wp_text_view_init                           (ModestWpTextView *self)
+{
+}
diff --git a/src/hildon2/modest-wp-text-view.h b/src/hildon2/modest-wp-text-view.h
new file mode 100644 (file)
index 0000000..0538561
--- /dev/null
@@ -0,0 +1,53 @@
+#ifndef                                         __MODEST_WP_TEXT_VIEW_H__
+#define                                         __MODEST_WP_TEXT_VIEW_H__
+
+#include                                        <wptextview.h>
+
+G_BEGIN_DECLS
+
+#define                                         MODEST_TYPE_WP_TEXT_VIEW \
+                                                (modest_wp_text_view_get_type())
+
+#define                                         MODEST_WP_TEXT_VIEW(obj) \
+                                                (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                                WP_TYPE_TEXT_VIEW, ModestWpTextView))
+
+#define                                         MODEST_WP_TEXT_VIEW_CLASS(klass) \
+                                                (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                                WP_TYPE_TEXT_VIEW, ModestWpTextViewClass))
+
+#define                                         MODEST_IS_WP_TEXT_VIEW(obj) \
+                                                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), WP_TYPE_TEXT_VIEW))
+
+#define                                         MODEST_IS_WP_TEXT_VIEW_CLASS(klass) \
+                                                (G_TYPE_CHECK_CLASS_TYPE ((klass), WP_TYPE_TEXT_VIEW))
+
+#define                                         MODEST_WP_TEXT_VIEW_GET_CLASS(obj) \
+                                                (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                                MODEST_TYPE_WP_TEXT_VIEW, ModestWpTextViewClass))
+
+typedef struct                                  _ModestWpTextView ModestWpTextView;
+
+typedef struct                                  _ModestWpTextViewClass ModestWpTextViewClass;
+
+struct                                          _ModestWpTextViewClass
+{
+    WPTextViewClass parent_class;
+};
+
+struct                                          _ModestWpTextView
+{
+    WPTextView parent;
+};
+
+
+GType
+modest_wp_text_view_get_type                       (void) G_GNUC_CONST;
+
+GtkWidget *
+modest_wp_text_view_new                            (void);
+
+
+G_END_DECLS
+
+#endif /* __MODEST_WP_TEXT_VIEW_H__ */