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