2 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
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.
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.
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.
21 * @file eail_scrollable_widget.c
22 * @brief Implementation of widget that can scroll its content
26 #include <Elementary.h>
28 #include "eail_scrollable_widget.h"
29 #include "eail_priv.h"
30 #include "eail_utils.h"
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 */
38 * @brief Definition of EailScrollableWidget as GObject
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
47 G_DEFINE_TYPE(EailScrollableWidget, eail_scrollable_widget,
48 EAIL_TYPE_ACTION_WIDGET);
51 * @brief Handler for 'scroll' event
53 * @param data data passed to callback
54 * @param obj Evas_Object that raised event
55 * @param event_info additional event info
58 _eail_scrollable_handle_scroll_event(void *data,
63 (ATK_OBJECT(data), "visible-data-changed", ATK_TYPE_OBJECT);
67 * @brief Initializer for GObject class
69 * @param scrollable_widget EailScrollableWidget instance
72 eail_scrollable_widget_init(EailScrollableWidget *scrollable_widget)
77 * @brief Finalize function for GObject
79 * @param object GObject instance to finalize
82 eail_scrollable_widget_finalize(GObject *object)
84 G_OBJECT_CLASS(eail_scrollable_widget_parent_class)->finalize(object);
90 * @brief 'scroll up' action callback
92 * @param action AtkAction instance
93 * @param data additional callback data
94 * @returns TRUE on success, FALSE otherwise
97 _action_scroll_up(AtkAction *action,
102 g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
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);
110 * @brief 'scroll down' action callback
112 * @param action AtkAction instance
113 * @param data additional callback data
114 * @returns TRUE on success, FALSE otherwise
117 _action_scroll_down(AtkAction *action,
122 g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
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);
130 * @brief 'scroll left' action callback
132 * @param action AtkAction instance
133 * @param data additional callback data
134 * @returns TRUE on success, FALSE otherwise
137 _action_scroll_left(AtkAction *action,
142 g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
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);
150 * @brief 'scroll right' action callback
152 * @param action AtkAction instance
153 * @param data additional callback data
154 * @returns TRUE on success, FALSE otherwise
157 _action_scroll_right(AtkAction *action,
162 g_return_val_if_fail(EAIL_IS_SCROLLABLE_WIDGET(action), FALSE);
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);
170 * @brief Adds actions for scrolling to actions table
171 * @param widget widget that implements EailScrollable interface
174 eail_scrollable_widget_actions_table_init(EailScrollableWidget *widget)
176 eail_action_widget_action_append(EAIL_ACTION_WIDGET(widget),
177 EAIL_STR_SCROLL_UP, NULL,
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);
191 * @brief Initializer for AtkObjectClass
193 * @param obj AtkObject instance
194 * @param data initialization data
197 eail_scrollable_widget_initialize(AtkObject *obj, gpointer data)
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);
203 /* Initializing possible widget actions table*/
204 eail_scrollable_widget_actions_table_init(widget);
206 evas_obj = eail_widget_get_widget(EAIL_WIDGET(widget));
209 ERR("No evas object for ScrollableWidget");
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);
234 * @brief Initializer for GObject
236 * @param klass EailScrollableWidgetClass instance
239 eail_scrollable_widget_class_init(EailScrollableWidgetClass *klass)
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;