Tizen 2.1 base
[apps/core/preloaded/calendar.git] / common / dialogue.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
5   *  Licensed under the Flora License, Version 1.0 (the "License");
6   *  you may not use this file except in compliance with the License.
7   *  You may obtain a copy of the License at
8   *
9   *       http://floralicense.org/license/
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17
18 #include "cld.h"
19 #include "dialogue.h"
20
21 #define CAL_DIALOGUE_CUSTOM_EDJ "/usr/apps/"CALENDAR_PACKAGE"/res/edje/dialogue.edj"
22 #define CAL_DIALOGUE_UNPACKED_ITEM_LIST "unpacked_item_list"
23
24 typedef struct {
25         Evas_Object *item;
26         cal_dialogue_item_clicked_callback callback_func;
27         void *callback_data;
28 } __cal_dialogue_item_callback_s;
29
30 static void __cal_dialogue_box_delete_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
31 {
32         c_ret_if(!obj);
33
34         Eina_List *unpacked_item_list = NULL;
35         Eina_List *cursor = NULL;
36         Evas_Object *unpacked_item = NULL;
37
38         unpacked_item_list = evas_object_data_get(obj, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
39
40         if (!unpacked_item_list)
41                 return;
42
43         EINA_LIST_FOREACH(unpacked_item_list, cursor, unpacked_item) {
44                 if (unpacked_item)
45                         evas_object_del(unpacked_item);
46         }
47 }
48
49 Evas_Object * cal_dialogue_create(Evas_Object *parent)
50 {
51         c_retv_if(!parent, NULL);
52
53         Evas_Object *scroller = cal_util_add_scroller(parent);
54         c_retv_if(!scroller, NULL);
55
56         elm_object_style_set(scroller, "dialogue");
57
58         Evas_Object *box = elm_box_add(scroller);
59         if (!box) {
60                 ERR("elm_box_add(scroller) is failed");
61                 evas_object_del(scroller);
62                 return NULL;
63         }
64
65         evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
66         evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
67
68         elm_object_content_set(scroller, box);
69
70         evas_object_show(box);
71
72         evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, __cal_dialogue_box_delete_callback, NULL);
73
74         return scroller;
75 }
76
77 void cal_dialogue_destroy(Evas_Object * dialogue)
78 {
79         c_ret_if(!dialogue);
80
81         evas_object_del(dialogue);
82 }
83
84 Evas_Object * cal_dialogue_get_box(Evas_Object *dialogue)
85 {
86         c_retv_if(!dialogue, NULL);
87
88         Evas_Object *box = elm_object_content_get(dialogue);
89
90         return box;
91 }
92
93 static void __cal_dialogue_item_clicked_callback(void *data, Evas *evas, Evas_Object *obj, void *event_info)
94 {
95         Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
96
97         __cal_dialogue_item_callback_s *callback = data;
98         c_ret_if(!callback);
99
100         Evas_Object *item = callback->item;
101
102         elm_object_signal_emit(item, "elm,state,unselected", "elm");
103         elm_object_focus_set(obj, EINA_TRUE);
104
105         if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
106                 return;
107
108         callback->callback_func(item, callback->callback_data);
109 }
110
111 static void __cal_dialogue_item_move_callback(void *data, Evas *evas, Evas_Object *obj, void *event_info)
112 {
113         Evas_Event_Mouse_Move *ev = (Evas_Event_Mouse_Move *)event_info;
114
115         __cal_dialogue_item_callback_s *callback = data;
116         c_ret_if(!callback);
117
118         Evas_Object *item = callback->item;
119
120         if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
121                 elm_object_signal_emit(item, "elm,state,unselected", "elm");
122                 return;
123         }
124 }
125
126 static void __cal_dialogue_item_down_callback(void *data, Evas *evas, Evas_Object *obj, void *event_info)
127 {
128         __cal_dialogue_item_callback_s *callback = data;
129
130         Evas_Object *item = callback->item;
131         c_ret_if(!callback);
132
133         elm_object_signal_emit(item, "elm,state,selected", "elm");
134 }
135
136 static void __cal_dialogue_item_delete_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
137 {
138         __cal_dialogue_item_callback_s *callback = data;
139
140         if (callback)
141                 free(callback);
142 }
143
144 static Evas_Object * __cal_dialogue_create_item(Evas_Object *box, const char *style, cal_dialogue_item_clicked_callback callback_func, void *callback_data)
145 {
146         Evas_Object *layout = NULL;
147
148         layout = elm_layout_add(box);
149         c_retv_if(!layout, NULL);
150
151         Eina_Bool ret = elm_layout_theme_set(layout, "layout", "dialogue", style);
152         if (ret != EINA_TRUE) {
153                 ret = elm_layout_file_set(layout, CAL_DIALOGUE_CUSTOM_EDJ, style);
154                 if (ret != EINA_TRUE) {
155                         ERR("elm_layout_theme_set(%s) is failed.", style);
156                         evas_object_del(layout);
157                         return NULL;
158                 }
159         }
160
161         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0);
162         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0.0);
163
164         if (callback_func) {
165                 __cal_dialogue_item_callback_s *callback = calloc(1, sizeof(__cal_dialogue_item_callback_s));
166
167                 callback->item = layout;
168                 callback->callback_func = callback_func;
169                 callback->callback_data = callback_data;
170
171                 evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, __cal_dialogue_item_clicked_callback, callback);
172                 evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, __cal_dialogue_item_down_callback, callback);
173                 evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_MOVE, __cal_dialogue_item_move_callback, callback);
174                 evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, __cal_dialogue_item_delete_callback, callback);
175         }
176
177         return layout;
178 }
179
180 Evas_Object * cal_dialogue_append_item(Evas_Object *box, const char *style, cal_dialogue_item_clicked_callback callback_func, void *callback_data)
181 {
182         c_retv_if(!box, NULL);
183         c_retv_if(!CAL_STRLEN(style), NULL);
184
185         Evas_Object *item = __cal_dialogue_create_item(box, style, callback_func, callback_data);
186         c_retv_if(!item, NULL);
187
188         elm_box_pack_end(box, item);
189         evas_object_show(item);
190
191         return item;
192 }
193
194 Evas_Object * cal_dialogue_insert_item_after(Evas_Object *box, const char *style, Evas_Object *after, cal_dialogue_item_clicked_callback callback_func, void *callback_data)
195 {
196         c_retv_if(!box, NULL);
197         c_retv_if(!CAL_STRLEN(style), NULL);
198         c_retv_if(!after, NULL);
199
200         Evas_Object *item = __cal_dialogue_create_item(box, style, callback_func, callback_data);
201         c_retv_if(!item, NULL);
202
203         elm_box_pack_after(box, item, after);
204         evas_object_show(item);
205
206         return item;
207 }
208
209 Evas_Object * cal_dialogue_insert_item_before(Evas_Object *box, const char *style, Evas_Object *before, cal_dialogue_item_clicked_callback callback_func, void *callback_data)
210 {
211         c_retv_if(!box, NULL);
212         c_retv_if(!CAL_STRLEN(style), NULL);
213         c_retv_if(!before, NULL);
214
215         Evas_Object *item = __cal_dialogue_create_item(box, style, callback_func, callback_data);
216         c_retv_if(!item, NULL);
217
218         elm_box_pack_before(box, item, before);
219         evas_object_show(item);
220
221         return item;
222 }
223
224 void cal_dialogue_delete_item(Evas_Object *box, Evas_Object *item)
225 {
226         c_ret_if(!box);
227         c_ret_if(!item);
228
229         elm_box_unpack(box, item);
230         evas_object_del(item);
231
232         Eina_List *unpacked_item_list = NULL;
233
234         unpacked_item_list = evas_object_data_get(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
235
236         if (unpacked_item_list)
237                 eina_list_remove(unpacked_item_list, item);
238 }
239
240 void cal_dialogue_delete_all_items(Evas_Object *dialogue)
241 {
242         c_ret_if(!dialogue);
243
244         Evas_Object *box = cal_dialogue_get_box(dialogue);
245         c_ret_if(!box);
246
247         elm_box_clear(box);
248
249         Eina_List *unpacked_item_list = NULL;
250
251         unpacked_item_list = evas_object_data_get(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
252
253         if (unpacked_item_list) {
254                 unpacked_item_list = eina_list_free(unpacked_item_list);
255                 evas_object_data_set(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST, unpacked_item_list);
256         }
257 }
258
259 static Eina_Bool __cal_dialogue_check_item_is_already_added(Evas_Object *box, Evas_Object *item)
260 {
261         Eina_Bool ret = EINA_FALSE;
262
263         c_retv_if(!box, ret);
264         c_retv_if(!item, ret);
265
266         Eina_List *children = NULL;
267
268         children = elm_box_children_get(box);
269         c_retv_if(!children, ret);
270
271         Eina_List *cursor = NULL;
272         Evas_Object *data = NULL;
273
274         EINA_LIST_FOREACH(children, cursor, data) {
275                 if (data && data == item) {
276                         ret = EINA_TRUE;
277                         break;
278                 }
279         }
280
281         eina_list_free(children);
282
283         return ret;
284 }
285
286 void cal_dialogue_show_item_before(Evas_Object *box, Evas_Object *item, Evas_Object *before)
287 {
288         c_ret_if(!box);
289         c_ret_if(!item);
290
291         if (__cal_dialogue_check_item_is_already_added(box, item))
292                 return;
293
294         c_ret_if(!before);
295
296         elm_box_pack_before(box, item, before);
297         evas_object_show(item);
298 }
299
300 void cal_dialogue_show_item_after(Evas_Object *box, Evas_Object *item, Evas_Object *after)
301 {
302         c_ret_if(!box);
303         c_ret_if(!item);
304
305         if (__cal_dialogue_check_item_is_already_added(box, item))
306                 return;
307
308         c_ret_if(!after);
309
310         elm_box_pack_after(box, item, after);
311         evas_object_show(item);
312 }
313
314 void cal_dialogue_hide_item(Evas_Object *box, Evas_Object *item)
315 {
316         c_ret_if(!box);
317         c_ret_if(!item);
318
319         elm_box_unpack(box, item);
320         evas_object_hide(item);
321
322         Eina_List *unpacked_item_list = NULL;
323
324         unpacked_item_list = evas_object_data_get(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
325
326         unpacked_item_list = eina_list_append(unpacked_item_list, item);
327
328         if (!evas_object_data_get(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST))
329                 evas_object_data_set(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST, unpacked_item_list);
330 }