Merge "custom eail widget implementation" into tizen
[platform/core/uifw/eail.git] / eail / eail_map.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_map.c
22  * @brief EailMap implementation
23  */
24
25 #include <Elementary.h>
26
27 #include "eail_map.h"
28 #include "eail_utils.h"
29
30 /**
31  * @brief 'press' action name
32  */
33 #define EAIL_MAP_ACTION_PRESS "press"
34
35 /**
36  * @brief 'scroll up' action name
37  */
38 #define EAIL_MAP_ACTION_SCROLL_UP "scroll_up"
39
40 /**
41  * @brief 'scroll down' action name
42  */
43 #define EAIL_MAP_ACTION_SCROLL_DOWN "scroll_down"
44
45 /**
46  * @brief 'scroll left' action name
47  */
48 #define EAIL_MAP_ACTION_SCROLL_LEFT "scroll_left"
49
50 /**
51  * @brief 'scroll right' action name
52  */
53 #define EAIL_MAP_ACTION_SCROLL_RIGHT "scroll_right"
54
55 /**
56  * @brief 'zoom in' action name
57  */
58 #define EAIL_MAP_ACTION_ZOOM_IN "zoom_in"
59
60 /**
61  * @brief 'zoom out' action name
62  */
63 #define EAIL_MAP_ACTION_ZOOM_OUT "zoom_out"
64
65 /**
66  * @brief Zoom increment
67  */
68 #define EAIL_MAP_ZOOM_STEP 1
69
70 static void akt_image_interface_init(AtkImageIface *iface);
71
72 /**
73  * @brief EailMap type definition
74  */
75 G_DEFINE_TYPE_WITH_CODE(EailMap,
76                         eail_map,
77                         EAIL_TYPE_IMAGE,
78                         G_IMPLEMENT_INTERFACE(ATK_TYPE_IMAGE,
79                                               akt_image_interface_init)) ;
80
81 static void eail_map_set_actions(AtkObject *obj);
82
83 /**
84  * @brief EailMap initializer
85  *
86  * @param object AtkObject instance
87  * @param data initialization data
88  */
89 static void
90 eail_map_initialize(AtkObject *object, gpointer data)
91 {
92    ATK_OBJECT_CLASS(eail_map_parent_class)->initialize(object, data);
93    object->role = ATK_ROLE_IMAGE_MAP;
94
95    eail_map_set_actions(object);
96 }
97
98 /**
99  * @brief EailMap finalizer
100  *
101  * @param object GObject instance
102  */
103 static void
104 eail_map_finalize(GObject *object)
105 {
106    EailMap *map = EAIL_MAP(object);
107    eina_stringshare_del(map->name);
108
109    G_OBJECT_CLASS(eail_map_parent_class)->finalize(object);
110 }
111
112 /**
113  * @brief Gets obj's name
114  *
115  * @param object AtkObject instance
116  * @return string containing obj's name if a name is assigned, map path otherwise
117  */
118 static const gchar*
119 eail_map_name_get(AtkObject *object)
120 {
121    Evas_Object *widget;
122    EailMap *map;
123    const gchar *atk_name = NULL;
124
125    /* returning name from ATK default implementation if available */
126    atk_name = ATK_OBJECT_CLASS(eail_map_parent_class)->get_name(object);
127    if (atk_name)
128      return atk_name;
129
130    g_return_val_if_fail(EAIL_IS_MAP(object), NULL);
131
132    map = EAIL_MAP(object);
133    if (map->name) return map->name;
134
135    widget = eail_widget_get_widget(EAIL_WIDGET(map));
136    if (!widget) return NULL;
137
138    map->name =
139            eina_stringshare_printf("Map(%s)",
140                                    elm_map_source_get(widget,
141                                                       ELM_MAP_SOURCE_TYPE_NAME));
142    return map->name;
143 }
144
145 /**
146  * @brief EailMap instance initializer
147  *
148  * @param map EailMap instance
149  */
150 static void
151 eail_map_init(EailMap *map)
152 {
153    map->name = NULL;
154 }
155
156 /**
157  * @brief EailMap class initializer
158  *
159  * @param klass EailMapClass instance
160  */
161 static void
162 eail_map_class_init(EailMapClass *klass)
163 {
164    AtkObjectClass *atk_class = ATK_OBJECT_CLASS(klass);
165    GObjectClass *g_object_class = G_OBJECT_CLASS(klass);
166
167    atk_class->initialize = eail_map_initialize;
168    atk_class->get_name = eail_map_name_get;
169
170    g_object_class->finalize = eail_map_finalize;
171 }
172
173 /**
174  * @brief Gets image size
175  *
176  * Image size is the same as window size
177  *
178  * @param image AtkImage instance
179  * @param [out] width image width or -1 if the value cannot be obtained
180  * @param [out] height image height or -1 if the value cannot be obtained
181  */
182 static void
183 eail_map_image_size_get(AtkImage *image, gint *width, gint *height)
184 {
185    atk_component_get_size(ATK_COMPONENT(image), width, height);
186 }
187
188 /**
189  * @brief AtkImage interface initializer
190  *
191  * @param iface AtkImageIface instance
192  */
193 static void
194 akt_image_interface_init(AtkImageIface *iface)
195 {
196    if (!iface) return;
197
198    iface->get_image_size = eail_map_image_size_get;
199 }
200
201 /*
202  * AtkAction implementation
203  */
204
205 /**
206  * @brief 'scroll up' action callback
207  *
208  * @param action AtkAction instance
209  * @param data callback data
210  * @return TRUE on success, FALSE otherwise
211  */
212 static gboolean
213 _eail_map_action_scroll_up(AtkAction *action, void *data)
214 {
215    Evas_Object *widget;
216
217    g_return_val_if_fail(EAIL_IS_MAP(action), FALSE);
218
219    widget = eail_widget_get_widget(EAIL_WIDGET(action));
220    return eail_action_scroll_up(widget, NULL);
221 }
222
223 /**
224  * @brief 'scroll down' action callback
225  *
226  * @param action an AtkAction
227  * @param data callback data
228  * @return TRUE on success, FALSE otherwise
229  */
230 static gboolean
231 _eail_map_action_scroll_down(AtkAction *action, void *data)
232 {
233    Evas_Object *widget;
234
235    g_return_val_if_fail(EAIL_IS_MAP(action), FALSE);
236
237    widget = eail_widget_get_widget(EAIL_WIDGET(action));
238    return eail_action_scroll_down(widget, NULL);
239 }
240
241 /**
242  * @brief 'scroll left' action callback
243  *
244  * @param action AtkAction instance
245  * @param data callback data
246  * @return TRUE on success, FALSE otherwise
247  */
248 static gboolean
249 _eail_map_action_scroll_left(AtkAction *action, void *data)
250 {
251    Evas_Object *widget;
252
253    g_return_val_if_fail(EAIL_IS_MAP(action), FALSE);
254
255    widget = eail_widget_get_widget(EAIL_WIDGET(action));
256    return eail_action_scroll_left(widget, NULL);
257 }
258
259 /**
260  * @brief 'scroll right' action callback
261  *
262  * @param action an AtkAction
263  * @param data callback data
264  * @return TRUE on success, FALSE otherwise
265  */
266 static gboolean
267 _eail_map_action_scroll_right(AtkAction *action, void *data)
268 {
269    Evas_Object *widget;
270
271    g_return_val_if_fail(EAIL_IS_MAP(action), FALSE);
272
273    widget = eail_widget_get_widget(EAIL_WIDGET(action));
274    return eail_action_scroll_right(widget, NULL);
275 }
276
277 /**
278  * @brief 'zoom in' action callback
279  *
280  * @param action AtkAction instance
281  * @param data data passed to callback
282  * @return TRUE on success, FALSE otherwise
283  */
284 static gboolean
285 _eail_map_action_zoom_in(AtkAction *action, void *data)
286 {
287    Evas_Object *widget;
288    int new_zoom;
289
290    g_return_val_if_fail(EAIL_IS_MAP(action), FALSE);
291
292    widget = eail_widget_get_widget(EAIL_WIDGET(action));
293    if (!widget) return FALSE;
294
295    new_zoom = elm_map_zoom_get(widget) + EAIL_MAP_ZOOM_STEP;
296    elm_map_zoom_set(widget, new_zoom);
297
298    return TRUE;
299 }
300
301 /**
302  * @brief 'zoom out' action callback
303  *
304  * @param action AtkAction instance
305  * @param data data passed to callback
306  * @return TRUE on success, FALSE otherwise
307  */
308 static gboolean
309 _eail_map_action_zoom_out(AtkAction *action, void *data)
310 {
311    Evas_Object *widget;
312    int new_zoom;
313
314    g_return_val_if_fail(EAIL_IS_MAP(action), FALSE);
315    widget = eail_widget_get_widget(EAIL_WIDGET(action));
316    if (!widget) return FALSE;
317
318    new_zoom = elm_map_zoom_get(widget) - EAIL_MAP_ZOOM_STEP;
319
320    elm_map_zoom_set(widget, new_zoom);
321
322    return TRUE;
323 }
324
325 /**
326  * @brief 'press' action callback
327  *
328  * @param action AtkAction instance
329  * @param data data passed to callback
330  * @return TRUE on success, FALSE otherwise
331  */
332 static gboolean
333 _eail_map_action_press(AtkAction *action, void *data)
334 {
335    Evas_Object *widget;
336
337    g_return_val_if_fail(EAIL_IS_MAP(action), FALSE);
338
339    widget = eail_widget_get_widget(EAIL_WIDGET(action));
340    if (!widget) return FALSE;
341
342    evas_object_smart_callback_call(widget, "press", NULL);
343    return TRUE;
344 }
345
346 /**
347  * @brief Sets EailMap actions
348  *
349  * @param obj AtkObject instance
350  */
351 static void
352 eail_map_set_actions(AtkObject *obj)
353 {
354    eail_action_widget_action_append(EAIL_ACTION_WIDGET(obj),
355                                     EAIL_MAP_ACTION_PRESS,
356                                     NULL,
357                                     _eail_map_action_press);
358    eail_action_widget_action_append(EAIL_ACTION_WIDGET(obj),
359                                     EAIL_MAP_ACTION_SCROLL_UP,
360                                     NULL,
361                                     _eail_map_action_scroll_up);
362    eail_action_widget_action_append(EAIL_ACTION_WIDGET(obj),
363                                     EAIL_MAP_ACTION_SCROLL_DOWN,
364                                     NULL,
365                                     _eail_map_action_scroll_down);
366    eail_action_widget_action_append(EAIL_ACTION_WIDGET(obj),
367                                     EAIL_MAP_ACTION_SCROLL_LEFT,
368                                     NULL,
369                                     _eail_map_action_scroll_left);
370    eail_action_widget_action_append(EAIL_ACTION_WIDGET(obj),
371                                     EAIL_MAP_ACTION_SCROLL_RIGHT,
372                                     NULL,
373                                     _eail_map_action_scroll_right);
374    eail_action_widget_action_append(EAIL_ACTION_WIDGET(obj),
375                                     EAIL_MAP_ACTION_ZOOM_IN,
376                                     NULL,
377                                     _eail_map_action_zoom_in);
378    eail_action_widget_action_append(EAIL_ACTION_WIDGET(obj),
379                                     EAIL_MAP_ACTION_ZOOM_OUT,
380                                     NULL,
381                                     _eail_map_action_zoom_out);
382 }