4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
23 #include <Elementary.h>
24 #include <ui-gadget-engine.h>
27 #include "ug-efl-engine.h"
31 #define UG_ENGINE_API __attribute__ ((visibility("default")))
34 static Evas_Object *navi = NULL;
35 static Evas_Object *conform = NULL;
36 static void on_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
37 static void (*show_end_cb)(void* data) = NULL;
38 static void (*hide_end_cb)(void* data) = NULL;
40 static void _layout_del_cb(void *data, Evas_Object *obj, void *event_info)
42 ui_gadget_h ug = (ui_gadget_h)data;
46 _WRN("ug(%p) layout is deleted by abnormal path", ug);
48 evas_object_event_callback_del(ug->layout, EVAS_CALLBACK_DEL, _layout_del_cb);
50 ug->layout_state = UG_LAYOUT_DESTROY;
54 static Eina_Bool __destroy_end_cb(void *data)
57 ui_gadget_h ug = (ui_gadget_h)data;
59 _DBG("\t __destroy_end_cb ug=%p", ug);
63 //_DBG("\t ug(%p) has children(%p)", ug, child);
66 _ERR("child->data is null");
67 return ECORE_CALLBACK_CANCEL;
70 //_DBG("\t child(%p) layout_state(%d)", child, ((ui_gadget_h)child->data)->layout_state);
72 if( ((ui_gadget_h)child->data)->layout_state == UG_LAYOUT_HIDEEFFECT) {
73 //_DBG("\t wait hideeffect child(%p)", ug);
74 return ECORE_CALLBACK_RENEW;
76 child = g_slist_next(child);
81 return ECORE_CALLBACK_CANCEL;
84 static void __del_effect_end(ui_gadget_h ug)
87 Elm_Object_Item *t = elm_naviframe_top_item_get(navi);
88 Elm_Object_Item *b = elm_naviframe_bottom_item_get(navi);
90 _DBG("\t unset navi");
91 elm_object_part_content_unset(conform, "elm.swallow.ug");
92 evas_object_hide(navi);
96 evas_object_hide(ug->layout);
97 evas_object_event_callback_del(ug->layout, EVAS_CALLBACK_DEL, _layout_del_cb);
100 ecore_idler_add((Ecore_Task_Cb)__destroy_end_cb, (void *)ug);
102 ug->layout_state = UG_LAYOUT_DESTROY;
105 static void __del_finished(void *data, Evas_Object *obj, void *event_info)
107 ui_gadget_h ug = (ui_gadget_h)data;
111 _DBG("\t obj=%p ug=%p", obj, ug);
113 evas_object_smart_callback_del(obj, "transition,finished",
116 if(ug->layout_state == UG_LAYOUT_HIDEEFFECT)
117 __del_effect_end(ug);
119 _ERR("wrong ug(%p) state(%d)", ug, ug->layout_state);
122 static void __del_effect_top_layout(ui_gadget_h ug)
124 _DBG("\t cb transition add ug=%p", ug);
125 evas_object_smart_callback_add(navi, "transition,finished",
127 elm_naviframe_item_pop(navi);
128 ug->effect_layout = NULL;
129 ug->layout_state = UG_LAYOUT_HIDEEFFECT;
132 static void __del_effect_layout(ui_gadget_h ug, ui_gadget_h t_ug)
139 _DBG("\t ug=%p state=%d , t_ug=%p", ug, ug->layout_state, t_ug);
142 child = ug->children;
143 _DBG("\t ug(%p) has children(%p)", ug, child);
145 __del_effect_layout(child->data, t_ug);
146 child = g_slist_next(child);
150 if((ug == t_ug)&&(ug->layout_state != UG_LAYOUT_NOEFFECT)){
151 if (ug->layout_state != UG_LAYOUT_HIDEEFFECT) {
152 __del_effect_top_layout(ug);
154 _ERR("\t top ug(%p) state is hideeffect.");
158 _DBG("\t remove navi item: ug=%p state=%d", ug, ug->layout_state);
159 elm_object_item_del(ug->effect_layout);
160 ug->effect_layout = NULL;
163 __del_effect_end(ug);
166 static void __hide_effect_end(ui_gadget_h ug)
169 Elm_Object_Item *t = elm_naviframe_top_item_get(navi);
170 Elm_Object_Item *b = elm_naviframe_bottom_item_get(navi);
172 _DBG("\t unset navi");
173 elm_object_part_content_unset(conform, "elm.swallow.ug");
174 evas_object_hide(navi);
179 evas_object_hide(ug->layout);
182 ug->layout_state = UG_LAYOUT_HIDE;
185 static void __hide_finished(void *data, Evas_Object *obj, void *event_info)
187 ui_gadget_h ug = (ui_gadget_h)data;
191 _DBG("\t obj=%p ug=%p", obj, ug);
193 evas_object_smart_callback_del(obj, "transition,finished",
196 if(ug->layout_state == UG_LAYOUT_HIDEEFFECT)
197 __hide_effect_end(ug);
199 _ERR("wrong ug(%p) state(%d)", ug, ug->layout_state);
202 static void __on_hideonly_cb(void *data, Evas_Object *obj)
204 ui_gadget_h ug = (ui_gadget_h)data;
209 _DBG("\t obj=%p ug=%p layout_state=%d state=%d", obj, ug, ug->layout_state, ug->state);
211 evas_object_intercept_hide_callback_del(ug->layout, __on_hideonly_cb);
212 evas_object_event_callback_add(ug->layout, EVAS_CALLBACK_SHOW, on_show_cb, ug);
214 if (ug->layout_state == UG_LAYOUT_SHOW) {
215 ug->layout_state = UG_LAYOUT_HIDE;
216 } else if (ug->layout_state == UG_LAYOUT_NOEFFECT) {
219 _ERR("wrong ug(%p) state(%d)", ug, ug->layout_state);
223 if (elm_naviframe_top_item_get(navi) == ug->effect_layout) {
224 _DBG("\t cb transition add ug=%p", ug);
225 evas_object_smart_callback_add(navi, "transition,finished",
226 __hide_finished, ug);
227 elm_naviframe_item_pop(navi);
228 ug->layout_state = UG_LAYOUT_HIDEEFFECT;
230 elm_object_item_del(ug->effect_layout);
231 __hide_effect_end(ug);
234 ug->effect_layout = NULL;
237 static void on_destroy(ui_gadget_h ug, ui_gadget_h t_ug,
238 void (*hide_cb)(void* data))
242 _DBG("\t ug=%p tug=%p state=%d", ug, t_ug, ug->layout_state);
244 evas_object_intercept_hide_callback_del(ug->layout,
247 if(hide_cb == NULL) {
248 /* ug_destroy_all case */
249 evas_object_event_callback_del(ug->layout, EVAS_CALLBACK_DEL, _layout_del_cb);
254 hide_end_cb = hide_cb;
257 _DBG("requested ug(%p) is not top ug(%p)", ug, t_ug);
258 __del_effect_layout(ug, t_ug);
262 if(ug->layout_state == UG_LAYOUT_SHOW) {
263 __del_effect_top_layout(ug);
264 } else if (ug->layout_state == UG_LAYOUT_HIDE
265 || ug->layout_state == UG_LAYOUT_NOEFFECT
266 || ug->layout_state == UG_LAYOUT_SHOWEFFECT) {
267 __del_effect_layout(ug, t_ug);
268 } else if (ug->layout_state == UG_LAYOUT_HIDEEFFECT) {
271 _WRN("[UG Effect Plug-in] : layout state error!!");
272 __del_effect_end(ug);
276 static void __update_indicator_overlap(int opt)
278 if (GET_OPT_OVERLAP_VAL(opt)) {
279 _DBG("\t this is Overlap UG. Send overlap sig on_show_cb");
280 elm_object_signal_emit(conform, "elm,state,indicator,overlap", "");
282 _DBG("\t this is no overlap UG. Send no overlap sig on_show_cb");
283 elm_object_signal_emit(conform, "elm,state,indicator,nooverlap", "");
287 static void __show_finished(void *data, Evas_Object *obj, void *event_info)
289 ui_gadget_h ug = (ui_gadget_h)data;
293 _DBG("\tobj=%p ug=%p", obj, ug);
295 evas_object_smart_callback_del(obj, "transition,finished",
298 if (ug->layout_state == UG_LAYOUT_DESTROY) {
299 _DBG("ug(%p) already destroyed", ug);
300 } else if (ug->layout_state == UG_LAYOUT_SHOWEFFECT) {
301 ug->layout_state = UG_LAYOUT_SHOW;
302 if((show_end_cb)&&(ug->state == UG_STATE_CREATED))
305 _ERR("wrong state(%d)", ug->layout_state);
311 static void on_show_cb(void *data, Evas *e, Evas_Object *obj,
314 ui_gadget_h ug = (ui_gadget_h)data;
317 _DBG("\tobj=%p ug=%p layout=%p state=%d", obj, ug, ug->layout, ug->layout_state);
319 evas_object_event_callback_del(ug->layout, EVAS_CALLBACK_SHOW, on_show_cb);
321 evas_object_intercept_hide_callback_add(ug->layout,
322 __on_hideonly_cb, ug);
324 //if 'elm.swallow.ug' string is changed, msg team have to apply this changes.
325 elm_object_part_content_set(conform, "elm.swallow.ug", navi);
327 if (ug->layout_state == UG_LAYOUT_HIDEEFFECT
328 || ug->layout_state == UG_LAYOUT_HIDE
329 || ug->layout_state == UG_LAYOUT_INIT) {
330 _DBG("\t UG_LAYOUT_Init(%d) obj=%p", ug->layout_state, obj);
331 ug->layout_state = UG_LAYOUT_SHOWEFFECT;
333 __update_indicator_overlap(ug->opt);
335 evas_object_smart_callback_add(navi, "transition,finished",
336 __show_finished, ug);
337 ug->effect_layout = elm_naviframe_item_push(navi, NULL, NULL, NULL,
339 } else if (ug->layout_state == UG_LAYOUT_NOEFFECT) {
340 _DBG("\t UG_LAYOUT_NOEFFECT obj=%p", obj);
342 __update_indicator_overlap(ug->opt);
344 Elm_Object_Item *navi_top = elm_naviframe_top_item_get(navi);
345 ug->effect_layout = elm_naviframe_item_insert_after(navi,
346 navi_top, NULL, NULL, NULL, ug->layout, NULL);
351 _ERR("\tlayout state error!! state=%d\n", ug->layout_state);
354 _DBG("\ton_show_cb end ug=%p", ug);
357 static void *on_create(void *win, ui_gadget_h ug,
358 void (*show_cb)(void* data))
360 Evas_Object *navi_bg;
361 Evas_Object *con = NULL;
365 _DBG("\t ug=%p state=%d", ug, ug->layout_state);
367 con = evas_object_data_get(win, "\377 elm,conformant");
370 _DBG("\t There is conformant");
373 _DBG("\t There is NO conformant");
376 navi = elm_naviframe_add(conform);
377 elm_object_focus_allow_set(navi, EINA_FALSE);
378 elm_object_style_set(navi, "uglib");
379 elm_naviframe_content_preserve_on_pop_set(navi, EINA_TRUE);
380 _DBG("\t new navi first navi=%p", navi);
381 elm_naviframe_prev_btn_auto_pushed_set(navi, EINA_FALSE);
383 navi_bg = evas_object_rectangle_add(evas_object_evas_get(navi));
384 evas_object_size_hint_fill_set(navi_bg, EVAS_HINT_FILL,
386 evas_object_color_set(navi_bg, 0, 0, 0, 0);
387 elm_naviframe_item_push(navi, NULL, NULL, NULL, navi_bg, NULL);
391 show_end_cb = show_cb;
393 evas_object_hide(ug->layout);
394 evas_object_event_callback_add(ug->layout, EVAS_CALLBACK_SHOW, on_show_cb, ug);
395 evas_object_event_callback_add(ug->layout, EVAS_CALLBACK_DEL, _layout_del_cb, ug);
397 ug->layout_state = UG_LAYOUT_INIT;
402 UG_ENGINE_API int UG_ENGINE_INIT(struct ug_engine_ops *ops)
407 ops->create = on_create;
408 ops->destroy = on_destroy;
413 UG_ENGINE_API void UG_ENGINE_EXIT(struct ug_engine_ops *ops)