3 * Copyright 2012 Samsung Electronics Co., Ltd
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
9 * http://floralicense.org/license/
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.
21 #define CAL_DIALOGUE_CUSTOM_EDJ "/usr/apps/"CALENDAR_PACKAGE"/res/edje/dialogue.edj"
22 #define CAL_DIALOGUE_UNPACKED_ITEM_LIST "unpacked_item_list"
26 cal_dialogue_item_clicked_callback callback_func;
28 } __cal_dialogue_item_callback_s;
30 static void __cal_dialogue_box_delete_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
34 Eina_List *unpacked_item_list = NULL;
35 Eina_List *cursor = NULL;
36 Evas_Object *unpacked_item = NULL;
38 unpacked_item_list = evas_object_data_get(obj, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
40 if (!unpacked_item_list)
43 EINA_LIST_FOREACH(unpacked_item_list, cursor, unpacked_item) {
45 evas_object_del(unpacked_item);
49 Evas_Object * cal_dialogue_create(Evas_Object *parent)
51 c_retv_if(!parent, NULL);
53 Evas_Object *scroller = cal_util_add_scroller(parent);
54 c_retv_if(!scroller, NULL);
56 elm_object_style_set(scroller, "dialogue");
58 Evas_Object *box = elm_box_add(scroller);
60 ERR("elm_box_add(scroller) is failed");
61 evas_object_del(scroller);
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);
68 elm_object_content_set(scroller, box);
70 evas_object_show(box);
72 evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, __cal_dialogue_box_delete_callback, NULL);
77 void cal_dialogue_destroy(Evas_Object * dialogue)
81 evas_object_del(dialogue);
84 Evas_Object * cal_dialogue_get_box(Evas_Object *dialogue)
86 c_retv_if(!dialogue, NULL);
88 Evas_Object *box = elm_object_content_get(dialogue);
93 static void __cal_dialogue_item_clicked_callback(void *data, Evas *evas, Evas_Object *obj, void *event_info)
95 Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
97 __cal_dialogue_item_callback_s *callback = data;
100 Evas_Object *item = callback->item;
102 elm_object_signal_emit(item, "elm,state,unselected", "elm");
103 elm_object_focus_set(obj, EINA_TRUE);
105 if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
108 callback->callback_func(item, callback->callback_data);
111 static void __cal_dialogue_item_move_callback(void *data, Evas *evas, Evas_Object *obj, void *event_info)
113 Evas_Event_Mouse_Move *ev = (Evas_Event_Mouse_Move *)event_info;
115 __cal_dialogue_item_callback_s *callback = data;
118 Evas_Object *item = callback->item;
120 if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
121 elm_object_signal_emit(item, "elm,state,unselected", "elm");
126 static void __cal_dialogue_item_down_callback(void *data, Evas *evas, Evas_Object *obj, void *event_info)
128 __cal_dialogue_item_callback_s *callback = data;
130 Evas_Object *item = callback->item;
133 elm_object_signal_emit(item, "elm,state,selected", "elm");
136 static void __cal_dialogue_item_delete_callback(void *data, Evas *e, Evas_Object *obj, void *ei)
138 __cal_dialogue_item_callback_s *callback = data;
144 static Evas_Object * __cal_dialogue_create_item(Evas_Object *box, const char *style, cal_dialogue_item_clicked_callback callback_func, void *callback_data)
146 Evas_Object *layout = NULL;
148 layout = elm_layout_add(box);
149 c_retv_if(!layout, NULL);
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);
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);
165 __cal_dialogue_item_callback_s *callback = calloc(1, sizeof(__cal_dialogue_item_callback_s));
167 callback->item = layout;
168 callback->callback_func = callback_func;
169 callback->callback_data = callback_data;
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);
180 Evas_Object * cal_dialogue_append_item(Evas_Object *box, const char *style, cal_dialogue_item_clicked_callback callback_func, void *callback_data)
182 c_retv_if(!box, NULL);
183 c_retv_if(!CAL_STRLEN(style), NULL);
185 Evas_Object *item = __cal_dialogue_create_item(box, style, callback_func, callback_data);
186 c_retv_if(!item, NULL);
188 elm_box_pack_end(box, item);
189 evas_object_show(item);
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)
196 c_retv_if(!box, NULL);
197 c_retv_if(!CAL_STRLEN(style), NULL);
198 c_retv_if(!after, NULL);
200 Evas_Object *item = __cal_dialogue_create_item(box, style, callback_func, callback_data);
201 c_retv_if(!item, NULL);
203 elm_box_pack_after(box, item, after);
204 evas_object_show(item);
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)
211 c_retv_if(!box, NULL);
212 c_retv_if(!CAL_STRLEN(style), NULL);
213 c_retv_if(!before, NULL);
215 Evas_Object *item = __cal_dialogue_create_item(box, style, callback_func, callback_data);
216 c_retv_if(!item, NULL);
218 elm_box_pack_before(box, item, before);
219 evas_object_show(item);
224 void cal_dialogue_delete_item(Evas_Object *box, Evas_Object *item)
229 elm_box_unpack(box, item);
230 evas_object_del(item);
232 Eina_List *unpacked_item_list = NULL;
234 unpacked_item_list = evas_object_data_get(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
236 if (unpacked_item_list)
237 eina_list_remove(unpacked_item_list, item);
240 void cal_dialogue_delete_all_items(Evas_Object *dialogue)
244 Evas_Object *box = cal_dialogue_get_box(dialogue);
249 Eina_List *unpacked_item_list = NULL;
251 unpacked_item_list = evas_object_data_get(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
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);
259 static Eina_Bool __cal_dialogue_check_item_is_already_added(Evas_Object *box, Evas_Object *item)
261 Eina_Bool ret = EINA_FALSE;
263 c_retv_if(!box, ret);
264 c_retv_if(!item, ret);
266 Eina_List *children = NULL;
268 children = elm_box_children_get(box);
269 c_retv_if(!children, ret);
271 Eina_List *cursor = NULL;
272 Evas_Object *data = NULL;
274 EINA_LIST_FOREACH(children, cursor, data) {
275 if (data && data == item) {
281 eina_list_free(children);
286 void cal_dialogue_show_item_before(Evas_Object *box, Evas_Object *item, Evas_Object *before)
291 if (__cal_dialogue_check_item_is_already_added(box, item))
296 elm_box_pack_before(box, item, before);
297 evas_object_show(item);
300 void cal_dialogue_show_item_after(Evas_Object *box, Evas_Object *item, Evas_Object *after)
305 if (__cal_dialogue_check_item_is_already_added(box, item))
310 elm_box_pack_after(box, item, after);
311 evas_object_show(item);
314 void cal_dialogue_hide_item(Evas_Object *box, Evas_Object *item)
319 elm_box_unpack(box, item);
320 evas_object_hide(item);
322 Eina_List *unpacked_item_list = NULL;
324 unpacked_item_list = evas_object_data_get(box, CAL_DIALOGUE_UNPACKED_ITEM_LIST);
326 unpacked_item_list = eina_list_append(unpacked_item_list, item);
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);