elementary/toolbar - trivial changes
[framework/uifw/elementary.git] / src / lib / elm_toolbar.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    Evas_Object *scr, *bx;
9    Evas_Object *menu_parent;
10    Eina_Inlist *items;
11    Elm_Toolbar_Item *more_item, *selected_item;
12    Elm_Toolbar_Shrink_Mode shrink_mode;
13    Elm_Icon_Lookup_Order lookup_order;
14    int icon_size;
15    double align;
16    Eina_Bool homogeneous : 1;
17    Eina_Bool no_select : 1;
18    Eina_Bool always_select : 1;
19    Eina_Bool vertical : 1;
20    Ecore_Job *resize_job;
21 };
22
23 struct _Elm_Toolbar_Item
24 {
25    Elm_Widget_Item base;
26    EINA_INLIST;
27    const char *label;
28    const char *icon_str;
29    Evas_Object *icon;
30    Evas_Object *o_menu;
31    Evas_Smart_Cb func;
32    struct {
33       int priority;
34       Eina_Bool visible : 1;
35    } prio;
36    Eina_Bool selected : 1;
37    Eina_Bool disabled : 1;
38    Eina_Bool separator : 1;
39    Eina_Bool menu : 1;
40    Eina_List *states;
41    Eina_List *current_state;
42 };
43
44 #define ELM_TOOLBAR_ITEM_FROM_INLIST(item)      \
45   ((item) ? EINA_INLIST_CONTAINER_GET(item, Elm_Toolbar_Item) : NULL)
46
47 struct _Elm_Toolbar_Item_State
48 {
49    const char *label;
50    const char *icon_str;
51    Evas_Object *icon;
52    Evas_Smart_Cb func;
53    const void *data;
54 };
55
56 static const char *widtype = NULL;
57 static void _item_show(Elm_Toolbar_Item *it);
58 static void _item_select(Elm_Toolbar_Item *it);
59 static void _item_unselect(Elm_Toolbar_Item *it);
60 static void _item_disable(Elm_Toolbar_Item *it, Eina_Bool disabled);
61 static void _del_pre_hook(Evas_Object *obj);
62 static void _del_hook(Evas_Object *obj);
63 static void _mirrored_set(Evas_Object *obj, Eina_Bool mirrored);
64 static void _mirrored_set_item(Evas_Object *obj, Elm_Toolbar_Item *it, Eina_Bool mirrored);
65 static void _theme_hook(Evas_Object *obj);
66 static void _sizing_eval(Evas_Object *obj);
67 static void _resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
68 static void _menu_move_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
69 static void _menu_hide(void *data, Evas *e, Evas_Object *obj, void *event_info);
70 static void _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
71 static void _elm_toolbar_item_icon_obj_set(Evas_Object *obj, Elm_Toolbar_Item *item, Evas_Object *icon_obj, const char *icon_str, double icon_size, const char *signal);
72 static void _item_label_set(Elm_Toolbar_Item *item, const char *label, const char *signal);
73
74 static const char SIG_CLICKED[] = "clicked";
75
76 static const Evas_Smart_Cb_Description _signals[] = {
77    {SIG_CLICKED, ""},
78    {NULL, NULL}
79 };
80
81
82 static Eina_Bool
83 _item_icon_set(Evas_Object *icon_obj, const char *type, const char *icon)
84 {
85    char icon_str[512];
86
87    if ((!type) || (!*type)) goto end;
88    if ((!icon) || (!*icon)) return EINA_FALSE;
89    if ((snprintf(icon_str, sizeof(icon_str), "%s%s", type, icon) > 0)
90        && (elm_icon_standard_set(icon_obj, icon_str)))
91      return EINA_TRUE;
92 end:
93    if (elm_icon_standard_set(icon_obj, icon))
94      return EINA_TRUE;
95    WRN("couldn't find icon definition for '%s'", icon);
96    return EINA_FALSE;
97 }
98
99 static int
100 _elm_toolbar_icon_size_get(Widget_Data *wd)
101 {
102    const char *icon_size = edje_object_data_get(
103       elm_smart_scroller_edje_object_get(wd->scr), "icon_size");
104    if (icon_size)
105      return atoi(icon_size);
106    return _elm_config->icon_size;
107 }
108
109 static void
110 _item_show(Elm_Toolbar_Item *it)
111 {
112    Widget_Data *wd = elm_widget_data_get(it->base.widget);
113    Evas_Coord x, y, w, h, bx, by;
114
115    if (!wd) return;
116    evas_object_geometry_get(wd->bx, &bx, &by, NULL, NULL);
117    evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
118    elm_smart_scroller_child_region_show(wd->scr, x - bx, y - by, w, h);
119 }
120
121 static void
122 _item_unselect(Elm_Toolbar_Item *item)
123 {
124    Widget_Data *wd;
125    if ((!item) || (!item->selected)) return;
126    wd = elm_widget_data_get(item->base.widget);
127    if (!wd) return;
128    item->selected = EINA_FALSE;
129    wd->selected_item = NULL;
130    edje_object_signal_emit(item->base.view, "elm,state,unselected", "elm");
131    elm_widget_signal_emit(item->icon, "elm,state,unselected", "elm");
132 }
133
134 static void
135 _item_select(Elm_Toolbar_Item *it)
136 {
137    Elm_Toolbar_Item *it2;
138    Widget_Data *wd = elm_widget_data_get(it->base.widget);
139    Evas_Object *obj2;
140    Eina_Bool sel;
141
142    if (!wd) return;
143    if ((it->disabled) || (it->separator)) return;
144    sel = it->selected;
145
146    if (!wd->no_select)
147      {
148         if (sel)
149           {
150              if (wd->always_select) return;
151              _item_unselect(it);
152           }
153         else
154           {
155              it2 = elm_toolbar_selected_item_get(it->base.widget);
156              _item_unselect(it2);
157
158              it->selected = EINA_TRUE;
159              wd->selected_item = it;
160              edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
161              elm_widget_signal_emit(it->icon, "elm,state,selected", "elm");
162              _item_show(it);
163           }
164      }
165    obj2 = it->base.widget;
166    if (it->menu && (!sel))
167      {
168         evas_object_show(it->o_menu);
169         evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_RESIZE,
170                                        _menu_move_resize, it);
171         evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_MOVE,
172                                        _menu_move_resize, it);
173
174         _menu_move_resize(it, NULL, NULL, NULL);
175      }
176    if (it->func) it->func((void *)(it->base.data), it->base.widget, it);
177    evas_object_smart_callback_call(obj2, SIG_CLICKED, it);
178 }
179
180 static void
181 _menu_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
182 {
183    Elm_Toolbar_Item *selected;
184    Elm_Toolbar_Item *it = data;
185    selected = elm_toolbar_selected_item_get(it->base.widget);
186    _item_unselect(selected);
187 }
188
189 static void
190 _menu_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
191 {
192    // avoid hide being emitted during object deletion
193    evas_object_event_callback_del_full
194       (obj, EVAS_CALLBACK_HIDE, _menu_hide, data);
195 }
196
197 static void
198 _menu_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
199 {
200    Elm_Toolbar_Item *it = data;
201    Evas_Coord x,y,w,h;
202    Widget_Data *wd = elm_widget_data_get(it->base.widget);
203
204    if ((!wd) || (!wd->menu_parent)) return;
205    evas_object_geometry_get(it->base.view, &x, &y, &w, &h);
206    elm_menu_move(it->o_menu, x, y+h);
207 }
208
209 static void
210 _item_disable(Elm_Toolbar_Item *it, Eina_Bool disabled)
211 {
212    Widget_Data *wd = elm_widget_data_get(it->base.widget);
213
214    if (!wd) return;
215    if (it->disabled == disabled) return;
216    it->disabled = !!disabled;
217    if (it->disabled)
218      {
219         edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
220         elm_widget_signal_emit(it->icon, "elm,state,disabled", "elm");
221      }
222    else
223      {
224         edje_object_signal_emit(it->base.view, "elm,state,enabled", "elm");
225         elm_widget_signal_emit(it->icon, "elm,state,enabled", "elm");
226      }
227 }
228
229 static void
230 _item_del(Elm_Toolbar_Item *it)
231 {
232    Elm_Toolbar_Item_State *it_state;
233    _item_unselect(it);
234    elm_widget_item_pre_notify_del(it);
235    EINA_LIST_FREE(it->states, it_state)
236      {
237         if (it->icon == it_state->icon)
238           it->icon = NULL;
239         eina_stringshare_del(it_state->label);
240         eina_stringshare_del(it_state->icon_str);
241         if (it_state->icon) evas_object_del(it_state->icon);
242         free(it_state);
243      }
244    eina_stringshare_del(it->label);
245    eina_stringshare_del(it->icon_str);
246    if (it->icon) evas_object_del(it->icon);
247    //TODO: See if checking for wd->menu_parent is necessary before deleting menu
248    if (it->o_menu) evas_object_del(it->o_menu);
249    elm_widget_item_del(it);
250 }
251
252 static void
253 _del_pre_hook(Evas_Object *obj)
254 {
255    Widget_Data *wd = elm_widget_data_get(obj);
256    Elm_Toolbar_Item *it, *next;
257
258    if (!wd) return;
259    it = ELM_TOOLBAR_ITEM_FROM_INLIST(wd->items);
260    while(it)
261      {
262         next = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
263         _item_del(it);
264         it = next;
265      }
266    if (wd->more_item)
267      _item_del(wd->more_item);
268 }
269
270 static void
271 _del_hook(Evas_Object *obj)
272 {
273    Widget_Data *wd = elm_widget_data_get(obj);
274
275    if (!wd) return;
276    free(wd);
277 }
278
279
280 static void
281 _mirrored_set_item(Evas_Object *obj __UNUSED__, Elm_Toolbar_Item *it, Eina_Bool mirrored)
282 {
283    edje_object_mirrored_set(it->base.view, mirrored);
284    elm_widget_mirrored_set(it->o_menu, mirrored);
285 }
286
287 static void
288 _theme_hook_item(Evas_Object *obj, Elm_Toolbar_Item *it, double scale, int icon_size)
289 {
290    Evas_Object *view = it->base.view;
291    Evas_Coord mw, mh;
292    const char *style = elm_widget_style_get(obj);
293
294    _mirrored_set_item(obj, it, elm_widget_mirrored_get(obj));
295    edje_object_scale_set(view, scale);
296    if (!it->separator)
297      {
298         _elm_theme_object_set(obj, view, "toolbar", "item", style);
299         if (it->selected)
300           {
301              edje_object_signal_emit(view, "elm,state,selected", "elm");
302              elm_widget_signal_emit(it->icon, "elm,state,selected", "elm");
303           }
304         if (it->disabled)
305           {
306              edje_object_signal_emit(view, "elm,state,disabled", "elm");
307              elm_widget_signal_emit(it->icon, "elm,state,disabled", "elm");
308           }
309         if (it->icon)
310           {
311              int ms = 0;
312
313              ms = ((double)icon_size * scale);
314              evas_object_size_hint_min_set(it->icon, ms, ms);
315              evas_object_size_hint_max_set(it->icon, ms, ms);
316              edje_object_part_swallow(view, "elm.swallow.icon",
317                                       it->icon);
318           }
319         edje_object_part_text_set(view, "elm.text", it->label);
320      }
321    else
322      _elm_theme_object_set(obj, view, "toolbar", "separator", style);
323
324    mw = mh = -1;
325    if (!it->separator)
326      elm_coords_finger_size_adjust(1, &mw, 1, &mh);
327    edje_object_size_min_restricted_calc(view, &mw, &mh, mw, mh);
328    if (!it->separator)
329      elm_coords_finger_size_adjust(1, &mw, 1, &mh);
330    evas_object_size_hint_min_set(view, mw, mh);
331 }
332
333 static void
334 _mirrored_set(Evas_Object *obj, Eina_Bool mirrored)
335 {
336    Widget_Data *wd = elm_widget_data_get(obj);
337    Elm_Toolbar_Item *it;
338
339    EINA_INLIST_FOREACH(wd->items, it)
340       _mirrored_set_item(obj, it, mirrored);
341    if (wd->more_item)
342      _mirrored_set_item(obj, wd->more_item, mirrored);
343 }
344
345 static void
346 _theme_hook(Evas_Object *obj)
347 {
348    Widget_Data *wd = elm_widget_data_get(obj);
349    Elm_Toolbar_Item *it;
350    double scale = 0;
351
352    if (!wd) return;
353    _elm_widget_mirrored_reload(obj);
354    elm_smart_scroller_object_theme_set(obj, wd->scr, "toolbar", "base", elm_widget_style_get(obj));
355    _mirrored_set(obj, elm_widget_mirrored_get(obj));
356    scale = (elm_widget_scale_get(obj) * _elm_config->scale);
357    edje_object_scale_set(wd->scr, scale);
358    wd->icon_size = _elm_toolbar_icon_size_get(wd);
359    EINA_INLIST_FOREACH(wd->items, it)
360       _theme_hook_item(obj, it, scale, wd->icon_size);
361    if (wd->more_item)
362      _theme_hook_item(obj, wd->more_item, scale, wd->icon_size);
363    _sizing_eval(obj);
364 }
365
366 static void
367 _sizing_eval(Evas_Object *obj)
368 {
369    Widget_Data *wd = elm_widget_data_get(obj);
370    Evas_Coord minw = -1, minh = -1, minw_bx, minh_bx;
371    Evas_Coord vw = 0, vh = 0;
372    Evas_Coord w, h;
373
374    if (!wd) return;
375    evas_object_smart_calculate(wd->bx);
376    edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
377                              &minw, &minh);
378    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
379    if (w < minw) w = minw;
380    if (h < minh) h = minh;
381    evas_object_resize(wd->scr, w, h);
382
383    evas_object_size_hint_min_get(wd->bx, &minw, &minh);
384    minw_bx = minw;
385    minh_bx = minh;
386    if (wd->vertical && (h > minh)) minh = h;
387    if ((!wd->vertical) && (w > minw)) minw = w;
388    evas_object_resize(wd->bx, minw, minh);
389    elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
390    switch (wd->shrink_mode)
391      {
392       case ELM_TOOLBAR_SHRINK_MENU: /* fallthrough */
393       case ELM_TOOLBAR_SHRINK_HIDE: /* fallthrough */
394       case ELM_TOOLBAR_SHRINK_SCROLL:
395         if (wd->vertical) minh = h - vh;
396         else minw = w - vw;
397         break;
398       case ELM_TOOLBAR_SHRINK_NONE:
399         if (wd->vertical) minh = minh_bx + (h - vh);
400         else minw = minw_bx + (w - vw);
401         break;
402      }
403    minh = minh + (h - vh);
404    evas_object_size_hint_min_set(obj, minw, minh);
405    evas_object_size_hint_max_set(obj, -1, -1);
406 }
407
408 static void
409 _item_menu_create(Widget_Data *wd, Elm_Toolbar_Item *item)
410 {
411    item->o_menu = elm_menu_add(item->base.view);
412    if (wd->menu_parent)
413      elm_menu_parent_set(item->o_menu, wd->menu_parent);
414    evas_object_event_callback_add(item->o_menu, EVAS_CALLBACK_HIDE,
415                                   _menu_hide, item);
416    evas_object_event_callback_add(item->o_menu, EVAS_CALLBACK_DEL,
417                                   _menu_del, item);
418 }
419
420 static void
421 _item_menu_destroy(Elm_Toolbar_Item *item)
422 {
423    if (item->o_menu)
424      {
425         evas_object_del(item->o_menu);
426         item->o_menu = NULL;
427      }
428 }
429
430 static int
431 _toolbar_item_prio_compare_cb(const void *i1, const void *i2)
432 {
433    const Elm_Toolbar_Item *eti1 = i1;
434    const Elm_Toolbar_Item *eti2 = i2;
435
436    if (!eti2) return 1;
437    if (!eti1) return -1;
438
439    return eti2->prio.priority - eti1->prio.priority;
440 }
441
442 static void
443 _fix_items_visibility(Widget_Data *wd, Evas_Coord *iw, Evas_Coord vw)
444 {
445    Elm_Toolbar_Item *it;
446    Eina_List *sorted = NULL;
447    Evas_Coord ciw;
448
449    EINA_INLIST_FOREACH(wd->items, it)
450      {
451         sorted = eina_list_sorted_insert(sorted,
452                                          _toolbar_item_prio_compare_cb, it);
453      }
454
455    if (wd->more_item)
456      {
457         evas_object_geometry_get(wd->more_item->base.view, NULL, NULL, &ciw, NULL);
458         *iw += ciw;
459      }
460    EINA_LIST_FREE(sorted, it)
461      {
462         evas_object_geometry_get(it->base.view, NULL, NULL, &ciw, NULL);
463         *iw += ciw;
464         it->prio.visible = (*iw <= vw);
465      }
466 }
467
468 static void
469 _elm_toolbar_item_menu_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
470 {
471    Elm_Toolbar_Item *it = data;
472    if (it->func) it->func((void *)(it->base.data), it->base.widget, it);
473 }
474
475 static void
476 _resize_job(void *data)
477 {
478    Widget_Data *wd = elm_widget_data_get(data);
479    Evas_Coord mw, mh, vw, vh, w, h;
480    Elm_Toolbar_Item *it;
481    Evas_Object *obj = (Evas_Object *) data;
482
483    if (!wd) return;
484    wd->resize_job = NULL;
485    elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
486    evas_object_size_hint_min_get(wd->bx, &mw, &mh);
487    evas_object_geometry_get(wd->bx, NULL, NULL, &w, &h);
488    if (wd->shrink_mode == ELM_TOOLBAR_SHRINK_MENU)
489      {
490         Evas_Coord iw = 0, more_w;
491
492         evas_object_resize(wd->bx, vw, h);
493         _fix_items_visibility(wd, &iw, vw);
494         evas_object_geometry_get(wd->more_item->base.view, NULL, NULL, &more_w, NULL);
495         if (iw - more_w <= vw)
496           iw -= more_w;
497
498         /* All items are removed from the box object, since removing individual
499          * items won't trigger a resize. Items are be readded below. */
500         evas_object_box_remove_all(wd->bx, EINA_FALSE);
501         if (iw > vw)
502           {
503              Evas_Object *menu;
504
505              _item_menu_destroy(wd->more_item);
506              _item_menu_create(wd, wd->more_item);
507              menu = elm_toolbar_item_menu_get(wd->more_item);
508
509              EINA_INLIST_FOREACH(wd->items, it)
510                {
511                   if (!it->prio.visible)
512                     {
513                        if (it->separator)
514                          elm_menu_item_separator_add(menu, NULL);
515                        else
516                          {
517                             Elm_Menu_Item *item;
518                             item = elm_menu_item_add(menu, NULL, it->icon_str, it->label,
519                                                      _elm_toolbar_item_menu_cb, it);
520                             elm_menu_item_disabled_set(item, it->disabled);
521                             if (it->o_menu) elm_menu_clone(it->o_menu, menu, item);
522                          }
523                        evas_object_hide(it->base.view);
524                     }
525                   else
526                     {
527                        evas_object_box_append(wd->bx, it->base.view);
528                        evas_object_show(it->base.view);
529                     }
530                }
531
532              evas_object_box_append(wd->bx, wd->more_item->base.view);
533              evas_object_show(wd->more_item->base.view);
534           }
535         else
536           {
537              /* All items are visible, show them all (except for the "More"
538               * button, of course). */
539              EINA_INLIST_FOREACH(wd->items, it)
540                {
541                   evas_object_show(it->base.view);
542                   evas_object_box_append(wd->bx, it->base.view);
543                }
544              evas_object_hide(wd->more_item->base.view);
545           }
546      }
547    else if (wd->shrink_mode == ELM_TOOLBAR_SHRINK_HIDE)
548      {
549         Evas_Coord iw = 0;
550
551         evas_object_resize(wd->bx, vw, h);
552         _fix_items_visibility(wd, &iw, vw);
553         evas_object_box_remove_all(wd->bx, EINA_FALSE);
554         if (iw > vw)
555           {
556              EINA_INLIST_FOREACH(wd->items, it)
557                {
558                   if (!it->prio.visible)
559                     evas_object_hide(it->base.view);
560                   else
561                     {
562                        evas_object_box_append(wd->bx, it->base.view);
563                        evas_object_show(it->base.view);
564                     }
565                }
566           }
567         else
568           {
569              /* All items are visible, show them all */
570              EINA_INLIST_FOREACH(wd->items, it)
571                {
572                   evas_object_show(it->base.view);
573                   evas_object_box_append(wd->bx, it->base.view);
574                }
575           }
576      }
577    else
578      {
579         if ((vw >= mw) && (w != vw)) evas_object_resize(wd->bx, vw, h);
580         EINA_INLIST_FOREACH(wd->items, it)
581           {
582              if (it->selected)
583                {
584                   _item_show(it);
585                   break;
586                }
587           }
588      }
589
590    _mirrored_set(obj, elm_widget_mirrored_get(obj));
591 }
592
593 static void
594 _resize_item(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
595 {
596    _sizing_eval(data);
597    _resize(data, NULL, NULL, NULL);
598 }
599
600 static void
601 _resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
602 {
603    Widget_Data *wd = elm_widget_data_get(data);
604    if (!wd->resize_job)
605      wd->resize_job = ecore_job_add(_resize_job, data);
606 }
607
608 static void
609 _select(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
610 {
611    Elm_Toolbar_Item *it = data;
612
613    if ((_elm_config->access_mode == ELM_ACCESS_MODE_OFF) ||
614        (_elm_access_2nd_click_timeout(it->base.view)))
615      {
616         if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
617            _elm_access_say(E_("Selected"));
618         _item_select(it);
619      }
620 }
621
622 static void
623 _mouse_in(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
624 {
625    Elm_Toolbar_Item *it = data;
626    edje_object_signal_emit(it->base.view, "elm,state,highlighted", "elm");
627    elm_widget_signal_emit(it->icon, "elm,state,highlighted", "elm");
628 }
629
630 static void
631 _mouse_out(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
632 {
633    Elm_Toolbar_Item *it = data;
634    edje_object_signal_emit(it->base.view, "elm,state,unhighlighted", "elm");
635    elm_widget_signal_emit(it->icon, "elm,state,unhighlighted", "elm");
636 }
637
638 static void
639 _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
640 {
641    Evas_Object *obj = (Evas_Object *) data;
642    Widget_Data *wd = elm_widget_data_get(obj);
643    if (!wd) return;
644    _els_box_layout(o, priv, !wd->vertical, wd->homogeneous, elm_widget_mirrored_get(obj));
645 }
646
647 static char *
648 _access_info_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Elm_Widget_Item *item)
649 {
650    Elm_Toolbar_Item *it = (Elm_Toolbar_Item *)item;
651    const char *txt = item->access_info;
652    if (!txt) txt = it->label;
653    if (txt) return strdup(txt);
654    return NULL;
655 }
656
657 static char *
658 _access_state_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Elm_Widget_Item *item __UNUSED__)
659 {
660    Elm_Toolbar_Item *it = (Elm_Toolbar_Item *)item;
661    if (it->separator)
662       return strdup(E_("Separator"));
663    else if (it->disabled)
664       return strdup(E_("State: Disabled"));
665    else if (it->selected)
666       return strdup(E_("State: Selected"));
667    else if (it->menu)
668       return strdup(E_("Has menu"));
669    return NULL;
670 }
671
672 static Elm_Toolbar_Item *
673 _item_new(Evas_Object *obj, const char *icon, const char *label, Evas_Smart_Cb func, const void *data)
674 {
675    Widget_Data *wd = elm_widget_data_get(obj);
676    Evas_Object *icon_obj;
677    Evas_Coord mw, mh;
678    Elm_Toolbar_Item *it;
679
680    icon_obj = elm_icon_add(obj);
681    elm_icon_order_lookup_set(icon_obj, wd->lookup_order);
682    if (!icon_obj) return NULL;
683    it = elm_widget_item_new(obj, Elm_Toolbar_Item);
684    if (!it)
685      {
686         evas_object_del(icon_obj);
687         return NULL;
688      }
689    it->label = eina_stringshare_add(label);
690    it->prio.visible = 1;
691    it->prio.priority = 0;
692    it->func = func;
693    it->separator = EINA_FALSE;
694    it->base.data = data;
695    it->base.view = edje_object_add(evas_object_evas_get(obj));
696    _elm_access_item_register((Elm_Widget_Item *)it, it->base.view);
697    _elm_access_text_set(_elm_access_item_get((Elm_Widget_Item *)it),
698                         ELM_ACCESS_TYPE, E_("Tool Item"));
699    _elm_access_callback_set(_elm_access_item_get((Elm_Widget_Item *)it),
700                             ELM_ACCESS_INFO, _access_info_cb, it);
701    _elm_access_callback_set(_elm_access_item_get((Elm_Widget_Item *)it),
702                             ELM_ACCESS_STATE, _access_state_cb, it);
703
704    if (_item_icon_set(icon_obj, "toolbar/", icon))
705      {
706         it->icon = icon_obj;
707         it->icon_str = eina_stringshare_add(icon);
708      }
709    else
710      {
711         it->icon = NULL;
712         it->icon_str = NULL;
713         evas_object_del(icon_obj);
714      }
715
716    _elm_theme_object_set(obj, it->base.view, "toolbar", "item",
717                          elm_widget_style_get(obj));
718    edje_object_signal_callback_add(it->base.view, "elm,action,click", "elm",
719                                    _select, it);
720    edje_object_signal_callback_add(it->base.view, "elm,mouse,in", "elm",
721                                    _mouse_in, it);
722    edje_object_signal_callback_add(it->base.view, "elm,mouse,out", "elm",
723                                    _mouse_out, it);
724    elm_widget_sub_object_add(obj, it->base.view);
725    if (it->icon)
726      {
727         int ms = 0;
728
729         ms = ((double)wd->icon_size * _elm_config->scale);
730         evas_object_size_hint_min_set(it->icon, ms, ms);
731         evas_object_size_hint_max_set(it->icon, ms, ms);
732         edje_object_part_swallow(it->base.view, "elm.swallow.icon", it->icon);
733         evas_object_show(it->icon);
734         elm_widget_sub_object_add(obj, it->icon);
735      }
736    edje_object_part_text_set(it->base.view, "elm.text", it->label);
737    mw = mh = -1;
738    elm_coords_finger_size_adjust(1, &mw, 1, &mh);
739    edje_object_size_min_restricted_calc(it->base.view, &mw, &mh, mw, mh);
740    elm_coords_finger_size_adjust(1, &mw, 1, &mh);
741    if (wd->vertical)
742      {
743         evas_object_size_hint_weight_set(it->base.view, EVAS_HINT_EXPAND, -1.0);
744         evas_object_size_hint_align_set(it->base.view, EVAS_HINT_FILL, 0.5);
745      }
746    else
747      {
748         evas_object_size_hint_weight_set(it->base.view, -1.0, EVAS_HINT_EXPAND);
749         evas_object_size_hint_align_set(it->base.view, 0.5, EVAS_HINT_FILL);
750      }
751    evas_object_size_hint_min_set(it->base.view, mw, mh);
752    evas_object_event_callback_add(it->base.view, EVAS_CALLBACK_RESIZE,
753                                   _resize_item, obj);
754    if ((!wd->items) && wd->always_select) _item_select(it);
755    return it;
756 }
757
758 EAPI Evas_Object *
759 elm_toolbar_add(Evas_Object *parent)
760 {
761    Evas_Object *obj;
762    Evas *e;
763    Widget_Data *wd;
764
765    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
766
767    ELM_SET_WIDTYPE(widtype, "toolbar");
768    elm_widget_type_set(obj, "toolbar");
769    elm_widget_sub_object_add(parent, obj);
770    elm_widget_data_set(obj, wd);
771    elm_widget_del_pre_hook_set(obj, _del_pre_hook);
772    elm_widget_del_hook_set(obj, _del_hook);
773    elm_widget_theme_hook_set(obj, _theme_hook);
774    elm_widget_can_focus_set(obj, EINA_FALSE);
775
776    wd->more_item = NULL;
777    wd->selected_item = NULL;
778    wd->scr = elm_smart_scroller_add(e);
779    elm_smart_scroller_widget_set(wd->scr, obj);
780    elm_smart_scroller_object_theme_set(obj, wd->scr, "toolbar", "base", "default");
781    elm_smart_scroller_bounce_allow_set(wd->scr,
782                                        _elm_config->thumbscroll_bounce_enable,
783                                        EINA_FALSE);
784    elm_widget_resize_object_set(obj, wd->scr);
785    elm_smart_scroller_policy_set(wd->scr,
786                                  ELM_SMART_SCROLLER_POLICY_AUTO,
787                                  ELM_SMART_SCROLLER_POLICY_OFF);
788
789
790    wd->icon_size = _elm_toolbar_icon_size_get(wd);
791
792
793    wd->homogeneous = EINA_TRUE;
794    wd->align = 0.5;
795
796    wd->bx = evas_object_box_add(e);
797    evas_object_size_hint_align_set(wd->bx, wd->align, 0.5);
798    evas_object_box_layout_set(wd->bx, _layout, obj, NULL);
799    elm_widget_sub_object_add(obj, wd->bx);
800    elm_smart_scroller_child_set(wd->scr, wd->bx);
801    evas_object_show(wd->bx);
802
803    elm_toolbar_mode_shrink_set(obj, _elm_config->toolbar_shrink_mode);
804    evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_RESIZE, _resize, obj);
805    evas_object_event_callback_add(wd->bx, EVAS_CALLBACK_RESIZE, _resize, obj);
806    elm_toolbar_icon_order_lookup_set(obj, ELM_ICON_LOOKUP_THEME_FDO);
807
808    evas_object_smart_callbacks_descriptions_set(obj, _signals);
809
810    _sizing_eval(obj);
811    return obj;
812 }
813
814 EAPI void
815 elm_toolbar_icon_size_set(Evas_Object *obj, int icon_size)
816 {
817    ELM_CHECK_WIDTYPE(obj, widtype);
818    Widget_Data *wd = elm_widget_data_get(obj);
819    if (!wd) return;
820    if (wd->icon_size == icon_size) return;
821    wd->icon_size = icon_size;
822    _theme_hook(obj);
823 }
824
825 EAPI int
826 elm_toolbar_icon_size_get(const Evas_Object *obj)
827 {
828    ELM_CHECK_WIDTYPE(obj, widtype) 0;
829    Widget_Data *wd = elm_widget_data_get(obj);
830    if (!wd) return 0;
831    return wd->icon_size;
832 }
833
834 EAPI Elm_Toolbar_Item *
835 elm_toolbar_item_append(Evas_Object *obj, const char *icon, const char *label, Evas_Smart_Cb func, const void *data)
836 {
837    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
838    Widget_Data *wd = elm_widget_data_get(obj);
839    if (!wd) return NULL;
840
841    Elm_Toolbar_Item *it = _item_new(obj, icon, label, func, data);
842    if (!it) return NULL;
843    double scale = (elm_widget_scale_get(obj) * _elm_config->scale);
844
845    wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(it));
846    evas_object_box_append(wd->bx, it->base.view);
847    evas_object_show(it->base.view);
848
849    _theme_hook_item(obj, it, scale, wd->icon_size);
850    _sizing_eval(obj);
851
852    return it;
853 }
854
855 static void
856 _elm_toolbar_item_state_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
857 {
858    Elm_Toolbar_Item *it = event_info;
859    Elm_Toolbar_Item_State *it_state;
860
861    it_state = eina_list_data_get(it->current_state);
862    if (it_state->func)
863      it_state->func((void *)it_state->data, obj, event_info);
864 }
865
866 EAPI Elm_Toolbar_Item_State *
867 elm_toolbar_item_state_next(Elm_Toolbar_Item *item)
868 {
869    Widget_Data *wd;
870    Evas_Object *obj;
871    Eina_List *next_state;
872    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
873
874    obj = item->base.widget;
875    wd = elm_widget_data_get(obj);
876    if (!wd) return NULL;
877    if (!item->states) return NULL;
878
879    next_state = eina_list_next(item->current_state);
880    if (!next_state)
881      next_state = eina_list_next(item->states);
882    return eina_list_data_get(next_state);
883 }
884
885 EAPI Elm_Toolbar_Item_State *
886 elm_toolbar_item_state_prev(Elm_Toolbar_Item *item)
887 {
888    Widget_Data *wd;
889    Evas_Object *obj;
890    Eina_List *prev_state;
891    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
892
893    obj = item->base.widget;
894    wd = elm_widget_data_get(obj);
895    if (!wd) return NULL;
896    if (!item->states) return NULL;
897
898    prev_state = eina_list_prev(item->current_state);
899    if ((!prev_state) || (prev_state == item->states))
900      prev_state = eina_list_last(item->states);
901    return eina_list_data_get(prev_state);
902 }
903
904 EAPI void
905 elm_toolbar_item_state_unset(Elm_Toolbar_Item *it)
906 {
907    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it);
908    elm_toolbar_item_state_set(it, NULL);
909 }
910
911 EAPI Eina_Bool
912 elm_toolbar_item_state_set(Elm_Toolbar_Item *it, Elm_Toolbar_Item_State *state)
913 {
914    Widget_Data *wd;
915    Eina_List *next_state;
916    Elm_Toolbar_Item_State *it_state;
917    Evas_Object *obj;
918    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, EINA_FALSE);
919
920    obj = it->base.widget;
921    wd = elm_widget_data_get(obj);
922    if (!wd) return EINA_FALSE;
923    if (!it->states) return EINA_FALSE;
924
925    if (state)
926      {
927         next_state = eina_list_data_find_list(it->states, state);
928         if (!next_state) return EINA_FALSE;
929      }
930    else
931      next_state = it->states;
932
933    if (next_state == it->current_state) return EINA_TRUE;
934
935    it_state = eina_list_data_get(next_state);
936    if (eina_list_data_find(it->current_state, state))
937      {
938         _item_label_set(it, it_state->label, "elm,state,label_set,forward");
939         _elm_toolbar_item_icon_obj_set(obj, it, it_state->icon, it_state->icon_str,
940                                        wd->icon_size, "elm,state,icon_set,forward");
941      }
942    else
943      {
944         _item_label_set(it, it_state->label, "elm,state,label_set,backward");
945         _elm_toolbar_item_icon_obj_set(obj, it, it_state->icon, it_state->icon_str,
946                                        wd->icon_size, "elm,state,icon_set,backward");
947      }
948    if (it->disabled)
949      elm_widget_signal_emit(it->icon, "elm,state,disabled", "elm");
950    else
951      elm_widget_signal_emit(it->icon, "elm,state,enabled", "elm");
952
953    it->current_state = next_state;
954    return EINA_TRUE;
955 }
956
957 EAPI Elm_Toolbar_Item_State *
958 elm_toolbar_item_state_get(const Elm_Toolbar_Item *it)
959 {
960    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, NULL);
961    if ((!it->states) || (!it->current_state)) return NULL;
962    if (it->current_state == it->states) return NULL;
963
964    return eina_list_data_get(it->current_state);
965 }
966
967 static Elm_Toolbar_Item_State *
968 _item_state_new(const char *label, const char *icon_str, Evas_Object *icon, Evas_Smart_Cb func, const void *data)
969 {
970    Elm_Toolbar_Item_State *it_state;
971    it_state = ELM_NEW(Elm_Toolbar_Item_State);
972    it_state->label = eina_stringshare_add(label);
973    it_state->icon_str = eina_stringshare_add(icon_str);
974    it_state->icon = icon;
975    it_state->func = func;
976    it_state->data = data;
977    return it_state;
978 }
979
980 EAPI Elm_Toolbar_Item_State *
981 elm_toolbar_item_state_add(Elm_Toolbar_Item *item, const char *icon, const char *label, Evas_Smart_Cb func, const void *data)
982 {
983    Elm_Toolbar_Item_State *it_state;
984    Evas_Object *icon_obj;
985    Evas_Object *obj;
986    Widget_Data *wd;
987    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
988    obj = item->base.widget;
989    wd = elm_widget_data_get(item->base.widget);
990    if (!wd) return NULL;
991
992    if (!item->states)
993      {
994         it_state = _item_state_new(item->label, item->icon_str, item->icon,
995                                    item->func, item->base.data);
996         item->states = eina_list_append(item->states, it_state);
997         item->current_state = item->states;
998      }
999
1000    icon_obj = elm_icon_add(obj);
1001    elm_icon_order_lookup_set(icon_obj, wd->lookup_order);
1002    if (!icon_obj) goto error_state_add;
1003
1004    if (!_item_icon_set(icon_obj, "toolbar/", icon))
1005      {
1006         evas_object_del(icon_obj);
1007         icon_obj = NULL;
1008         icon = NULL;
1009      }
1010
1011    it_state = _item_state_new(label, icon, icon_obj, func, data);
1012    item->states = eina_list_append(item->states, it_state);
1013    item->func = _elm_toolbar_item_state_cb;
1014    item->base.data = NULL;
1015
1016    return it_state;
1017
1018 error_state_add:
1019    if (item->states && !eina_list_next(item->states))
1020      {
1021         eina_stringshare_del(item->label);
1022         eina_stringshare_del(item->icon_str);
1023         free(eina_list_data_get(item->states));
1024         eina_list_free(item->states);
1025         item->states = NULL;
1026      }
1027    return NULL;
1028 }
1029
1030 EAPI Eina_Bool
1031 elm_toolbar_item_state_del(Elm_Toolbar_Item *item, Elm_Toolbar_Item_State *state)
1032 {
1033    Eina_List *del_state;
1034    Elm_Toolbar_Item_State *it_state;
1035    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, EINA_FALSE);
1036
1037    if (!state) return EINA_FALSE;
1038    if (!item->states) return EINA_FALSE;
1039
1040    del_state = eina_list_data_find_list(item->states, state);
1041    if (del_state == item->states) return EINA_FALSE;
1042    if (del_state == item->current_state)
1043      elm_toolbar_item_state_unset(item);
1044
1045    eina_stringshare_del(state->label);
1046    eina_stringshare_del(state->icon_str);
1047    if (state->icon) evas_object_del(state->icon);
1048    free(state);
1049    item->states = eina_list_remove_list(item->states, del_state);
1050    if (item->states && !eina_list_next(item->states))
1051      {
1052         it_state = eina_list_data_get(item->states);
1053         item->base.data = it_state->data;
1054         item->func = it_state->func;
1055         eina_stringshare_del(it_state->label);
1056         eina_stringshare_del(it_state->icon_str);
1057         free(eina_list_data_get(item->states));
1058         eina_list_free(item->states);
1059         item->states = NULL;
1060      }
1061    return EINA_TRUE;
1062 }
1063
1064 EAPI Elm_Toolbar_Item *
1065 elm_toolbar_item_prepend(Evas_Object *obj, const char *icon, const char *label, Evas_Smart_Cb func, const void *data)
1066 {
1067    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1068    Widget_Data *wd = elm_widget_data_get(obj);
1069    if (!wd) return NULL;
1070
1071    Elm_Toolbar_Item *it = _item_new(obj, icon, label, func, data);
1072    if (!it) return NULL;
1073    double scale = (elm_widget_scale_get(obj) * _elm_config->scale);
1074
1075    wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(it));
1076    evas_object_box_prepend(wd->bx, it->base.view);
1077    evas_object_show(it->base.view);
1078    _theme_hook_item(obj, it, scale, wd->icon_size);
1079    _sizing_eval(obj);
1080
1081    return it;
1082 }
1083
1084 EAPI Elm_Toolbar_Item *
1085 elm_toolbar_item_insert_before(Evas_Object *obj, Elm_Toolbar_Item *before, const char *icon, const char *label, Evas_Smart_Cb func, const void *data)
1086 {
1087    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1088    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(before, NULL);
1089    Widget_Data *wd = elm_widget_data_get(obj);
1090    if (!wd) return NULL;
1091
1092    Elm_Toolbar_Item *it = _item_new(obj, icon, label, func, data);
1093    if (!it) return NULL;
1094    double scale = (elm_widget_scale_get(obj) * _elm_config->scale);
1095
1096    wd->items = eina_inlist_prepend_relative(wd->items, EINA_INLIST_GET(it),
1097                                             EINA_INLIST_GET(before));
1098    evas_object_box_insert_before(wd->bx, it->base.view, before->base.view);
1099    evas_object_show(it->base.view);
1100    _theme_hook_item(obj, it, scale, wd->icon_size);
1101    _sizing_eval(obj);
1102
1103    return it;
1104 }
1105
1106 EAPI Elm_Toolbar_Item *
1107 elm_toolbar_item_insert_after(Evas_Object *obj, Elm_Toolbar_Item *after, const char *icon, const char *label, Evas_Smart_Cb func, const void *data)
1108 {
1109    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1110    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(after, NULL);
1111    Widget_Data *wd = elm_widget_data_get(obj);
1112    if (!wd) return NULL;
1113
1114    Elm_Toolbar_Item *it = _item_new(obj, icon, label, func, data);
1115    if (!it) return NULL;
1116    double scale = (elm_widget_scale_get(obj) * _elm_config->scale);
1117
1118    wd->items = eina_inlist_append_relative(wd->items, EINA_INLIST_GET(it),
1119                                            EINA_INLIST_GET(after));
1120    evas_object_box_insert_after(wd->bx, it->base.view, after->base.view);
1121    evas_object_show(it->base.view);
1122    _theme_hook_item(obj, it, scale, wd->icon_size);
1123    _sizing_eval(obj);
1124
1125    return it;
1126 }
1127
1128 EAPI Elm_Toolbar_Item *
1129 elm_toolbar_first_item_get(const Evas_Object *obj)
1130 {
1131    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1132    Widget_Data *wd = elm_widget_data_get(obj);
1133    if (!wd || !wd->items) return NULL;
1134    Elm_Toolbar_Item *it = ELM_TOOLBAR_ITEM_FROM_INLIST(wd->items);
1135    return it;
1136 }
1137
1138 EAPI Elm_Toolbar_Item *
1139 elm_toolbar_last_item_get(const Evas_Object *obj)
1140 {
1141    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1142    Widget_Data *wd = elm_widget_data_get(obj);
1143    if (!wd || !wd->items) return NULL;
1144    Elm_Toolbar_Item *it = ELM_TOOLBAR_ITEM_FROM_INLIST(wd->items->last);
1145    return it;
1146 }
1147
1148 EAPI Elm_Toolbar_Item *
1149 elm_toolbar_item_next_get(const Elm_Toolbar_Item *item)
1150 {
1151    Elm_Toolbar_Item *next;
1152    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1153    next = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(item)->next);
1154    return next;
1155 }
1156
1157 EAPI Elm_Toolbar_Item *
1158 elm_toolbar_item_prev_get(const Elm_Toolbar_Item *item)
1159 {
1160    Elm_Toolbar_Item *prev;
1161    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1162    prev = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(item)->prev);
1163    return prev;
1164 }
1165
1166 EAPI Evas_Object *
1167 elm_toolbar_item_toolbar_get(const Elm_Toolbar_Item *item)
1168 {
1169    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1170    return item->base.widget;
1171 }
1172
1173 EAPI void
1174 elm_toolbar_item_priority_set(Elm_Toolbar_Item *item, int priority)
1175 {
1176    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1177    if (item->prio.priority == priority) return;
1178    item->prio.priority = priority;
1179    _resize(item->base.widget, NULL, NULL, NULL);
1180 }
1181
1182 EAPI int
1183 elm_toolbar_item_priority_get(const Elm_Toolbar_Item *item)
1184 {
1185    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, 0);
1186    return item->prio.priority;
1187 }
1188
1189 EAPI const char *
1190 elm_toolbar_item_icon_get(const Elm_Toolbar_Item *item)
1191 {
1192    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1193    return item->icon_str;
1194 }
1195
1196 EAPI const char *
1197 elm_toolbar_item_label_get(const Elm_Toolbar_Item *item)
1198 {
1199    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1200    return item->label;
1201 }
1202
1203 static void
1204 _elm_toolbar_item_label_update(Elm_Toolbar_Item *item)
1205 {
1206    Evas_Coord mw = -1, mh = -1;
1207    Widget_Data *wd = elm_widget_data_get(item->base.widget);
1208    edje_object_part_text_set(item->base.view, "elm.text", item->label);
1209
1210    elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1211    edje_object_size_min_restricted_calc(item->base.view, &mw, &mh, mw, mh);
1212    elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1213    if (wd->vertical)
1214      {
1215         evas_object_size_hint_weight_set(item->base.view, EVAS_HINT_EXPAND, -1.0);
1216         evas_object_size_hint_align_set(item->base.view, EVAS_HINT_FILL, 0.5);
1217      }
1218    else
1219      {
1220         evas_object_size_hint_weight_set(item->base.view, -1.0, EVAS_HINT_EXPAND);
1221         evas_object_size_hint_align_set(item->base.view, 0.5, EVAS_HINT_FILL);
1222      }
1223    evas_object_size_hint_min_set(item->base.view, mw, mh);
1224 }
1225
1226 static void
1227 _elm_toolbar_item_label_set_cb (void *data, Evas_Object *obj, const char *emission, const char *source)
1228 {
1229    Elm_Toolbar_Item *item = data;
1230    _elm_toolbar_item_label_update(item);
1231    edje_object_signal_callback_del(obj, emission, source,
1232                                    _elm_toolbar_item_label_set_cb);
1233    edje_object_signal_emit (item->base.view, "elm,state,label,reset", "elm");
1234 }
1235
1236 static void
1237 _item_label_set(Elm_Toolbar_Item *item, const char *label, const char *signal)
1238 {
1239    const char *s;
1240
1241    if ((label) && (item->label) && (!strcmp(label, item->label))) return;
1242
1243    eina_stringshare_replace(&item->label, label);
1244    s = edje_object_data_get(item->base.view, "transition_animation_on");
1245    if ((s) && (atoi(s)))
1246      {
1247         edje_object_part_text_set(item->base.view, "elm.text_new", item->label);
1248         edje_object_signal_emit (item->base.view, signal, "elm");
1249         edje_object_signal_callback_add(item->base.view,
1250                                         "elm,state,label_set,done", "elm",
1251                                         _elm_toolbar_item_label_set_cb, item);
1252      }
1253    else
1254      _elm_toolbar_item_label_update(item);
1255    _resize(item->base.widget, NULL, NULL, NULL);
1256 }
1257
1258 EAPI void
1259 elm_toolbar_item_label_set(Elm_Toolbar_Item *item, const char *label)
1260 {
1261    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1262    _item_label_set(item, label, "elm,state,label_set");
1263 }
1264
1265 static void
1266 _elm_toolbar_item_icon_update(Elm_Toolbar_Item *item)
1267 {
1268    Elm_Toolbar_Item_State *it_state;
1269    Eina_List *l;
1270    Evas_Coord mw = -1, mh = -1;
1271    Widget_Data *wd = elm_widget_data_get(item->base.widget);
1272    Evas_Object *old_icon = edje_object_part_swallow_get(item->base.view,
1273                                                         "elm.swallow.icon");
1274    elm_widget_sub_object_del(item->base.view, old_icon);
1275    evas_object_hide(old_icon);
1276    edje_object_part_swallow(item->base.view, "elm.swallow.icon", item->icon);
1277    elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1278    edje_object_size_min_restricted_calc(item->base.view, &mw, &mh, mw, mh);
1279    elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1280    if (wd->vertical)
1281      {
1282         evas_object_size_hint_weight_set(item->base.view, EVAS_HINT_EXPAND, -1.0);
1283         evas_object_size_hint_align_set(item->base.view, EVAS_HINT_FILL, 0.5);
1284      }
1285    else
1286      {
1287         evas_object_size_hint_weight_set(item->base.view, -1.0, EVAS_HINT_EXPAND);
1288         evas_object_size_hint_align_set(item->base.view, 0.5, EVAS_HINT_FILL);
1289      }
1290    evas_object_size_hint_min_set(item->base.view, mw, mh);
1291
1292    EINA_LIST_FOREACH(item->states, l, it_state)
1293       if (it_state->icon == old_icon)
1294         return;
1295    evas_object_del(old_icon);
1296 }
1297
1298 EAPI Eina_Bool
1299 elm_toolbar_item_selected_get(const Elm_Toolbar_Item *item)
1300 {
1301    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, EINA_FALSE);
1302    return item->selected;
1303 }
1304
1305 EAPI void
1306 elm_toolbar_item_selected_set(Elm_Toolbar_Item *item, Eina_Bool selected)
1307 {
1308    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1309    Widget_Data *wd = elm_widget_data_get(item->base.widget);
1310    if (!wd) return;
1311
1312    if (item->selected == selected) return;
1313
1314    if (selected)
1315      _item_select(item);
1316    else
1317      _item_unselect(item);
1318 }
1319
1320 EAPI Elm_Toolbar_Item *
1321 elm_toolbar_selected_item_get(const Evas_Object *obj)
1322 {
1323    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1324    Widget_Data *wd = elm_widget_data_get(obj);
1325    if (!wd) return NULL;
1326    return wd->selected_item;
1327 }
1328
1329 static void
1330 _elm_toolbar_item_icon_set_cb (void *data, Evas_Object *obj, const char *emission, const char *source)
1331 {
1332    Elm_Toolbar_Item *item = data;
1333    edje_object_part_unswallow(item->base.view, item->icon);
1334    _elm_toolbar_item_icon_update(item);
1335    edje_object_signal_callback_del(obj, emission, source,
1336                                    _elm_toolbar_item_icon_set_cb);
1337    edje_object_signal_emit (item->base.view, "elm,state,icon,reset", "elm");
1338 }
1339
1340 static void
1341 _elm_toolbar_item_icon_obj_set(Evas_Object *obj, Elm_Toolbar_Item *item, Evas_Object *icon_obj, const char *icon_str, double icon_size, const char *signal)
1342 {
1343    Evas_Object *old_icon;
1344    int ms = 0;
1345    const char *s;
1346
1347    if (icon_str)
1348      eina_stringshare_replace(&item->icon_str, icon_str);
1349    else
1350      {
1351         eina_stringshare_del(item->icon_str);
1352         item->icon_str = NULL;
1353      }
1354    item->icon = icon_obj;
1355    if (icon_obj)
1356      {
1357         ms = (icon_size * _elm_config->scale);
1358         evas_object_size_hint_min_set(item->icon, ms, ms);
1359         evas_object_size_hint_max_set(item->icon, ms, ms);
1360         evas_object_show(item->icon);
1361         elm_widget_sub_object_add(obj, item->icon);
1362      }
1363    s = edje_object_data_get(item->base.view, "transition_animation_on");
1364    if ((s) && (atoi(s)))
1365      {
1366         old_icon = edje_object_part_swallow_get(item->base.view,
1367                                                 "elm.swallow.icon_new");
1368         if (old_icon)
1369           {
1370              elm_widget_sub_object_del(item->base.view, old_icon);
1371              evas_object_hide(old_icon);
1372           }
1373         edje_object_part_swallow(item->base.view, "elm.swallow.icon_new",
1374                                  item->icon);
1375         edje_object_signal_emit (item->base.view, signal, "elm");
1376         edje_object_signal_callback_add(item->base.view,
1377                                         "elm,state,icon_set,done", "elm",
1378                                         _elm_toolbar_item_icon_set_cb, item);
1379      }
1380    else
1381      _elm_toolbar_item_icon_update(item);
1382    _resize(obj, NULL, NULL, NULL);
1383 }
1384
1385 EAPI void
1386 elm_toolbar_item_icon_set(Elm_Toolbar_Item *item, const char *icon)
1387 {
1388    Evas_Object *icon_obj;
1389    Widget_Data *wd;
1390    Evas_Object *obj;
1391
1392    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1393    obj = item->base.widget;
1394    wd = elm_widget_data_get(obj);
1395    if (!wd) return;
1396    if ((icon) && (item->icon_str) && (!strcmp(icon, item->icon_str))) return;
1397
1398    icon_obj = elm_icon_add(obj);
1399    if (!icon_obj) return;
1400    if (_item_icon_set(icon_obj, "toolbar/", icon))
1401      _elm_toolbar_item_icon_obj_set(obj, item, icon_obj, icon, wd->icon_size,
1402                                     "elm,state,icon_set");
1403    else
1404      {
1405         _elm_toolbar_item_icon_obj_set(obj, item, NULL, NULL, 0,
1406                                        "elm,state,icon_set");
1407         evas_object_del(icon_obj);
1408      }
1409 }
1410
1411 EAPI Eina_Bool
1412 elm_toolbar_item_icon_memfile_set(Elm_Toolbar_Item *item, const void *img, size_t size, const char *format, const char *key)
1413 {
1414    Evas_Object *icon_obj;
1415    Widget_Data *wd;
1416    Evas_Object *obj;
1417    Eina_Bool ret;
1418
1419    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, EINA_FALSE);
1420    obj = item->base.widget;
1421    wd = elm_widget_data_get(obj);
1422    if (!wd) return EINA_FALSE;
1423
1424    if (img && size)
1425      {
1426         icon_obj = _els_smart_icon_add(evas_object_evas_get(obj));
1427         evas_object_repeat_events_set(icon_obj, EINA_TRUE);
1428         ret = _els_smart_icon_memfile_set(icon_obj, img, size, format, key);
1429         if (!ret)
1430           {
1431              evas_object_del(icon_obj);
1432              return EINA_FALSE;
1433           }
1434         _elm_toolbar_item_icon_obj_set(obj, item, icon_obj, NULL, wd->icon_size,
1435                                          "elm,state,icon_set");
1436      }
1437    else
1438      _elm_toolbar_item_icon_obj_set(obj, item, NULL, NULL, 0, "elm,state,icon_set");
1439    return EINA_TRUE;
1440 }
1441
1442 EAPI Evas_Object *
1443 elm_toolbar_item_object_get(const Elm_Toolbar_Item *item)
1444 {
1445    Widget_Data *wd;
1446    Evas_Object *obj;
1447
1448    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1449    obj = item->base.widget;
1450    wd = elm_widget_data_get(obj);
1451    if (!wd) return NULL;
1452
1453    return item->base.view;
1454 }
1455
1456 EAPI Evas_Object *
1457 elm_toolbar_item_icon_object_get(Elm_Toolbar_Item *item)
1458 {
1459    Widget_Data *wd;
1460    Evas_Object *obj;
1461
1462    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1463    obj = item->base.widget;
1464    wd = elm_widget_data_get(obj);
1465    if (!wd) return NULL;
1466
1467    return item->icon;
1468 }
1469
1470 EAPI void
1471 elm_toolbar_item_del(Elm_Toolbar_Item *item)
1472 {
1473    Widget_Data *wd;
1474    Evas_Object *obj2;
1475    Elm_Toolbar_Item *next;
1476
1477    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1478    wd = elm_widget_data_get(item->base.widget);
1479    if (!wd) return;
1480    obj2 = item->base.widget;
1481    next = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(item)->next);
1482    wd->items = eina_inlist_remove(wd->items, EINA_INLIST_GET(item));
1483    if (!next) next = ELM_TOOLBAR_ITEM_FROM_INLIST(wd->items);
1484    if (wd->always_select && item->selected && next) _item_select(next);
1485    _item_del(item);
1486    _theme_hook(obj2);
1487 }
1488
1489 EAPI void
1490 elm_toolbar_item_del_cb_set(Elm_Toolbar_Item *item, Evas_Smart_Cb func)
1491 {
1492    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1493    elm_widget_item_del_cb_set(item, func);
1494 }
1495
1496 EAPI Eina_Bool
1497 elm_toolbar_item_disabled_get(const Elm_Toolbar_Item *item)
1498 {
1499    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, EINA_FALSE);
1500    return item->disabled;
1501 }
1502
1503 EAPI void
1504 elm_toolbar_item_disabled_set(Elm_Toolbar_Item *item, Eina_Bool disabled)
1505 {
1506    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1507    _item_disable(item, disabled);
1508    _resize(item->base.widget, NULL, NULL, NULL);
1509 }
1510
1511 EAPI void
1512 elm_toolbar_item_separator_set(Elm_Toolbar_Item *item, Eina_Bool separator)
1513 {
1514    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1515    Evas_Object *obj = item->base.widget;
1516    Widget_Data *wd = elm_widget_data_get(obj);
1517    double scale;
1518    if (item->separator == separator) return;
1519    item->separator = separator;
1520    scale = (elm_widget_scale_get(obj) * _elm_config->scale);
1521    _theme_hook_item(obj, item, scale, wd->icon_size);
1522 }
1523
1524 EAPI Eina_Bool
1525 elm_toolbar_item_separator_get(const Elm_Toolbar_Item *item)
1526 {
1527    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, EINA_FALSE);
1528    return item->separator;
1529 }
1530
1531 EAPI void
1532 elm_toolbar_mode_shrink_set(Evas_Object *obj, Elm_Toolbar_Shrink_Mode shrink_mode)
1533 {
1534    ELM_CHECK_WIDTYPE(obj, widtype);
1535    Widget_Data *wd = elm_widget_data_get(obj);
1536    Eina_Bool bounce;
1537
1538    if (!wd) return;
1539    wd->shrink_mode = shrink_mode;
1540    bounce = (_elm_config->thumbscroll_bounce_enable) &&
1541       (shrink_mode == ELM_TOOLBAR_SHRINK_SCROLL);
1542    elm_smart_scroller_bounce_allow_set(wd->scr, bounce, EINA_FALSE);
1543
1544    if (wd->more_item)
1545      {
1546         _item_del(wd->more_item);
1547         wd->more_item = NULL;
1548      }
1549
1550    if (shrink_mode == ELM_TOOLBAR_SHRINK_MENU)
1551      {
1552         elm_smart_scroller_policy_set(wd->scr, ELM_SMART_SCROLLER_POLICY_OFF, ELM_SMART_SCROLLER_POLICY_OFF);
1553
1554         wd->more_item = _item_new(obj, "more_menu", "More",
1555                                   NULL, NULL);
1556      }
1557    else if (shrink_mode == ELM_TOOLBAR_SHRINK_HIDE)
1558      elm_smart_scroller_policy_set(wd->scr, ELM_SMART_SCROLLER_POLICY_OFF,
1559                                    ELM_SMART_SCROLLER_POLICY_OFF);
1560    else
1561      elm_smart_scroller_policy_set(wd->scr, ELM_SMART_SCROLLER_POLICY_AUTO,
1562                                    ELM_SMART_SCROLLER_POLICY_OFF);
1563    _sizing_eval(obj);
1564 }
1565
1566 EAPI Elm_Toolbar_Shrink_Mode
1567 elm_toolbar_mode_shrink_get(const Evas_Object *obj)
1568 {
1569    ELM_CHECK_WIDTYPE(obj, widtype) ELM_TOOLBAR_SHRINK_NONE;
1570    Widget_Data *wd = elm_widget_data_get(obj);
1571
1572    if (!wd) return ELM_TOOLBAR_SHRINK_NONE;
1573    return wd->shrink_mode;
1574 }
1575
1576 EAPI void
1577 elm_toolbar_homogeneous_set(Evas_Object *obj, Eina_Bool homogeneous)
1578 {
1579    ELM_CHECK_WIDTYPE(obj, widtype);
1580    Widget_Data *wd = elm_widget_data_get(obj);
1581
1582    if (!wd) return;
1583    wd->homogeneous = !!homogeneous;
1584    evas_object_smart_calculate(wd->bx);
1585 }
1586
1587 EINA_DEPRECATED EAPI void
1588 elm_toolbar_homogenous_set(Evas_Object *obj, Eina_Bool homogenous)
1589 {
1590    elm_toolbar_homogeneous_set(obj, homogenous);
1591 }
1592
1593 EAPI Eina_Bool
1594 elm_toolbar_homogeneous_get(const Evas_Object *obj)
1595 {
1596    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1597    Widget_Data *wd = elm_widget_data_get(obj);
1598
1599    if (!wd) return EINA_FALSE;
1600    return wd->homogeneous;
1601 }
1602
1603 EINA_DEPRECATED EAPI Eina_Bool
1604 elm_toolbar_homogenous_get(const Evas_Object *obj)
1605 {
1606    return elm_toolbar_homogeneous_get(obj);
1607 }
1608
1609 EAPI void
1610 elm_toolbar_menu_parent_set(Evas_Object *obj, Evas_Object *parent)
1611 {
1612    Elm_Toolbar_Item *it;
1613    ELM_CHECK_WIDTYPE(obj, widtype);
1614    Widget_Data *wd = elm_widget_data_get(obj);
1615
1616    if (!wd) return;
1617    EINA_SAFETY_ON_NULL_RETURN(parent);
1618    wd->menu_parent = parent;
1619    EINA_INLIST_FOREACH(wd->items, it)
1620      {
1621         if (it->o_menu)
1622           elm_menu_parent_set(it->o_menu, wd->menu_parent);
1623      }
1624    if ((wd->more_item) && (wd->more_item->o_menu))
1625      elm_menu_parent_set(wd->more_item->o_menu, wd->menu_parent);
1626 }
1627
1628 EAPI Evas_Object *
1629 elm_toolbar_menu_parent_get(const Evas_Object *obj)
1630 {
1631    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1632    Widget_Data *wd = elm_widget_data_get(obj);
1633
1634    if (!wd) return NULL;
1635    return wd->menu_parent;
1636 }
1637
1638 EAPI void
1639 elm_toolbar_align_set(Evas_Object *obj, double align)
1640 {
1641    ELM_CHECK_WIDTYPE(obj, widtype);
1642    Widget_Data *wd = elm_widget_data_get(obj);
1643
1644    if (!wd) return;
1645    if (wd->align != align)
1646      evas_object_size_hint_align_set(wd->bx, align, 0.5);
1647    wd->align = align;
1648 }
1649
1650 EAPI double
1651 elm_toolbar_align_get(const Evas_Object *obj)
1652 {
1653    ELM_CHECK_WIDTYPE(obj, widtype) 0.0;
1654    Widget_Data *wd = elm_widget_data_get(obj);
1655
1656    if (!wd) return 0.0;
1657    return wd->align;
1658 }
1659
1660 EAPI void
1661 elm_toolbar_item_menu_set(Elm_Toolbar_Item *item, Eina_Bool menu)
1662 {
1663    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1664    Widget_Data *wd = elm_widget_data_get(item->base.widget);
1665    if (!wd) return;
1666
1667    if (item->menu == menu) return;
1668    item->menu = menu;
1669    if (menu) _item_menu_create(wd, item);
1670    else _item_menu_destroy(item);
1671 }
1672
1673 EAPI void
1674 elm_toolbar_item_tooltip_text_set(Elm_Toolbar_Item *item, const char *text)
1675 {
1676    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1677    elm_widget_item_tooltip_text_set(item, text);
1678 }
1679
1680 EAPI void
1681 elm_toolbar_item_tooltip_content_cb_set(Elm_Toolbar_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb)
1682 {
1683    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1684    elm_widget_item_tooltip_content_cb_set(item, func, data, del_cb);
1685 }
1686
1687 EAPI void
1688 elm_toolbar_item_tooltip_unset(Elm_Toolbar_Item *item)
1689 {
1690    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1691    elm_widget_item_tooltip_unset(item);
1692 }
1693
1694 EAPI void
1695 elm_toolbar_item_tooltip_style_set(Elm_Toolbar_Item *item, const char *style)
1696 {
1697    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1698    elm_widget_item_tooltip_style_set(item, style);
1699 }
1700
1701 EAPI const char *
1702 elm_toolbar_item_tooltip_style_get(const Elm_Toolbar_Item *item)
1703 {
1704    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1705    return elm_widget_item_tooltip_style_get(item);
1706 }
1707
1708 EAPI void
1709 elm_toolbar_item_cursor_set(Elm_Toolbar_Item *item, const char *cursor)
1710 {
1711    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1712    elm_widget_item_cursor_set(item, cursor);
1713 }
1714
1715 EAPI const char *
1716 elm_toolbar_item_cursor_get(const Elm_Toolbar_Item *item)
1717 {
1718    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1719    return elm_widget_item_cursor_get(item);
1720 }
1721
1722 EAPI void
1723 elm_toolbar_item_cursor_unset(Elm_Toolbar_Item *item)
1724 {
1725    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1726    elm_widget_item_cursor_unset(item);
1727 }
1728
1729 EAPI void
1730 elm_toolbar_item_cursor_style_set(Elm_Toolbar_Item *item, const char *style)
1731 {
1732    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1733    elm_widget_item_cursor_style_set(item, style);
1734 }
1735
1736 EAPI const char *
1737 elm_toolbar_item_cursor_style_get(const Elm_Toolbar_Item *item)
1738 {
1739    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1740    return elm_widget_item_cursor_style_get(item);
1741 }
1742
1743 EAPI void
1744 elm_toolbar_item_cursor_engine_only_set(Elm_Toolbar_Item *item, Eina_Bool engine_only)
1745 {
1746    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1747    elm_widget_item_cursor_engine_only_set(item, engine_only);
1748 }
1749
1750 EAPI Eina_Bool
1751 elm_toolbar_item_cursor_engine_only_get(const Elm_Toolbar_Item *item)
1752 {
1753    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, EINA_FALSE);
1754    return elm_widget_item_cursor_engine_only_get(item);
1755 }
1756
1757 EAPI Evas_Object *
1758 elm_toolbar_item_menu_get(Elm_Toolbar_Item *item)
1759 {
1760    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1761    Widget_Data *wd = elm_widget_data_get(item->base.widget);
1762    if (!wd) return NULL;
1763    /* FIXME: It's not ok. This function needs to be reviewed. And should
1764     * receive a const item */
1765    elm_toolbar_item_menu_set(item, 1);
1766    return item->o_menu;
1767 }
1768
1769 EAPI Elm_Toolbar_Item *
1770 elm_toolbar_item_find_by_label(const Evas_Object *obj, const char *label)
1771 {
1772    Elm_Toolbar_Item *it;
1773    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1774    Widget_Data *wd = elm_widget_data_get(obj);
1775
1776    if (!wd) return NULL;
1777    EINA_INLIST_FOREACH(wd->items, it)
1778      {
1779         if (!strcmp(it->label, label)) return it;
1780      }
1781
1782    return NULL;
1783 }
1784
1785 EAPI void
1786 elm_toolbar_item_data_set(Elm_Toolbar_Item *item, const void *data)
1787 {
1788    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item);
1789    elm_widget_item_data_set(item, data);
1790 }
1791
1792 EAPI void *
1793 elm_toolbar_item_data_get(const Elm_Toolbar_Item *item)
1794 {
1795    ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(item, NULL);
1796    return elm_widget_item_data_get(item);
1797 }
1798
1799 EAPI void
1800 elm_toolbar_always_select_mode_set(Evas_Object *obj, Eina_Bool always_select)
1801 {
1802    ELM_CHECK_WIDTYPE(obj, widtype);
1803    Widget_Data *wd = elm_widget_data_get(obj);
1804    if (!wd) return;
1805    if (always_select && (!wd->always_select) && wd->items)
1806      _item_select(ELM_TOOLBAR_ITEM_FROM_INLIST(wd->items));
1807    wd->always_select = always_select;
1808 }
1809
1810 EAPI Eina_Bool
1811 elm_toolbar_always_select_mode_get(const Evas_Object *obj)
1812 {
1813    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1814    Widget_Data *wd = elm_widget_data_get(obj);
1815    if (!wd) return EINA_FALSE;
1816    return wd->always_select;
1817 }
1818
1819 EAPI void
1820 elm_toolbar_no_select_mode_set(Evas_Object *obj, Eina_Bool no_select)
1821 {
1822    ELM_CHECK_WIDTYPE(obj, widtype);
1823    Widget_Data *wd = elm_widget_data_get(obj);
1824    if (!wd) return;
1825    wd->no_select = no_select;
1826 }
1827
1828 EAPI Eina_Bool
1829 elm_toolbar_no_select_mode_get(const Evas_Object *obj)
1830 {
1831    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1832    Widget_Data *wd = elm_widget_data_get(obj);
1833    if (!wd) return EINA_FALSE;
1834    return wd->no_select;
1835 }
1836
1837 EAPI void
1838 elm_toolbar_icon_order_lookup_set(Evas_Object *obj, Elm_Icon_Lookup_Order order)
1839 {
1840    ELM_CHECK_WIDTYPE(obj, widtype);
1841    Elm_Toolbar_Item *it;
1842    Widget_Data *wd = elm_widget_data_get(obj);
1843    if (!wd) return;
1844
1845    wd->lookup_order = order;
1846    EINA_INLIST_FOREACH(wd->items, it)
1847       elm_icon_order_lookup_set(it->icon, order);
1848    if (wd->more_item)
1849      elm_icon_order_lookup_set(wd->more_item->icon, order);
1850 }
1851
1852 EAPI Elm_Icon_Lookup_Order
1853 elm_toolbar_icon_order_lookup_get(const Evas_Object *obj)
1854 {
1855    ELM_CHECK_WIDTYPE(obj, widtype) ELM_ICON_LOOKUP_THEME_FDO;
1856    Widget_Data *wd = elm_widget_data_get(obj);
1857    if (!wd) return ELM_ICON_LOOKUP_THEME_FDO;
1858    return wd->lookup_order;
1859 }
1860
1861 EAPI void
1862 elm_toolbar_orientation_set(Evas_Object *obj, Eina_Bool vertical)
1863 {
1864    ELM_CHECK_WIDTYPE(obj, widtype);
1865    Widget_Data *wd = elm_widget_data_get(obj);
1866    if (!wd) return;
1867    wd->vertical = vertical;
1868    _sizing_eval(obj);
1869 }
1870
1871 EAPI Eina_Bool
1872 elm_toolbar_orientation_get(Evas_Object *obj)
1873 {
1874    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1875    Widget_Data *wd = elm_widget_data_get(obj);
1876    if (!wd) return EINA_FALSE;
1877    return wd->vertical;
1878 }