Merge "custom eail widget implementation" into tizen
[platform/core/uifw/eail.git] / eail / eail_scrollable_widget.c
1 /*
2  * Copyright (c) 2013 Samsung Electronics Co., Ltd.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 /**
21  * @file eail_scrollable_widget.c
22  * @brief Implementation of widget that can scroll its content
23  */
24
25 #include <atk/atk.h>
26 #include <Elementary.h>
27
28 #include "eail_scrollable_widget.h"
29 #include "eail_priv.h"
30 #include "eail_utils.h"
31
32 #define EAIL_STR_SCROLL_UP "scroll_up" /**< 'scroll_up' action name */
33 #define EAIL_STR_SCROLL_DOWN "scroll_down" /**< 'scroll_down' action name */
34 #define EAIL_STR_SCROLL_LEFT "scroll_left"/**< 'scroll_left' action name */
35 #define EAIL_STR_SCROLL_RIGHT "scroll_right"/**< 'scroll_right' action name */
36
37 /**
38  * @brief Definition of EailScrollableWidget as GObject
39  *
40  * NOTE: this class extends EAIL_TYPE_ACTION_WIDGET, which implements
41  * all needed functions for ATK_ACTION interface so additional implementing of
42  * ATK_ACTION interface here is not needed.
43  * Only thing that is really needed is to call:
44  * eail_action_widget_action_append(...) to register all needed additional
45  * actions
46  */
47 G_DEFINE_TYPE(EailScrollableWidget, eail_scrollable_widget,
48               EAIL_TYPE_ACTION_WIDGET);
49
50 /**
51  * @brief Handler for 'scroll' event
52  *
53  * @param data data passed to callback
54  * @param obj Evas_Object that raised event
55  * @param event_info additional event info
56  */
57 static void
58 _eail_scrollable_handle_scroll_event(void *data,
59                                      Evas_Object *obj,
60                                      void *event_info)
61 {
62    eail_emit_atk_signal
63                   (ATK_OBJECT(data), "visible-data-changed", ATK_TYPE_OBJECT);
64 }
65
66 /**
67  * @brief Initializer for GObject class
68  *
69  * @param scrollable_widget EailScrollableWidget instance
70  */
71 static void
72 eail_scrollable_widget_init(EailScrollableWidget *scrollable_widget)
73 {
74 }
75
76 /**
77  * @brief Finalize function for GObject
78  *
79  * @param object GObject instance to finalize
80  */
81 static void
82 eail_scrollable_widget_finalize(GObject *object)
83 {
84    G_OBJECT_CLASS(eail_scrollable_widget_parent_class)->finalize(object);
85 }
86
87
88
89 /**
90  * @brief 'scroll up' action callback
91  *
92  * @param action AtkAction instance
93  * @param data additional callback data
94  * @returns TRUE on success, FALSE otherwise
95  */
96 static gboolean
97 _action_scroll_up(AtkAction *action,
98                   void *data)
99 {
100    Evas_Object *widget;
101
102    g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
103
104    widget = eail_widget_get_widget(EAIL_WIDGET(action));
105    _eail_scrollable_handle_scroll_event(action, widget, NULL);
106    return eail_action_scroll_up(widget, NULL);
107 }
108
109 /**
110  * @brief 'scroll down' action callback
111  *
112  * @param action AtkAction instance
113  * @param data additional callback data
114  * @returns TRUE on success, FALSE otherwise
115  */
116 static gboolean
117 _action_scroll_down(AtkAction *action,
118                     void *data)
119 {
120    Evas_Object *widget;
121
122    g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
123
124    widget = eail_widget_get_widget(EAIL_WIDGET(action));
125    _eail_scrollable_handle_scroll_event(action, widget, NULL);
126    return eail_action_scroll_down(widget, NULL);
127 }
128
129 /**
130  * @brief 'scroll left' action callback
131  *
132  * @param action AtkAction instance
133  * @param data additional callback data
134  * @returns TRUE on success, FALSE otherwise
135  */
136 static gboolean
137 _action_scroll_left(AtkAction *action,
138                     void *data)
139 {
140    Evas_Object *widget;
141
142    g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
143
144    widget = eail_widget_get_widget(EAIL_WIDGET(action));
145    _eail_scrollable_handle_scroll_event(action, widget, NULL);
146    return eail_action_scroll_left(widget, NULL);
147 }
148
149 /**
150  * @brief 'scroll right' action callback
151  *
152  * @param action AtkAction instance
153  * @param data additional callback data
154  * @returns TRUE on success, FALSE otherwise
155  */
156 static gboolean
157 _action_scroll_right(AtkAction *action,
158                      void *data)
159 {
160    Evas_Object *widget;
161
162    g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
163
164    widget = eail_widget_get_widget(EAIL_WIDGET(action));
165    _eail_scrollable_handle_scroll_event(action, widget, NULL);
166    return eail_action_scroll_right(widget, NULL);
167 }
168
169 /**
170  * @brief Adds actions for scrolling to actions table
171  * @param widget widget that implements EailScrollable interface
172  */
173 static void
174 eail_scrollable_widget_actions_table_init(EailScrollableWidget *widget)
175 {
176    eail_action_widget_action_append(EAIL_ACTION_WIDGET(widget),
177                                     EAIL_STR_SCROLL_UP, NULL,
178                                     _action_scroll_up);
179    eail_action_widget_action_append(EAIL_ACTION_WIDGET(widget),
180                                     EAIL_STR_SCROLL_DOWN, NULL,
181                                     _action_scroll_down);
182    eail_action_widget_action_append(EAIL_ACTION_WIDGET(widget),
183                                     EAIL_STR_SCROLL_LEFT, NULL,
184                                     _action_scroll_left);
185    eail_action_widget_action_append(EAIL_ACTION_WIDGET(widget),
186                                     EAIL_STR_SCROLL_RIGHT, NULL,
187                                     _action_scroll_right);
188 }
189
190 /**
191  * @brief Initializer for AtkObjectClass
192  *
193  * @param obj AtkObject instance
194  * @param data initialization data
195  */
196 static void
197 eail_scrollable_widget_initialize(AtkObject *obj, gpointer data)
198 {
199    ATK_OBJECT_CLASS(eail_scrollable_widget_parent_class)->initialize(obj, data);
200    Evas_Object *evas_obj = NULL;
201    EailScrollableWidget *widget = EAIL_SCROLLABLE_WIDGET(obj);
202
203    /* Initializing possible widget actions table*/
204    eail_scrollable_widget_actions_table_init(widget);
205
206    evas_obj = eail_widget_get_widget(EAIL_WIDGET(widget));
207    if (!evas_obj)
208      {
209          ERR("No evas object for ScrollableWidget");
210          return;
211      }
212
213    evas_object_smart_callback_add
214        (evas_obj, "scroll", _eail_scrollable_handle_scroll_event, widget);
215    evas_object_smart_callback_add
216        (evas_obj, "scroll,left", _eail_scrollable_handle_scroll_event, widget);
217    evas_object_smart_callback_add
218        (evas_obj, "scroll,right", _eail_scrollable_handle_scroll_event, widget);
219    evas_object_smart_callback_add
220         (evas_obj, "scroll,up", _eail_scrollable_handle_scroll_event, widget);
221    evas_object_smart_callback_add
222         (evas_obj, "scroll,down", _eail_scrollable_handle_scroll_event, widget);
223    evas_object_smart_callback_add(evas_obj,
224          "scroll,page,changed", _eail_scrollable_handle_scroll_event, widget);
225    evas_object_smart_callback_add(evas_obj,
226               "scroll,anim,stop", _eail_scrollable_handle_scroll_event, widget);
227    evas_object_smart_callback_add(evas_obj,
228                         "swipe", _eail_scrollable_handle_scroll_event, widget);
229    evas_object_smart_callback_add(evas_obj,
230              "scroll,drag,stop", _eail_scrollable_handle_scroll_event, widget);
231 }
232
233 /**
234  * @brief Initializer for GObject
235  *
236  * @param klass EailScrollableWidgetClass instance
237  */
238 static void
239 eail_scrollable_widget_class_init(EailScrollableWidgetClass *klass)
240 {
241    AtkObjectClass *class = ATK_OBJECT_CLASS(klass);
242    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
243    class->initialize = eail_scrollable_widget_initialize;
244    gobject_class->finalize = eail_scrollable_widget_finalize;
245 }