Fix modest_tny_msg_header_get_all_recipients_list (in case from is empty)
[modest] / src / hildon2 / modest-wp-text-view.c
1 /*
2  * Copyright (C) 2009 Nokia Corporation, all rights reserved.
3  *
4  */
5
6 #include                                        "modest-wp-text-view.h"
7 #include <math.h>
8
9 #define MODEST_WP_TEXT_VIEW_DRAG_THRESHOLD 16.0
10
11 G_DEFINE_TYPE                                   (ModestWpTextView, modest_wp_text_view, WP_TYPE_TEXT_VIEW);
12
13 #define                                         MODEST_WP_TEXT_VIEW_GET_PRIVATE(obj) \
14                                                 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
15                                                 MODEST_TYPE_WP_TEXT_VIEW, ModestWpTextViewPrivate));
16
17 typedef struct                                  _ModestWpTextViewPrivate ModestWpTextViewPrivate;
18
19 struct                                          _ModestWpTextViewPrivate
20 {
21     gdouble x;                                                      /* tap x position */
22     gdouble y;                                                      /* tap y position */
23 };
24
25 GtkWidget *
26 modest_wp_text_view_new                            (void)
27 {
28     GtkWidget *entry = g_object_new (MODEST_TYPE_WP_TEXT_VIEW, NULL);
29
30     return entry;
31 }
32
33 static gint
34 modest_wp_text_view_button_press_event (GtkWidget        *widget,
35                                         GdkEventButton   *event)
36 {
37     ModestWpTextViewPrivate *priv = MODEST_WP_TEXT_VIEW_GET_PRIVATE (widget);
38
39     if (GTK_TEXT_VIEW (widget)->editable &&
40         hildon_gtk_im_context_filter_event (GTK_TEXT_VIEW (widget)->im_context, (GdkEvent*)event)) {
41         GTK_TEXT_VIEW (widget)->need_im_reset = TRUE;
42         return TRUE;
43     }
44
45     if (event->button == 1 && event->type == GDK_BUTTON_PRESS) {
46         priv->x = event->x;
47         priv->y = event->y;
48
49         return TRUE;
50     }
51
52     return FALSE;
53 }
54
55 static gint
56 modest_wp_text_view_button_release_event (GtkWidget        *widget,
57                                           GdkEventButton   *event)
58 {
59     GtkTextView *text_view = GTK_TEXT_VIEW (widget);
60     ModestWpTextViewPrivate *priv = MODEST_WP_TEXT_VIEW_GET_PRIVATE (widget);
61     GtkTextIter iter;
62     gint x, y;
63
64     if (text_view->editable &&
65         hildon_gtk_im_context_filter_event (text_view->im_context, (GdkEvent*)event)) {
66         text_view->need_im_reset = TRUE;
67         return TRUE;
68     }
69
70     if (event->button == 1 && event->type == GDK_BUTTON_RELEASE) {
71         if (fabs (priv->x - event->x) < MODEST_WP_TEXT_VIEW_DRAG_THRESHOLD &&
72             fabs (priv->y - event->y) < MODEST_WP_TEXT_VIEW_DRAG_THRESHOLD) {
73             GtkTextWindowType window_type;
74             GtkTextBuffer *buffer;
75
76             window_type = gtk_text_view_get_window_type (text_view, event->window);
77             gtk_text_view_window_to_buffer_coords (text_view,
78                                                    window_type,
79                                                    event->x, event->y,
80                                                    &x, &y);
81             gtk_text_view_get_iter_at_location (text_view, &iter, x, y);
82             buffer = gtk_text_view_get_buffer (text_view);
83             if (gtk_text_buffer_get_char_count (buffer))
84                 gtk_text_buffer_place_cursor (buffer, &iter);
85
86             gtk_widget_grab_focus (GTK_WIDGET (text_view));
87
88             return TRUE;
89         }
90     }
91     return FALSE;
92 }
93
94 static void
95 modest_wp_text_view_finalize                       (GObject *object)
96 {
97     if (G_OBJECT_CLASS (modest_wp_text_view_parent_class)->finalize)
98         G_OBJECT_CLASS (modest_wp_text_view_parent_class)->finalize (object);
99 }
100
101 static void
102 modest_wp_text_view_class_init                     (ModestWpTextViewClass *klass)
103 {
104     GObjectClass *gobject_class = (GObjectClass *)klass;
105     GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
106
107     gobject_class->finalize = modest_wp_text_view_finalize;
108     widget_class->motion_notify_event = NULL;
109     widget_class->button_press_event = modest_wp_text_view_button_press_event;
110     widget_class->button_release_event = modest_wp_text_view_button_release_event;
111
112     g_type_class_add_private (klass, sizeof (ModestWpTextViewPrivate));
113 }
114
115 static void
116 modest_wp_text_view_init                           (ModestWpTextView *self)
117 {
118 }