[Review comments fixed]
[framework/uifw/elementary.git] / src / lib / elc_naviframe.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3
4 typedef struct _Widget_Data Widget_Data;
5 typedef struct _Elm_Naviframe_Item Elm_Naviframe_Item;
6 typedef struct _Elm_Naviframe_Content_Item_Pair Elm_Naviframe_Content_Item_Pair;
7 typedef struct _Elm_Naviframe_Text_Item_Pair Elm_Naviframe_Text_Item_Pair;
8
9 struct _Widget_Data
10 {
11    Eina_Inlist  *stack;
12    Evas_Object  *base;
13    Evas_Object  *rect;
14    Eina_Bool     preserve: 1;
15    Eina_Bool     auto_pushed: 1;
16    Eina_Bool     freeze_events: 1;
17 };
18
19 struct _Elm_Naviframe_Content_Item_Pair
20 {
21    EINA_INLIST;
22    const char *part;
23    Evas_Object *content;
24    Elm_Naviframe_Item *it;
25 };
26
27 struct _Elm_Naviframe_Text_Item_Pair
28 {
29    EINA_INLIST;
30    const char *part;
31    const char *text;
32 };
33
34 struct _Elm_Naviframe_Item
35 {
36    ELM_WIDGET_ITEM;
37    EINA_INLIST;
38    Eina_Inlist       *content_list;
39    Eina_Inlist       *text_list;
40    Evas_Object       *content;
41    Evas_Object       *title_prev_btn;
42    Evas_Object       *title_next_btn;
43    Evas_Object       *icon;
44    const char        *style;
45    Eina_Bool          back_btn: 1;
46    Eina_Bool          title_visible: 1;
47 };
48
49 static const char *widtype = NULL;
50
51 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
52 static const char SIG_PUSH_FINISHED[] = "push,finished";
53 static const char SIG_POP_FINISHED[] = "pop,finished";
54 static const char SIG_TITLE_CLICKED[] = "title,clicked";
55
56 static const Evas_Smart_Cb_Description _signals[] = {
57        {SIG_TRANSITION_FINISHED, ""},
58        {SIG_TITLE_CLICKED, ""},
59        {NULL, NULL}
60 };
61
62 static void _del_hook(Evas_Object *obj);
63 static void _theme_hook(Evas_Object *obj);
64 static void _emit_hook(Evas_Object *obj,
65                        const char *emission,
66                        const char *source);
67 static void _disable_hook(Evas_Object *obj);
68 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
69 static void _item_text_set_hook(Elm_Object_Item *it,
70                                 const char *part,
71                                 const char *label);
72 static const char *_item_text_get_hook(const Elm_Object_Item *it,
73                                        const char *part);
74 static void _item_content_set_hook(Elm_Object_Item *it,
75                                    const char *part,
76                                    Evas_Object *content);
77 static Evas_Object *_item_content_get_hook(const Elm_Object_Item *it,
78                                            const char *part);
79 static Evas_Object *_item_content_unset_hook(Elm_Object_Item *it,
80                                              const char *part);
81 static void _item_signal_emit_hook(Elm_Object_Item *it,
82                                    const char *emission,
83                                    const char *source);
84 static void _item_title_visible_update(Elm_Naviframe_Item *navi_it);
85 static void _sizing_eval(Evas_Object *obj);
86 static void _item_sizing_eval(Elm_Naviframe_Item *it);
87 static void _move(void *data, Evas *e, Evas_Object *obj, void *event_info);
88 static void _resize(void *data,
89                     Evas *e,
90                     Evas_Object *obj,
91                     void *event_info);
92 static void _hide(void *data, Evas *e, Evas_Object *obj, void *event_info);
93 static void _title_clicked(void *data, Evas_Object *obj,
94                            const char *emission,
95                            const char *source);
96 static void _back_btn_clicked(void *data,
97                               Evas_Object *obj,
98                               void *event_info);
99 static Evas_Object *_back_btn_new(Evas_Object *obj);
100 static void _item_content_del(void *data,
101                               Evas *e,
102                               Evas_Object *obj,
103                               void *event_info);
104 static void _title_content_del(void *data,
105                                Evas *e,
106                                Evas_Object *obj,
107                                void *event_info);
108 static void _title_prev_btn_del(void *data,
109                                 Evas *e,
110                                 Evas_Object *obj,
111                                 void *event_info);
112 static void _title_next_btn_del(void *data,
113                                 Evas *e,
114                                 Evas_Object *obj,
115                                 void *event_info);
116 static void _title_icon_del(void *data,
117                             Evas *e,
118                             Evas_Object *obj,
119                             void *event_info);
120 static void _title_content_set(Elm_Naviframe_Item *it,
121                                const char *part,
122                                Evas_Object *content);
123 static void _title_prev_btn_set(Elm_Naviframe_Item *it,
124                                 Evas_Object *btn,
125                                 Eina_Bool back_btn);
126 static void _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn);
127 static void _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon);
128 static void _item_del(Elm_Naviframe_Item *it);
129 static void _pushed_finished(void *data,
130                              Evas_Object *obj,
131                              const char *emission,
132                              const char *source);
133 static void _popped_finished(void *data,
134                              Evas_Object *obj,
135                              const char *emission,
136                              const char *source);
137 static void _show_finished(void *data,
138                            Evas_Object *obj,
139                            const char *emission,
140                            const char *source);
141 static void _item_content_set(Elm_Naviframe_Item *navi_it,
142                               Evas_Object *content);
143 static void _item_style_set(Elm_Naviframe_Item *navi_it,
144                             const char *item_style);
145 static Elm_Naviframe_Item * _item_new(Evas_Object *obj,
146                                       const char *title_label,
147                                       Evas_Object *prev_btn,
148                                       Evas_Object *next_btn,
149                                       Evas_Object *content,
150                                       const char *item_style);
151
152 static void
153 _del_hook(Evas_Object *obj)
154 {
155    Widget_Data *wd;
156    Elm_Naviframe_Item *it;
157
158    wd = elm_widget_data_get(obj);
159    if (!wd) return;
160
161    if (wd->stack)
162      {
163         while (wd->stack->last)
164           {
165              it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
166                                             Elm_Naviframe_Item);
167              wd->stack = eina_inlist_remove(wd->stack, wd->stack->last);
168              _item_del(it);
169              if (!wd->stack) break;
170           }
171      }
172    free(wd);
173 }
174
175 static void
176 _theme_hook(Evas_Object *obj)
177 {
178    Widget_Data *wd;
179    Elm_Naviframe_Item *it;
180
181    wd  = elm_widget_data_get(obj);
182    if (!wd) return;
183
184    _elm_theme_object_set(obj,
185                          wd->base,
186                          "naviframe",
187                          "base",
188                          elm_widget_style_get(obj));
189
190    EINA_INLIST_FOREACH(wd->stack, it)
191      {
192         _item_style_set(it, it->style);
193         _item_title_visible_update(it);
194      }
195
196    _elm_widget_mirrored_reload(obj);
197    _mirrored_set(obj, elm_widget_mirrored_get(obj));
198
199    evas_object_hide(wd->rect);
200 }
201
202 static void _emit_hook(Evas_Object *obj,
203                        const char *emission,
204                        const char *source)
205 {
206    ELM_CHECK_WIDTYPE(obj, widtype);
207
208    Widget_Data *wd = elm_widget_data_get(obj);
209    if (!wd) return;
210
211    edje_object_signal_emit(wd->base, emission, source);
212 }
213
214 static void
215 _disable_hook(Evas_Object *obj __UNUSED__)
216 {
217    //FIXME:
218 }
219
220 static void
221 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
222 {
223    Widget_Data *wd;
224    Elm_Naviframe_Item *it;
225
226    wd  = elm_widget_data_get(obj);
227    if (!wd) return;
228
229    EINA_INLIST_FOREACH(wd->stack, it)
230      edje_object_mirrored_set(VIEW(it), rtl);
231    edje_object_mirrored_set(wd->base, rtl);
232 }
233
234 static void
235 _item_text_set_hook(Elm_Object_Item *it,
236                     const char *part,
237                     const char *label)
238 {
239    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
240
241    Elm_Naviframe_Text_Item_Pair *pair = NULL;
242    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
243    char buf[1024];
244
245    if (!part || !strcmp(part, "default"))
246      snprintf(buf, sizeof(buf), "elm.text.title");
247    else if(!strcmp("subtitle", part))
248      snprintf(buf, sizeof(buf), "elm.text.subtitle");
249    else
250      snprintf(buf, sizeof(buf), "%s", part);
251
252    EINA_INLIST_FOREACH(navi_it->text_list, pair)
253      if (!strcmp(buf, pair->part)) break;
254
255    if (!pair)
256      {
257         pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
258         if (!pair)
259           {
260              ERR("Failed to allocate new text part of the item! : naviframe=%p",
261              WIDGET(navi_it));
262              return;
263           }
264         eina_stringshare_replace(&pair->part, buf);
265         navi_it->text_list = eina_inlist_append(navi_it->text_list,
266                                                 EINA_INLIST_GET(pair));
267      }
268
269    eina_stringshare_replace(&pair->text, label);
270    edje_object_part_text_set(VIEW(navi_it), buf, label);
271
272    if (label)
273      {
274         snprintf(buf, sizeof(buf), "elm,state,%s,show", buf);
275         edje_object_signal_emit(VIEW(navi_it), buf, "elm");
276      }
277    else
278      {
279         snprintf(buf, sizeof(buf), "elm,state,%s,hide", buf);
280         edje_object_signal_emit(VIEW(navi_it), buf, "elm");
281      }
282
283    _item_sizing_eval(navi_it);
284 }
285
286 static const char *
287 _item_text_get_hook(const Elm_Object_Item *it, const char *part)
288 {
289    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
290    Elm_Naviframe_Text_Item_Pair *pair = NULL;
291    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
292    char buf[1024];
293
294    if (!part || !strcmp(part, "default"))
295      snprintf(buf, sizeof(buf), "elm.text.title");
296    else if(!strcmp("subtitle", part))
297      snprintf(buf, sizeof(buf), "elm.text.subtitle");
298    else
299      snprintf(buf, sizeof(buf), "%s", part);
300
301    EINA_INLIST_FOREACH(navi_it->text_list, pair)
302      {
303         if (!strcmp(buf, pair->part))
304           return pair->text;
305      }
306    return NULL;
307 }
308
309 static void
310 _item_content_set_hook(Elm_Object_Item *it,
311                        const char *part,
312                        Evas_Object *content)
313 {
314    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
315
316    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
317
318    //specified parts
319    if ((!part) || (!strcmp(part, "elm.swallow.content")))
320      {
321         _item_content_set(navi_it, content);
322         return;
323      }
324    else if (!strcmp(part, "elm.swallow.prev_btn"))
325      {
326         _title_prev_btn_set(navi_it, content, EINA_FALSE);
327         return;
328      }
329    else if (!strcmp(part, "elm.swallow.next_btn"))
330      {
331         _title_next_btn_set(navi_it, content);
332         return;
333      }
334    else if (!strcmp(part, "icon"))
335      {
336         _title_icon_set(navi_it, content);
337         return;
338      }
339
340    //common part
341    _title_content_set(navi_it, part, content);
342 }
343
344 static Evas_Object *
345 _item_content_get_hook(const Elm_Object_Item *it, const char *part)
346 {
347    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
348    Elm_Naviframe_Content_Item_Pair *pair = NULL;
349    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
350
351    //specified parts
352    if ((!part) || (!strcmp(part, "elm.swallow.content")))
353      return navi_it->content;
354    else if (!strcmp(part, "elm.swallow.prev_btn"))
355      return navi_it->title_prev_btn;
356    else if (!strcmp(part, "elm.swallow.next_btn"))
357      return navi_it->title_next_btn;
358    else if (!strcmp(part, "icon"))
359      return navi_it->icon;
360
361    //common parts
362    EINA_INLIST_FOREACH(navi_it->content_list, pair)
363      {
364         if (!strcmp(part, pair->part))
365           return pair->content;
366      }
367    return NULL;
368 }
369
370 static Evas_Object *
371 _item_content_unset_hook(Elm_Object_Item *it, const char *part)
372 {
373    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
374    Elm_Naviframe_Content_Item_Pair *pair = NULL;
375    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
376    Evas_Object *content = NULL;
377    char buf[1028];
378
379    //specified parts
380    //FIXME: could be unset the below specified contents also.
381    if (!part ||
382        !strcmp(part, "elm.swallow.content") ||
383        !strcmp(part, "elm.swallow.prev_btn") ||
384        !strcmp(part, "elm.swallow.next_btn") ||
385        !strcmp(part, "icon"))
386      {
387         WRN("You can not unset the content! : naviframe=%p",
388             WIDGET(navi_it));
389         return NULL;
390      }
391
392    //common parts
393    EINA_INLIST_FOREACH(navi_it->content_list, pair)
394      {
395         if (!strcmp(part, pair->part))
396           {
397              content = pair->content;
398              eina_stringshare_del(pair->part);
399              navi_it->content_list = eina_inlist_remove(navi_it->content_list,
400                                                         EINA_INLIST_GET(pair));
401              free(pair);
402              break;
403           }
404      }
405
406    if (!content) return NULL;
407
408    elm_widget_sub_object_del(WIDGET(navi_it), content);
409    edje_object_part_unswallow(VIEW(navi_it), content);
410    snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
411    edje_object_signal_emit(VIEW(navi_it), buf, "elm");
412    evas_object_event_callback_del(content,
413                                   EVAS_CALLBACK_DEL,
414                                   _title_content_del);
415    _item_sizing_eval(navi_it);
416
417    return content;
418 }
419
420 static void
421 _item_signal_emit_hook(Elm_Object_Item *it,
422                        const char *emission,
423                        const char *source)
424 {
425    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
426    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
427    edje_object_signal_emit(VIEW(navi_it), emission, source);
428 }
429
430 static void
431 _item_title_visible_update(Elm_Naviframe_Item *navi_it)
432 {
433    if (navi_it->title_visible)
434      edje_object_signal_emit(VIEW(navi_it), "elm,state,title,show", "elm");
435    else
436      edje_object_signal_emit(VIEW(navi_it), "elm,state,title,hide", "elm");
437 }
438
439 static void
440 _sizing_eval(Evas_Object *obj)
441 {
442    Widget_Data *wd;
443    Elm_Naviframe_Item *it;
444    wd  = elm_widget_data_get(obj);
445    if (!wd) return;
446
447    EINA_INLIST_FOREACH(wd->stack, it)
448      _item_sizing_eval(it);
449 }
450
451 static void
452 _item_sizing_eval(Elm_Naviframe_Item *it)
453 {
454    Widget_Data *wd;
455    Evas_Coord x, y, w, h;
456    if (!it) return;
457
458    wd = elm_widget_data_get(WIDGET(it));
459    if (!wd) return;
460
461    evas_object_geometry_get(WIDGET(it), &x, &y, &w, &h);
462    evas_object_move(VIEW(it), x, y);
463    evas_object_resize(VIEW(it), w, h);
464 }
465
466 static void
467 _move(void *data __UNUSED__,
468       Evas *e __UNUSED__,
469       Evas_Object *obj,
470       void *event_info __UNUSED__)
471 {
472    Evas_Coord x, y;
473    Widget_Data *wd = elm_widget_data_get(obj);
474    if (!wd) return;
475
476    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
477    evas_object_move(wd->rect, x, y);
478
479    _sizing_eval(obj);
480 }
481
482 static void
483 _resize(void *data __UNUSED__,
484         Evas *e __UNUSED__,
485         Evas_Object *obj,
486         void *event_info __UNUSED__)
487 {
488    Evas_Coord w, h;
489    Widget_Data *wd = elm_widget_data_get(obj);
490    if (!wd) return;
491
492    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
493    evas_object_resize(wd->rect, w, h);
494
495    _sizing_eval(obj);
496 }
497
498 static void
499 _hide(void *data __UNUSED__,
500       Evas *e __UNUSED__,
501       Evas_Object *obj,
502       void *event_info __UNUSED__)
503 {
504    Widget_Data *wd = elm_widget_data_get(obj);
505    if (!wd) return;
506    if (wd->freeze_events)
507      evas_object_hide(wd->rect);
508 }
509
510 static void
511 _title_clicked(void *data,
512                Evas_Object *obj __UNUSED__,
513                const char *emission __UNUSED__,
514                const char *source __UNUSED__)
515 {
516    Elm_Naviframe_Item *it = data;
517    evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
518 }
519
520 static void
521 _back_btn_clicked(void *data,
522                   Evas_Object *obj,
523                   void *event_info __UNUSED__)
524 {
525 /* Since edje has the event queue, clicked event could be happend multiple times
526    on some heavy environment. This callback del will prevent those  scenario and
527    guarantee only one clicked for it's own page. */
528    evas_object_smart_callback_del(obj, "clicked", _back_btn_clicked);
529    elm_naviframe_item_pop(data);
530 }
531
532 static Evas_Object *
533 _back_btn_new(Evas_Object *obj)
534 {
535    Evas_Object *btn;
536    char buf[1024];
537    btn = elm_button_add(obj);
538    if (!btn) return NULL;
539    evas_object_smart_callback_add(btn, "clicked", _back_btn_clicked, obj);
540    snprintf(buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
541    elm_object_style_set(btn, buf);
542    return btn;
543 }
544
545 static void
546 _title_content_del(void *data,
547                    Evas *e __UNUSED__,
548                    Evas_Object *obj __UNUSED__,
549                    void *event_info __UNUSED__)
550 {
551    char buf[1024];
552    Elm_Naviframe_Content_Item_Pair *pair = data;
553    Elm_Naviframe_Item *it = pair->it;
554    snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
555    edje_object_signal_emit(VIEW(it), buf, "elm");
556    it->content_list = eina_inlist_remove(it->content_list,
557                                          EINA_INLIST_GET(pair));
558    eina_stringshare_del(pair->part);
559    free(pair);
560 }
561
562 static void
563 _title_prev_btn_del(void *data,
564                     Evas *e __UNUSED__,
565                     Evas_Object *obj __UNUSED__,
566                     void *event_info __UNUSED__)
567 {
568    Elm_Naviframe_Item *it = data;
569    it->back_btn = EINA_FALSE;
570    it->title_prev_btn = NULL;
571    edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
572 }
573
574 static void
575 _title_next_btn_del(void *data,
576                     Evas *e __UNUSED__,
577                     Evas_Object *obj __UNUSED__,
578                     void *event_info __UNUSED__)
579 {
580    Elm_Naviframe_Item *it = data;
581    it->title_next_btn = NULL;
582    edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
583 }
584
585 static void
586 _title_icon_del(void *data,
587                 Evas *e __UNUSED__,
588                 Evas_Object *obj __UNUSED__,
589                 void *event_info __UNUSED__)
590 {
591    Elm_Naviframe_Item *it = data;
592    it->icon = NULL;
593    edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
594 }
595
596 static void
597 _item_content_del(void *data,
598                   Evas *e __UNUSED__,
599                   Evas_Object *obj __UNUSED__,
600                   void *event_info __UNUSED__)
601 {
602    Elm_Naviframe_Item *it = data;
603    it->content = NULL;
604    edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
605 }
606
607 static void
608 _title_content_set(Elm_Naviframe_Item *it,
609                    const char *part,
610                    Evas_Object *content)
611 {
612    char buf[1024];
613    Elm_Naviframe_Content_Item_Pair *pair = NULL;
614
615    EINA_INLIST_FOREACH(it->content_list, pair)
616      if (!strcmp(part, pair->part)) break;
617
618    if ((pair) && (pair->content))
619      {
620         if (!content)
621           {
622              evas_object_del(pair->content);
623              pair->content = NULL;
624              return;
625           }
626         if (pair->content == content) return;
627         evas_object_event_callback_del(pair->content,
628                                        EVAS_CALLBACK_DEL,
629                                        _title_content_del);
630         evas_object_del(pair->content);
631         snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
632         edje_object_signal_emit(VIEW(it), buf, "elm");
633      }
634    else
635      {
636         pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
637         if (!pair)
638           {
639              ERR("Failed to allocate new content part of the item! : naviframe=%p", WIDGET(it));
640              return;
641           }
642         pair->it = it;
643         eina_stringshare_replace(&pair->part, part);
644         it->content_list = eina_inlist_append(it->content_list,
645                                               EINA_INLIST_GET(pair));
646      }
647
648    elm_widget_sub_object_add(WIDGET(it), content);
649    evas_object_event_callback_add(content,
650                                   EVAS_CALLBACK_DEL,
651                                   _title_content_del,
652                                   pair);
653    edje_object_part_swallow(VIEW(it), part, content);
654    snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
655    edje_object_signal_emit(VIEW(it), buf, "elm");
656    pair->content = content;
657    _item_sizing_eval(it);
658 }
659
660 static void
661 _title_prev_btn_set(Elm_Naviframe_Item *it,
662                     Evas_Object *btn,
663                     Eina_Bool back_btn)
664 {
665    if (it->title_prev_btn == btn) return;
666
667    if (it->title_prev_btn)
668      evas_object_del(it->title_prev_btn);
669
670    it->title_prev_btn = btn;
671    if (!btn) return;
672
673    elm_widget_sub_object_add(WIDGET(it), btn);
674    evas_object_event_callback_add(btn,
675                                   EVAS_CALLBACK_DEL,
676                                   _title_prev_btn_del,
677                                   it);
678    edje_object_part_swallow(VIEW(it), "elm.swallow.prev_btn", btn);
679    edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
680    it->back_btn = back_btn;
681
682    _item_sizing_eval(it);
683 }
684
685 static void
686 _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn)
687 {
688    if (it->title_next_btn == btn) return;
689
690    if (it->title_next_btn)
691      evas_object_del(it->title_next_btn);
692
693    it->title_next_btn = btn;
694    if (!btn) return;
695
696    elm_widget_sub_object_add(WIDGET(it), btn);
697    evas_object_event_callback_add(btn,
698                                   EVAS_CALLBACK_DEL,
699                                   _title_next_btn_del,
700                                   it);
701    edje_object_part_swallow(VIEW(it), "elm.swallow.next_btn", btn);
702    edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
703
704    _item_sizing_eval(it);
705 }
706
707 static void
708 _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon)
709 {
710    if (it->icon == icon) return;
711
712    if (it->icon)
713      evas_object_del(it->icon);
714
715    it->icon = icon;
716    if (!icon) return;
717
718    elm_widget_sub_object_add(WIDGET(it), icon);
719    evas_object_event_callback_add(icon,
720                                   EVAS_CALLBACK_DEL,
721                                   _title_icon_del,
722                                   it);
723    edje_object_part_swallow(VIEW(it), "elm.swallow.icon", icon);
724    edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
725
726    _item_sizing_eval(it);
727 }
728
729
730 static void
731 _item_del(Elm_Naviframe_Item *it)
732 {
733    Widget_Data *wd;
734    Elm_Naviframe_Content_Item_Pair *content_pair;
735    Elm_Naviframe_Text_Item_Pair *text_pair;
736
737    if (!it) return;
738
739    wd = elm_widget_data_get(WIDGET(it));
740    if (!wd) return;
741
742    if (it->title_prev_btn)
743      evas_object_del(it->title_prev_btn);
744    if (it->title_next_btn)
745      evas_object_del(it->title_next_btn);
746    if (it->icon)
747      evas_object_del(it->icon);
748    if ((it->content) && (!wd->preserve))
749      evas_object_del(it->content);
750
751    while (it->content_list)
752      {
753         content_pair = EINA_INLIST_CONTAINER_GET(it->content_list,
754                                                  Elm_Naviframe_Content_Item_Pair);
755         evas_object_event_callback_del(content_pair->content,
756                                        EVAS_CALLBACK_DEL,
757                                        _title_content_del);
758         evas_object_del(content_pair->content);
759         eina_stringshare_del(content_pair->part);
760         it->content_list = eina_inlist_remove(it->content_list,
761                                               it->content_list);
762         free(content_pair);
763      }
764
765    while (it->text_list)
766      {
767         text_pair = EINA_INLIST_CONTAINER_GET(it->text_list,
768                                               Elm_Naviframe_Text_Item_Pair);
769         eina_stringshare_del(text_pair->part);
770         eina_stringshare_del(text_pair->text);
771         it->text_list = eina_inlist_remove(it->text_list,
772                                            it->text_list);
773         free(text_pair);
774      }
775
776    eina_stringshare_del(it->style);
777
778    elm_widget_item_del(it);
779 }
780
781 static void
782 _pushed_finished(void *data,
783                  Evas_Object *obj __UNUSED__,
784                  const char *emission __UNUSED__,
785                  const char *source __UNUSED__)
786 {
787    Widget_Data *wd;
788    Elm_Naviframe_Item *it = data;
789    if (!it) return;
790
791    wd = elm_widget_data_get(WIDGET(it));
792    if (!wd) return;
793
794    evas_object_hide(VIEW(it));
795    evas_object_smart_callback_call(WIDGET(it),
796                                    SIG_PUSH_FINISHED,
797                                    data);
798 }
799
800 static void
801 _popped_finished(void *data,
802                  Evas_Object *obj __UNUSED__,
803                  const char *emission __UNUSED__,
804                  const char *source __UNUSED__)
805 {
806    Elm_Naviframe_Item *it = data;
807    if (!it) return;
808    evas_object_smart_callback_call(WIDGET(it),
809                                    SIG_POP_FINISHED,
810                                    data);
811    _item_del(data);
812 }
813
814 static void
815 _show_finished(void *data,
816                Evas_Object *obj __UNUSED__,
817                const char *emission __UNUSED__,
818                const char *source __UNUSED__)
819 {
820    Elm_Naviframe_Item *it;
821    Widget_Data *wd;
822
823    it = data;
824    if (!it) return;
825    wd =  elm_widget_data_get(WIDGET(it));
826    if (!wd) return;
827
828    evas_object_smart_callback_call(WIDGET(it),
829                                    SIG_TRANSITION_FINISHED,
830                                    data);
831    if (wd->freeze_events)
832      evas_object_hide(wd->rect);
833 }
834
835 static void
836 _item_content_set(Elm_Naviframe_Item *navi_it, Evas_Object *content)
837 {
838    if (navi_it->content == content) return;
839    if (navi_it->content) evas_object_del(navi_it->content);
840    elm_widget_sub_object_add(WIDGET(navi_it), content);
841    edje_object_part_swallow(VIEW(navi_it),
842                             "elm.swallow.content",
843                             content);
844    if (content)
845      edje_object_signal_emit(VIEW(navi_it),
846                              "elm,state,content,show",
847                              "elm");
848    else
849      edje_object_signal_emit(VIEW(navi_it),
850                              "elm,state,content,hide",
851                              "elm");
852    evas_object_event_callback_add(content,
853                                   EVAS_CALLBACK_DEL,
854                                   _item_content_del,
855                                   navi_it);
856    navi_it->content = content;
857    _item_sizing_eval(navi_it);
858 }
859
860 //FIXME: need to handle if this function is called while transition
861 static void
862 _item_style_set(Elm_Naviframe_Item *navi_it, const char *item_style)
863 {
864    Elm_Naviframe_Content_Item_Pair *content_pair;
865    Elm_Naviframe_Text_Item_Pair *text_pair;
866    Widget_Data *wd;
867
868    char buf[256];
869
870    if (!item_style)
871      {
872         sprintf(buf, "item/basic");
873         eina_stringshare_replace(&navi_it->style, "basic");
874      }
875    else
876      {
877         if (strlen(item_style) > sizeof(buf))
878           WRN("too much long style name! : naviframe=%p", WIDGET(navi_it));
879         sprintf(buf, "item/%s", item_style);
880         eina_stringshare_replace(&navi_it->style, item_style);
881      }
882    _elm_theme_object_set(WIDGET(navi_it),
883                          VIEW(navi_it),
884                          "naviframe",
885                          buf,
886                          elm_widget_style_get(WIDGET(navi_it)));
887    //recover item
888    EINA_INLIST_FOREACH(navi_it->text_list, text_pair)
889       _item_text_set_hook((Elm_Object_Item *) navi_it,
890                           text_pair->part,
891                           text_pair->text);
892
893    EINA_INLIST_FOREACH(navi_it->content_list, content_pair)
894       _item_content_set_hook((Elm_Object_Item *) navi_it,
895                              content_pair->part,
896                              content_pair->content);
897    //content
898    if (navi_it->content)
899      {
900         edje_object_part_swallow(VIEW(navi_it),
901                                  "elm.swallow.content",
902                                  navi_it->content);
903         edje_object_signal_emit(VIEW(navi_it),
904                                 "elm,state,content,show",
905                                 "elm");
906      }
907
908    //prev button
909    if (navi_it->title_prev_btn)
910      {
911         edje_object_part_swallow(VIEW(navi_it),
912                                  "elm.swallow.prev_btn",
913                                  navi_it->title_prev_btn);
914         edje_object_signal_emit(VIEW(navi_it),
915                                 "elm,state,prev_btn,show",
916                                 "elm");
917      }
918
919    //next button
920    if (navi_it->title_next_btn)
921      {
922         edje_object_part_swallow(VIEW(navi_it),
923                                  "elm.swallow.next_btn",
924                                  navi_it->title_next_btn);
925         edje_object_signal_emit(VIEW(navi_it),
926                                 "elm,state,next_btn,show",
927                                 "elm");
928      }
929
930    navi_it->title_visible = EINA_TRUE;
931    _item_sizing_eval(navi_it);
932
933    wd = elm_widget_data_get(WIDGET(navi_it));
934    if (wd && wd->freeze_events)
935      evas_object_hide(wd->rect);
936 }
937
938 static Elm_Naviframe_Item *
939 _item_new(Evas_Object *obj,
940           const char *title_label,
941           Evas_Object *prev_btn,
942           Evas_Object *next_btn,
943           Evas_Object *content,
944           const char *item_style)
945 {
946    Widget_Data *wd = elm_widget_data_get(obj);
947
948    //create item
949    Elm_Naviframe_Item *it = elm_widget_item_new(obj, Elm_Naviframe_Item);
950    if (!it)
951      {
952         ERR("Failed to allocate new item! : naviframe=%p", obj);
953         return NULL;
954      }
955
956    elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
957    elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
958    elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
959    elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
960    elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
961    elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
962
963    //item base layout
964    VIEW(it) = edje_object_add(evas_object_evas_get(obj));
965    edje_object_mirrored_set(VIEW(it), elm_widget_mirrored_get(obj));
966    evas_object_smart_member_add(VIEW(it), wd->base);
967    elm_widget_sub_object_add(obj, VIEW(it));
968    edje_object_signal_callback_add(VIEW(it),
969                                    "elm,action,show,finished",
970                                    "",
971                                    _show_finished, it);
972    edje_object_signal_callback_add(VIEW(it),
973                                    "elm,action,pushed,finished",
974                                    "",
975                                    _pushed_finished, it);
976    edje_object_signal_callback_add(VIEW(it),
977                                    "elm,action,popped,finished",
978                                    "",
979                                    _popped_finished, it);
980    edje_object_signal_callback_add(VIEW(it),
981                                    "elm,action,title,clicked",
982                                    "",
983                                    _title_clicked, it);
984
985    _item_style_set(it, item_style);
986    _item_text_set_hook((Elm_Object_Item *) it, "elm.text.title", title_label);
987
988    //title buttons
989    if ((!prev_btn) && wd->auto_pushed && eina_inlist_count(wd->stack))
990      {
991         prev_btn = _back_btn_new(obj);
992         _title_prev_btn_set(it, prev_btn, EINA_TRUE);
993      }
994    else
995      _title_prev_btn_set(it, prev_btn, EINA_FALSE);
996
997    _title_next_btn_set(it, next_btn);
998    _item_content_set(it, content);
999    _item_sizing_eval(it);
1000
1001    it->title_visible = EINA_TRUE;
1002    return it;
1003 }
1004
1005 EAPI Evas_Object *
1006 elm_naviframe_add(Evas_Object *parent)
1007 {
1008    Evas_Object *obj;
1009    Evas *e;
1010    Widget_Data *wd;
1011
1012    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
1013    ELM_SET_WIDTYPE(widtype, "naviframe");
1014    elm_widget_type_set(obj, "naviframe");
1015    elm_widget_sub_object_add(parent, obj);
1016    elm_widget_data_set(obj, wd);
1017    elm_widget_del_hook_set(obj, _del_hook);
1018    elm_widget_disable_hook_set(obj, _disable_hook);
1019    elm_widget_theme_hook_set(obj, _theme_hook);
1020    elm_widget_signal_emit_hook_set(obj, _emit_hook);
1021
1022    //base
1023    wd->base = edje_object_add(e);
1024    edje_object_mirrored_set(wd->base, elm_widget_mirrored_get(obj));
1025    elm_widget_resize_object_set(obj, wd->base);
1026    _elm_theme_object_set(obj, wd->base, "naviframe", "base", "default");
1027
1028    //rect
1029    wd->rect = evas_object_rectangle_add(e);
1030    evas_object_color_set(wd->rect, 0, 0, 0, 0);
1031    elm_widget_sub_object_add(obj, wd->rect);
1032
1033    evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);
1034    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
1035    evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _hide, obj);
1036    evas_object_smart_callbacks_descriptions_set(obj, _signals);
1037
1038    wd->auto_pushed = EINA_TRUE;
1039    wd->freeze_events = EINA_TRUE;
1040
1041    return obj;
1042 }
1043
1044 EAPI Elm_Object_Item *
1045 elm_naviframe_item_push(Evas_Object *obj,
1046                         const char *title_label,
1047                         Evas_Object *prev_btn,
1048                         Evas_Object *next_btn,
1049                         Evas_Object *content,
1050                         const char *item_style)
1051 {
1052    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1053    Widget_Data *wd;
1054    Elm_Naviframe_Item *prev_it, *it;
1055
1056    wd = elm_widget_data_get(obj);
1057    if (!wd) return NULL;
1058
1059    it = _item_new(obj, title_label, prev_btn, next_btn, content, item_style);
1060    if (!it) return NULL;
1061
1062    evas_object_show(VIEW(it));
1063
1064    prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1065    if (prev_it)
1066      {
1067         if (wd->freeze_events)
1068           {
1069              evas_object_raise(wd->rect);
1070              evas_object_show(wd->rect);
1071           }
1072         edje_object_signal_emit(VIEW(prev_it),
1073                                 "elm,state,cur,pushed",
1074                                 "elm");
1075         edje_object_signal_emit(VIEW(it),
1076                                 "elm,state,new,pushed",
1077                                 "elm");
1078         edje_object_message_signal_process(VIEW(prev_it));
1079         edje_object_message_signal_process(VIEW(it));
1080      }
1081    wd->stack = eina_inlist_append(wd->stack, EINA_INLIST_GET(it));
1082    return (Elm_Object_Item *) it;
1083 }
1084
1085 EAPI Elm_Object_Item *
1086 elm_naviframe_item_insert_before(Elm_Object_Item *before,
1087                                  const char *title_label,
1088                                  Evas_Object *prev_btn,
1089                                  Evas_Object *next_btn,
1090                                  Evas_Object *content,
1091                                  const char *item_style)
1092 {
1093    ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
1094    Elm_Naviframe_Item *it;
1095    Widget_Data *wd;
1096
1097    wd = elm_widget_data_get(WIDGET(before));
1098    if (!wd) return NULL;
1099
1100    it = _item_new(WIDGET(before), title_label, prev_btn, next_btn, content,
1101                   item_style);
1102    if (!it) return NULL;
1103
1104    wd->stack =
1105       eina_inlist_prepend_relative(wd->stack, EINA_INLIST_GET(it),
1106                                    EINA_INLIST_GET(((Elm_Naviframe_Item *) before)));
1107    return (Elm_Object_Item *) it;
1108 }
1109
1110 EAPI Elm_Object_Item *
1111 elm_naviframe_item_insert_after(Elm_Object_Item *after,
1112                                 const char *title_label,
1113                                 Evas_Object *prev_btn,
1114                                 Evas_Object *next_btn,
1115                                 Evas_Object *content,
1116                                 const char *item_style)
1117 {
1118    ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
1119    Elm_Naviframe_Item *it;
1120    Widget_Data *wd;
1121
1122    wd = elm_widget_data_get(WIDGET(after));
1123    if (!wd) return NULL;
1124
1125    it = _item_new(WIDGET(after), title_label, prev_btn, next_btn, content,
1126                   item_style);
1127    if (!it) return NULL;
1128
1129    if (elm_naviframe_top_item_get(WIDGET(after)) == after)
1130      {
1131         evas_object_hide(VIEW(after));
1132         evas_object_show(VIEW(it));
1133      }
1134    wd->stack =
1135       eina_inlist_append_relative(wd->stack, EINA_INLIST_GET(it),
1136                                   EINA_INLIST_GET(((Elm_Naviframe_Item *) after)));
1137    return (Elm_Object_Item *) it;
1138 }
1139
1140 EAPI Evas_Object *
1141 elm_naviframe_item_pop(Evas_Object *obj)
1142 {
1143    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1144    Elm_Naviframe_Item *it, *prev_it = NULL;
1145    Widget_Data *wd;
1146    Evas_Object *content = NULL;
1147
1148    wd = elm_widget_data_get(obj);
1149    if (!wd) return NULL;
1150
1151    it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1152    if (!it) return NULL;
1153    elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
1154    if (wd->preserve)
1155      content = it->content;
1156
1157    if (wd->stack->last->prev)
1158      prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1159                                          Elm_Naviframe_Item);
1160    wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(it));
1161    if (prev_it)
1162      {
1163         if (wd->freeze_events)
1164           {
1165              evas_object_raise(wd->rect);
1166              evas_object_show(wd->rect);
1167           }
1168         edje_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1169         evas_object_show(VIEW(prev_it));
1170         evas_object_raise(VIEW(prev_it));
1171         edje_object_signal_emit(VIEW(prev_it),
1172                                 "elm,state,prev,popped",
1173                                 "elm");
1174         edje_object_message_signal_process(VIEW(it));
1175         edje_object_message_signal_process(VIEW(prev_it));
1176      }
1177    else
1178      _item_del(it);
1179
1180    return content;
1181 }
1182
1183 EAPI void
1184 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1185 {
1186    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1187    Elm_Naviframe_Item *navi_it;
1188    Widget_Data *wd;
1189    Eina_Inlist *l, *prev_l;
1190
1191    navi_it = (Elm_Naviframe_Item *) it;
1192    wd = elm_widget_data_get(WIDGET(navi_it));
1193    if (!wd) return;
1194
1195    if (it == elm_naviframe_top_item_get(WIDGET(navi_it))) return;
1196
1197    l = wd->stack->last->prev;
1198
1199    while(l)
1200      {
1201         if (EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item) ==
1202             ((Elm_Naviframe_Item *) it)) break;
1203         prev_l = l->prev;
1204         wd->stack = eina_inlist_remove(wd->stack, l);
1205         _item_del(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item));
1206         l = prev_l;
1207      }
1208    elm_naviframe_item_pop(WIDGET(navi_it));
1209 }
1210
1211 EAPI void
1212 elm_naviframe_item_promote(Elm_Object_Item *it)
1213 {
1214    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1215    Elm_Naviframe_Item *navi_it;
1216    Elm_Naviframe_Item *prev_it;
1217    Widget_Data *wd;
1218
1219    navi_it = (Elm_Naviframe_Item *) it;
1220    wd = elm_widget_data_get(navi_it->base.widget);
1221    if (!wd) return;
1222
1223    if (it == elm_naviframe_top_item_get(navi_it->base.widget)) return;
1224    wd->stack = eina_inlist_demote(wd->stack, EINA_INLIST_GET(navi_it));
1225    prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1226                                          Elm_Naviframe_Item);
1227    if (wd->freeze_events)
1228      {
1229         evas_object_raise(wd->rect);
1230         evas_object_show(wd->rect);
1231      }
1232    edje_object_signal_emit(VIEW(prev_it),
1233                            "elm,state,cur,pushed",
1234                            "elm");
1235    evas_object_show(VIEW(navi_it));
1236    evas_object_raise(VIEW(navi_it));
1237    edje_object_signal_emit(VIEW(navi_it),
1238                            "elm,state,new,pushed",
1239                            "elm");
1240    edje_object_message_signal_process(VIEW(prev_it));
1241    edje_object_message_signal_process(VIEW(navi_it));
1242 }
1243
1244 EAPI void
1245 elm_naviframe_item_del(Elm_Object_Item *it)
1246 {
1247    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1248    Elm_Naviframe_Item *navi_it;
1249    Widget_Data *wd;
1250
1251    navi_it =(Elm_Naviframe_Item *) it;
1252    wd = elm_widget_data_get(WIDGET(navi_it));
1253    if (!wd) return;
1254
1255    if (it == elm_naviframe_top_item_get(WIDGET(navi_it)))
1256      {
1257         wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1258         _item_del(navi_it);
1259         navi_it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
1260                                             Elm_Naviframe_Item);
1261         evas_object_show(VIEW(navi_it));
1262         evas_object_raise(VIEW(navi_it));
1263         edje_object_signal_emit(VIEW(navi_it), "elm,state,visible", "elm");
1264      }
1265    else
1266      {
1267         wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1268         _item_del(navi_it);
1269      }
1270 }
1271
1272 EAPI void
1273 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj, Eina_Bool preserve)
1274 {
1275    ELM_CHECK_WIDTYPE(obj, widtype);
1276    Widget_Data *wd = elm_widget_data_get(obj);
1277    if (!wd) return;
1278    wd->preserve = !!preserve;
1279 }
1280
1281 EAPI Eina_Bool
1282 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
1283 {
1284    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1285    Widget_Data *wd = elm_widget_data_get(obj);
1286    if (!wd) return EINA_FALSE;
1287    return wd->preserve;
1288 }
1289
1290 EAPI Elm_Object_Item*
1291 elm_naviframe_top_item_get(const Evas_Object *obj)
1292 {
1293    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1294    Widget_Data *wd = elm_widget_data_get(obj);
1295    if ((!wd) || (!wd->stack)) return NULL;
1296    return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack->last,
1297                                                          Elm_Naviframe_Item));
1298 }
1299
1300 EAPI Elm_Object_Item*
1301 elm_naviframe_bottom_item_get(const Evas_Object *obj)
1302 {
1303    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1304    Widget_Data *wd = elm_widget_data_get(obj);
1305    if ((!wd) || (!wd->stack)) return NULL;
1306    return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack,
1307                                                          Elm_Naviframe_Item));
1308 }
1309
1310 EAPI void
1311 elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style)
1312 {
1313    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1314    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1315
1316    //Return if new style is exsiting one.
1317    if (item_style)
1318      if (!strcmp(item_style, navi_it->style)) return;
1319
1320    if (!item_style)
1321      if (!strcmp("basic", navi_it->style)) return;
1322
1323    _item_style_set(navi_it, item_style);
1324 }
1325
1326 EAPI const char *
1327 elm_naviframe_item_style_get(const Elm_Object_Item *it)
1328 {
1329    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
1330    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1331    return navi_it->style;
1332 }
1333
1334 EAPI void
1335 elm_naviframe_item_title_visible_set(Elm_Object_Item *it, Eina_Bool visible)
1336 {
1337    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1338    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1339
1340    visible = !!visible;
1341    if (navi_it->title_visible == visible) return;
1342
1343    navi_it->title_visible = visible;
1344    _item_title_visible_update(navi_it);
1345 }
1346
1347 EAPI Eina_Bool
1348 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1349 {
1350    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1351    Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1352    return navi_it->title_visible;
1353 }
1354
1355 EAPI void
1356 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj, Eina_Bool auto_pushed)
1357 {
1358    ELM_CHECK_WIDTYPE(obj, widtype);
1359    Widget_Data *wd = elm_widget_data_get(obj);
1360    if (!wd) return;
1361    wd->auto_pushed = !!auto_pushed;
1362 }
1363
1364 EAPI Eina_Bool
1365 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
1366 {
1367    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1368    Widget_Data *wd = elm_widget_data_get(obj);
1369    if (!wd) return EINA_FALSE;
1370    return wd->auto_pushed;
1371 }
1372
1373 EAPI Eina_Inlist *
1374 elm_naviframe_items_get(const Evas_Object *obj)
1375 {
1376    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1377    Widget_Data *wd = elm_widget_data_get(obj);
1378    if (!wd) return NULL;
1379    return wd->stack;
1380 }
1381