elementary/naviframe - modified to use elm_object_item common apis.
[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
7 struct _Widget_Data
8 {
9    Eina_List    *stack;
10    Evas_Object  *base;
11    Eina_Bool     preserve: 1;
12    Eina_Bool     pass_events: 1;
13 };
14
15 struct _Elm_Naviframe_Item
16 {
17    Elm_Widget_Item    base;
18    Evas_Object       *title;
19    Evas_Object       *content;
20    const char        *title_label;
21    const char        *title_sublabel;
22    Evas_Object       *title_prev_btn;
23    Evas_Object       *title_next_btn;
24    Evas_Object       *title_icon;
25    const char        *style;
26    Eina_Bool          back_btn: 1;
27    Eina_Bool          title_visible: 1;
28 };
29
30 static const char *widtype = NULL;
31
32 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
33 static const char SIG_TITLE_CLICKED[] = "title,clicked";
34
35 static const Evas_Smart_Cb_Description _signals[] = {
36        {SIG_TRANSITION_FINISHED, ""},
37        {SIG_TITLE_CLICKED, ""},
38        {NULL, NULL}
39 };
40
41 static void _del_hook(Evas_Object *obj);
42 static void _theme_hook(Evas_Object *obj);
43 static void _disable_hook(Evas_Object *obj);
44 static void _text_set_hook(Elm_Object_Item *it,
45                            const char *part,
46                            const char *label);
47 static const char *_text_get_hook(const Elm_Object_Item *it,
48                                    const char *part);
49 static void _content_set_hook(Elm_Object_Item *it,
50                               const char *part,
51                               Evas_Object *content);
52 static Evas_Object *_content_get_hook(const Elm_Object_Item *it,
53                                       const char *part);
54 static Evas_Object *_content_unset_hook(Elm_Object_Item *it,
55                                         const char *part);
56 static void _sizing_eval(Evas_Object *obj);
57 static void _item_sizing_eval(Elm_Naviframe_Item *it);
58 static void _move(void *data, Evas *e, Evas_Object *obj, void *event_info);
59 static void _resize(void *data,
60                     Evas *e,
61                     Evas_Object *obj,
62                     void *event_info);
63 static void _title_clicked(void *data, Evas_Object *obj,
64                            const char *emission,
65                            const char *source);
66 static void _back_btn_clicked(void *data,
67                               Evas_Object *obj,
68                               void *event_info);
69 static Evas_Object *_back_btn_new(Evas_Object *obj);
70 static void _title_prev_btn_del(void *data,
71                                 Evas *e,
72                                 Evas_Object *obj,
73                                 void *event_info);
74 static void _title_next_btn_del(void *data,
75                                 Evas *e,
76                                 Evas_Object *obj,
77                                 void *event_info);
78 static void _title_icon_del(void *data,
79                             Evas *e,
80                             Evas_Object *obj,
81                             void *event_info);
82 static void _content_del(void *data,
83                          Evas *e,
84                          Evas_Object *obj,
85                          void *event_info);
86 static void _title_prev_btn_set(Elm_Naviframe_Item *it,
87                                 Evas_Object *btn,
88                                 Eina_Bool back_btn);
89 static void _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn);
90 static void _item_del(Elm_Naviframe_Item *it);
91 static void _pushed_finished(void *data,
92                              Evas_Object *obj,
93                              const char *emission,
94                              const char *source);
95 static void _popped_finished(void *data,
96                              Evas_Object *obj,
97                              const char *emission,
98                              const char *source);
99 static void _show_finished(void *data,
100                            Evas_Object *obj,
101                            const char *emission,
102                            const char *source);
103 static void _item_content_set(Elm_Naviframe_Item *navi_it,
104                               Evas_Object *content);
105 static void _item_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon);
106 static void _item_title_label_set(Elm_Naviframe_Item *navi_it,
107                                   const char *label);
108 static void _item_subtitle_label_set(Elm_Naviframe_Item *navi_it,
109                                      const char *label);
110
111
112
113 static void
114 _del_hook(Evas_Object *obj)
115 {
116    Widget_Data *wd;
117    Eina_List *list;
118    Elm_Naviframe_Item *it;
119
120    wd = elm_widget_data_get(obj);
121    if (!wd) return;
122
123    EINA_LIST_FOREACH(wd->stack, list, it)
124      _item_del(it);
125    eina_list_free(wd->stack);
126    free(wd);
127 }
128
129 static void
130 _theme_hook(Evas_Object *obj __UNUSED__)
131 {
132    //FIXME:
133 }
134
135 static void
136 _disable_hook(Evas_Object *obj __UNUSED__)
137 {
138    //FIXME:
139 }
140
141 static void
142 _text_set_hook(Elm_Object_Item *it, const char *part, const char *label)
143 {
144    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
145    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
146
147    if ((!part) || (!strcmp(part, "elm.text.title")))
148      {
149         _item_title_label_set(navi_it, label);
150         return;
151      }
152    else if(!strcmp(part, "elm.text.subtitle"))
153      {
154         _item_subtitle_label_set(navi_it, label);
155         return;
156      }
157    WRN("The part name is invalid! : naviframe=%p", navi_it->base.widget);
158 }
159
160 static const char *
161 _text_get_hook(const Elm_Object_Item *it, const char *part)
162 {
163    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
164    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
165
166    if ((!part) || (!strcmp(part, "elm.text.title")))
167      {
168         return navi_it->title_label;
169      }
170    else if(!strcmp(part, "elm.text.subtitle"))
171      {
172         return navi_it->title_sublabel;
173      }
174    WRN("The part name is invalid! : naviframe=%p", navi_it->base.widget);
175    return NULL;
176 }
177
178 static void
179 _content_set_hook(Elm_Object_Item *it,
180                   const char *part,
181                   Evas_Object *content)
182 {
183    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
184    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
185
186    if ((!(part)) || (!strcmp(part, "elm.swallow.content")))
187      {
188         _item_content_set(navi_it, content);
189         return;
190      }
191    else if(!strcmp(part, "elm.swallow.icon"))
192      {
193         _item_icon_set(navi_it, content);
194         return;
195      }
196    else if(!strcmp(part, "elm.swallow.prev_btn"))
197      {
198        _title_prev_btn_set(navi_it, content, EINA_FALSE);
199        return;
200      }
201    else if(!strcmp(part, "elm.swallow.next_btn"))
202      {
203        _title_next_btn_set(navi_it, content);
204        return;
205      }
206
207    WRN("The part name is invalid! : naviframe=%p", navi_it->base.widget);
208 }
209
210
211 static Evas_Object *
212 _content_get_hook(const Elm_Object_Item *it,
213                   const char *part)
214 {
215    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
216    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
217
218    if ((!(part)) || (!strcmp(part, "elm.swallow.content")))
219      {
220         return navi_it->content;
221      }
222    else if(!strcmp(part, "elm.swallow.icon"))
223      {
224         return navi_it->title_icon;
225      }
226    else if(!strcmp(part, "elm.swallow.prev_btn"))
227      {
228         return navi_it->title_prev_btn;
229      }
230    else if(!strcmp(part, "elm.swallow.next_btn"))
231      {
232         return navi_it->title_next_btn;
233      }
234
235    WRN("The part name is invalid! : naviframe=%p", navi_it->base.widget);
236    return NULL;
237 }
238
239 static Evas_Object *
240 _content_unset_hook(Elm_Object_Item *it __UNUSED__,
241                     const char *part __UNUSED__)
242 {
243    //FIXME:
244    return NULL;
245 }
246
247 static void
248 _sizing_eval(Evas_Object *obj)
249 {
250    Widget_Data *wd;
251    Eina_List *list;
252    Elm_Naviframe_Item *it;
253    wd  = elm_widget_data_get(obj);
254    if (!wd) return;
255
256    list = eina_list_last(wd->stack);
257    if (!list) return;
258
259    EINA_LIST_FOREACH(wd->stack, list, it)
260      _item_sizing_eval(it);
261 }
262
263 static void
264 _item_sizing_eval(Elm_Naviframe_Item *it)
265 {
266    Widget_Data *wd;
267    Evas_Coord x, y, w, h;
268    if (!it) return;
269
270    wd = elm_widget_data_get(it->base.widget);
271    if (!wd) return;
272
273    evas_object_geometry_get(it->base.widget, &x, &y, &w, &h);
274    evas_object_move(it->base.view, x, y);
275    evas_object_resize(it->base.view, w, h);
276 }
277
278 static void
279 _move(void *data __UNUSED__,
280       Evas *e __UNUSED__,
281       Evas_Object *obj,
282       void *event_info __UNUSED__)
283 {
284    _sizing_eval(obj);
285 }
286
287 static void
288 _resize(void *data __UNUSED__,
289         Evas *e __UNUSED__,
290         Evas_Object *obj,
291         void *event_info __UNUSED__)
292 {
293    _sizing_eval(obj);
294 }
295
296 static void
297 _title_clicked(void *data,
298                Evas_Object *obj __UNUSED__,
299                const char *emission __UNUSED__,
300                const char *source __UNUSED__)
301 {
302    Elm_Naviframe_Item *it = data;
303    evas_object_smart_callback_call(it->base.widget, SIG_TITLE_CLICKED, it);
304 }
305
306 static void
307 _back_btn_clicked(void *data,
308                   Evas_Object *obj __UNUSED__,
309                   void *event_info __UNUSED__)
310 {
311    elm_naviframe_item_pop(data);
312 }
313
314 static Evas_Object *
315 _back_btn_new(Evas_Object *obj)
316 {
317    Evas_Object *btn;
318    char buf[256];   //FIXME: How to guarantee the size of style name?
319    btn = elm_button_add(obj);
320    if (!btn) return NULL;
321    evas_object_smart_callback_add(btn, "clicked", _back_btn_clicked, obj);
322    snprintf(buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
323    elm_object_style_set(btn, buf);
324    return btn;
325 }
326
327 static void
328 _title_prev_btn_del(void *data,
329                     Evas *e __UNUSED__,
330                     Evas_Object *obj __UNUSED__,
331                     void *event_info __UNUSED__)
332 {
333    Elm_Naviframe_Item *it = data;
334    it->back_btn = EINA_FALSE;
335    it->title_prev_btn = NULL;
336 }
337
338 static void
339 _title_next_btn_del(void *data,
340                     Evas *e __UNUSED__,
341                     Evas_Object *obj __UNUSED__,
342                     void *event_info __UNUSED__)
343 {
344    Elm_Naviframe_Item *it = data;
345    it->title_next_btn = NULL;
346 }
347
348 static void
349 _title_icon_del(void *data,
350                 Evas *e __UNUSED__,
351                 Evas_Object *obj __UNUSED__,
352                 void *event_info __UNUSED__)
353 {
354    Elm_Naviframe_Item *it = data;
355    it->title_icon = NULL;
356    edje_object_signal_emit(it->base.view, "elm,state,icon,hide", "elm");
357 }
358
359 static void
360 _content_del(void *data,
361              Evas *e __UNUSED__,
362              Evas_Object *obj __UNUSED__,
363              void *event_info __UNUSED__)
364 {
365    Elm_Naviframe_Item *it = data;
366    it->content = NULL;
367    edje_object_signal_emit(it->base.view, "elm,state,content,hide", "elm");
368 }
369
370 static void
371 _title_prev_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn, Eina_Bool back_btn)
372 {
373    char buf[256];   //FIXME: How to guarantee the size of style name?
374
375    if (it->title_prev_btn == btn) return;
376
377    if (it->title_prev_btn)
378      evas_object_del(it->title_prev_btn);
379
380    it->title_prev_btn = btn;
381
382    if (!btn) return;
383
384    if (!back_btn)
385      {
386         snprintf(buf,
387                  sizeof(buf),
388                  "naviframe/prev_btn/%s",
389                  elm_widget_style_get(it->base.widget));
390         elm_object_style_set(btn, buf);
391      }
392    elm_widget_sub_object_add(it->base.widget, btn);
393    evas_object_event_callback_add(btn,
394                                   EVAS_CALLBACK_DEL,
395                                   _title_prev_btn_del,
396                                   it);
397    edje_object_part_swallow(it->title, "elm.swallow.prev_btn", btn);
398    it->back_btn = back_btn;
399
400    _item_sizing_eval(it);
401 }
402
403 static void
404 _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn)
405 {
406    char buf[256];   //FIXME: How to guarantee the size of style name?
407
408    if (it->title_next_btn == btn) return;
409
410    if (it->title_next_btn)
411      evas_object_del(it->title_next_btn);
412
413    it->title_next_btn = btn;
414
415    if (!btn) return;
416
417    snprintf(buf,
418             sizeof(buf),
419             "naviframe/next_btn/%s",
420             elm_widget_style_get(it->base.widget));
421    elm_object_style_set(btn, buf);
422    elm_widget_sub_object_add(it->base.widget, btn);
423    evas_object_event_callback_add(btn,
424                                   EVAS_CALLBACK_DEL,
425                                   _title_next_btn_del,
426                                   it);
427    edje_object_part_swallow(it->title, "elm.swallow.next_btn", btn);
428
429    _item_sizing_eval(it);
430 }
431
432 static void
433 _item_del(Elm_Naviframe_Item *it)
434 {
435    Widget_Data *wd;
436
437    if (!it) return;
438
439    wd = elm_widget_data_get(it->base.widget);
440    if (!wd) return;
441
442    if (it->title_prev_btn)
443      evas_object_del(it->title_prev_btn);
444    if (it->title_next_btn)
445      evas_object_del(it->title_next_btn);
446    if (it->title_icon)
447      evas_object_del(it->title_icon);
448    if ((it->content) && (!wd->preserve))
449      evas_object_del(it->content);
450
451    evas_object_del(it->title);
452    evas_object_del(it->base.view);
453
454    wd->stack = eina_list_remove(wd->stack, it);
455
456    free(it);
457 }
458
459 static void
460 _pushed_finished(void *data,
461                  Evas_Object *obj __UNUSED__,
462                  const char *emission __UNUSED__,
463                  const char *source __UNUSED__)
464 {
465    Elm_Naviframe_Item *it = data;
466    if (!it) return;
467    evas_object_hide(it->base.view);
468 }
469
470 static void
471 _popped_finished(void *data,
472                  Evas_Object *obj __UNUSED__,
473                  const char *emission __UNUSED__,
474                  const char *source __UNUSED__)
475 {
476    _item_del(data);
477 }
478
479 static void
480 _show_finished(void *data,
481                Evas_Object *obj __UNUSED__,
482                const char *emission __UNUSED__,
483                const char *source __UNUSED__)
484 {
485    Elm_Naviframe_Item *it;
486    Widget_Data *wd;
487
488    it = data;
489    if (!it) return;
490    wd =  elm_widget_data_get(it->base.widget);
491    if (!wd) return;
492
493    evas_object_smart_callback_call(it->base.widget,
494                                    SIG_TRANSITION_FINISHED,
495                                    (void *) EINA_TRUE);
496    if (wd->pass_events)
497      evas_object_pass_events_set(wd->base, EINA_FALSE);
498 }
499
500 static void
501 _item_content_set(Elm_Naviframe_Item *navi_it, Evas_Object *content)
502 {
503    if (navi_it->content == content) return;
504    if (navi_it->content) evas_object_del(navi_it->content);
505    elm_widget_sub_object_add(navi_it->base.widget, content);
506    edje_object_part_swallow(navi_it->base.view, "elm.swallow.content", content);
507    if (content)
508      edje_object_signal_emit(navi_it->base.view,
509                              "elm,state,content,show",
510                              "elm");
511    else
512      edje_object_signal_emit(navi_it->base.view,
513                              "elm,state,content,hide",
514                              "elm");
515    evas_object_event_callback_add(content,
516                                   EVAS_CALLBACK_DEL,
517                                   _content_del,
518                                   navi_it);
519    navi_it->content = content;
520    _item_sizing_eval(navi_it);
521 }
522
523 static void
524 _item_icon_set(Elm_Naviframe_Item *navi_it, Evas_Object *icon)
525 {
526    Widget_Data *wd = elm_widget_data_get(navi_it->base.widget);
527    if (!wd) return;
528
529    if (navi_it->title_icon == icon) return;
530    if (navi_it->title_icon) evas_object_del(navi_it->title_icon);
531    navi_it->title_icon = icon;
532    if (!icon)
533      {
534         edje_object_signal_emit(navi_it->title,
535                                 "elm,state,icon,hide",
536                                 "elm");
537         return;
538      }
539    elm_widget_sub_object_add(navi_it->base.widget, icon);
540    edje_object_part_swallow(navi_it->title, "elm.swallow.icon", icon);
541    edje_object_signal_emit(navi_it->title, "elm,state,icon,show", "elm");
542
543    evas_object_event_callback_add(icon, EVAS_CALLBACK_DEL, _title_icon_del, navi_it);
544    _item_sizing_eval(navi_it);
545 }
546
547 static void
548 _item_title_label_set(Elm_Naviframe_Item *navi_it, const char *label)
549 {
550    edje_object_part_text_set(navi_it->title, "elm.text.title", label);
551    if (label)
552      edje_object_signal_emit(navi_it->title, "elm,state,title,show", "elm");
553    else
554      edje_object_signal_emit(navi_it->title, "elm,state,title,hidew", "elm");
555
556    eina_stringshare_replace(&navi_it->title_label, label);
557    _item_sizing_eval(navi_it);
558 }
559
560 static void
561 _item_subtitle_label_set(Elm_Naviframe_Item *navi_it, const char *label)
562 {
563    edje_object_part_text_set(navi_it->title, "elm.text.subtitle", label);
564    if (label)
565      edje_object_signal_emit(navi_it->title, "elm,state,subtitle,show", "elm");
566    else
567      edje_object_signal_emit(navi_it->title, "elm,state,subtitle,hide", "elm");
568
569    eina_stringshare_replace(&navi_it->title_sublabel, label);
570    _item_sizing_eval(navi_it);
571 }
572
573 EAPI Evas_Object *
574 elm_naviframe_add(Evas_Object *parent)
575 {
576    Evas_Object *obj;
577    Evas *e;
578    Widget_Data *wd;
579
580    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
581    ELM_SET_WIDTYPE(widtype, "naviframe");
582    elm_widget_type_set(obj, "naviframe");
583    elm_widget_sub_object_add(parent, obj);
584    elm_widget_data_set(obj, wd);
585    elm_widget_del_hook_set(obj, _del_hook);
586    elm_widget_disable_hook_set(obj, _disable_hook);
587    elm_widget_theme_hook_set(obj, _theme_hook);
588
589    //base
590    wd->base = edje_object_add(e);
591    elm_widget_resize_object_set(obj, wd->base);
592    _elm_theme_object_set(obj, wd->base, "naviframe", "base", "default");
593
594    evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);
595    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
596    evas_object_smart_callbacks_descriptions_set(obj, _signals);
597
598    wd->pass_events = EINA_TRUE;
599
600    return obj;
601 }
602
603 EAPI Elm_Object_Item *
604 elm_naviframe_item_push(Evas_Object *obj, const char *title_label, Evas_Object *prev_btn, Evas_Object *next_btn, Evas_Object *content, const char *item_style)
605 {
606    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
607    Widget_Data *wd;
608    Elm_Naviframe_Item *prev_it, *it;
609
610    wd = elm_widget_data_get(obj);
611    if (!wd) return NULL;
612
613    //create item
614    it = elm_widget_item_new(obj, Elm_Naviframe_Item);
615    if (!it)
616      {
617         ERR("Failed to allocate new item! : naviframe=%p", obj);
618         return NULL;
619      }
620
621    elm_widget_item_text_set_hook_set(it, _text_set_hook);
622    elm_widget_item_text_get_hook_set(it, _text_get_hook);
623    elm_widget_item_content_set_hook_set(it, _content_set_hook);
624    elm_widget_item_content_get_hook_set(it, _content_get_hook);
625    elm_widget_item_content_unset_hook_set(it, _content_unset_hook);
626
627    //item base layout
628    it->base.view = edje_object_add(evas_object_evas_get(obj));
629    evas_object_smart_member_add(it->base.view, wd->base);
630    elm_widget_sub_object_add(obj, it->base.view);
631    edje_object_signal_callback_add(it->base.view,
632                                    "elm,action,show,finished",
633                                    "",
634                                    _show_finished, it);
635    edje_object_signal_callback_add(it->base.view,
636                                    "elm,action,pushed,finished",
637                                    "",
638                                    _pushed_finished, it);
639    edje_object_signal_callback_add(it->base.view,
640                                    "elm,action,popped,finished",
641                                    "",
642                                    _popped_finished, it);
643    elm_naviframe_item_style_set(ELM_CAST(it), item_style);
644
645    //title
646    it->title = edje_object_add(evas_object_evas_get(obj));
647    elm_widget_sub_object_add(obj, it->title);
648    _elm_theme_object_set(obj,
649                          it->title, "naviframe",
650                          "title",
651                          elm_widget_style_get(obj));
652    edje_object_signal_callback_add(it->title,
653                                    "elm,action,clicked",
654                                    "elm",
655                                    _title_clicked, it);
656
657    _item_title_label_set(it, title_label);
658
659    //title buttons
660    if ((!prev_btn) && (eina_list_count(wd->stack)))
661      {
662         prev_btn = _back_btn_new(obj);
663         _title_prev_btn_set(it, prev_btn, EINA_TRUE);
664      }
665    else
666      _title_prev_btn_set(it, prev_btn, EINA_FALSE);
667
668    _title_next_btn_set(it, next_btn);
669    edje_object_part_swallow(it->base.view, "elm.swallow.title", it->title);
670
671    _item_content_set(it, content);
672
673    _item_sizing_eval(it);
674    evas_object_show(it->base.view);
675
676    prev_it = ELM_CAST(elm_naviframe_top_item_get(obj));
677    if (prev_it)
678      {
679         if (wd->pass_events)
680           evas_object_pass_events_set(wd->base, EINA_TRUE);
681         edje_object_signal_emit(prev_it->base.view,
682                                 "elm,state,pushed",
683                                 "elm");
684         edje_object_signal_emit(it->base.view,
685                                 "elm,state,show",
686                                 "elm");
687      }
688    else
689      edje_object_signal_emit(it->base.view, "elm,state,visible", "elm");
690    it->title_visible = EINA_TRUE;
691    wd->stack = eina_list_append(wd->stack, it);
692    return ELM_CAST(it);
693 }
694
695 EAPI Evas_Object *
696 elm_naviframe_item_pop(Evas_Object *obj)
697 {
698    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
699    Elm_Naviframe_Item *it, *prev_it;
700    Widget_Data *wd;
701    Evas_Object *content = NULL;
702
703    wd = elm_widget_data_get(obj);
704    if (!wd) return NULL;
705
706    it = ELM_CAST(elm_naviframe_top_item_get(obj));
707    if (!it) return NULL;
708    wd->stack = eina_list_remove(wd->stack, it);
709
710    if (wd->preserve)
711      content = it->content;
712
713    prev_it = ELM_CAST(elm_naviframe_top_item_get(obj));
714    if (prev_it)
715      {
716         if (wd->pass_events)
717           evas_object_pass_events_set(wd->base, EINA_TRUE);
718         evas_object_show(prev_it->base.view);
719         evas_object_raise(prev_it->base.view);
720         edje_object_signal_emit(prev_it->base.view,
721                                 "elm,state,show",
722                                 "elm");
723         edje_object_signal_emit(it->base.view, "elm,state,popped", "elm");
724      }
725    else
726      _item_del(it);
727
728    return content;
729 }
730
731 EAPI void
732 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj, Eina_Bool preserve)
733 {
734    ELM_CHECK_WIDTYPE(obj, widtype);
735    Widget_Data *wd = elm_widget_data_get(obj);
736    if (!wd) return;
737    wd->preserve = !!preserve;
738 }
739
740 EAPI Eina_Bool
741 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
742 {
743    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
744    Widget_Data *wd = elm_widget_data_get(obj);
745    if (!wd) return EINA_FALSE;
746    return wd->preserve;
747 }
748
749 EAPI Elm_Object_Item*
750 elm_naviframe_top_item_get(const Evas_Object *obj)
751 {
752    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
753    Widget_Data *wd = elm_widget_data_get(obj);
754    if ((!wd) || (!wd->stack)) return NULL;
755    return eina_list_last(wd->stack)->data;
756 }
757
758 EAPI Elm_Object_Item*
759 elm_naviframe_bottom_item_get(const Evas_Object *obj)
760 {
761    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
762    Widget_Data *wd = elm_widget_data_get(obj);
763    if (!wd) return NULL;
764    return NULL;
765 }
766
767 EAPI void
768 elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style)
769 {
770    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
771    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
772
773    char buf[256];
774
775    if (!item_style) sprintf(buf, "item/basic");
776    else
777      {
778         if (strlen(item_style) > sizeof(buf))
779           WRN("too much long style name! : naviframe=%p", navi_it->base.widget);
780         else
781           sprintf(buf, "item/%s", item_style);
782      }
783    _elm_theme_object_set(navi_it->base.widget,
784                          navi_it->base.view,
785                          "naviframe",
786                          buf,
787                          elm_widget_style_get(navi_it->base.widget));
788 }
789
790 EAPI const char *
791 elm_naviframe_item_style_get(const Elm_Object_Item *it)
792 {
793    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
794    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
795    return navi_it->style;
796 }
797
798 EAPI void
799 elm_naviframe_item_title_visible_set(Elm_Object_Item *it, Eina_Bool visible)
800 {
801    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
802    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
803
804    visible = !!visible;
805    if (navi_it->title_visible == visible) return;
806
807    if (visible)
808      edje_object_signal_emit(navi_it->base.view, "elm,state,title,show", "elm");
809    else
810      edje_object_signal_emit(navi_it->base.view, "elm,state,title,hide", "elm");
811
812    navi_it->title_visible = visible;
813 }
814
815 EAPI Eina_Bool
816 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
817 {
818    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
819    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
820    return navi_it->title_visible;
821 }
822