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