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