f4e7a7f6b9d3a5b93e13e25b47083e295fc6679f
[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, 
95                                               "initial-hint", TRUE, 
96                                               NULL);
97
98     return scrollable;
99 }
100
101 static void
102 modest_hildon_pannable_area_scrollable_class_init (ModestHildonPannableAreaScrollableClass *klass)
103 {
104         GObjectClass *gobject_class;
105
106         parent_class = g_type_class_peek_parent (klass);
107         gobject_class->finalize = modest_hildon_pannable_area_scrollable_finalize;
108         gobject_class->set_property = modest_hildon_pannable_area_scrollable_set_property;
109         gobject_class->get_property = modest_hildon_pannable_area_scrollable_get_property;
110
111         klass->add_with_viewport_func = modest_hildon_pannable_area_scrollable_add_with_viewport_default;
112         klass->get_vadjustment_func = modest_hildon_pannable_area_scrollable_get_vadjustment_default;
113         klass->get_hadjustment_func = modest_hildon_pannable_area_scrollable_get_hadjustment_default;
114         klass->scroll_to_func = modest_hildon_pannable_area_scrollable_scroll_to_default;
115         klass->jump_to_func = modest_hildon_pannable_area_scrollable_jump_to_default;
116         klass->get_vertical_policy_func = modest_hildon_pannable_area_scrollable_get_vertical_policy_default;
117         klass->get_horizontal_policy_func = modest_hildon_pannable_area_scrollable_get_horizontal_policy_default;
118         klass->set_vertical_policy_func = modest_hildon_pannable_area_scrollable_set_vertical_policy_default;
119         klass->set_horizontal_policy_func = modest_hildon_pannable_area_scrollable_set_horizontal_policy_default;
120
121         g_object_class_install_property (gobject_class,
122                                          PROP_HORIZONTAL_POLICY,
123                                          g_param_spec_enum ("horizontal_policy", 
124                                                             _("Horizontal scrollbar policy"),
125                                                             _("Visual policy of the horizontal scrollbar"),
126                                                             GTK_TYPE_POLICY_TYPE,
127                                                             GTK_POLICY_AUTOMATIC,
128                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
129
130         g_object_class_install_property (gobject_class,
131                                          PROP_VERTICAL_POLICY,
132                                          g_param_spec_enum ("vertical_policy", 
133                                                             _("Vertical scrollbar policy"),
134                                                             _("Visual policy of the vertical scrollbar"),
135                                                             GTK_TYPE_POLICY_TYPE,
136                                                             GTK_POLICY_AUTOMATIC,
137                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
138
139         g_object_class_install_property (gobject_class,
140                                          PROP_MOVEMENT_MODE,
141                                          g_param_spec_enum ("movement_mode",
142                                                             "Directions scroll is allowed",
143                                                             "Movements allowed in the scrollable",
144                                                             MODEST_TYPE_MOVEMENT_MODE,
145                                                             MODEST_MOVEMENT_MODE_VERTICAL,
146                                                             G_PARAM_READWRITE |
147                                                             G_PARAM_CONSTRUCT));
148
149         g_object_class_install_property (gobject_class,
150                                          PROP_HORIZONTAL_MAX_OVERSHOOT,
151                                          g_param_spec_int ("horizontal-max-overshoot",
152                                                            "Horizontal max overshoot",
153                                                            "Horizontal maximum overshoot (0 disables)",
154                                                            0, G_MAXINT, 150,
155                                                            G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
156
157         g_object_class_install_property (gobject_class,
158                                          PROP_VERTICAL_MAX_OVERSHOOT,
159                                          g_param_spec_int ("vertical-max-overshoot",
160                                                            "Vertical max overshoot",
161                                                            "Vertical maximum overshoot (0 disables)",
162                                                            0, G_MAXINT, 150,
163                                                            G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
164 }
165
166 static void
167 modest_hildon_pannable_area_scrollable_init (ModestHildonPannableAreaScrollable *self)
168 {
169 }
170
171 static void
172 modest_scrollable_iface_init (gpointer g, gpointer iface_data)
173 {
174         ModestScrollableIface *iface = (ModestScrollableIface *) g;
175
176         iface->jump_to = modest_hildon_pannable_area_scrollable_jump_to;
177         iface->scroll_to = modest_hildon_pannable_area_scrollable_scroll_to;
178         iface->add_with_viewport = modest_hildon_pannable_area_scrollable_add_with_viewport;
179         iface->get_vadjustment = modest_hildon_pannable_area_scrollable_get_vadjustment;
180         iface->get_hadjustment = modest_hildon_pannable_area_scrollable_get_hadjustment;
181         iface->get_vertical_policy = modest_hildon_pannable_area_scrollable_get_vertical_policy;
182         iface->set_vertical_policy = modest_hildon_pannable_area_scrollable_set_vertical_policy;
183         iface->get_horizontal_policy = modest_hildon_pannable_area_scrollable_get_horizontal_policy;
184         iface->set_horizontal_policy = modest_hildon_pannable_area_scrollable_set_horizontal_policy;
185 }
186
187 static void 
188 modest_hildon_pannable_area_scrollable_finalize (GObject *obj)
189 {
190         G_OBJECT_CLASS(parent_class)->finalize (obj);           
191 }
192
193 static void
194 modest_hildon_pannable_area_scrollable_get_property (GObject *obj,
195                                                      guint prop_id, 
196                                                      GValue *value, 
197                                                      GParamSpec *pspec)
198 {
199         GtkPolicyType policy;
200         HildonMovementMode mov_mode;
201         gint overshoot;
202
203         switch (prop_id) {
204         case PROP_VERTICAL_POLICY:
205                 g_object_get (obj, "vscrollbar-policy", &policy, NULL);
206                 g_value_set_enum (value, policy);
207                 break;
208         case PROP_HORIZONTAL_POLICY:
209                 g_object_get (obj, "hscrollbar-policy", &policy, NULL);
210                 g_value_set_enum (value, policy);
211                 break;
212         case PROP_MOVEMENT_MODE:
213                 g_object_get (obj, "mov-mode", &mov_mode, NULL);
214                 switch (mov_mode) {
215                 case HILDON_MOVEMENT_MODE_HORIZ:
216                         g_value_set_enum (value, MODEST_MOVEMENT_MODE_HORIZONTAL);
217                         break;
218                 case HILDON_MOVEMENT_MODE_BOTH:
219                         g_value_set_enum (value, MODEST_MOVEMENT_MODE_BOTH);
220                         break;
221                 default:
222                 case HILDON_MOVEMENT_MODE_VERT:
223                         g_value_set_enum (value, MODEST_MOVEMENT_MODE_VERTICAL);
224                         break;
225                 }
226                 break;
227         case PROP_HORIZONTAL_MAX_OVERSHOOT:
228                 g_object_get (obj, "hovershoot-max", &overshoot, NULL);
229                 g_value_set_int (value, overshoot);
230                 break;
231         case PROP_VERTICAL_MAX_OVERSHOOT:
232                 g_object_get (obj, "vovershoot-max", &overshoot, NULL);
233                 g_value_set_int (value, overshoot);
234                 break;
235         default:
236                 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
237                 break;
238         }
239 }
240
241 static void
242 modest_hildon_pannable_area_scrollable_set_property (GObject *obj,
243                                                      guint prop_id, 
244                                                      const GValue *value, 
245                                                      GParamSpec *pspec)
246 {
247         GtkPolicyType policy;
248         ModestMovementMode mov_mode;
249         gint overshoot;
250
251         switch (prop_id) {
252         case PROP_VERTICAL_POLICY:
253                 policy = g_value_get_enum (value);
254                 g_object_set (obj, "vscrollbar-policy", policy, NULL);
255                 break;
256         case PROP_HORIZONTAL_POLICY:
257                 policy = g_value_get_enum (value);
258                 g_object_set (obj, "hscrollbar-policy", policy, NULL);
259                 break;
260         case PROP_MOVEMENT_MODE:
261                 mov_mode = g_value_get_enum (value);
262                 switch (mov_mode) {
263                 case MODEST_MOVEMENT_MODE_HORIZONTAL:
264                         g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_HORIZ, NULL);
265                         break;
266                 case HILDON_MOVEMENT_MODE_BOTH:
267                         g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_BOTH, NULL);
268                         break;
269                 default:
270                 case MODEST_MOVEMENT_MODE_VERTICAL:
271                         g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL);
272                         break;
273                 }
274                 break;
275         case PROP_HORIZONTAL_MAX_OVERSHOOT:
276                 overshoot = g_value_get_int (value);
277                 g_object_set (obj, "hovershoot-max", overshoot, NULL);
278                 break;
279         case PROP_VERTICAL_MAX_OVERSHOOT:
280                 overshoot = g_value_get_int (value);
281                 g_object_set (obj, "vovershoot-max", overshoot, NULL);
282                 break;
283         default:
284                 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
285                 break;
286         }
287 }
288
289 static void
290 modest_hildon_pannable_area_scrollable_add_with_viewport (ModestScrollable *self,
291                                                           GtkWidget *widget)
292 {
293         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->add_with_viewport_func (self, widget);
294 }
295
296 static void
297 modest_hildon_pannable_area_scrollable_add_with_viewport_default (ModestScrollable *self,
298                                                                   GtkWidget *widget)
299 {
300         hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (self), widget);
301 }
302
303 static GtkAdjustment *
304 modest_hildon_pannable_area_scrollable_get_vadjustment (ModestScrollable *self)
305 {
306         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_vadjustment_func (self);
307 }
308
309 static GtkAdjustment *
310 modest_hildon_pannable_area_scrollable_get_vadjustment_default (ModestScrollable *self)
311 {
312         return hildon_pannable_area_get_vadjustment (HILDON_PANNABLE_AREA (self));
313 }
314
315 static GtkAdjustment *
316 modest_hildon_pannable_area_scrollable_get_hadjustment (ModestScrollable *self)
317 {
318         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_hadjustment_func (self);
319 }
320
321 static GtkAdjustment *
322 modest_hildon_pannable_area_scrollable_get_hadjustment_default (ModestScrollable *self)
323 {
324         return hildon_pannable_area_get_hadjustment (HILDON_PANNABLE_AREA (self));
325 }
326
327 static void
328 modest_hildon_pannable_area_scrollable_scroll_to (ModestScrollable *self, 
329                                                   const gint x, const gint y)
330 {
331         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->scroll_to_func (self, x, y);
332 }
333
334 static void
335 modest_hildon_pannable_area_scrollable_scroll_to_default (ModestScrollable *self,
336                                                           const gint x, const gint y)
337 {
338         hildon_pannable_area_scroll_to (HILDON_PANNABLE_AREA (self), x, y);
339 }
340
341 static void
342 modest_hildon_pannable_area_scrollable_jump_to (ModestScrollable *self, 
343                                                 const gint x, const gint y)
344 {
345         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->jump_to_func (self, x, y);
346 }
347
348 static void
349 modest_hildon_pannable_area_scrollable_jump_to_default (ModestScrollable *self,
350                                                         const gint x, const gint y)
351 {
352         hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (self), x, y);
353 }
354
355 static GtkPolicyType
356 modest_hildon_pannable_area_scrollable_get_vertical_policy (ModestScrollable *self)
357 {
358         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_vertical_policy_func (self);
359 }
360
361 static GtkPolicyType
362 modest_hildon_pannable_area_scrollable_get_vertical_policy_default (ModestScrollable *self)
363 {
364         GtkPolicyType policy;
365
366         g_object_get (G_OBJECT (self), "vscrollbar-policy", &policy, NULL);
367         return policy;
368 }
369
370 static GtkPolicyType
371 modest_hildon_pannable_area_scrollable_get_horizontal_policy (ModestScrollable *self)
372 {
373         return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_horizontal_policy_func (self);
374 }
375
376 static GtkPolicyType
377 modest_hildon_pannable_area_scrollable_get_horizontal_policy_default (ModestScrollable *self)
378 {
379         GtkPolicyType policy;
380
381         g_object_get (G_OBJECT (self), "hscrollbar-policy", &policy, NULL);
382         return policy;
383 }
384
385 static void
386 modest_hildon_pannable_area_scrollable_set_horizontal_policy (ModestScrollable *self,
387                                                               GtkPolicyType policy)
388 {
389         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->set_horizontal_policy_func (self, policy);
390 }
391
392 static void
393 modest_hildon_pannable_area_scrollable_set_horizontal_policy_default (ModestScrollable *self,
394                                                                       GtkPolicyType policy)
395 {
396         g_object_set (G_OBJECT (self), "hscrollbar-policy", policy, NULL);
397 }
398
399 static void
400 modest_hildon_pannable_area_scrollable_set_vertical_policy (ModestScrollable *self,
401                                                             GtkPolicyType policy)
402 {
403         MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->set_vertical_policy_func (self, policy);
404 }
405
406 static void
407 modest_hildon_pannable_area_scrollable_set_vertical_policy_default (ModestScrollable *self,
408                                                                     GtkPolicyType policy)
409 {
410         g_object_set (G_OBJECT (self), "vscrollbar-policy", policy, NULL);
411 }