1 #include <Elementary.h>
3 #include "elm_widget_naviframe.h"
5 #define KEY_END "XF86Stop" //Tizen Only
6 #define KEY_MENU "XF86Send" //Tizen Only
8 EAPI const char ELM_NAVIFRAME_SMART_NAME[] = "elm_naviframe";
10 static const char CONTENT_PART[] = "elm.swallow.content";
11 static const char PREV_BTN_PART[] = "elm.swallow.prev_btn";
12 static const char NEXT_BTN_PART[] = "elm.swallow.next_btn";
13 static const char ICON_PART[] = "elm.swallow.icon";
14 static const char TITLE_PART[] = "elm.text.title";
15 static const char SUBTITLE_PART[] = "elm.text.subtitle";
16 static const char TITLE_ACCESS_PART[] = "access.title";
18 static const char SIG_LANG_CHANGED[] = "language,changed";
19 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
20 static const char SIG_TITLE_TRANSITION_FINISHED[] = "title,transition,finished";
21 static const char SIG_TITLE_CLICKED[] = "title,clicked";
22 static const char SIG_ACCESS_CHANGED[] = "access,changed";
23 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
24 {SIG_LANG_CHANGED, ""},
25 {SIG_TRANSITION_FINISHED, ""},
26 {SIG_TITLE_TRANSITION_FINISHED, ""},
27 {SIG_TITLE_CLICKED, ""},
28 {SIG_ACCESS_CHANGED, ""},
32 EVAS_SMART_SUBCLASS_NEW
33 (ELM_NAVIFRAME_SMART_NAME, _elm_naviframe, Elm_Naviframe_Smart_Class,
34 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
36 static const char SIG_CLICKED[] = "clicked";
38 static int initted = 0;
39 static Elm_Naviframe_Mod_Api *nf_mod = NULL;
41 static Elm_Naviframe_Mod_Api *
46 ERR("_nf_mod_init initted %d", initted);
47 if (initted > 1) return;
48 if (!(mod = _elm_module_find_as("naviframe/api"))) return;
50 mod->api = malloc(sizeof(Elm_Naviframe_Mod_Api));
51 if (!mod->api) return;
53 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_push_effect =
54 _elm_module_symbol_get(mod, "tizen_push_effect");
55 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_pop_effect =
56 _elm_module_symbol_get(mod, "tizen_pop_effect");
60 static void _on_item_back_btn_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__);
61 static void _access_focus_set(Elm_Naviframe_Item *it);
64 _resize_object_reset(Evas_Object *obj, Elm_Naviframe_Item *it)
68 elm_widget_resize_object_set(obj, VIEW(it), EINA_FALSE);
69 evas_object_raise(VIEW(it));
74 _prev_page_focus_recover(Elm_Naviframe_Item *it)
77 unsigned int order = 0;
79 ELM_WIDGET_DATA_GET(VIEW(it), sd);
80 order = sd->focus_order;
82 if (_elm_config->access_mode)
83 _access_focus_set(it);
86 newest = elm_widget_newest_focus_order_get(VIEW(it), &order, EINA_TRUE);
88 elm_object_focus_set(newest, EINA_TRUE);
91 if (elm_object_focus_allow_get(VIEW(it)))
92 elm_object_focus_set(VIEW(it), EINA_TRUE);
94 elm_object_focus_set(WIDGET(it), EINA_TRUE);
100 _elm_naviframe_smart_translate(Evas_Object *obj)
102 ELM_NAVIFRAME_DATA_GET(obj, sd);
103 Elm_Naviframe_Item *it;
105 EINA_INLIST_FOREACH(sd->stack, it)
106 elm_widget_item_translate(it);
108 evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
114 _item_content_del_cb(void *data,
116 Evas_Object *obj __UNUSED__,
117 void *event_info __UNUSED__)
119 Elm_Naviframe_Item *it = data;
122 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
126 _item_title_prev_btn_del_cb(void *data,
128 Evas_Object *obj __UNUSED__,
129 void *event_info __UNUSED__)
131 Elm_Naviframe_Item *it = data;
133 it->title_prev_btn = NULL;
134 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
138 _item_title_next_btn_del_cb(void *data,
140 Evas_Object *obj __UNUSED__,
141 void *event_info __UNUSED__)
143 Elm_Naviframe_Item *it = data;
145 it->title_next_btn = NULL;
146 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
150 _item_title_icon_del_cb(void *data,
152 Evas_Object *obj __UNUSED__,
153 void *event_info __UNUSED__)
155 Elm_Naviframe_Item *it = data;
157 it->title_icon = NULL;
158 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
162 _title_content_del(void *data,
164 Evas_Object *obj __UNUSED__,
165 void *event_info __UNUSED__)
168 Elm_Naviframe_Content_Item_Pair *pair = data;
169 Elm_Naviframe_Item *it = pair->it;
170 snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
171 elm_object_signal_emit(VIEW(it), buf, "elm");
172 it->content_list = eina_inlist_remove(it->content_list,
173 EINA_INLIST_GET(pair));
174 eina_stringshare_del(pair->part);
179 _item_free(Elm_Naviframe_Item *it)
182 Elm_Naviframe_Content_Item_Pair *content_pair = NULL;
183 Elm_Naviframe_Text_Item_Pair *text_pair = NULL;
185 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
187 eina_stringshare_del(it->style);
188 eina_stringshare_del(it->title_label);
189 eina_stringshare_del(it->subtitle_label);
191 EINA_INLIST_FOREACH_SAFE(it->content_list, l, content_pair)
193 if (content_pair->content)
195 evas_object_event_callback_del(content_pair->content,
198 evas_object_del(content_pair->content);
200 eina_stringshare_del(content_pair->part);
204 EINA_INLIST_FOREACH_SAFE(it->text_list, l, text_pair)
206 eina_stringshare_del(text_pair->part);
213 if ((sd->preserve) && (!sd->on_deletion))
215 /* so that elm does not delete the contents with the item's
216 * view after the del_pre_hook */
217 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
218 evas_object_event_callback_del
219 (it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
225 _item_content_signals_emit(Elm_Naviframe_Item *it)
227 Elm_Naviframe_Content_Item_Pair *content_pair;
231 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
233 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
236 if (it->title_prev_btn)
237 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
239 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
242 if (it->title_next_btn)
243 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
245 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
248 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
250 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
252 EINA_INLIST_FOREACH(it->content_list, content_pair)
254 if (content_pair->content)
255 snprintf(buf, sizeof(buf), "elm,state,%s,show", content_pair->part);
257 snprintf(buf, sizeof(buf), "elm,state,%s,hide", content_pair->part);
258 elm_object_signal_emit(VIEW(it), buf, "elm");
263 _item_text_signals_emit(Elm_Naviframe_Item *it)
265 Elm_Naviframe_Text_Item_Pair *text_pair;
269 if ((it->title_label) && (it->title_label[0]))
270 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
272 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
274 if ((it->subtitle_label) && (it->subtitle_label[0]))
275 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
277 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
279 EINA_INLIST_FOREACH(it->text_list, text_pair)
281 text = elm_object_part_text_get(VIEW(it), text_pair->part);
282 if (text && strlen(text))
283 snprintf(buf, sizeof(buf), "elm,state,%s,show", text_pair->part);
285 snprintf(buf, sizeof(buf), "elm,state,%s,hide", text_pair->part);
286 elm_object_signal_emit(VIEW(it), buf, "elm");
291 _access_focus_set(Elm_Naviframe_Item *it)
295 if (elm_widget_tree_unfocusable_get(VIEW(it))) return;
297 ao = ((Elm_Widget_Item *)it)->access_obj;
299 if (ao && it->title_enabled)
300 _elm_access_highlight_set(ao, EINA_TRUE);
303 if (!elm_widget_highlight_get(VIEW(it)))
304 _elm_access_highlight_cycle(VIEW(it), ELM_ACCESS_ACTION_HIGHLIGHT_NEXT);
309 _item_signals_emit(Elm_Naviframe_Item *it)
311 _item_text_signals_emit(it);
312 _item_content_signals_emit(it);
315 /* FIXME: we need to handle the case when this function is called
316 * during a transition */
318 _item_style_set(Elm_Naviframe_Item *it,
319 const char *item_style)
323 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
327 strcpy(buf, "item/basic");
328 eina_stringshare_replace(&it->style, "basic");
332 snprintf(buf, sizeof(buf), "item/%s", item_style);
333 eina_stringshare_replace(&it->style, item_style);
336 elm_layout_theme_set(VIEW(it), "naviframe", buf,
337 elm_widget_style_get(WIDGET(it)));
338 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
340 if (sd->freeze_events)
341 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
345 (char *)edje_object_data_get(elm_layout_edje_get(VIEW(it)), "tizen_zoom");
346 if (tizen_zoom) it->tizen_zoom = atoi(tizen_zoom);
350 _on_item_title_transition_finished(void *data,
351 Evas_Object *obj __UNUSED__,
352 const char *emission __UNUSED__,
353 const char *source __UNUSED__)
355 Elm_Naviframe_Item *it = data;
357 evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_TRANSITION_FINISHED, data);
361 _item_title_enabled_update(Elm_Naviframe_Item *nit, Eina_Bool transition)
363 transition = !!transition;
366 if (nit->title_enabled)
367 elm_object_signal_emit(VIEW(nit), "elm,action,title,show", "elm");
369 elm_object_signal_emit(VIEW(nit), "elm,action,title,hide", "elm");
373 if (nit->title_enabled)
374 elm_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
376 elm_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
378 edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
382 _elm_naviframe_smart_theme(Evas_Object *obj)
384 Elm_Naviframe_Item *it;
385 const char *style, *sstyle;
387 ELM_NAVIFRAME_DATA_GET(obj, sd);
389 style = elm_widget_style_get(obj);
391 EINA_INLIST_FOREACH(sd->stack, it)
393 sstyle = elm_widget_style_get(VIEW(it));
394 if ((style && sstyle) && strcmp(style, sstyle))
395 _item_style_set(it, it->style);
396 _item_signals_emit(it);
397 _item_title_enabled_update(it, EINA_FALSE);
400 elm_layout_sizing_eval(obj);
406 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
409 Elm_Naviframe_Item *nit;
416 if (!nit->title_enabled) return NULL;
419 info = elm_object_part_text_get(layout, TITLE_PART);
420 if (!info) return NULL;
422 buf = eina_strbuf_new();
423 eina_strbuf_append(buf, info);
425 info = elm_object_part_text_get(layout, SUBTITLE_PART);
428 eina_strbuf_append_printf(buf, ", %s", info);
431 ret = eina_strbuf_string_steal(buf);
432 eina_strbuf_free(buf);
437 _access_obj_process(Elm_Naviframe_Item *it, Eina_Bool is_access)
439 Evas_Object *ao, *eo;
441 if (is_access && (it->title_label || it->subtitle_label))
443 ao = ((Elm_Widget_Item *)it)->access_obj;
447 eo = elm_layout_edje_get(VIEW(it));
448 ao =_elm_access_edje_object_part_object_register(VIEW(it), eo,
450 _elm_access_callback_set(_elm_access_object_get(ao),
451 ELM_ACCESS_INFO, _access_info_cb, it);
453 /* to access title access object, any idea? */
454 ((Elm_Widget_Item *)it)->access_obj = ao;
459 /* to access title access object, any idea? */
460 ao = ((Elm_Widget_Item *)it)->access_obj;
463 if (it->title_label || it->subtitle_label)
465 _elm_access_edje_object_part_object_unregister
466 (VIEW(it), elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
468 /* deletion of access object occurs in
469 _elm_access_edje_object_part_object_unregister(); */
470 ((Elm_Widget_Item *)it)->access_obj = NULL;
476 _item_text_set_hook(Elm_Object_Item *it,
480 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
481 Elm_Naviframe_Text_Item_Pair *pair = NULL;
484 if ((!part) || (!strcmp(part, "default")) ||
485 (!strcmp(part, TITLE_PART)))
487 eina_stringshare_replace(&nit->title_label, label);
489 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
491 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
492 elm_object_part_text_set(VIEW(it), TITLE_PART, label);
494 else if (!strcmp("subtitle", part))
496 eina_stringshare_replace(&nit->subtitle_label, label);
498 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
500 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
501 elm_object_part_text_set(VIEW(it), SUBTITLE_PART, label);
505 EINA_INLIST_FOREACH(nit->text_list, pair)
506 if (!strcmp(part, pair->part)) break;
510 pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
513 ERR("Failed to allocate new text part of the item! : naviframe=%p",
517 eina_stringshare_replace(&pair->part, part);
518 nit->text_list = eina_inlist_append(nit->text_list,
519 EINA_INLIST_GET(pair));
523 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
524 elm_object_part_text_set(VIEW(it), part, label);
528 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
529 elm_object_part_text_set(VIEW(it), part, "");
531 elm_object_signal_emit(VIEW(it), buf, "elm");
535 if (_elm_config->access_mode)
536 _access_obj_process(nit, EINA_TRUE);
538 elm_layout_sizing_eval(WIDGET(nit));
542 _item_text_get_hook(const Elm_Object_Item *it,
547 if (!part || !strcmp(part, "default"))
548 snprintf(buf, sizeof(buf), TITLE_PART);
549 else if (!strcmp("subtitle", part))
550 snprintf(buf, sizeof(buf), SUBTITLE_PART);
552 snprintf(buf, sizeof(buf), "%s", part);
554 return elm_object_part_text_get(VIEW(it), buf);
558 _item_del_pre_hook(Elm_Object_Item *it)
560 Elm_Naviframe_Item *nit, *prev_it = NULL;
563 nit = (Elm_Naviframe_Item *)it;
564 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
566 nit->delete_me = EINA_TRUE;
567 if (nit->ref > 0) return EINA_FALSE;
569 if (nit->animator) ecore_animator_del(nit->animator);
571 top = (it == elm_naviframe_top_item_get(WIDGET(nit)));
572 if (evas_object_data_get(VIEW(nit), "out_of_list"))
575 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
577 if (top && !sd->on_deletion) /* must raise another one */
579 if (sd->stack && sd->stack->last)
580 prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last,
582 if (!prev_it) goto end;
584 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_FALSE);
585 elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
587 if (sd->freeze_events)
588 evas_object_freeze_events_set(VIEW(prev_it), EINA_FALSE);
589 _resize_object_reset(WIDGET(prev_it), prev_it);
590 evas_object_show(VIEW(prev_it));
592 _prev_page_focus_recover(prev_it);
594 elm_object_signal_emit(VIEW(prev_it), "elm,state,visible",
604 _item_content_set(Elm_Naviframe_Item *it,
605 Evas_Object *content)
607 if (it->content == content) return;
609 if (it->content) evas_object_del(it->content);
610 it->content = content;
612 if (!content) return;
614 elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
615 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
617 evas_object_event_callback_add
618 (content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
622 _access_prev_btn_info_cb(void *data __UNUSED__ , Evas_Object *obj __UNUSED__)
624 return strdup(E_("Back"));
628 _item_title_prev_btn_set(Elm_Naviframe_Item *it,
632 if (it->title_prev_btn == btn) return;
633 if (it->title_prev_btn) evas_object_del(it->title_prev_btn);
634 it->title_prev_btn = btn;
637 elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
638 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
639 evas_object_event_callback_add
640 (btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
641 evas_object_smart_callback_add
642 (btn, SIG_CLICKED, _on_item_back_btn_clicked, WIDGET(it));
644 txt = elm_layout_text_get(btn, NULL);
645 if (txt && (strlen(txt) > 0)) return;
647 _elm_access_callback_set
648 (_elm_access_object_get(btn), ELM_ACCESS_INFO,
649 (Elm_Access_Info_Cb)_access_prev_btn_info_cb, it);
653 _item_title_next_btn_set(Elm_Naviframe_Item *it,
656 if (it->title_next_btn == btn) return;
657 if (it->title_next_btn) evas_object_del(it->title_next_btn);
658 it->title_next_btn = btn;
661 elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
662 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
664 evas_object_event_callback_add
665 (btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
669 _item_title_icon_set(Elm_Naviframe_Item *it,
672 if (it->title_icon == icon) return;
673 if (it->title_icon) evas_object_del(it->title_icon);
674 it->title_icon = icon;
677 elm_object_part_content_set(VIEW(it), ICON_PART, icon);
678 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
680 evas_object_event_callback_add
681 (icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
685 _item_content_unset(Elm_Naviframe_Item *it)
687 Evas_Object *content = it->content;
689 if (!content) return NULL;
691 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
692 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
694 evas_object_event_callback_del
695 (content, EVAS_CALLBACK_DEL, _item_content_del_cb);
702 _item_title_prev_btn_unset(Elm_Naviframe_Item *it)
704 Evas_Object *content = it->title_prev_btn;
706 if (!content) return NULL;
708 elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
709 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
711 evas_object_event_callback_del
712 (content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
714 evas_object_smart_callback_del(content, SIG_CLICKED,
715 _on_item_back_btn_clicked);
717 it->title_prev_btn = NULL;
722 _item_title_next_btn_unset(Elm_Naviframe_Item *it)
724 Evas_Object *content = it->title_next_btn;
726 if (!content) return NULL;
728 elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
729 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
731 evas_object_event_callback_del
732 (content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
734 it->title_next_btn = NULL;
739 _item_title_icon_unset(Elm_Naviframe_Item *it)
741 Evas_Object *content = it->title_icon;
743 if (!content) return NULL;
745 elm_object_part_content_unset(VIEW(it), ICON_PART);
746 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
748 evas_object_event_callback_del
749 (content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
751 it->title_icon = NULL;
755 /* since we have each item as layout, we can't reusing the layout's
756 * aliasing, so let's do it ourselves */
758 _part_aliasing_eval(const char **part)
760 if (!*part || !strcmp("default", *part))
761 *part = CONTENT_PART;
762 else if (!strcmp(*part, "prev_btn"))
763 *part = PREV_BTN_PART;
764 else if (!strcmp(*part, "next_btn"))
765 *part = NEXT_BTN_PART;
766 else if (!strcmp(*part, "icon"))
771 _title_content_set(Elm_Naviframe_Item *it,
773 Evas_Object *content)
775 Elm_Naviframe_Content_Item_Pair *pair = NULL;
778 EINA_INLIST_FOREACH(it->content_list, pair)
779 if (!strcmp(part, pair->part)) break;
782 if (pair->content == content) return;
784 evas_object_event_callback_del(pair->content,
787 if (content) elm_object_part_content_set(VIEW(it), part, content);
791 if (!content) return;
793 //Remove the pair if new content was swallowed into other part.
794 EINA_INLIST_FOREACH(it->content_list, pair)
796 if (pair->content == content)
798 eina_stringshare_del(pair->part);
799 it->content_list = eina_inlist_remove(it->content_list,
800 EINA_INLIST_GET(pair));
801 evas_object_event_callback_del(pair->content,
810 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
813 ERR("Failed to allocate new content part of the item! : naviframe=%p",
818 eina_stringshare_replace(&pair->part, part);
819 it->content_list = eina_inlist_append(it->content_list,
820 EINA_INLIST_GET(pair));
821 elm_object_part_content_set(VIEW(it), part, content);
822 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
823 elm_object_signal_emit(VIEW(it), buf, "elm");
825 pair->content = content;
826 evas_object_event_callback_add(content,
831 if (_elm_config->access_mode)
832 _access_obj_process(it, EINA_TRUE);
836 _item_content_set_hook(Elm_Object_Item *it,
838 Evas_Object *content)
840 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
842 _part_aliasing_eval(&part);
845 if (!part || !strcmp(CONTENT_PART, part))
846 _item_content_set(nit, content);
847 else if (!strcmp(part, PREV_BTN_PART))
848 _item_title_prev_btn_set(nit, content);
849 else if (!strcmp(part, NEXT_BTN_PART))
850 _item_title_next_btn_set(nit, content);
851 else if (!strcmp(part, ICON_PART))
852 _item_title_icon_set(nit, content);
854 _title_content_set(nit, part, content);
856 elm_layout_sizing_eval(WIDGET(it));
860 _item_content_get_hook(const Elm_Object_Item *it,
863 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
865 _part_aliasing_eval(&part);
868 if (!part || !strcmp(CONTENT_PART, part))
870 else if (!strcmp(part, PREV_BTN_PART))
871 return nit->title_prev_btn;
872 else if (!strcmp(part, NEXT_BTN_PART))
873 return nit->title_next_btn;
874 else if (!strcmp(part, ICON_PART))
875 return nit->title_icon;
878 return elm_object_part_content_get(VIEW(nit), part);
882 _title_content_unset(Elm_Naviframe_Item *it, const char *part)
884 Elm_Naviframe_Content_Item_Pair *pair = NULL;
886 Evas_Object *content = NULL;
888 EINA_INLIST_FOREACH(it->content_list, pair)
890 if (!strcmp(part, pair->part))
892 content = pair->content;
893 eina_stringshare_del(pair->part);
894 it->content_list = eina_inlist_remove(it->content_list,
895 EINA_INLIST_GET(pair));
901 if (!content) return NULL;
903 elm_object_part_content_unset(VIEW(it), part);
904 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
905 elm_object_signal_emit(VIEW(it), buf, "elm");
906 evas_object_event_callback_del(content,
913 _item_content_unset_hook(Elm_Object_Item *it,
916 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
917 Evas_Object *o = NULL;
919 _part_aliasing_eval(&part);
922 if (!part || !strcmp(CONTENT_PART, part))
923 o = _item_content_unset(nit);
924 else if (!strcmp(part, PREV_BTN_PART))
925 o = _item_title_prev_btn_unset(nit);
926 else if (!strcmp(part, NEXT_BTN_PART))
927 o = _item_title_next_btn_unset(nit);
928 else if (!strcmp(part, ICON_PART))
929 o = _item_title_icon_unset(nit);
931 o = _title_content_unset(nit, part);
933 elm_layout_sizing_eval(WIDGET(it));
939 _item_signal_emit_hook(Elm_Object_Item *it,
940 const char *emission,
943 elm_object_signal_emit(VIEW(it), emission, source);
947 _elm_naviframe_smart_sizing_eval(Evas_Object *obj)
949 Evas_Coord minw = -1, minh = -1;
950 Elm_Naviframe_Item *it, *top;
951 Evas_Coord x, y, w, h;
953 ELM_NAVIFRAME_DATA_GET(obj, sd);
955 if (sd->on_deletion) return;
957 if (!sd->stack) return;
959 top = (EINA_INLIST_CONTAINER_GET(sd->stack->last, Elm_Naviframe_Item));
960 evas_object_geometry_get(obj, &x, &y, &w, &h);
961 EINA_INLIST_FOREACH(sd->stack, it)
963 evas_object_move(VIEW(it), x, y);
964 evas_object_resize(VIEW(it), w, h);
968 edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
969 &it->minw, &it->minh);
975 evas_object_size_hint_min_set(obj, minw, minh);
976 evas_object_size_hint_max_set(obj, -1, -1);
980 _on_item_back_btn_clicked(void *data,
982 void *event_info __UNUSED__)
984 /* Since edje has the event queue, clicked event could be happend
985 multiple times on some heavy environment. This callback del will
986 prevent those scenario and guarantee only one clicked for it's own
988 evas_object_smart_callback_del(obj, SIG_CLICKED, _on_item_back_btn_clicked);
989 elm_naviframe_item_pop(data);
993 _back_btn_new(Evas_Object *obj, const char *title_label)
995 Evas_Object *btn, *ed;
998 btn = elm_button_add(obj);
1000 if (!btn) return NULL;
1002 (buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
1003 elm_object_style_set(btn, buf);
1005 elm_layout_text_set(btn, NULL, title_label);
1007 elm_object_domain_translatable_text_set(btn, PACKAGE, N_("Back"));
1009 /* HACK NOTE: this explicit check only exists to avoid an ERR()
1010 * message from elm_layout_content_set().
1012 * The button was ALWAYS supposed to support an elm.swallow.content, but
1013 * default naviframe/back_btn/default theme did not provide such, then
1014 * old themes would emit such error message.
1016 * Once we can break the theme API, remove this check and always
1019 ed = elm_layout_edje_get(btn);
1020 if (edje_object_part_exists(ed, CONTENT_PART))
1022 Evas_Object *ico = elm_icon_add(btn);
1023 elm_icon_standard_set(ico, "arrow_left");
1024 elm_layout_content_set(btn, CONTENT_PART, ico);
1031 _elm_naviframe_smart_signal_callback_add(Evas_Object *obj,
1032 const char *emission,
1034 Edje_Signal_Cb func_cb,
1037 ELM_NAVIFRAME_DATA_GET(obj, sd);
1038 Elm_Object_Item *it;
1040 if (!sd->stack) return;
1042 _elm_naviframe_parent_sc->callback_add(obj, emission, source, func_cb, data);
1044 it = elm_naviframe_top_item_get(obj);
1047 elm_object_signal_callback_add(VIEW(it), emission, source, func_cb, data);
1051 _elm_naviframe_smart_signal(Evas_Object *obj,
1052 const char *emission,
1055 ELM_NAVIFRAME_DATA_GET(obj, sd);
1056 Elm_Object_Item *it;
1058 if (!sd->stack) return;
1060 _elm_naviframe_parent_sc->signal(obj, emission, source);
1062 it = elm_naviframe_top_item_get(obj);
1065 elm_object_signal_emit(VIEW(it), emission, source);
1068 /* content/text smart functions proxying things to the top item, which
1069 * is the resize object of the layout */
1071 _elm_naviframe_smart_text_set(Evas_Object *obj,
1075 Elm_Object_Item *it = NULL;
1076 const char *ret = NULL;
1078 it = elm_naviframe_top_item_get(obj);
1079 if (!it) return EINA_FALSE;
1081 elm_object_item_part_text_set(it, part, label);
1082 ret = elm_object_item_part_text_get(it, part);
1085 return !strcmp(ret, label);
1086 else return EINA_FALSE;
1091 _elm_naviframe_smart_text_get(const Evas_Object *obj,
1094 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1096 if (!it) return NULL;
1098 return elm_object_item_part_text_get(it, part);
1101 /* we have to keep a "manual" set here because of the callbacks on the
1104 _elm_naviframe_smart_content_set(Evas_Object *obj,
1106 Evas_Object *content)
1108 Elm_Object_Item *it;
1110 it = elm_naviframe_top_item_get(obj);
1111 if (!it) return EINA_FALSE;
1113 elm_object_item_part_content_set(it, part, content);
1115 return content == elm_object_item_part_content_get(it, part);
1118 static Evas_Object *
1119 _elm_naviframe_smart_content_get(const Evas_Object *obj,
1122 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1124 if (!it) return NULL;
1126 return elm_object_item_part_content_get(it, part);
1129 static Evas_Object *
1130 _elm_naviframe_smart_content_unset(Evas_Object *obj,
1133 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1135 if (!it) return NULL;
1137 return elm_object_item_part_content_unset(it, part);
1141 _on_item_title_clicked(void *data,
1142 Evas_Object *obj __UNUSED__,
1143 const char *emission __UNUSED__,
1144 const char *source __UNUSED__)
1146 Elm_Naviframe_Item *it = data;
1148 evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
1151 /* "elm,state,cur,pushed"
1154 _on_item_push_finished(void *data,
1155 Evas_Object *obj __UNUSED__,
1156 const char *emission __UNUSED__,
1157 const char *source __UNUSED__)
1159 Elm_Naviframe_Item *it = data;
1163 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1165 evas_object_hide(VIEW(it));
1167 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1169 if (sd->freeze_events)
1170 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1174 /* "elm,state,new,pushed",
1175 * "elm,state,prev,popped
1178 _on_item_show_finished(void *data,
1179 Evas_Object *obj __UNUSED__,
1180 const char *emission __UNUSED__,
1181 const char *source __UNUSED__)
1183 Elm_Naviframe_Item *it = data;
1185 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1187 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1189 if (_elm_config->access_mode)
1190 _elm_access_highlight_read_enable_set(WIDGET(it), EINA_TRUE, EINA_FALSE);
1192 _prev_page_focus_recover(it);
1194 if (sd->freeze_events)
1195 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1197 evas_object_smart_callback_call(WIDGET(it), SIG_TRANSITION_FINISHED, data);
1201 _on_item_size_hints_changed(void *data,
1203 Evas_Object *obj __UNUSED__,
1204 void *event_info __UNUSED__)
1206 elm_layout_sizing_eval(data);
1210 _item_dispmode_set(Elm_Naviframe_Item *it, Evas_Display_Mode dispmode)
1212 if (it->dispmode == dispmode) return;
1215 case EVAS_DISPLAY_MODE_COMPRESS:
1216 elm_object_signal_emit(VIEW(it), "elm,state,display,compress", "elm");
1219 elm_object_signal_emit(VIEW(it), "elm,state,display,default", "elm");
1222 it->dispmode = dispmode;
1226 _on_item_pop_finished(void *data,
1227 Evas_Object *obj __UNUSED__,
1228 const char *emission __UNUSED__,
1229 const char *source __UNUSED__)
1231 Elm_Naviframe_Item *it = data;
1233 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1236 elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1238 sd->popping = eina_list_remove(sd->popping, it);
1240 elm_widget_item_del(data);
1243 static Elm_Naviframe_Item *
1244 _item_new(Evas_Object *obj,
1245 const Elm_Naviframe_Item *prev_it,
1246 const char *title_label,
1247 Evas_Object *prev_btn,
1248 Evas_Object *next_btn,
1249 Evas_Object *content,
1250 const char *item_style)
1252 Elm_Naviframe_Item *it;
1254 ELM_NAVIFRAME_DATA_GET(obj, sd);
1256 it = elm_widget_item_new(obj, Elm_Naviframe_Item);
1259 ERR("Failed to allocate new item! : naviframe=%p", obj);
1263 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
1264 elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
1265 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
1266 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
1267 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
1268 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
1269 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
1272 VIEW(it) = elm_layout_add(obj);
1273 evas_object_smart_member_add(VIEW(it), obj);
1275 if (!elm_widget_sub_object_add(obj, VIEW(it)))
1276 ERR("could not add %p as sub object of %p", VIEW(it), obj);
1278 evas_object_event_callback_add
1279 (VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1280 _on_item_size_hints_changed, obj);
1282 elm_object_signal_callback_add
1283 (VIEW(it), "elm,action,show,finished", "", _on_item_show_finished, it);
1284 elm_object_signal_callback_add
1285 (VIEW(it), "elm,action,pushed,finished", "", _on_item_push_finished, it);
1286 elm_object_signal_callback_add
1287 (VIEW(it), "elm,action,popped,finished", "", _on_item_pop_finished, it);
1288 elm_object_signal_callback_add
1289 (VIEW(it), "elm,action,title,transition,finished", "", _on_item_title_transition_finished, it);
1290 elm_object_signal_callback_add
1291 (VIEW(it), "elm,action,title,clicked", "", _on_item_title_clicked, it);
1293 _item_style_set(it, item_style);
1296 _item_text_set_hook((Elm_Object_Item *)it, TITLE_PART, title_label);
1299 if ((!prev_btn) && sd->auto_pushed && prev_it)
1301 const char *prev_title = prev_it->title_label;
1302 prev_btn = _back_btn_new(obj, prev_title);
1306 _item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
1310 _item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
1312 if (!elm_layout_text_get(next_btn, NULL))
1315 text = elm_access_info_get(next_btn, ELM_ACCESS_INFO);
1322 _elm_access_text_set
1323 (_elm_access_object_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
1328 _item_content_set(it, content);
1329 _item_dispmode_set(it, sd->dispmode);
1331 it->title_enabled = EINA_TRUE;
1336 //Tizen Only: Pop an item by clicking mouse right button
1338 _elm_naviframe_mouse_up_cb(void *data __UNUSED__, Evas *e __UNUSED__,
1339 Evas_Object *obj, void *event_info)
1341 Elm_Naviframe_Item *it;
1342 Evas_Event_Mouse_Up *ev = event_info;
1344 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
1345 if (elm_widget_disabled_get(obj)) return;
1346 if (ev->button != 3) return;
1348 it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1351 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1353 elm_naviframe_item_pop(obj);
1357 _on_obj_size_hints_changed(void *data __UNUSED__, Evas *e __UNUSED__,
1358 Evas_Object *obj, void *event_info __UNUSED__)
1360 Elm_Naviframe_Item *it;
1361 Evas_Display_Mode dispmode;
1363 ELM_NAVIFRAME_DATA_GET(obj, sd);
1365 dispmode = evas_object_size_hint_display_mode_get(obj);
1366 if (sd->dispmode == dispmode) return;
1368 sd->dispmode = dispmode;
1370 EINA_INLIST_FOREACH(sd->stack, it)
1371 _item_dispmode_set(it, dispmode);
1375 _elm_naviframe_smart_focus_next(const Evas_Object *obj,
1376 Elm_Focus_Direction dir,
1380 Eina_Bool ret = EINA_FALSE;
1381 Eina_List *l = NULL;
1382 Elm_Naviframe_Item *top_it;
1383 void *(*list_data_get)(const Eina_List *list);
1385 top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1386 if (!top_it) goto end;
1388 ao = ((Elm_Widget_Item *)top_it)->access_obj;
1390 list_data_get = eina_list_data_get;
1392 l = eina_list_append(l, VIEW(top_it));
1395 if (_elm_access_auto_highlight_get() &&
1396 top_it->title_enabled)
1398 if (elm_widget_tree_unfocusable_get(VIEW(top_it))) return EINA_FALSE;
1401 !elm_widget_highlight_get(ao) &&
1402 !elm_widget_highlight_get(VIEW(top_it)))
1404 /* if title does not have a highlight and sub object of item layout
1405 does not have a highlight, give a highlight to the title */
1411 ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
1414 if (!_elm_access_auto_highlight_get()) goto end;
1416 if (ret && ao && top_it->title_enabled && (dir == ELM_FOCUS_PREVIOUS) &&
1417 elm_widget_highlight_get(ao))
1422 if (top_it->title_enabled)
1424 if (elm_widget_tree_unfocusable_get(VIEW(top_it)))
1427 if (ao && !elm_widget_highlight_get(ao))
1429 /* if a highlight meets end, give a highlight to the title directly
1430 or let parent object decide to give a highlight to the title */
1432 if (dir == ELM_FOCUS_PREVIOUS) return EINA_TRUE;
1433 else return EINA_FALSE;
1437 /* if focus next object is not found, highlight can go to item layout */
1438 if (*next) return EINA_FALSE;
1439 else if (VIEW(top_it))
1441 *next = VIEW(top_it);
1448 *next = (Evas_Object *)obj;
1449 ret = !elm_widget_focus_get(obj);
1455 _elm_naviframe_smart_focus_direction_manager_is(const Evas_Object *obj __UNUSED__)
1461 _elm_naviframe_smart_focus_direction(const Evas_Object *obj,
1462 const Evas_Object *base,
1464 Evas_Object **direction,
1468 Eina_List *l = NULL;
1469 Elm_Naviframe_Item *top_it;
1470 void *(*list_data_get)(const Eina_List *list);
1472 top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1473 if (!top_it) return EINA_FALSE;
1475 list_data_get = eina_list_data_get;
1477 l = eina_list_append(l, VIEW(top_it));
1478 ret = elm_widget_focus_list_direction_get
1479 (obj, base, l, list_data_get, degree, direction, weight);
1486 _elm_naviframe_smart_add(Evas_Object *obj)
1488 EVAS_SMART_DATA_ALLOC(obj, Elm_Naviframe_Smart_Data);
1490 ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.add(obj);
1494 _pop_transition_cb(void *data)
1496 Elm_Naviframe_Item *prev_it, *it;
1497 it = (Elm_Naviframe_Item *)data;
1499 it->animator = NULL;
1501 prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it));
1504 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred",
1506 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1508 #ifdef ELM_FEATURE_WEARABLE_RECTANGLE
1509 if (nf_mod && nf_mod->tizen_pop_effect) nf_mod->tizen_pop_effect(prev_it);
1512 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
1513 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1515 #ifndef ELM_FEATURE_WEARABLE_RECTANGLE
1517 if (nf_mod && nf_mod->tizen_pop_effect) nf_mod->tizen_pop_effect(it);
1520 return ECORE_CALLBACK_CANCEL;
1524 _elm_naviframe_smart_del(Evas_Object *obj)
1526 Elm_Naviframe_Item *it;
1528 ELM_NAVIFRAME_DATA_GET(obj, sd);
1530 sd->on_deletion = EINA_TRUE;
1534 it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item);
1535 elm_widget_item_del(it);
1538 //All popping items which are not called yet by animator.
1539 EINA_LIST_FREE(sd->popping, it)
1541 if (it->animator) ecore_animator_del(it->animator);
1542 elm_widget_item_del(it);
1545 evas_object_del(sd->dummy_edje);
1547 ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.del(obj);
1551 _elm_naviframe_smart_access(Evas_Object *obj, Eina_Bool is_access)
1553 Elm_Naviframe_Item *it;
1555 ELM_NAVIFRAME_CHECK(obj);
1556 ELM_NAVIFRAME_DATA_GET(obj, sd);
1558 EINA_INLIST_FOREACH(sd->stack, it)
1559 _access_obj_process(it, is_access);
1561 it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1562 if (it && is_access) _access_focus_set(it);
1563 evas_object_smart_callback_call(obj, SIG_ACCESS_CHANGED, NULL);
1567 _elm_naviframe_smart_event(Evas_Object *obj,
1568 Evas_Object *src __UNUSED__,
1569 Evas_Callback_Type type,
1572 //Elm_Naviframe_Item *it;
1573 Evas_Event_Key_Down *ev = event_info;
1575 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
1576 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1577 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1579 /* Tizen Only: Need key binding. At this moment, Naviframe doesn't support
1581 //if (strcmp(ev->keyname, "Escape")) return EINA_FALSE;
1584 /*it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1585 if (!it) return EINA_FALSE;
1586 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1587 if (it->title_prev_btn)
1588 evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
1594 _elm_naviframe_smart_activate(Evas_Object *obj, Elm_Activate act)
1596 Elm_Naviframe_Item *it;
1598 if (act != ELM_ACTIVATE_BACK) return EINA_FALSE;
1599 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
1601 it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1602 if (!it) return EINA_FALSE;
1604 if (it->title_prev_btn)
1605 evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
1611 _elm_naviframe_smart_show(Evas_Object *obj)
1613 Elm_Naviframe_Item *top;
1614 top = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1616 if (top && !top->delete_me)
1617 evas_object_show(VIEW(top));
1621 _elm_naviframe_smart_set_user(Elm_Naviframe_Smart_Class *sc)
1623 ELM_WIDGET_CLASS(sc)->base.add = _elm_naviframe_smart_add;
1624 ELM_WIDGET_CLASS(sc)->base.del = _elm_naviframe_smart_del;
1625 ELM_WIDGET_CLASS(sc)->base.show = _elm_naviframe_smart_show;
1627 ELM_WIDGET_CLASS(sc)->theme = _elm_naviframe_smart_theme;
1628 ELM_WIDGET_CLASS(sc)->translate = _elm_naviframe_smart_translate;
1629 ELM_WIDGET_CLASS(sc)->focus_next = _elm_naviframe_smart_focus_next;
1630 ELM_WIDGET_CLASS(sc)->focus_direction_manager_is =
1631 _elm_naviframe_smart_focus_direction_manager_is;
1632 ELM_WIDGET_CLASS(sc)->focus_direction = _elm_naviframe_smart_focus_direction;
1633 ELM_WIDGET_CLASS(sc)->access = _elm_naviframe_smart_access;
1634 ELM_WIDGET_CLASS(sc)->event = _elm_naviframe_smart_event;
1635 ELM_WIDGET_CLASS(sc)->activate = _elm_naviframe_smart_activate;
1637 ELM_CONTAINER_CLASS(sc)->content_set = _elm_naviframe_smart_content_set;
1638 ELM_CONTAINER_CLASS(sc)->content_get = _elm_naviframe_smart_content_get;
1639 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_naviframe_smart_content_unset;
1641 ELM_LAYOUT_CLASS(sc)->signal = _elm_naviframe_smart_signal;
1642 ELM_LAYOUT_CLASS(sc)->callback_add = _elm_naviframe_smart_signal_callback_add;
1643 ELM_LAYOUT_CLASS(sc)->text_set = _elm_naviframe_smart_text_set;
1644 ELM_LAYOUT_CLASS(sc)->text_get = _elm_naviframe_smart_text_get;
1645 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_naviframe_smart_sizing_eval;
1649 _push_transition_cb(void *data)
1651 Elm_Naviframe_Item *prev_it, *it = data;
1653 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1655 it->animator = NULL;
1657 if (sd->stack->last->prev)
1659 prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last->prev,
1660 Elm_Naviframe_Item);
1661 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
1663 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1665 #ifdef ELM_FEATURE_WEARABLE_RECTANGLE
1666 if (nf_mod && nf_mod->tizen_push_effect) nf_mod->tizen_push_effect(prev_it);
1669 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
1670 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1672 #ifndef ELM_FEATURE_WEARABLE_RECTANGLE
1674 if (nf_mod && nf_mod->tizen_push_effect) nf_mod->tizen_push_effect(it);
1676 return ECORE_CALLBACK_CANCEL;
1679 EAPI const Elm_Naviframe_Smart_Class *
1680 elm_naviframe_smart_class_get(void)
1682 static Elm_Naviframe_Smart_Class _sc =
1683 ELM_NAVIFRAME_SMART_CLASS_INIT_NAME_VERSION
1684 (ELM_NAVIFRAME_SMART_NAME);
1685 static const Elm_Naviframe_Smart_Class *class = NULL;
1686 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
1691 _elm_naviframe_smart_set(&_sc);
1692 esc->callbacks = _smart_callbacks;
1699 elm_naviframe_add(Evas_Object *parent)
1703 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1705 obj = elm_widget_add(_elm_naviframe_smart_class_new(), parent);
1706 if (!obj) return NULL;
1708 if (!elm_widget_sub_object_add(parent, obj))
1709 ERR("could not add %p as sub object of %p", obj, parent);
1711 if (!nf_mod) nf_mod = _nf_mod_init();
1712 ELM_NAVIFRAME_DATA_GET(obj, sd);
1714 sd->dummy_edje = ELM_WIDGET_DATA(sd)->resize_obj;
1715 evas_object_smart_member_add(sd->dummy_edje, obj);
1717 // TIZEN ONLY: for color class setting //
1718 elm_layout_theme_set(obj, "naviframe", "base", elm_widget_style_get(obj));
1720 sd->auto_pushed = EINA_TRUE;
1721 sd->freeze_events = EINA_TRUE;
1723 evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1724 _on_obj_size_hints_changed, obj);
1726 //Tizen Only: Pop an item by clicking mouse right button
1727 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP,
1728 _elm_naviframe_mouse_up_cb, NULL);
1730 elm_widget_can_focus_set(obj, EINA_TRUE);
1732 //Tizen Only: This should be removed when eo is applied.
1733 ELM_WIDGET_DATA_GET(obj, wsd);
1734 wsd->on_create = EINA_FALSE;
1739 EAPI Elm_Object_Item *
1740 elm_naviframe_item_push(Evas_Object *obj,
1741 const char *title_label,
1742 Evas_Object *prev_btn,
1743 Evas_Object *next_btn,
1744 Evas_Object *content,
1745 const char *item_style)
1747 Elm_Naviframe_Item *prev_it, *it;
1749 ELM_NAVIFRAME_CHECK(obj) NULL;
1751 ELM_NAVIFRAME_DATA_GET(obj, sd);
1753 prev_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1754 it = _item_new(obj, prev_it,
1755 title_label, prev_btn, next_btn, content, item_style);
1756 if (!it) return NULL;
1758 #ifdef ELM_FEATURE_WEARABLE_CIRCLE
1759 //Tizen Only: give the new item's view to decorate it
1760 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
1763 evas_object_show(VIEW(it));
1765 if (prev_it) elm_widget_focused_object_clear(VIEW(prev_it));
1766 _resize_object_reset(obj, it);
1769 if (sd->freeze_events)
1771 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1772 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1775 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
1776 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
1777 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1778 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1780 if (_elm_config->access_mode)
1781 _elm_access_highlight_read_enable_set(WIDGET(prev_it), EINA_FALSE, EINA_FALSE);
1782 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
1784 if (it->animator) ecore_animator_del(it->animator);
1785 it->animator = ecore_animator_add(_push_transition_cb, it);
1790 if (_elm_config->access_mode)
1791 _access_focus_set(it);
1794 if (elm_object_focus_allow_get(VIEW(it)))
1795 elm_object_focus_set(VIEW(it), EINA_TRUE);
1797 elm_object_focus_set(WIDGET(it), EINA_TRUE);
1801 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
1803 elm_layout_sizing_eval(obj);
1806 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1808 return (Elm_Object_Item *)it;
1811 EAPI Elm_Object_Item *
1812 elm_naviframe_item_insert_before(Evas_Object *obj,
1813 Elm_Object_Item *before,
1814 const char *title_label,
1815 Evas_Object *prev_btn,
1816 Evas_Object *next_btn,
1817 Evas_Object *content,
1818 const char *item_style)
1820 Elm_Naviframe_Item *it, *prev_it = NULL;
1822 ELM_NAVIFRAME_CHECK(obj) NULL;
1823 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1824 ELM_NAVIFRAME_DATA_GET(obj, sd);
1826 it = (Elm_Naviframe_Item *)before;
1827 if (EINA_INLIST_GET(it)->prev)
1828 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1829 Elm_Naviframe_Item);
1830 it = _item_new(obj, prev_it,
1831 title_label, prev_btn, next_btn, content, item_style);
1832 if (!it) return NULL;
1834 #ifdef ELM_FEATURE_WEARABLE_CIRCLE
1835 //Tizen Only: give the new item's view to decorate it
1836 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
1839 sd->stack = eina_inlist_prepend_relative
1840 (sd->stack, EINA_INLIST_GET(it),
1841 EINA_INLIST_GET(((Elm_Naviframe_Item *)before)));
1843 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1844 evas_object_hide(VIEW(it));
1845 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1847 elm_layout_sizing_eval(obj);
1849 return (Elm_Object_Item *)it;
1852 EAPI Elm_Object_Item *
1853 elm_naviframe_item_insert_after(Evas_Object *obj,
1854 Elm_Object_Item *after,
1855 const char *title_label,
1856 Evas_Object *prev_btn,
1857 Evas_Object *next_btn,
1858 Evas_Object *content,
1859 const char *item_style)
1861 Elm_Naviframe_Item *it;
1862 Eina_Bool top_inserted = EINA_FALSE;
1864 ELM_NAVIFRAME_CHECK(obj) NULL;
1865 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
1866 ELM_NAVIFRAME_DATA_GET(obj, sd);
1868 it = _item_new(obj, (Elm_Naviframe_Item *)after,
1869 title_label, prev_btn, next_btn, content, item_style);
1870 if (!it) return NULL;
1872 #ifdef ELM_FEATURE_WEARABLE_CIRCLE
1873 //Tizen Only: give the new item's view to decorate it
1874 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
1877 if (elm_naviframe_top_item_get(obj) == after) top_inserted = EINA_TRUE;
1879 sd->stack = eina_inlist_append_relative
1880 (sd->stack, EINA_INLIST_GET(it),
1881 EINA_INLIST_GET(((Elm_Naviframe_Item *)after)));
1885 elm_widget_focused_object_clear(VIEW(after));
1886 elm_widget_tree_unfocusable_set(VIEW(after), EINA_TRUE);
1887 _resize_object_reset(obj, it);
1888 evas_object_show(VIEW(it));
1889 evas_object_hide(VIEW(after));
1892 if (_elm_config->access_mode)
1893 _access_focus_set(it);
1896 if (elm_object_focus_allow_get(VIEW(it)))
1897 elm_object_focus_set(VIEW(it), EINA_TRUE);
1899 elm_object_focus_set(WIDGET(it), EINA_TRUE);
1901 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1902 elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
1905 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1907 elm_layout_sizing_eval(obj);
1909 return (Elm_Object_Item *)it;
1913 elm_naviframe_item_pop(Evas_Object *obj)
1915 Elm_Naviframe_Item *it, *prev_it = NULL;
1916 Evas_Object *content = NULL;
1918 ELM_NAVIFRAME_CHECK(obj) NULL;
1919 ELM_NAVIFRAME_DATA_GET(obj, sd);
1921 if (sd->freeze_events && sd->popping) return NULL;
1923 it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1924 if (!it) return NULL;
1926 if (it->popping) return NULL;
1927 it->popping = EINA_TRUE;
1929 evas_object_ref(obj);
1933 if (!it->pop_cb(it->pop_data, (Elm_Object_Item *)it))
1938 _item_del_pre_hook((Elm_Object_Item*)it);
1939 _elm_widget_item_free((Elm_Widget_Item*)it);
1942 it->popping = EINA_FALSE;
1943 evas_object_unref(obj);
1948 evas_object_unref(obj);
1951 content = it->content;
1953 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
1955 if (sd->stack->last->prev)
1956 prev_it = EINA_INLIST_CONTAINER_GET
1957 (sd->stack->last->prev, Elm_Naviframe_Item);
1959 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
1963 if (_elm_config->access_mode)
1964 _elm_access_highlight_read_enable_set(WIDGET(it), EINA_FALSE, EINA_FALSE);
1965 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1966 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_FALSE);
1968 if (sd->freeze_events)
1970 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1971 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1974 elm_widget_resize_object_set(obj, VIEW(prev_it), EINA_FALSE);
1976 /* these 2 signals MUST take place simultaneously */
1977 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1978 evas_object_show(VIEW(prev_it));
1979 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
1981 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1982 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1984 if (it->animator) ecore_animator_del(it->animator);
1985 it->animator = ecore_animator_add(_pop_transition_cb, it);
1986 sd->popping = eina_list_append(sd->popping, it);
1989 elm_widget_item_del(it);
1995 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1997 Elm_Naviframe_Item *nit;
2000 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
2002 nit = (Elm_Naviframe_Item *)it;
2003 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
2005 if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
2007 l = sd->stack->last->prev;
2009 sd->on_deletion = EINA_TRUE;
2013 Elm_Naviframe_Item *iit = EINA_INLIST_CONTAINER_GET
2014 (l, Elm_Naviframe_Item);
2016 if (iit == nit) break;
2020 elm_widget_item_del(iit);
2023 sd->on_deletion = EINA_FALSE;
2025 elm_naviframe_item_pop(WIDGET(nit));
2029 elm_naviframe_item_promote(Elm_Object_Item *it)
2031 Elm_Object_Item *prev_top;
2032 Elm_Naviframe_Item *nit;
2033 Elm_Naviframe_Item *prev_it;
2035 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
2037 nit = (Elm_Naviframe_Item *)it;
2038 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
2040 prev_top = elm_naviframe_top_item_get(WIDGET(nit));
2041 if (it == prev_top) return;
2043 /* remember, last is 1st on the naviframe, push it to last pos. */
2044 sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit));
2046 evas_object_show(VIEW(nit));
2048 /* this was the previous top one */
2049 prev_it = EINA_INLIST_CONTAINER_GET
2050 (sd->stack->last->prev, Elm_Naviframe_Item);
2052 elm_widget_focused_object_clear(VIEW(nit));
2053 _resize_object_reset(WIDGET(it), nit);
2055 if (_elm_config->access_mode)
2056 _elm_access_highlight_read_enable_set(WIDGET(prev_it), EINA_FALSE, EINA_FALSE);
2057 elm_widget_tree_unfocusable_set(VIEW(nit), EINA_FALSE);
2058 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
2060 if (sd->freeze_events)
2062 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
2063 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
2066 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
2067 elm_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
2069 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
2070 edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
2071 if (nit->animator) ecore_animator_del(nit->animator);
2072 nit->animator = ecore_animator_add(_push_transition_cb, nit);
2076 elm_naviframe_item_simple_promote(Evas_Object *obj,
2077 Evas_Object *content)
2079 Elm_Naviframe_Item *itr;
2081 ELM_NAVIFRAME_CHECK(obj);
2082 ELM_NAVIFRAME_DATA_GET(obj, sd);
2084 EINA_INLIST_FOREACH(sd->stack, itr)
2086 if (elm_object_item_content_get((Elm_Object_Item *)itr) == content)
2088 elm_naviframe_item_promote((Elm_Object_Item *)itr);
2095 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj,
2098 ELM_NAVIFRAME_CHECK(obj);
2099 ELM_NAVIFRAME_DATA_GET(obj, sd);
2101 sd->preserve = !!preserve;
2105 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
2107 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
2108 ELM_NAVIFRAME_DATA_GET(obj, sd);
2110 return sd->preserve;
2113 EAPI Elm_Object_Item *
2114 elm_naviframe_top_item_get(const Evas_Object *obj)
2116 ELM_NAVIFRAME_CHECK(obj) NULL;
2117 ELM_NAVIFRAME_DATA_GET(obj, sd);
2119 if (!sd->stack) return NULL;
2120 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
2121 (sd->stack->last, Elm_Naviframe_Item));
2124 EAPI Elm_Object_Item *
2125 elm_naviframe_bottom_item_get(const Evas_Object *obj)
2127 ELM_NAVIFRAME_CHECK(obj) NULL;
2128 ELM_NAVIFRAME_DATA_GET(obj, sd);
2130 if (!sd->stack) return NULL;
2131 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
2132 (sd->stack, Elm_Naviframe_Item));
2136 elm_naviframe_item_style_set(Elm_Object_Item *it,
2137 const char *item_style)
2139 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
2141 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
2143 if (item_style && !strcmp(item_style, nit->style)) return;
2146 if (!strcmp("basic", nit->style)) return;
2148 _item_style_set(nit, item_style);
2149 _item_signals_emit(nit);
2150 _item_title_enabled_update(nit, EINA_FALSE);
2154 elm_naviframe_item_style_get(const Elm_Object_Item *it)
2156 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
2158 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, NULL);
2164 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
2167 elm_naviframe_item_title_enabled_set(it, visible, EINA_FALSE);
2171 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
2173 return elm_naviframe_item_title_enabled_get(it);
2177 elm_naviframe_item_title_enabled_set(Elm_Object_Item *it,
2179 Eina_Bool transition)
2181 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
2183 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
2185 enabled = !!enabled;
2186 if (nit->title_enabled == enabled) return;
2188 nit->title_enabled = enabled;
2190 transition = !!transition;
2191 _item_title_enabled_update(nit, transition);
2195 elm_naviframe_item_title_enabled_get(const Elm_Object_Item *it)
2197 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
2199 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
2201 return nit->title_enabled;
2205 elm_naviframe_item_pop_cb_set(Elm_Object_Item *it, Elm_Naviframe_Item_Pop_Cb func, void *data)
2207 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
2209 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
2212 nit->pop_data = data;
2216 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj,
2217 Eina_Bool auto_pushed)
2219 ELM_NAVIFRAME_CHECK(obj);
2220 ELM_NAVIFRAME_DATA_GET(obj, sd);
2222 sd->auto_pushed = !!auto_pushed;
2226 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
2228 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
2229 ELM_NAVIFRAME_DATA_GET(obj, sd);
2231 return sd->auto_pushed;
2235 elm_naviframe_items_get(const Evas_Object *obj)
2237 Eina_List *ret = NULL;
2238 Elm_Naviframe_Item *itr;
2240 ELM_NAVIFRAME_CHECK(obj) NULL;
2241 ELM_NAVIFRAME_DATA_GET(obj, sd);
2243 EINA_INLIST_FOREACH(sd->stack, itr)
2244 ret = eina_list_append(ret, itr);
2250 elm_naviframe_event_enabled_set(Evas_Object *obj,
2253 ELM_NAVIFRAME_CHECK(obj);
2254 ELM_NAVIFRAME_DATA_GET(obj, sd);
2256 enabled = !!enabled;
2257 if (sd->freeze_events == !enabled) return;
2258 sd->freeze_events = !enabled;
2262 elm_naviframe_event_enabled_get(const Evas_Object *obj)
2264 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
2265 ELM_NAVIFRAME_DATA_GET(obj, sd);
2267 return !sd->freeze_events;