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