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