Replace hildon pannable area with modest scrollable in msg view window
[modest] / src / hildon2 / modest-hildon-pannable-area-scrollable.c
1 /* Copyright (c) 2009, Igalia
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <glib/gi18n.h>
31 #include                                        "modest-hildon-pannable-area-scrollable.h"
32
33 static void modest_hildon_pannable_area_scrollable_class_init (ModestHildonPannableAreaScrollableClass *klass);
34 static void modest_hildon_pannable_area_scrollable_init (ModestHildonPannableAreaScrollable *self);
35 static void modest_scrollable_iface_init (gpointer g, gpointer iface_data);
36
37 /* GObject interface */
38 static void modest_hildon_pannable_area_scrollable_finalize (GObject *obj);
39 static void modest_hildon_pannable_area_scrollable_get_property (GObject *obj,
40                                                                  guint prop_id, 
41                                                                  GValue *value, 
42                                                                  GParamSpec *pspec);
43 static void modest_hildon_pannable_area_scrollable_set_property (GObject *obj,
44                                                                  guint prop_id, 
45                                                                  const GValue *value, 
46                                                                  GParamSpec *pspec);
47
48 /* Modest scrollable interface */
49 static void modest_hildon_pannable_area_scrollable_add_with_viewport (ModestScrollable *self, GtkWidget *widget);
50 static void modest_hildon_pannable_area_scrollable_add_with_viewport_default (ModestScrollable *self, GtkWidget *widget);
51 static GtkAdjustment *modest_hildon_pannable_area_scrollable_get_vadjustment (ModestScrollable *self);
52 static GtkAdjustment *modest_hildon_pannable_area_scrollable_get_vadjustment_default (ModestScrollable *self);
53 static GtkAdjustment *modest_hildon_pannable_area_scrollable_get_hadjustment (ModestScrollable *self);
54 static GtkAdjustment *modest_hildon_pannable_area_scrollable_get_hadjustment_default (ModestScrollable *self);
55 static void modest_hildon_pannable_area_scrollable_scroll_to (ModestScrollable *self, const gint x, const gint y);
56 static void modest_hildon_pannable_area_scrollable_scroll_to_default (ModestScrollable *self, const gint x, const gint y);
57 static void modest_hildon_pannable_area_scrollable_jump_to (ModestScrollable *self, const gint x, const gint y);
58 static void modest_hildon_pannable_area_scrollable_jump_to_default (ModestScrollable *self, const gint x, const gint y);
59 static GtkPolicyType modest_hildon_pannable_area_scrollable_get_vertical_policy (ModestScrollable *self);
60 static GtkPolicyType modest_hildon_pannable_area_scrollable_get_vertical_policy_default (ModestScrollable *self);
61 static GtkPolicyType modest_hildon_pannable_area_scrollable_get_horizontal_policy (ModestScrollable *self);
62 static GtkPolicyType modest_hildon_pannable_area_scrollable_get_horizontal_policy_default (ModestScrollable *self);
63 static void modest_hildon_pannable_area_scrollable_set_horizontal_policy (ModestScrollable *self, GtkPolicyType policy);
64 static void modest_hildon_pannable_area_scrollable_set_horizontal_policy_default (ModestScrollable *self, GtkPolicyType policy);
65 static void modest_hildon_pannable_area_scrollable_set_vertical_policy (ModestScrollable *self, GtkPolicyType policy);
66 static void modest_hildon_pannable_area_scrollable_set_vertical_policy_default (ModestScrollable *self, GtkPolicyType policy);
67
68 /* list properties */
69 enum {
70         PROP_0,
71         PROP_HORIZONTAL_POLICY,
72         PROP_VERTICAL_POLICY,
73         PROP_MOVEMENT_MODE,
74         PROP_HORIZONTAL_MAX_OVERSHOOT,
75         PROP_VERTICAL_MAX_OVERSHOOT,
76 };
77
78 /* globals */
79 static HildonPannableAreaClass *parent_class = NULL;
80
81 G_DEFINE_TYPE_EXTENDED    (ModestHildonPannableAreaScrollable,
82                            modest_hildon_pannable_area_scrollable,
83                            HILDON_TYPE_PANNABLE_AREA,
84                            0,
85                            {
86                              G_IMPLEMENT_INTERFACE (MODEST_TYPE_SCROLLABLE, modest_scrollable_iface_init);
87                              g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_BIN);
88                            }
89                            );
90
91 GtkWidget *
92 modest_hildon_pannable_area_scrollable_new                            (void)
93 {
94     GtkWidget *scrollable = g_object_new (MODEST_TYPE_HILDON_PANNABLE_AREA_SCROLLABLE, NULL);
95
96     return scrollable;
97 }
98
99 static void
100 modest_hildon_pannable_area_scrollable_class_init (ModestHildonPannableAreaScrollableClass *klass)
101 {
102         GObjectClass *gobject_class;
103
104         parent_class = g_type_class_peek_parent (klass);
105         gobject_class->finalize = modest_hildon_pannable_area_scrollable_finalize;
106         gobject_class->set_property = modest_hildon_pannable_area_scrollable_set_property;
107         gobject_class->get_property = modest_hildon_pannable_area_scrollable_get_property;
108
109         klass->add_with_viewport_func = modest_hildon_pannable_area_scrollable_add_with_viewport_default;
110         klass->get_vadjustment_func = modest_hildon_pannable_area_scrollable_get_vadjustment_default;
111         klass->get_hadjustment_func = modest_hildon_pannable_area_scrollable_get_hadjustment_default;
112         klass->scroll_to_func = modest_hildon_pannable_area_scrollable_scroll_to_default;
113         klass->jump_to_func = modest_hildon_pannable_area_scrollable_jump_to_default;
114         klass->get_vertical_policy_func = modest_hildon_pannable_area_scrollable_get_vertical_policy_default;
115         klass->get_horizontal_policy_func = modest_hildon_pannable_area_scrollable_get_horizontal_policy_default;
116         klass->set_vertical_policy_func = modest_hildon_pannable_area_scrollable_set_vertical_policy_default;
117         klass->set_horizontal_policy_func = modest_hildon_pannable_area_scrollable_set_horizontal_policy_default;
118
119         g_object_class_install_property (gobject_class,
120                                          PROP_HORIZONTAL_POLICY,
121                                          g_param_spec_enum ("horizontal_policy", 
122                                                             _("Horizontal scrollbar policy"),
123                                                             _("Visual policy of the horizontal scrollbar"),
124                                                             GTK_TYPE_POLICY_TYPE,
125                                                             GTK_POLICY_AUTOMATIC,
126                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
127
128         g_object_class_install_property (gobject_class,
129                                          PROP_VERTICAL_POLICY,
130                                          g_param_spec_enum ("vertical_policy", 
131                                                             _("Vertical scrollbar policy"),
132                                                             _("Visual policy of the vertical scrollbar"),
133                                                             GTK_TYPE_POLICY_TYPE,
134                                                             GTK_POLICY_AUTOMATIC,
135                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
136
137         g_object_class_install_property (gobject_class,
138                                          PROP_MOVEMENT_MODE,
139                                          g_param_spec_enum ("movement_mode",
140                                                             "Directions scroll is allowed",
141                                                             "Movements allowed in the scrollable",
142                                                             MODEST_TYPE_MOVEMENT_MODE,
143                                                             MODEST_MOVEMENT_MODE_VERTICAL,
144                                                             G_PARAM_READWRITE |
145                                                             G_PARAM_CONSTRUCT));
146
147         g_object_class_install_property (gobject_class,
148                                          PROP_HORIZONTAL_MAX_OVERSHOOT,
149                                          g_param_spec_int ("horizontal-max-overshoot",
150                                                            "Horizontal max overshoot",
151                                                            "Horizontal maximum overshoot (0 disables)",
152                                                            0, G_MAXINT, 150,
153                                                            G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
154
155         g_object_class_install_property (gobject_class,
156                                          PROP_VERTICAL_MAX_OVERSHOOT,
157                                          g_param_spec_int ("vertical-max-overshoot",
158                                                            "Vertical max overshoot",
159                                                            "Vertical maximum overshoot (0 disables)",
160                                                            0, G_MAXINT, 150,
161                                                            G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
162 }
163
164 static void
165 modest_hildon_pannable_area_scrollable_init (ModestHildonPannableAreaScrollable *self)
166 {
167 }
168
169 static void
170 modest_scrollable_iface_init (gpointer g, gpointer iface_data)
171 {
172         ModestScrollableIface *iface = (ModestScrollableIface *) g;
173
174         iface->jump_to = modest_hildon_pannable_area_scrollable_jump_to;
175         iface->scroll_to = modest_hildon_pannable_area_scrollable_scroll_to;
176         iface->add_with_viewport = modest_hildon_pannable_area_scrollable_add_with_viewport;
177         iface->get_vadjustment = modest_hildon_pannable_area_scrollable_get_vadjustment;
178         iface->get_hadjustment = modest_hildon_pannable_area_scrollable_get_hadjustment;
179         iface->get_vertical_policy = modest_hildon_pannable_area_scrollable_get_vertical_policy;
180         iface->set_vertical_policy = modest_hildon_pannable_area_scrollable_set_vertical_policy;
181         iface->get_horizontal_policy = modest_hildon_pannable_area_scrollable_get_horizontal_policy;
182         iface->set_horizontal_policy = modest_hildon_pannable_area_scrollable_set_horizontal_policy;
183 }
184
185 static void 
186 modest_hildon_pannable_area_scrollable_finalize (GObject *obj)
187 {
188         G_OBJECT_CLASS(parent_class)->finalize (obj);           
189 }
190
191 static void
192 modest_hildon_pannable_area_scrollable_get_property (GObject *obj,
193                                                      guint prop_id, 
194                                                      GValue *value, 
195                                                      GParamSpec *pspec)
196 {
197         GtkPolicyType policy;
198         HildonMovementMode mov_mode;
199         gint overshoot;
200
201         switch (prop_id) {
202         case PROP_VERTICAL_POLICY:
203                 g_object_get (obj, "vscrollbar-policy", &policy, NULL);
204                 g_value_set_enum (value, policy);
205                 break;
206         case PROP_HORIZONTAL_POLICY:
207                 g_object_get (obj, "hscrollbar-policy", &policy, NULL);
208                 g_value_set_enum (value, policy);
209                 break;
210         case PROP_MOVEMENT_MODE:
211                 g_object_get (obj, "mov-mode", &mov_mode, NULL);
212                 switch (mov_mode) {
213                 case HILDON_MOVEMENT_MODE_HORIZ:
214                         g_value_set_enum (value, MODEST_MOVEMENT_MODE_HORIZONTAL);
215                         break;
216                 case HILDON_MOVEMENT_MODE_BOTH:
217                         g_value_set_enum (value, MODEST_MOVEMENT_MODE_BOTH);
218                         break;
219                 default:
220                 case HILDON_MOVEMENT_MODE_VERT:
221                         g_value_set_enum (value, MODEST_MOVEMENT_MODE_VERTICAL);
222                         break;
223                 }
224                 break;
225         case PROP_HORIZONTAL_MAX_OVERSHOOT:
226                 g_object_get (obj, "hovershoot-max", &overshoot, NULL);
227                 g_value_set_int (value, overshoot);
228                 break;
229         case PROP_VERTICAL_MAX_OVERSHOOT:
230                 g_object_get (obj, "vovershoot-max", &overshoot, NULL);
231                 g_value_set_int (value, overshoot);
232                 break;
233         default:
234                 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
235                 break;
236         }
237 }
238
239 static void
240 modest_hildon_pannable_area_scrollable_set_property (GObject *obj,
241                                                      guint prop_id, 
242                                                      const GValue *value, 
243                                                      GParamSpec *pspec)
244 {
245         GtkPolicyType policy;
246         ModestMovementMode mov_mode;
247         gint overshoot;
248
249         switch (prop_id) {
250         case PROP_VERTICAL_POLICY:
251                 policy = g_value_get_enum (value);
252                 g_object_set (obj, "vscrollbar-policy", policy, NULL);
253                 break;
254         case PROP_HORIZONTAL_POLICY:
255                 policy = g_value_get_enum (value);
256                 g_object_set (obj, "hscrollbar-policy", policy, NULL);
257                 break;
258         case PROP_MOVEMENT_MODE:
259                 mov_mode = g_value_get_enum (value);
260                 switch (mov_mode) {
261                 case MODEST_MOVEMENT_MODE_HORIZONTAL:
262                         g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_HORIZ, NULL);
263                         break;
264                 case HILDON_MOVEMENT_MODE_BOTH:
265                         g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_BOTH, NULL);
266                         break;
267                 default:
268                 case MODEST_MOVEMENT_MODE_VERTICAL:
269                         g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL);
270                         break;
271                 }
272                 break;
273         case PROP_HORIZONTAL_MAX_OVERSHOOT:
274                 overshoot = g_value_get_int (value);
275                 g_object_set (obj, "hovershoot-max", overshoot, NULL);
276                 break;
277         case PROP_VERTICAL_MAX_OVERSHOOT:
278                 overshoot = g_value_get_int (value);
279                 g_object_set (obj, "vovershoot-max", overshoot, NULL);
280                 break;
281         default:
282                 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
283                 break;
284         }
285 }
286
287 static void
288 modest_hildon_pannable_area_scrollable_add_with_viewport (ModestScrollable *self,
289                                                           GtkWidget *widget)
290 {
291         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->add_with_viewport_func (self, widget);
292 }
293
294 static void
295 modest_hildon_pannable_area_scrollable_add_with_viewport_default (ModestScrollable *self,
296                                                                   GtkWidget *widget)
297 {
298         hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (self), widget);
299 }
300
301 static GtkAdjustment *
302 modest_hildon_pannable_area_scrollable_get_vadjustment (ModestScrollable *self)
303 {
304         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_vadjustment_func (self);
305 }
306
307 static GtkAdjustment *
308 modest_hildon_pannable_area_scrollable_get_vadjustment_default (ModestScrollable *self)
309 {
310         return hildon_pannable_area_get_vadjustment (HILDON_PANNABLE_AREA (self));
311 }
312
313 static GtkAdjustment *
314 modest_hildon_pannable_area_scrollable_get_hadjustment (ModestScrollable *self)
315 {
316         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_hadjustment_func (self);
317 }
318
319 static GtkAdjustment *
320 modest_hildon_pannable_area_scrollable_get_hadjustment_default (ModestScrollable *self)
321 {
322         return hildon_pannable_area_get_hadjustment (HILDON_PANNABLE_AREA (self));
323 }
324
325 static void
326 modest_hildon_pannable_area_scrollable_scroll_to (ModestScrollable *self, 
327                                                   const gint x, const gint y)
328 {
329         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->scroll_to_func (self, x, y);
330 }
331
332 static void
333 modest_hildon_pannable_area_scrollable_scroll_to_default (ModestScrollable *self,
334                                                           const gint x, const gint y)
335 {
336         hildon_pannable_area_scroll_to (HILDON_PANNABLE_AREA (self), x, y);
337 }
338
339 static void
340 modest_hildon_pannable_area_scrollable_jump_to (ModestScrollable *self, 
341                                                 const gint x, const gint y)
342 {
343         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->jump_to_func (self, x, y);
344 }
345
346 static void
347 modest_hildon_pannable_area_scrollable_jump_to_default (ModestScrollable *self,
348                                                         const gint x, const gint y)
349 {
350         hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (self), x, y);
351 }
352
353 static GtkPolicyType
354 modest_hildon_pannable_area_scrollable_get_vertical_policy (ModestScrollable *self)
355 {
356         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_vertical_policy_func (self);
357 }
358
359 static GtkPolicyType
360 modest_hildon_pannable_area_scrollable_get_vertical_policy_default (ModestScrollable *self)
361 {
362         GtkPolicyType policy;
363
364         g_object_get (G_OBJECT (self), "vscrollbar-policy", &policy, NULL);
365         return policy;
366 }
367
368 static GtkPolicyType
369 modest_hildon_pannable_area_scrollable_get_horizontal_policy (ModestScrollable *self)
370 {
371         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_horizontal_policy_func (self);
372 }
373
374 static GtkPolicyType
375 modest_hildon_pannable_area_scrollable_get_horizontal_policy_default (ModestScrollable *self)
376 {
377         GtkPolicyType policy;
378
379         g_object_get (G_OBJECT (self), "hscrollbar-policy", &policy, NULL);
380         return policy;
381 }
382
383 static void
384 modest_hildon_pannable_area_scrollable_set_horizontal_policy (ModestScrollable *self,
385                                                               GtkPolicyType policy)
386 {
387         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->set_horizontal_policy_func (self, policy);
388 }
389
390 static void
391 modest_hildon_pannable_area_scrollable_set_horizontal_policy_default (ModestScrollable *self,
392                                                                       GtkPolicyType policy)
393 {
394         g_object_set (G_OBJECT (self), "hscrollbar-policy", policy, NULL);
395 }
396
397 static void
398 modest_hildon_pannable_area_scrollable_set_vertical_policy (ModestScrollable *self,
399                                                             GtkPolicyType policy)
400 {
401         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->set_vertical_policy_func (self, policy);
402 }
403
404 static void
405 modest_hildon_pannable_area_scrollable_set_vertical_policy_default (ModestScrollable *self,
406                                                                     GtkPolicyType policy)
407 {
408         g_object_set (G_OBJECT (self), "vscrollbar-policy", policy, NULL);
409 }