1 /* Copyright (c) 2009, Igalia
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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.
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.
30 #include <glib/gi18n.h>
31 #include "modest-hildon-pannable-area-scrollable.h"
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);
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,
43 static void modest_hildon_pannable_area_scrollable_set_property (GObject *obj,
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);
71 PROP_HORIZONTAL_POLICY,
74 PROP_HORIZONTAL_MAX_OVERSHOOT,
75 PROP_VERTICAL_MAX_OVERSHOOT,
79 static HildonPannableAreaClass *parent_class = NULL;
81 G_DEFINE_TYPE_EXTENDED (ModestHildonPannableAreaScrollable,
82 modest_hildon_pannable_area_scrollable,
83 HILDON_TYPE_PANNABLE_AREA,
86 G_IMPLEMENT_INTERFACE (MODEST_TYPE_SCROLLABLE, modest_scrollable_iface_init);
87 g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_BIN);
92 modest_hildon_pannable_area_scrollable_new (void)
94 GtkWidget *scrollable = g_object_new (MODEST_TYPE_HILDON_PANNABLE_AREA_SCROLLABLE, NULL);
100 modest_hildon_pannable_area_scrollable_class_init (ModestHildonPannableAreaScrollableClass *klass)
102 GObjectClass *gobject_class;
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;
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;
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));
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));
137 g_object_class_install_property (gobject_class,
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,
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)",
153 G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
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)",
161 G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
165 modest_hildon_pannable_area_scrollable_init (ModestHildonPannableAreaScrollable *self)
170 modest_scrollable_iface_init (gpointer g, gpointer iface_data)
172 ModestScrollableIface *iface = (ModestScrollableIface *) g;
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;
186 modest_hildon_pannable_area_scrollable_finalize (GObject *obj)
188 G_OBJECT_CLASS(parent_class)->finalize (obj);
192 modest_hildon_pannable_area_scrollable_get_property (GObject *obj,
197 GtkPolicyType policy;
198 HildonMovementMode mov_mode;
202 case PROP_VERTICAL_POLICY:
203 g_object_get (obj, "vscrollbar-policy", &policy, NULL);
204 g_value_set_enum (value, policy);
206 case PROP_HORIZONTAL_POLICY:
207 g_object_get (obj, "hscrollbar-policy", &policy, NULL);
208 g_value_set_enum (value, policy);
210 case PROP_MOVEMENT_MODE:
211 g_object_get (obj, "mov-mode", &mov_mode, NULL);
213 case HILDON_MOVEMENT_MODE_HORIZ:
214 g_value_set_enum (value, MODEST_MOVEMENT_MODE_HORIZONTAL);
216 case HILDON_MOVEMENT_MODE_BOTH:
217 g_value_set_enum (value, MODEST_MOVEMENT_MODE_BOTH);
220 case HILDON_MOVEMENT_MODE_VERT:
221 g_value_set_enum (value, MODEST_MOVEMENT_MODE_VERTICAL);
225 case PROP_HORIZONTAL_MAX_OVERSHOOT:
226 g_object_get (obj, "hovershoot-max", &overshoot, NULL);
227 g_value_set_int (value, overshoot);
229 case PROP_VERTICAL_MAX_OVERSHOOT:
230 g_object_get (obj, "vovershoot-max", &overshoot, NULL);
231 g_value_set_int (value, overshoot);
234 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
240 modest_hildon_pannable_area_scrollable_set_property (GObject *obj,
245 GtkPolicyType policy;
246 ModestMovementMode mov_mode;
250 case PROP_VERTICAL_POLICY:
251 policy = g_value_get_enum (value);
252 g_object_set (obj, "vscrollbar-policy", policy, NULL);
254 case PROP_HORIZONTAL_POLICY:
255 policy = g_value_get_enum (value);
256 g_object_set (obj, "hscrollbar-policy", policy, NULL);
258 case PROP_MOVEMENT_MODE:
259 mov_mode = g_value_get_enum (value);
261 case MODEST_MOVEMENT_MODE_HORIZONTAL:
262 g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_HORIZ, NULL);
264 case HILDON_MOVEMENT_MODE_BOTH:
265 g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_BOTH, NULL);
268 case MODEST_MOVEMENT_MODE_VERTICAL:
269 g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL);
273 case PROP_HORIZONTAL_MAX_OVERSHOOT:
274 overshoot = g_value_get_int (value);
275 g_object_set (obj, "hovershoot-max", overshoot, NULL);
277 case PROP_VERTICAL_MAX_OVERSHOOT:
278 overshoot = g_value_get_int (value);
279 g_object_set (obj, "vovershoot-max", overshoot, NULL);
282 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
288 modest_hildon_pannable_area_scrollable_add_with_viewport (ModestScrollable *self,
291 MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->add_with_viewport_func (self, widget);
295 modest_hildon_pannable_area_scrollable_add_with_viewport_default (ModestScrollable *self,
298 hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (self), widget);
301 static GtkAdjustment *
302 modest_hildon_pannable_area_scrollable_get_vadjustment (ModestScrollable *self)
304 return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_vadjustment_func (self);
307 static GtkAdjustment *
308 modest_hildon_pannable_area_scrollable_get_vadjustment_default (ModestScrollable *self)
310 return hildon_pannable_area_get_vadjustment (HILDON_PANNABLE_AREA (self));
313 static GtkAdjustment *
314 modest_hildon_pannable_area_scrollable_get_hadjustment (ModestScrollable *self)
316 return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_hadjustment_func (self);
319 static GtkAdjustment *
320 modest_hildon_pannable_area_scrollable_get_hadjustment_default (ModestScrollable *self)
322 return hildon_pannable_area_get_hadjustment (HILDON_PANNABLE_AREA (self));
326 modest_hildon_pannable_area_scrollable_scroll_to (ModestScrollable *self,
327 const gint x, const gint y)
329 MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->scroll_to_func (self, x, y);
333 modest_hildon_pannable_area_scrollable_scroll_to_default (ModestScrollable *self,
334 const gint x, const gint y)
336 hildon_pannable_area_scroll_to (HILDON_PANNABLE_AREA (self), x, y);
340 modest_hildon_pannable_area_scrollable_jump_to (ModestScrollable *self,
341 const gint x, const gint y)
343 MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->jump_to_func (self, x, y);
347 modest_hildon_pannable_area_scrollable_jump_to_default (ModestScrollable *self,
348 const gint x, const gint y)
350 hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (self), x, y);
354 modest_hildon_pannable_area_scrollable_get_vertical_policy (ModestScrollable *self)
356 return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_vertical_policy_func (self);
360 modest_hildon_pannable_area_scrollable_get_vertical_policy_default (ModestScrollable *self)
362 GtkPolicyType policy;
364 g_object_get (G_OBJECT (self), "vscrollbar-policy", &policy, NULL);
369 modest_hildon_pannable_area_scrollable_get_horizontal_policy (ModestScrollable *self)
371 return MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->get_horizontal_policy_func (self);
375 modest_hildon_pannable_area_scrollable_get_horizontal_policy_default (ModestScrollable *self)
377 GtkPolicyType policy;
379 g_object_get (G_OBJECT (self), "hscrollbar-policy", &policy, NULL);
384 modest_hildon_pannable_area_scrollable_set_horizontal_policy (ModestScrollable *self,
385 GtkPolicyType policy)
387 MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->set_horizontal_policy_func (self, policy);
391 modest_hildon_pannable_area_scrollable_set_horizontal_policy_default (ModestScrollable *self,
392 GtkPolicyType policy)
394 g_object_set (G_OBJECT (self), "hscrollbar-policy", policy, NULL);
398 modest_hildon_pannable_area_scrollable_set_vertical_policy (ModestScrollable *self,
399 GtkPolicyType policy)
401 MODEST_HILDON_PANNABLE_AREA_SCROLLABLE_GET_CLASS (self)->set_vertical_policy_func (self, policy);
405 modest_hildon_pannable_area_scrollable_set_vertical_policy_default (ModestScrollable *self,
406 GtkPolicyType policy)
408 g_object_set (G_OBJECT (self), "vscrollbar-policy", policy, NULL);