EFL migration revision 67547
[framework/uifw/elementary.git] / src / lib / elm_controlbar.c
1 #include <string.h>
2 #include <math.h>
3
4 #include <Elementary.h>
5 #include "elm_priv.h"
6
7 #ifndef EAPI
8 #define EAPI __attribute__ ((visibility("default")))
9 #endif
10
11 #define ELM_MAX(v1, v2)    (((v1) > (v2)) ? (v1) : (v2))
12 #define _EDJ(x) (Evas_Object *)elm_layout_edje_get(x)
13
14 #define TABBAR 0
15 #define TOOLBAR 1
16 #define OBJECT 2
17
18 typedef struct _Animation_Data Animation_Data;
19
20 struct _Animation_Data
21 {
22    Evas_Object * obj;
23    Evas_Coord fx;
24    Evas_Coord fy;
25    Evas_Coord fw;
26    Evas_Coord fh;
27    Evas_Coord tx;
28    Evas_Coord ty;
29    Evas_Coord tw;
30    Evas_Coord th;
31    double start_time;
32    double time;
33    void (*func) (void *data, Evas_Object * obj);
34    void *data;
35    Ecore_Animator * timer;
36 };
37
38 // internal data structure of controlbar object
39 typedef struct _Widget_Data Widget_Data;
40
41 struct _Widget_Data
42 {
43    Evas_Object * object;
44    Evas_Object * parent;
45    Evas_Object * view;
46    Evas_Object * edje;
47    Evas_Object * bg;
48    Evas_Object * box;
49
50    Elm_Controlbar_Item * more_item;
51    Elm_Controlbar_Item * pre_item;
52    Elm_Controlbar_Item * cur_item;
53    Evas_Coord x, y, w, h;
54    Eina_Bool disabled;
55    Eina_Bool vertical;
56    Eina_Bool auto_align;
57    int mode;
58    int alpha;
59    int num;
60    int animating;
61    Eina_List * items;
62    Eina_List * visible_items;
63
64    void (*ani_func) (void *data, Evas_Object * obj, void *event_info);
65    void *ani_data;
66    Ecore_Timer *effect_timer;
67    Eina_Bool selected_animation;
68    Animation_Data *ad;
69
70    const char *pressed_signal;
71    const char *selected_signal;
72
73    Ecore_Job *del_callback_job;
74 };
75
76 struct _Elm_Controlbar_Item
77 {
78    Widget_Data * wd;
79    Evas_Object * obj;
80    Evas_Object * base;
81    Evas_Object * base_item;
82    Evas_Object * view;
83    Evas_Object * icon;
84    const char *icon_path;
85    const char *text;
86    void (*func) (void *data, Evas_Object * obj, void *event_info);
87    void *data;
88    int order;
89    int sel;
90    int style;
91    Eina_Bool selected;
92    Eina_Bool disabled;
93 };
94
95 static const char *widtype = NULL;
96
97 static void _sizing_eval(Evas_Object * obj);
98 static int _check_bar_item_number(Widget_Data *wd);
99 static void _unpress_box_cb(void *data, Evas_Object *obj, void *event_info);
100 static void _clicked_box_cb(void *data, Evas_Object *obj, void *event_info);
101 static void _select_box(Elm_Controlbar_Item * it);
102 static void _cancel_selected_box(Widget_Data *wd);
103 static void _check_toolbar_line(Widget_Data *wd);
104 static Eina_Bool _press_box(Elm_Controlbar_Item * it);
105
106 static void
107 _controlbar_move(void *data, Evas_Object * obj __UNUSED__)
108 {
109    Widget_Data * wd;
110    Evas_Coord x, y, x_, y_, width;
111    if (!data) return;
112    wd = elm_widget_data_get((Evas_Object *) data);
113    if (!wd) return;
114    evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);
115    wd->x = x;
116    wd->y = y;
117    evas_object_move(wd->edje, x, y);
118    evas_object_geometry_get(elm_object_part_content_get(wd->edje, "bg_image"), NULL, NULL, &width, NULL);
119    evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
120 }
121
122 static void
123 _controlbar_resize(void *data, Evas_Object * obj __UNUSED__)
124 {
125    Widget_Data * wd;
126    Evas_Coord x, y, x_, y_, w, h, width, height;
127    if (!data) return;
128    wd = elm_widget_data_get((Evas_Object *) data);
129    if (!wd) return;
130    evas_object_geometry_get(wd->edje, &x, &y, &w, &h);
131    wd->w = w;
132    wd->h = h;
133    evas_object_resize(wd->edje, w, h);
134    evas_object_geometry_get(elm_object_part_content_get(wd->edje, "bg_image"), NULL, NULL, &width, &height);
135    evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
136 }
137
138 static void
139 _controlbar_object_move(void *data, Evas * e __UNUSED__, Evas_Object * obj,
140                         void *event_info __UNUSED__)
141 {
142    _controlbar_move(data, obj);
143 }
144
145 static void
146 _controlbar_object_resize(void *data, Evas * e __UNUSED__, Evas_Object * obj,
147                           void *event_info __UNUSED__)
148 {
149    _controlbar_resize(data, obj);
150 }
151
152 static void
153 _controlbar_object_show(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
154                         void *event_info __UNUSED__)
155 {
156    Widget_Data * wd;
157    if (!data) return;
158    wd = elm_widget_data_get((Evas_Object *) data);
159    if (!wd) return;
160    evas_object_show(wd->edje);
161    evas_object_show(wd->box);
162 }
163
164 static void
165 _controlbar_object_hide(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
166                         void *event_info __UNUSED__)
167 {
168    Widget_Data * wd;
169    if (!data) return;
170    wd = elm_widget_data_get((Evas_Object *) data);
171    if (!wd) return;
172    evas_object_hide(wd->edje);
173    evas_object_hide(wd->box);
174
175    _cancel_selected_box(wd);
176 }
177
178 static void
179 _item_del(Elm_Controlbar_Item *it)
180 {
181    if (!it) return;
182    Widget_Data *wd = elm_widget_data_get(it->obj);
183    if (!wd) return;
184
185    if (it->text)
186      eina_stringshare_del(it->text);
187    if (it->icon_path)
188      eina_stringshare_del(it->icon_path);
189    if (it->icon)
190      evas_object_del(it->icon);
191    if (it->base)
192      evas_object_del(it->base);
193    if (it->base_item)
194      {
195         evas_object_smart_callback_del(it->base_item, "unpressed", _unpress_box_cb);
196         evas_object_smart_callback_del(it->base_item, "clicked", _clicked_box_cb);
197         evas_object_del(it->base_item);
198      }
199    if (it->view)
200      evas_object_del(it->view);
201 }
202
203 static void
204 _del_hook(Evas_Object * obj)
205 {
206    Widget_Data * wd = elm_widget_data_get(obj);
207    Elm_Controlbar_Item * item;
208    if (!wd) return;
209
210    EINA_LIST_FREE(wd->items, item)
211      {
212         _item_del(item);
213         free(item);
214         item = NULL;
215      }
216    if (wd->bg)
217      {
218         evas_object_del(wd->bg);
219         wd->bg = NULL;
220      }
221    if (wd->box)
222      {
223         evas_object_del(wd->box);
224         wd->box = NULL;
225      }
226    if (wd->edje)
227      {
228         evas_object_del(wd->edje);
229         wd->edje = NULL;
230      }
231    if (wd->effect_timer)
232      {
233         ecore_timer_del(wd->effect_timer);
234         wd->effect_timer = NULL;
235      }
236    if (wd->ad)
237      {
238         if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
239         wd->ad->timer = NULL;
240         free(wd->ad);
241         wd->ad = NULL;
242      }
243    if (wd->del_callback_job)
244      {
245         if (wd->del_callback_job) ecore_job_del(wd->del_callback_job);
246         wd->del_callback_job = NULL;
247      }
248
249    free(wd);
250    wd = NULL;
251 }
252
253 static void
254 _theme_hook(Evas_Object * obj)
255 {
256    const Eina_List *l;
257
258    Elm_Controlbar_Item * item;
259    int r, g, b;
260
261    Widget_Data * wd = elm_widget_data_get(obj);
262    if (!wd) return;
263    elm_layout_theme_set(wd->edje, "controlbar", "base",
264                         elm_widget_style_get(obj));
265    elm_layout_theme_set(wd->bg, "controlbar", "background",
266                         elm_widget_style_get(obj));
267    evas_object_color_get(wd->bg, &r, &g, &b, NULL);
268    evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
269    EINA_LIST_FOREACH(wd->items, l, item)
270      {
271         elm_layout_theme_set(item->base, "controlbar", "item_bg", elm_widget_style_get(obj));
272         if (item->selected)
273           _select_box(item);
274      }
275    elm_controlbar_mode_set(obj, wd->mode);
276    _check_toolbar_line(wd);
277 }
278
279 static void
280 _disable_hook(Evas_Object * obj)
281 {
282    Widget_Data * wd = elm_widget_data_get(obj);
283    if (!wd) return;
284    const Eina_List *l;
285    Elm_Controlbar_Item * item;
286    Eina_Bool disabled;
287
288    wd->disabled = elm_widget_disabled_get(obj);
289
290    EINA_LIST_FOREACH(wd->items, l, item)
291      {
292         if (wd->disabled)
293           disabled = wd->disabled;
294         else
295           disabled = item->disabled;
296
297         if (item->base_item) elm_widget_disabled_set(item->base_item, disabled);
298      }
299 }
300
301 static void
302 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
303 {
304 }
305
306 static void
307 _sizing_eval(Evas_Object * obj)
308 {
309    Widget_Data * wd = elm_widget_data_get(obj);
310    if (!wd) return;
311    _controlbar_move(obj, obj);
312    _controlbar_resize(obj, obj);
313 }
314
315 static Eina_Bool
316 _move_evas_object(void *data)
317 {
318    const Evas_Object *bg_image;
319    double t = 0.0, vx = 0.0, vy = 0.0, vw = 0.0, vh = 0.0;
320    int dx = 0 , dy = 0, dw = 0, dh = 0;
321    int px = 0, py = 0, pw = 0, ph = 0;
322    int ox = 0, oy = 0, ow = 0, oh = 0;
323    int x = 0, y = 0, w = 0, h = 0;
324
325    Animation_Data * ad = (Animation_Data *) data;
326    bg_image = edje_object_part_object_get(_EDJ(ad->obj), "bg_image");
327    if (bg_image) evas_object_geometry_get(bg_image, &ox, &oy, &ow, &oh);
328    t = ELM_MAX(0.0, ecore_loop_time_get() - ad->start_time);
329    dx = ad->tx - ad->fx;
330    dy = ad->ty - ad->fy;
331    dw = ad->tw - ad->fw;
332    dh = ad->th - ad->fh;
333    if (t <= ad->time)
334      {
335         x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
336         y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
337         w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
338         h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
339      }
340    else
341      {
342         x = dx;
343         y = dy;
344         w = dw;
345         h = dh;
346      }
347    px = ad->fx + x;
348    py = ad->fy + y;
349    pw = ad->fw + w;
350    ph = ad->fh + h;
351
352    if ((ow - pw) == 0)
353      vx = 0;
354    else
355      vx = (double)(px - ox) / (double)(ow - pw);
356    if ((oh - ph) == 0)
357      vy = 0;
358    else
359      vy = (double)(py - oy) / (double)(oh - ph);
360    vw = (double)pw / (double)ow;
361    vh = (double)ph / (double)oh;
362
363    if ((x == dx) && (y == dy) && (w == dw) && (h == dh))
364      {
365         if (ad->timer) ecore_animator_del(ad->timer);
366         ad->timer = NULL;
367         edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
368         edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
369         if (ad->func != NULL)
370           ad->func(ad->data, ad->obj);
371         return ECORE_CALLBACK_CANCEL;
372      }
373    else
374      {
375         edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
376         edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
377      }
378    return ECORE_CALLBACK_RENEW;
379 }
380
381 static Animation_Data*
382 _move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
383                            Evas_Coord w, Evas_Coord h, Evas_Coord x_,
384                            Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
385                            double time, Eina_Bool (*mv_func) (void *data),
386                            void (*func) (void *data,
387                                          Evas_Object * obj), void *data)
388 {
389    Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
390    if (!ad) return NULL;
391    ad->obj = obj;
392    ad->fx = x;
393    ad->fy = y;
394    ad->fw = w;
395    ad->fh = h;
396    ad->tx = x_;
397    ad->ty = y_;
398    ad->tw = w_;
399    ad->th = h_;
400    ad->start_time = ecore_loop_time_get();
401    ad->time = time;
402    ad->func = func;
403    ad->data = data;
404    ad->timer = ecore_animator_add(mv_func, ad);
405
406    return ad;
407 }
408
409 static int
410 _sort_cb(const void *d1, const void *d2)
411 {
412    Elm_Controlbar_Item * item1, *item2;
413    item1 = (Elm_Controlbar_Item *) d1;
414    item2 = (Elm_Controlbar_Item *) d2;
415    if (item1->order <= 0) return 1;
416    if (item2->order <= 0) return -1;
417    return item1->order > item2->order ? 1 : -1;
418 }
419
420 static Eina_Bool
421 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
422 {
423    const Eina_List *l;
424    Elm_Controlbar_Item *it;
425
426    if (!wd) return EINA_FALSE;
427    if (!wd->items) return EINA_FALSE;
428
429    EINA_LIST_FOREACH(wd->items, l, it)
430      if (it == item) return EINA_TRUE;
431
432    return EINA_FALSE;
433 }
434
435 static void
436 _check_background(Widget_Data *wd)
437 {
438    if (!wd) return;
439    Eina_List *l;
440    Elm_Controlbar_Item *it;
441
442    EINA_LIST_FOREACH(wd->items, l, it)
443      {
444         if (it->style == TABBAR)
445           {
446              if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
447                edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
448              else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
449                edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
450              else
451                edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
452              return;
453           }
454      }
455    edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
456 }
457
458 static void
459 _check_toolbar_line(Widget_Data *wd)
460 {
461    if (!wd) return;
462    Eina_List *l;
463    Elm_Controlbar_Item *it, *it2;
464
465    EINA_LIST_FOREACH(wd->items, l, it)
466      {
467         it2 = elm_controlbar_item_prev(it);
468         if (!it2) continue;
469         if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
470
471         if (wd->vertical)
472           {
473              edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
474              edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
475
476              if ((it->icon || it->text) && (it2->icon || it2->text))
477                {
478                   edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
479                   edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
480                }
481              else
482                {
483                   edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
484                   edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
485                }
486           }
487         else
488           {
489              edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
490              edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
491
492              if ((it->icon || it->text) && (it2->icon || it2->text))
493                {
494                   edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
495                   edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
496                }
497              else
498                {
499                   edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
500                   edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
501                }
502           }
503      }
504 }
505
506 static int
507 _check_bar_item_number(Widget_Data *wd)
508 {
509    const Eina_List *l;
510    Elm_Controlbar_Item * item;
511    int num = 0;
512
513    EINA_LIST_FOREACH(wd->items, l, item)
514       if (item->order > 0) num++;
515
516    return num;
517 }
518
519 static void
520 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
521 {
522    const Eina_List *l;
523    Elm_Controlbar_Item * item;
524    Widget_Data * wd = elm_widget_data_get(it->obj);
525    if (!wd) return;
526    int check = 0;
527
528    if (order == 0) return;
529
530    EINA_LIST_FOREACH(wd->items, l, item)
531      {
532         if ((item->order == order) && (item != it))
533           check = 1;
534      }
535    if (check)
536      {
537         EINA_LIST_FOREACH(wd->items, l, item)
538           {
539              if (item->order > 0)
540                elm_table_unpack(wd->box, item->base);
541           }
542         EINA_LIST_FOREACH(wd->items, l, item)
543           {
544              if (item->order > 0)
545                {
546                   if (item->order >= order)
547                     item->order += 1;
548                   if (!wd->vertical)
549                     elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
550                   else
551                     elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
552                   evas_object_show(item->base);
553                }
554           }
555      }
556    it->order = order;
557    if (!wd->vertical)
558      elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
559    else
560      elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
561    evas_object_show(it->base);
562 }
563
564 static void
565 _delete_item_in_bar(Elm_Controlbar_Item * it)
566 {
567    const Eina_List *l;
568    Elm_Controlbar_Item * item;
569    Widget_Data * wd = elm_widget_data_get(it->obj);
570    if (!wd) return;
571    int i = 0;
572
573    EINA_LIST_FOREACH(wd->items, l, item)
574      {
575         if (item == it)
576           {
577              i = it->order;
578              it->order = 0;
579              elm_table_unpack(wd->box, it->base);
580              evas_object_hide(it->base);
581           }
582      }
583    if (i)
584      {
585         EINA_LIST_FOREACH(wd->items, l, item)
586           {
587              if (item->order > i)
588                {
589                   item->order--;
590                   elm_table_unpack(wd->box, item->base);
591                   if (!wd->vertical)
592                     elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
593                   else
594                     elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
595                }
596           }
597      }
598 }
599
600 static void
601 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
602 {
603    Elm_Controlbar_Item *item;
604    Eina_Bool check = EINA_TRUE;
605
606    if (!it) return;
607    if (it->obj == NULL) return;
608    Widget_Data * wd = elm_widget_data_get(it->obj);
609    if (!wd || !wd->items) return;
610    if (it->order <= 0) check = EINA_FALSE;
611    if (check == visible) return;
612    if (visible)
613      {
614         item = elm_controlbar_last_item_get(it->obj);
615         if (!item) return;
616         while (!elm_controlbar_item_visible_get(item)){
617              item = elm_controlbar_item_prev(item);
618         }
619         _insert_item_in_bar(it, item->order + 1);
620      }
621    else
622      {
623         _delete_item_in_bar(it);
624      }
625    wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
626    _sizing_eval(it->obj);
627 }
628
629 static Eina_Bool
630 _hide_selected_box(void *data)
631 {
632    Evas_Object *base = (Evas_Object *)data;
633
634    edje_object_part_drag_size_set(_EDJ(base), "elm.dragable.box", 0.0, 0.0);
635
636    return ECORE_CALLBACK_CANCEL;
637 }
638
639 static void
640 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
641 {
642    Widget_Data * wd = (Widget_Data *)data;
643
644    if (_check_item(wd, wd->cur_item))
645      {
646         edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
647      }
648
649    wd->animating--;
650    if (wd->animating < 0)
651      {
652         printf("animation error\n");
653         wd->animating = 0;
654      }
655
656    ecore_idler_add(_hide_selected_box, wd->edje);
657 }
658
659 static void
660 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
661 {
662    Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
663    Evas_Object *from, *to;
664
665    if ((fit->order <= 0) && (wd->auto_align))
666      fit = wd->more_item;
667
668    from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
669    evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
670
671    to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
672    evas_object_geometry_get(to, &tx, &ty, &tw, &th);
673
674    if (_check_item(wd, wd->pre_item))
675      {
676         edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
677      }
678    if (_check_item(wd, wd->cur_item))
679      edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
680
681    wd->animating++;
682    if (wd->ad)
683      {
684         if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
685         wd->ad->timer = NULL;
686         free(wd->ad);
687         wd->ad = NULL;
688      }
689    wd->ad = _move_object_with_animation(wd->edje, fx, fy, fw, fh, tx, ty, tw, th,
690                                         0.3, _move_evas_object, _end_selected_box, wd);
691 }
692
693 static void
694 _select_box(Elm_Controlbar_Item * it)
695 {
696    if (!it) return;
697    Widget_Data * wd = elm_widget_data_get(it->obj);
698    if (!wd) return;
699    const Eina_List *l;
700    Elm_Controlbar_Item * item, *fit = NULL;
701    Evas_Object * content;
702
703    if (wd->animating) return;
704
705    wd->cur_item = it;
706
707    if (it->style == TABBAR)
708      {
709         content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
710         if (content) evas_object_hide(content);
711
712         EINA_LIST_FOREACH(wd->items, l, item){
713              if (item->selected) {
714                   fit = item;
715                   wd->pre_item = fit;
716              }
717              item->selected = EINA_FALSE;
718         }
719         it->selected = EINA_TRUE;
720
721         if ((fit != NULL) && (fit != it))
722           {
723              _move_selected_box(wd, fit, it);
724           }
725         else
726           {
727              edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
728           }
729
730         if (fit != it)
731           {
732              if (wd->more_item != it)
733                evas_object_smart_callback_call(it->obj, "view,change,before", it);
734           }
735
736         elm_object_part_content_set(wd->edje, "elm.swallow.view", it->view);
737      }
738    else if (it->style == TOOLBAR)
739      {
740         edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
741         if (it->func)
742           it->func(it->data, it->obj, it);
743      }
744 }
745
746 static void
747 _cancel_selected_box(Widget_Data *wd)
748 {
749    const Eina_List *l;
750    Elm_Controlbar_Item * item;
751
752    EINA_LIST_FOREACH(wd->items, l, item)
753      {
754         if (item->style == TABBAR)
755           {
756              if (item->selected)
757                {
758                   edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
759                }
760              else
761                {
762                   edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
763                }
764           }
765         else if (item->style == TOOLBAR)
766           {
767              edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
768           }
769      }
770 }
771
772 static void
773 _del_button_callback(void *data)
774 {
775    Widget_Data *wd = (Widget_Data *)data;
776    if (!wd) return;
777    const Eina_List *l;
778    Elm_Controlbar_Item * it;
779
780    EINA_LIST_FOREACH(wd->items, l, it)
781      {
782         evas_object_smart_callback_del(it->base_item, "unpressed", _unpress_box_cb);
783         evas_object_smart_callback_del(it->base_item, "clicked", _clicked_box_cb);
784      }
785
786    wd->del_callback_job = NULL;
787 }
788
789 static void
790 _unpress_box_cb(void *data, Evas_Object *obj, void *event_info)
791 {
792    Widget_Data * wd = (Widget_Data *) data;
793    if (!wd) return;
794    const Eina_List *l;
795    Elm_Controlbar_Item * it;
796
797    EINA_LIST_FOREACH(wd->items, l, it)
798      {
799         if (it->base_item == obj) break;
800      }
801    if (it)
802      {
803         if (wd->del_callback_job) ecore_job_del(wd->del_callback_job);
804         wd->del_callback_job = ecore_job_add(_del_button_callback, wd);
805      }
806
807    _cancel_selected_box(wd);
808 }
809
810 static void
811 _clicked_box_cb(void *data, Evas_Object *obj, void *event_info)
812 {
813    Widget_Data * wd = (Widget_Data *) data;
814    if (!wd) return;
815    const Eina_List *l;
816    Elm_Controlbar_Item * it;
817
818    EINA_LIST_FOREACH(wd->items, l, it)
819      {
820         if (it->base_item == obj) break;
821      }
822    if (it)
823      {
824         if (wd->del_callback_job) ecore_job_del(wd->del_callback_job);
825         wd->del_callback_job = ecore_job_add(_del_button_callback, wd);
826         _select_box(it);
827      }
828 }
829
830 static Eina_Bool
831 _press_box(Elm_Controlbar_Item * it)
832 {
833    Widget_Data * wd = elm_widget_data_get(it->obj);
834    if (!wd) return EINA_FALSE;
835    int check = 0;
836    const Eina_List *l;
837    Elm_Controlbar_Item * item;
838
839    if (wd->animating) return EINA_FALSE;
840
841    if (wd->disabled || it->disabled) return EINA_FALSE;
842
843    EINA_LIST_FOREACH(wd->items, l, item)
844      {
845         if (it == item)
846           {
847              if (it->style == TABBAR)
848                {
849                   edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
850                }
851              else if (it->style == TOOLBAR)
852                {
853                   edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
854                }
855              evas_object_smart_callback_add(it->base_item, "unpressed", _unpress_box_cb, wd);
856              evas_object_smart_callback_add(it->base_item, "clicked", _clicked_box_cb, wd);
857
858              check = EINA_TRUE;
859           }
860      }
861    if (!check)
862      return EINA_FALSE;
863
864    wd->pre_item = it;
865
866    return EINA_TRUE;
867 }
868
869 static Evas_Object *
870 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
871 {
872
873    Evas_Object *icon;
874    icon = elm_icon_add(obj);
875
876    if (it->wd->more_item == it)
877      elm_icon_standard_set(icon, it->icon_path);
878    else
879      elm_icon_file_set(icon, it->icon_path, NULL);
880
881    evas_object_size_hint_min_set(icon, 40, 40);
882    evas_object_size_hint_max_set(icon, 100, 100);
883    evas_object_show(icon);
884    if (obj && part)
885      elm_object_content_set(obj, icon);
886
887    return icon;
888 }
889
890 static Evas_Object *
891 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
892 {
893
894    Evas_Object * obj;
895    obj = elm_layout_add(parent);
896    if (obj == NULL)
897      {
898         fprintf(stderr, "Cannot load bg edj\n");
899         return NULL;
900      }
901    elm_layout_theme_set(obj, "controlbar", "item_bg",
902                         elm_widget_style_get(it->obj));
903    evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
904    evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
905
906    *item = elm_button_add(parent);
907    if (*item == NULL) return NULL;
908    elm_object_style_set(*item, "controlbar/vertical");
909    elm_object_part_content_set(obj, "item", *item);
910
911    if (it->text)
912      elm_object_text_set(*item, it->text);
913    if (it->icon_path)
914      *icon = _create_item_icon(*item, it, "elm.swallow.icon");
915
916    return obj;
917 }
918
919 static void
920 _bar_item_down_cb(void *data, Evas_Object * obj, void *event_info __UNUSED__)
921 {
922    Widget_Data * wd = (Widget_Data *) data;
923    const Eina_List *l;
924    Elm_Controlbar_Item * item;
925    if (wd->animating) return;
926
927    EINA_LIST_FOREACH(wd->items, l, item)
928       if (item->base_item == obj) break;
929
930    if (item == NULL) return;
931
932    _press_box(item);
933 }
934
935 static Elm_Controlbar_Item *
936 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
937                 Evas_Object * view)
938 {
939    Elm_Controlbar_Item * it;
940    Widget_Data * wd;
941    if (obj == NULL)
942      {
943         fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
944         return NULL;
945      }
946    wd = elm_widget_data_get(obj);
947    if (!wd)
948      {
949         fprintf(stderr, "Cannot get smart data\n");
950         return NULL;
951      }
952    it = ELM_NEW(Elm_Controlbar_Item);
953    if (!it) return NULL;
954    it->wd = wd;
955    it->obj = obj;
956    it->text = eina_stringshare_add(label);
957    it->icon_path = eina_stringshare_add(icon_path);
958    it->selected = EINA_FALSE;
959    it->sel = 1;
960    it->view = view;
961    it->style = TABBAR;
962    it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
963    evas_object_smart_callback_add(it->base_item, "pressed",
964                                   _bar_item_down_cb, wd);
965    evas_object_show(it->base);
966
967    return it;
968 }
969
970 static Elm_Controlbar_Item *
971 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
972                  void (*func) (void *data, Evas_Object * obj,
973                                void *event_info), void *data)
974 {
975
976    Elm_Controlbar_Item * it;
977    Widget_Data * wd;
978    if (obj == NULL)
979      {
980         fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
981         return NULL;
982      }
983    wd = elm_widget_data_get(obj);
984    if (!wd)
985      {
986         fprintf(stderr, "Cannot get smart data\n");
987         return NULL;
988      }
989    it = ELM_NEW(Elm_Controlbar_Item);
990    if (!it)
991      return NULL;
992    it->wd = wd;
993    it->obj = obj;
994    it->text = eina_stringshare_add(label);
995    it->icon_path = eina_stringshare_add(icon_path);
996    it->selected = EINA_FALSE;
997    it->sel = 1;
998    it->func = func;
999    it->data = data;
1000    it->style = TOOLBAR;
1001    it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1002    evas_object_smart_callback_add(it->base_item, "pressed",
1003                                   _bar_item_down_cb, wd);
1004    evas_object_show(it->base);
1005
1006    return it;
1007 }
1008
1009 static Elm_Controlbar_Item *
1010 _create_object_item(Evas_Object *obj, Evas_Object *obj_item, const int sel)
1011 {
1012    Elm_Controlbar_Item *it;
1013    Widget_Data * wd;
1014    if (obj == NULL)
1015      {
1016         fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1017         return NULL;
1018      }
1019    wd = elm_widget_data_get(obj);
1020    if (!wd)
1021      {
1022         fprintf(stderr, "Cannot get smart data\n");
1023         return NULL;
1024      }
1025    it = ELM_NEW(Elm_Controlbar_Item);
1026    if (!it)
1027      return NULL;
1028    it->wd = wd;
1029    it->obj = obj;
1030    it->sel = sel;
1031    it->style = OBJECT;
1032    it->base = elm_layout_add(wd->edje);
1033    elm_layout_theme_set(it->base, "controlbar", "item_bg",
1034                         elm_widget_style_get(it->obj));
1035    evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1036    evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1037    it->base_item = obj_item;
1038    elm_object_part_content_set(it->base, "item", it->base_item);
1039    evas_object_show(it->base);
1040    return it;
1041 }
1042
1043 static void
1044 _repack_items(Widget_Data *wd)
1045 {
1046    const Eina_List *l;
1047    Elm_Controlbar_Item * item;
1048
1049    EINA_LIST_FOREACH(wd->items, l, item)
1050      {
1051         if (item->order > 0)
1052           {
1053              elm_table_unpack(wd->box, item->base);
1054              if (!wd->vertical)
1055                elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1056              else
1057                elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1058           }
1059      }
1060 }
1061
1062 static void
1063 _set_items_position(Evas_Object *obj, Elm_Controlbar_Item *it,
1064                     Elm_Controlbar_Item *mit, Eina_Bool bar)
1065 {
1066    Widget_Data * wd;
1067    const Eina_List *l;
1068    Elm_Controlbar_Item * item;
1069    int check = EINA_FALSE;
1070    int order = 1;
1071
1072    if (obj == NULL)
1073      {
1074         fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1075         return;
1076      }
1077    wd = elm_widget_data_get(obj);
1078    if (!wd)
1079      {
1080         fprintf(stderr, "Cannot get smart data\n");
1081         return;
1082      }
1083
1084    EINA_LIST_FOREACH(wd->items, l, item)
1085      {
1086         if ((item == mit) && (item->order > 0))
1087           {
1088              check = EINA_TRUE;
1089              it->order = mit->order;
1090           }
1091         if (check)
1092           {
1093              if (item->order > 0)
1094                {
1095                   elm_table_unpack(wd->box, item->base);
1096                   item->order += it->sel;
1097                   if (!wd->vertical)
1098                     elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1099                   else
1100                     elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1101                }
1102           }
1103         if (item->order > 0) order += item->sel;
1104      }
1105    if (!check)
1106      {
1107         if (bar)
1108           it->order = order;
1109         else
1110           it->order = 0;
1111      }
1112    wd->num++;
1113
1114    if (bar)
1115      {
1116         if (!wd->vertical)
1117           elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1118         else
1119           elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1120      }
1121    else
1122      evas_object_hide(it->base);
1123 }
1124
1125 static void
1126 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1127 {
1128    Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1129    Elm_Controlbar_Item *it;
1130    const Eina_List *l;
1131    Widget_Data *wd;
1132    Evas_Object *content;
1133    Elm_Object_Item *lit = (Elm_Object_Item *) elm_list_selected_item_get(obj);
1134    if (!lit) return;
1135
1136    elm_list_item_selected_set(lit, 0);
1137
1138    if (!item) return;
1139
1140    wd = elm_widget_data_get(item->obj);
1141    if (!wd) return;
1142
1143    EINA_LIST_FOREACH(wd->items, l, it)
1144      {
1145         it->selected = EINA_FALSE;
1146      }
1147
1148    if (item->style == TABBAR)
1149      {
1150         content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
1151         evas_object_hide(content);
1152         item->selected = EINA_TRUE;
1153         evas_object_smart_callback_call(item->obj, "view,change,before", item);
1154         elm_object_part_content_set(wd->edje, "elm.swallow.view", item->view);
1155      }
1156
1157    if ((item->style == TOOLBAR) && (item->func))
1158      item->func(item->data, item->obj, item);
1159 }
1160
1161 static Evas_Object *
1162 _create_more_view(Widget_Data *wd)
1163 {
1164    Evas_Object *list;
1165    Elm_Controlbar_Item *item;
1166    const Eina_List *l;
1167    Evas_Object *icon;
1168
1169    list = elm_list_add( wd->object );
1170    elm_list_mode_set( list, ELM_LIST_COMPRESS );
1171
1172    EINA_LIST_FOREACH(wd->items, l, item)
1173      {
1174         if (item->order <= 0)
1175           {
1176              icon = NULL;
1177              if (item->icon_path)
1178                {
1179                   icon = _create_item_icon(list, item, NULL);
1180                   evas_object_color_set(icon, 0, 0, 0, 255);
1181                }
1182              elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1183           }
1184      }
1185
1186    elm_list_go( list );
1187
1188    return list;
1189 }
1190
1191 static void
1192 _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1193 {
1194    Elm_Controlbar_Item *it;
1195    const Eina_List *l;
1196    Evas_Object *ctxpopup = obj;
1197    const char *label;
1198    Widget_Data *wd = (Widget_Data *)data;
1199
1200    EINA_LIST_FOREACH(wd->items, l, it)
1201      {
1202         label = elm_ctxpopup_item_label_get((Elm_Object_Item *) event_info);
1203         if ((label) && (!strcmp(it->text, label))) break;
1204      }
1205
1206    if (it->func)
1207      it->func(it->data, it->obj, it);
1208
1209    if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1210
1211    evas_object_del(ctxpopup);
1212    ctxpopup = NULL;
1213 }
1214
1215 static void
1216 _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1217 {
1218    Evas_Object *ctxpopup = obj;
1219
1220    evas_object_del(ctxpopup);
1221    ctxpopup = NULL;
1222 }
1223
1224 static void
1225 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1226 {
1227    Evas_Object *ctxpopup;
1228    Elm_Controlbar_Item *item;
1229    const Eina_List *l;
1230    Evas_Object *icon;
1231    Evas_Coord x, y, w, h;
1232    Widget_Data *wd = elm_widget_data_get(obj);
1233    if (!wd) return;
1234
1235    ctxpopup = elm_ctxpopup_add(wd->parent);
1236    evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1237
1238    EINA_LIST_FOREACH(wd->items, l, item)
1239      {
1240         if (item->order <= 0)
1241           {
1242              icon = NULL;
1243              if (item->icon_path)
1244                {
1245                   icon = _create_item_icon(ctxpopup, item, NULL);
1246                   evas_object_color_set(icon, 0, 0, 0, 255);
1247                }
1248              elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1249           }
1250      }
1251
1252    evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1253    evas_object_move(ctxpopup, x + w/2, y + h/2);
1254
1255    evas_object_show(ctxpopup);
1256 }
1257
1258 static Elm_Controlbar_Item *
1259 _create_more_item(Widget_Data *wd, int style)
1260 {
1261    Elm_Controlbar_Item * it;
1262
1263    it = ELM_NEW(Elm_Controlbar_Item);
1264    if (!it) return NULL;
1265    wd->more_item = it;
1266    it->obj = wd->object;
1267    it->text = eina_stringshare_add("more");
1268    it->icon_path = eina_stringshare_add("controlbar_more");
1269    it->selected = EINA_FALSE;
1270    it->sel = 1;
1271    it->view = _create_more_view(wd);
1272    it->func = _create_more_func;
1273    it->style = style;
1274    it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1275    evas_object_smart_callback_add(it->base_item, "pressed",
1276                                   _bar_item_down_cb, wd);
1277    evas_object_show(it->base);
1278
1279    _set_items_position(it->obj, it, NULL, EINA_TRUE);
1280    wd->items = eina_list_append(wd->items, it);
1281    wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1282
1283    return it;
1284 }
1285
1286 EAPI Evas_Object *
1287 elm_controlbar_add(Evas_Object *parent)
1288 {
1289    if (parent == NULL) return NULL;
1290    Evas_Object * obj = NULL;
1291    Evas_Object * bg = NULL;
1292    Widget_Data * wd = NULL;
1293    Evas_Coord x, y, w, h;
1294    Evas *e;
1295    ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
1296    ELM_SET_WIDTYPE(widtype, "controlbar");
1297    elm_widget_type_set(obj, "controlbar");
1298    elm_widget_sub_object_add(parent, obj);
1299    elm_widget_data_set(obj, wd);
1300    elm_widget_del_hook_set(obj, _del_hook);
1301    elm_widget_can_focus_set(obj, EINA_FALSE);
1302    elm_widget_theme_hook_set(obj, _theme_hook);
1303    elm_widget_disable_hook_set(obj, _disable_hook);
1304
1305    // initialization
1306    wd->parent = parent;
1307    evas_object_geometry_get(parent, &x, &y, &w, &h);
1308    wd->object = obj;
1309    wd->x = x;
1310    wd->y = y;
1311    wd->w = w;
1312    wd->h = h;
1313    wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1314    wd->alpha = 100;
1315    wd->num = 0;
1316    wd->animating = 0;
1317    wd->vertical = EINA_FALSE;
1318    wd->auto_align = EINA_FALSE;
1319    wd->selected_animation = EINA_FALSE;
1320    wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1321    wd->selected_signal = eina_stringshare_add("elm,state,selected");
1322
1323    /* load background edj */
1324    wd->edje = elm_layout_add(obj);
1325    elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1326    if (wd->edje == NULL)
1327      {
1328         printf("Cannot load base edj\n");
1329         return NULL;
1330      }
1331    evas_object_show(wd->edje);
1332
1333    wd->bg = elm_layout_add(wd->edje);
1334    elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1335    if (wd->bg == NULL)
1336      {
1337         printf("Cannot load bg edj\n");
1338         return NULL;
1339      }
1340    elm_object_part_content_set(wd->edje, "bg_image", wd->bg);
1341
1342    // initialization
1343    evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1344                                   _controlbar_object_resize, obj);
1345    evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1346                                   _controlbar_object_move, obj);
1347    evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1348                                   _controlbar_object_show, obj);
1349    evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1350                                   _controlbar_object_hide, obj);
1351
1352    bg = elm_object_part_content_get(wd->edje, "bg_image");
1353    evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1354    evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1355
1356    // items container
1357    wd->box = elm_table_add(wd->edje);
1358    elm_table_homogeneous_set(wd->box, EINA_TRUE);
1359    evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1360                                     EVAS_HINT_EXPAND);
1361    evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1362    elm_object_part_content_set(wd->edje, "elm.swallow.items", wd->box);
1363    evas_object_show(wd->box);
1364
1365    evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1366
1367    elm_widget_resize_object_set(obj, wd->edje);
1368
1369    _sizing_eval(obj);
1370
1371    return obj;
1372 }
1373
1374 EAPI Elm_Controlbar_Item *
1375 elm_controlbar_tab_item_append(Evas_Object *obj, const char *icon_path,
1376                                const char *label, Evas_Object *view)
1377 {
1378    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1379    Elm_Controlbar_Item * it;
1380    Elm_Controlbar_Item * lit;
1381    Widget_Data * wd;
1382    it = _create_tab_item(obj, icon_path, label, view);
1383    if (!it) return NULL;
1384    wd = elm_widget_data_get(obj);
1385    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1386      {
1387         if (!wd->more_item) {
1388              lit = elm_controlbar_last_item_get(obj);
1389              _set_item_visible(lit, EINA_FALSE);
1390              _create_more_item(wd, TABBAR);
1391         }
1392         _set_items_position(obj, it, NULL, EINA_FALSE);
1393      }
1394    else
1395      {
1396         _set_items_position(obj, it, NULL, EINA_TRUE);
1397      }
1398    wd->items = eina_list_append(wd->items, it);
1399    if (wd->more_item)
1400      elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1401
1402    _check_background(wd);
1403    _sizing_eval(obj);
1404    return it;
1405 }
1406
1407 EAPI Elm_Controlbar_Item *
1408 elm_controlbar_tab_item_prepend(Evas_Object *obj, const char *icon_path,
1409                                 const char *label, Evas_Object *view)
1410 {
1411    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1412    Widget_Data * wd;
1413    Elm_Controlbar_Item * it;
1414    Elm_Controlbar_Item * lit;
1415    Elm_Controlbar_Item * item;
1416    it = _create_tab_item(obj, icon_path, label, view);
1417    if (!it) return NULL;
1418    wd = elm_widget_data_get(obj);
1419    item = eina_list_data_get(wd->items);
1420    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1421      {
1422         if (!wd->more_item)
1423           {
1424              lit = elm_controlbar_last_item_get(obj);
1425              _set_item_visible(lit, EINA_FALSE);
1426              _create_more_item(wd, TABBAR);
1427           }
1428         lit = elm_controlbar_item_prev(wd->more_item);
1429         _set_item_visible(lit, EINA_FALSE);
1430         _set_items_position(obj, it, item, EINA_TRUE);
1431      }
1432    else
1433      {
1434         _set_items_position(obj, it, item, EINA_TRUE);
1435      }
1436    wd->items = eina_list_prepend(wd->items, it);
1437    if (wd->more_item)
1438      elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1439
1440    _check_background(wd);
1441    _sizing_eval(obj);
1442    return it;
1443 }
1444
1445 EAPI Elm_Controlbar_Item *
1446 elm_controlbar_tab_item_insert_before(Evas_Object *obj,
1447                                       Elm_Controlbar_Item *before,
1448                                       const char *icon_path,
1449                                       const char *label, Evas_Object *view)
1450 {
1451    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1452    Widget_Data * wd;
1453    Elm_Controlbar_Item * it;
1454    Elm_Controlbar_Item * lit;
1455    if (!before) return NULL;
1456    it = _create_tab_item(obj, icon_path, label, view);
1457    if (!it) return NULL;
1458    wd = elm_widget_data_get(obj);
1459    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1460      {
1461         if (!wd->more_item)
1462           {
1463              lit = elm_controlbar_last_item_get(obj);
1464              _set_item_visible(lit, EINA_FALSE);
1465              _create_more_item(wd, TABBAR);
1466           }
1467         before = wd->more_item;
1468         if (before->order > 0)
1469           {
1470              lit = elm_controlbar_item_prev(wd->more_item);
1471              _set_item_visible(lit, EINA_FALSE);
1472              _set_items_position(obj, it, before, EINA_TRUE);
1473           }
1474         else
1475           {
1476              _set_items_position(obj, it, before, EINA_FALSE);
1477           }
1478      }
1479    else
1480      {
1481         _set_items_position(obj, it, before, EINA_TRUE);
1482      }
1483    wd->items = eina_list_prepend_relative(wd->items, it, before);
1484    if (wd->more_item)
1485      elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1486
1487    _check_background(wd);
1488    _sizing_eval(obj);
1489    return it;
1490 }
1491
1492 EAPI Elm_Controlbar_Item *
1493 elm_controlbar_tab_item_insert_after(Evas_Object *obj,
1494                                      Elm_Controlbar_Item *after,
1495                                      const char *icon_path, const char *label,
1496                                      Evas_Object * view)
1497 {
1498    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1499    Widget_Data * wd;
1500    Elm_Controlbar_Item * it;
1501    Elm_Controlbar_Item * lit;
1502    Elm_Controlbar_Item * item;
1503    if (!after) return NULL;
1504    it = _create_tab_item(obj, icon_path, label, view);
1505    if (!it) return NULL;
1506    wd = elm_widget_data_get(obj);
1507    item = elm_controlbar_item_next(after);
1508    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1509      {
1510         if (!wd->more_item)
1511           {
1512              lit = elm_controlbar_last_item_get(obj);
1513              _set_item_visible(lit, EINA_FALSE);
1514              _create_more_item(wd, TABBAR);
1515           }
1516         lit = elm_controlbar_item_prev(wd->more_item);
1517         if ((lit != after) && (item->order > 0))
1518           {
1519              _set_item_visible(lit, EINA_FALSE);
1520              _set_items_position(obj, it, item, EINA_TRUE);
1521           }
1522         else
1523           {
1524              _set_items_position(obj, it, NULL, EINA_FALSE);
1525           }
1526      }
1527    else
1528      {
1529         _set_items_position(obj, it, item, EINA_TRUE);
1530      }
1531    wd->items = eina_list_append_relative(wd->items, it, after);
1532    if (wd->more_item)
1533      elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1534
1535    _check_background(wd);
1536    _sizing_eval(obj);
1537    return it;
1538 }
1539
1540 EAPI Elm_Controlbar_Item *
1541 elm_controlbar_tool_item_append(Evas_Object *obj, const char *icon_path,
1542                                 const char *label,
1543                                 void (*func)(void *data, Evas_Object * obj, void *event_info),
1544                                 void *data)
1545
1546 {
1547    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1548    Elm_Controlbar_Item * it;
1549    Elm_Controlbar_Item * lit;
1550    Widget_Data * wd;
1551    it = _create_tool_item(obj, icon_path, label, func, data);
1552    if (!it) return NULL;
1553    wd = elm_widget_data_get(obj);
1554    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1555      {
1556         if (!wd->more_item)
1557           {
1558              lit = elm_controlbar_last_item_get(obj);
1559              _set_item_visible(lit, EINA_FALSE);
1560              _create_more_item(wd, TOOLBAR);
1561           }
1562         _set_items_position(obj, it, NULL, EINA_FALSE);
1563      }
1564    else
1565      {
1566         _set_items_position(obj, it, NULL, EINA_TRUE);
1567      }
1568    wd->items = eina_list_append(wd->items, it);
1569    _check_toolbar_line(wd);
1570    _sizing_eval(obj);
1571    return it;
1572 }
1573
1574 EAPI Elm_Controlbar_Item *
1575 elm_controlbar_tool_item_prepend(Evas_Object *obj, const char *icon_path,
1576                                  const char *label,
1577                                  void (*func) (void *data, Evas_Object *obj, void *event_info),
1578                                  void *data)
1579 {
1580    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1581    Widget_Data * wd;
1582    Elm_Controlbar_Item * it;
1583    Elm_Controlbar_Item * lit;
1584    Elm_Controlbar_Item * item;
1585    it = _create_tool_item(obj, icon_path, label, func, data);
1586    if (!it) return NULL;
1587    wd = elm_widget_data_get(obj);
1588    item = eina_list_data_get(wd->items);
1589    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1590      {
1591         if (!wd->more_item)
1592           {
1593              lit = elm_controlbar_last_item_get(obj);
1594              _set_item_visible(lit, EINA_FALSE);
1595              _create_more_item(wd, TOOLBAR);
1596           }
1597         lit = elm_controlbar_item_prev(wd->more_item);
1598         _set_item_visible(lit, EINA_FALSE);
1599         _set_items_position(obj, it, item, EINA_TRUE);
1600      }
1601    else
1602      {
1603         _set_items_position(obj, it, item, EINA_TRUE);
1604      }
1605    wd->items = eina_list_prepend(wd->items, it);
1606    _check_toolbar_line(wd);
1607    _sizing_eval(obj);
1608    return it;
1609 }
1610
1611 EAPI Elm_Controlbar_Item *
1612 elm_controlbar_tool_item_insert_before(Evas_Object *obj,
1613                                        Elm_Controlbar_Item *before,
1614                                        const char *icon_path,
1615                                        const char *label,
1616                                        void (*func)(void *data, Evas_Object *obj, void *event_info),
1617                                        void *data)
1618 {
1619    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1620    Widget_Data * wd;
1621    Elm_Controlbar_Item * it;
1622    Elm_Controlbar_Item * lit;
1623    if (!before) return NULL;
1624    it = _create_tool_item(obj, icon_path, label, func, data);
1625    if (!it) return NULL;
1626    wd = elm_widget_data_get(obj);
1627    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1628      {
1629         if (!wd->more_item)
1630           {
1631              lit = elm_controlbar_last_item_get(obj);
1632              _set_item_visible(lit, EINA_FALSE);
1633              _create_more_item(wd, TOOLBAR);
1634           }
1635         before = wd->more_item;
1636         if (before->order > 0)
1637           {
1638              lit = elm_controlbar_item_prev(wd->more_item);
1639              _set_item_visible(lit, EINA_FALSE);
1640              _set_items_position(obj, it, before, EINA_TRUE);
1641           }
1642         else
1643           {
1644              _set_items_position(obj, it, before, EINA_FALSE);
1645           }
1646      }
1647    else
1648      {
1649         _set_items_position(obj, it, before, EINA_TRUE);
1650      }
1651    wd->items = eina_list_prepend_relative(wd->items, it, before);
1652    _check_toolbar_line(wd);
1653    _sizing_eval(obj);
1654    return it;
1655 }
1656
1657 EAPI Elm_Controlbar_Item *
1658 elm_controlbar_tool_item_insert_after(Evas_Object *obj,
1659                                       Elm_Controlbar_Item *after,
1660                                       const char *icon_path,
1661                                       const char *label,
1662                                       void (*func) (void *data, Evas_Object *obj, void *event_info),
1663                                       void *data)
1664 {
1665    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1666    Widget_Data * wd;
1667    Elm_Controlbar_Item * it;
1668    Elm_Controlbar_Item * lit;
1669    Elm_Controlbar_Item * item;
1670    if (!after) return NULL;
1671    it = _create_tool_item(obj, icon_path, label, func, data);
1672    if (!it) return NULL;
1673    wd = elm_widget_data_get(obj);
1674    item = elm_controlbar_item_next(after);
1675    if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1676      {
1677         if (!wd->more_item)
1678           {
1679              lit = elm_controlbar_last_item_get(obj);
1680              _set_item_visible(lit, EINA_FALSE);
1681              _create_more_item(wd, TOOLBAR);
1682           }
1683         lit = elm_controlbar_item_prev(wd->more_item);
1684         if ((lit != after) && (item->order > 0))
1685           {
1686              _set_item_visible(lit, EINA_FALSE);
1687              _set_items_position(obj, it, item, EINA_TRUE);
1688           }
1689         else
1690           {
1691              _set_items_position(obj, it, NULL, EINA_FALSE);
1692           }
1693      }
1694    else
1695      {
1696         _set_items_position(obj, it, item, EINA_TRUE);
1697      }
1698    wd->items = eina_list_append_relative(wd->items, it, after);
1699    _check_toolbar_line(wd);
1700    _sizing_eval(obj);
1701    return it;
1702 }
1703
1704 EAPI Elm_Controlbar_Item *
1705 elm_controlbar_object_item_append(Evas_Object *obj, Evas_Object *obj_item,
1706                                   const int sel)
1707 {
1708    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1709    Widget_Data * wd;
1710    Elm_Controlbar_Item * it;
1711    wd = elm_widget_data_get(obj);
1712    if (!wd) return NULL;
1713    it = _create_object_item(obj, obj_item, sel);
1714    if (!it) return NULL;
1715    _set_items_position(obj, it, NULL, EINA_TRUE);
1716    wd->items = eina_list_append(wd->items, it);
1717    _sizing_eval(obj);
1718    return it;
1719 }
1720
1721 EAPI Elm_Controlbar_Item *
1722 elm_controlbar_object_item_prepend(Evas_Object *obj, Evas_Object *obj_item,
1723                                    const int sel)
1724 {
1725    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1726    Widget_Data * wd;
1727    Elm_Controlbar_Item * it;
1728    Elm_Controlbar_Item * item;
1729    wd = elm_widget_data_get(obj);
1730    if (!wd) return NULL;
1731    it = _create_object_item(obj, obj_item, sel);
1732    if (!it) return NULL;
1733    item = eina_list_data_get(wd->items);
1734    _set_items_position(obj, it, item, EINA_TRUE);
1735    wd->items = eina_list_prepend(wd->items, it);
1736    _sizing_eval(obj);
1737    return it;
1738 }
1739
1740 EAPI Elm_Controlbar_Item *
1741 elm_controlbar_object_item_insert_before(Evas_Object *obj,
1742                                          Elm_Controlbar_Item *before,
1743                                          Evas_Object *obj_item, const int sel)
1744 {
1745    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1746    Widget_Data * wd;
1747    Elm_Controlbar_Item * it;
1748    wd = elm_widget_data_get(obj);
1749    if (!wd) return NULL;
1750    if (!before) return NULL;
1751    it = _create_object_item(obj, obj_item, sel);
1752    if (!it) return NULL;
1753    _set_items_position(obj, it, before, EINA_TRUE);
1754    wd->items = eina_list_prepend_relative(wd->items, it, before);
1755    _sizing_eval(obj);
1756    return it;
1757 }
1758
1759 EAPI Elm_Controlbar_Item *
1760 elm_controlbar_object_item_insert_after(Evas_Object *obj,
1761                                         Elm_Controlbar_Item *after,
1762                                         Evas_Object *obj_item, const int sel)
1763 {
1764    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1765    Widget_Data *wd;
1766    Elm_Controlbar_Item *it;
1767    Elm_Controlbar_Item *item;
1768    wd = elm_widget_data_get(obj);
1769    if (!wd) return NULL;
1770    if (!after) return NULL;
1771    it = _create_object_item(obj, obj_item, sel);
1772    if (!it) return NULL;
1773    item = elm_controlbar_item_next(after);
1774    _set_items_position(obj, it, item, EINA_TRUE);
1775    wd->items = eina_list_append_relative(wd->items, it, after);
1776    _sizing_eval(obj);
1777    return it;
1778 }
1779
1780 EAPI Evas_Object *
1781 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item *it)
1782 {
1783    if (!it) return NULL;
1784    if (it->style != OBJECT) return NULL;
1785    if (!it->base_item) return NULL;
1786    return it->base_item;
1787 }
1788
1789 EAPI void
1790 elm_controlbar_item_del(Elm_Controlbar_Item *it)
1791 {
1792    Evas_Object *obj;
1793    Widget_Data *wd;
1794    const Eina_List *l;
1795
1796    Elm_Controlbar_Item *item;
1797
1798    int sel = 1;
1799
1800    if (!it) return;
1801
1802    obj = it->obj;
1803    if (it->obj == NULL)
1804      {
1805         printf("Invalid argument: controlbar object is NULL\n");
1806         return;
1807      }
1808    wd = elm_widget_data_get(it->obj);
1809    if (!wd)
1810      {
1811         printf("Cannot get smart data\n");
1812         return;
1813      }
1814
1815    // unpack base item
1816    if (it->order > 0)
1817      {
1818         if (it->base)
1819           elm_table_unpack(wd->box, it->base);
1820         sel = it->sel;
1821         EINA_LIST_FOREACH(wd->items, l, item)
1822           {
1823              if (it != item)
1824                {
1825                   if (item->order > it->order)
1826                     {
1827                        if (item->base)
1828                          elm_table_unpack(wd->box, item->base);
1829                        item->order -= sel;
1830                        if (!wd->vertical)
1831                          elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1832                        else
1833                          elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1834                     }
1835                }
1836           }
1837      }
1838
1839    // delete item in list
1840    _item_del(it);
1841    wd->items = eina_list_remove(wd->items, it);
1842    free(it);
1843    it = NULL;
1844    wd->num = wd->num - 1;
1845    _sizing_eval(obj);
1846 }
1847
1848 EAPI void
1849 elm_controlbar_item_select(Elm_Controlbar_Item * it)
1850 {
1851    if (!it) return;
1852    if (it->obj == NULL) return;
1853    Widget_Data * wd = elm_widget_data_get(it->obj);
1854    if (!wd) return;
1855
1856    _select_box(it);
1857 }
1858
1859 EAPI void
1860 elm_controlbar_item_icon_set(Elm_Controlbar_Item *it, const char *icon_path)
1861 {
1862    if (!it) return;
1863    if (it->style == OBJECT) return;
1864    if (it->icon_path)
1865      {
1866         eina_stringshare_del(it->icon_path);
1867         it->icon_path = NULL;
1868      }
1869    if (it->icon)
1870      {
1871         evas_object_del(it->icon);
1872         it->icon = NULL;
1873      }
1874    if (icon_path != NULL)
1875      {
1876         it->icon_path = eina_stringshare_add(icon_path);
1877         it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
1878      }
1879    if (it->wd->disabled || it->disabled)
1880      elm_widget_disabled_set(it->base_item, EINA_TRUE);
1881    else
1882      elm_widget_disabled_set(it->base_item, EINA_FALSE);
1883 }
1884
1885 EAPI Evas_Object *
1886 elm_controlbar_item_icon_get(const Elm_Controlbar_Item *it)
1887 {
1888    if (!it) return NULL;
1889    return it->icon;
1890 }
1891
1892 EAPI void
1893 elm_controlbar_item_label_set(Elm_Controlbar_Item *it, const char *label)
1894 {
1895    if (!it) return;
1896    if (it->style == OBJECT) return;
1897    if (it->text)
1898      {
1899         eina_stringshare_del(it->text);
1900         it->text = NULL;
1901      }
1902    it->text = eina_stringshare_add(label);
1903    elm_object_text_set(it->base_item, it->text);
1904
1905    if (it->wd->disabled || it->disabled)
1906      elm_widget_disabled_set(it->base_item, EINA_TRUE);
1907    else
1908      elm_widget_disabled_set(it->base_item, EINA_FALSE);
1909 }
1910
1911 EAPI const char *
1912 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
1913 {
1914    if (!it) return NULL;
1915    return it->text;
1916 }
1917
1918 EAPI Elm_Controlbar_Item *
1919 elm_controlbar_selected_item_get(const Evas_Object *obj)
1920 {
1921    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1922    const Eina_List *l;
1923
1924    Elm_Controlbar_Item * item;
1925    if (obj == NULL) return NULL;
1926    Widget_Data * wd = elm_widget_data_get(obj);
1927    if (!wd || !wd->items) return NULL;
1928    EINA_LIST_FOREACH(wd->items, l, item)
1929      {
1930         if (item->selected) return item;
1931      }
1932    return NULL;
1933 }
1934
1935 EAPI Elm_Controlbar_Item *
1936 elm_controlbar_first_item_get(const Evas_Object *obj)
1937 {
1938    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1939    Widget_Data * wd = elm_widget_data_get(obj);
1940    if (!wd || !wd->items) return NULL;
1941    return eina_list_data_get(wd->items);
1942 }
1943
1944 EAPI Elm_Controlbar_Item *
1945 elm_controlbar_last_item_get(const Evas_Object *obj)
1946 {
1947    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1948    Widget_Data * wd = elm_widget_data_get(obj);
1949    if (!wd || !wd->items) return NULL;
1950    return eina_list_data_get(eina_list_last(wd->items));
1951 }
1952
1953 EAPI const Eina_List *
1954 elm_controlbar_items_get(const Evas_Object *obj)
1955 {
1956    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1957    Widget_Data * wd = elm_widget_data_get(obj);
1958    if (!wd || !wd->items) return NULL;
1959    return wd->items;
1960 }
1961
1962 EAPI Elm_Controlbar_Item *
1963 elm_controlbar_item_prev(Elm_Controlbar_Item *it)
1964 {
1965    if (!it) return NULL;
1966    const Eina_List *l;
1967
1968    Elm_Controlbar_Item * item;
1969    if (it->obj == NULL) return NULL;
1970    Widget_Data * wd = elm_widget_data_get(it->obj);
1971    if (!wd || !wd->items) return NULL;
1972    EINA_LIST_FOREACH(wd->items, l, item)
1973      {
1974         if (it == item)
1975           {
1976              l = eina_list_prev(l);
1977              if (!l) return NULL;
1978              return eina_list_data_get(l);
1979           }
1980      }
1981    return NULL;
1982 }
1983
1984 EAPI Elm_Controlbar_Item *
1985 elm_controlbar_item_next(Elm_Controlbar_Item *it)
1986 {
1987    if (!it) return NULL;
1988    const Eina_List *l;
1989
1990    Elm_Controlbar_Item * item;
1991    if (it->obj == NULL) return NULL;
1992    Widget_Data * wd = elm_widget_data_get(it->obj);
1993    if (!wd || !wd->items) return NULL;
1994    EINA_LIST_FOREACH(wd->items, l, item)
1995      {
1996         if (it == item)
1997           {
1998              l = eina_list_next(l);
1999              if (!l) return NULL;
2000              return eina_list_data_get(l);
2001           }
2002      }
2003    return NULL;
2004 }
2005
2006 EAPI void
2007 elm_controlbar_item_visible_set(Elm_Controlbar_Item *it, Eina_Bool visible)
2008 {
2009    if (!it) return;
2010    if (it->obj == NULL) return;
2011    Widget_Data * wd = elm_widget_data_get(it->obj);
2012    if (!wd) return;
2013
2014    if (!wd->auto_align)
2015      _set_item_visible(it, visible);
2016 }
2017
2018 EAPI Eina_Bool
2019 elm_controlbar_item_visible_get(const Elm_Controlbar_Item *it)
2020 {
2021    if (!it) return EINA_FALSE;
2022    if (it->obj == NULL) return EINA_FALSE;
2023    Widget_Data * wd = elm_widget_data_get(it->obj);
2024    if (!wd) return EINA_FALSE;
2025    if (it->order <= 0) return EINA_FALSE;
2026
2027    return EINA_TRUE;
2028 }
2029
2030 EAPI void
2031 elm_controlbar_item_disabled_set(Elm_Controlbar_Item *it, Eina_Bool disabled)
2032 {
2033    if (!it) return;
2034
2035    if (it->disabled == disabled) return;
2036
2037    it->disabled = disabled;
2038
2039    if ((it->wd) && (it->wd->disabled)) return;
2040
2041    if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2042 }
2043
2044 EAPI Eina_Bool
2045 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item *it)
2046 {
2047    if (!it) return EINA_FALSE;
2048
2049    return it->disabled;
2050 }
2051
2052 EAPI void
2053 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2054 {
2055    if (!it) return;
2056    if (it->view == view) return;
2057
2058    evas_object_del(it->view);
2059    it->view = view;
2060 }
2061
2062 EAPI Evas_Object *
2063 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2064 {
2065    if (!it) return NULL;
2066
2067    return it->view;
2068 }
2069
2070 EAPI Evas_Object *
2071 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2072 {
2073    if (!it) return NULL;
2074    if (it->obj == NULL) return NULL;
2075    Widget_Data * wd = elm_widget_data_get(it->obj);
2076    if (!wd) return NULL;
2077    Evas_Object *content;
2078
2079    if (it->view == elm_object_part_content_get(wd->edje, "elm.swallow.view"))
2080      {
2081         content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
2082         if (content) evas_object_hide(content);
2083      }
2084    else
2085      content = it->view;
2086
2087    it->view = NULL;
2088
2089    return content;
2090 }
2091
2092 EAPI void
2093 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2094 {
2095    ELM_CHECK_WIDTYPE(obj, widtype);
2096    Widget_Data *wd = elm_widget_data_get(obj);
2097    if (!wd)
2098      {
2099         fprintf(stderr, "Cannot get smart data\n");
2100         return;
2101      }
2102    Evas_Object *selected_box;
2103
2104    wd->mode = mode;
2105
2106    switch(wd->mode)
2107      {
2108       case ELM_CONTROLBAR_MODE_DEFAULT:
2109          edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2110          break;
2111       case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2112          elm_controlbar_alpha_set(obj, 85);
2113          break;
2114       case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2115          elm_controlbar_alpha_set(obj, 0);
2116          break;
2117       case ELM_CONTROLBAR_MODE_LARGE:
2118          edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2119          break;
2120       case ELM_CONTROLBAR_MODE_SMALL:
2121          edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2122          break;
2123       case ELM_CONTROLBAR_MODE_LEFT:
2124          selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2125          if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,left", "elm");
2126          wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2127          wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2128          edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2129          _check_background(wd);
2130          _sizing_eval(obj);
2131          return;
2132       case ELM_CONTROLBAR_MODE_RIGHT:
2133          selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2134          if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,right", "elm");
2135          wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2136          wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2137          edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2138          _check_background(wd);
2139          _sizing_eval(obj);
2140          return;
2141       default:
2142          break;
2143      }
2144    selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2145    if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,default", "elm");
2146    wd->selected_signal = eina_stringshare_add("elm,state,selected");
2147    wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2148    _check_background(wd);
2149    _sizing_eval(obj);
2150 }
2151
2152 EAPI void
2153 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2154 {
2155    ELM_CHECK_WIDTYPE(obj, widtype);
2156    int r, g, b;
2157    Widget_Data *wd = elm_widget_data_get(obj);
2158    if (!wd)
2159      {
2160         fprintf(stderr, "Cannot get smart data\n");
2161         return;
2162      }
2163
2164    if (alpha < 0) wd->alpha = 0;
2165    else if (alpha > 100) wd->alpha = 100;
2166    else wd->alpha = alpha;
2167
2168    evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2169    evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2170 }
2171
2172 EAPI void
2173 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2174 {
2175    ELM_CHECK_WIDTYPE(obj, widtype);
2176    Widget_Data *wd = elm_widget_data_get(obj);
2177    Elm_Controlbar_Item *item;
2178    const Eina_List *l;
2179    int i;
2180    if (!wd)
2181      {
2182         fprintf(stderr, "Cannot get smart data\n");
2183         return;
2184      }
2185
2186    if (wd->auto_align == auto_align) return;
2187
2188    if (auto_align)
2189      {
2190         if ((_check_bar_item_number(wd)) >= 5 && (!wd->more_item))
2191           {
2192              i = 0;
2193              EINA_LIST_FOREACH(wd->items, l, item)
2194                {
2195                   if (elm_controlbar_item_visible_get(item))
2196                     i++;
2197                   if (i >= 5){
2198                        _delete_item_in_bar(item);
2199                   }
2200                }
2201              item = elm_controlbar_last_item_get(obj);
2202              while (!elm_controlbar_item_visible_get(item)){
2203                   item = elm_controlbar_item_prev(item);
2204              }
2205              _create_more_item(wd, item->style);
2206           }
2207      }
2208    else
2209      {
2210         if (wd->more_item)
2211           {
2212              // delete more item
2213              if (wd->more_item->view)
2214                evas_object_del(wd->more_item->view);
2215              wd->items = eina_list_remove(wd->items, wd->more_item);
2216              eina_stringshare_del(wd->more_item->text);
2217              if (wd->more_item->icon)
2218                evas_object_del(wd->more_item->icon);
2219              if (wd->more_item->base)
2220                evas_object_del(wd->more_item->base);
2221              if (wd->more_item->base_item)
2222                evas_object_del(wd->more_item->base_item);
2223              free(wd->more_item);
2224              wd->more_item = NULL;
2225
2226              // make all item is visible
2227              i = 1;
2228              EINA_LIST_FOREACH(wd->items, l, item)
2229                {
2230                   if (!elm_controlbar_item_visible_get(item))
2231                     _insert_item_in_bar(item, i);
2232                   i++;
2233                }
2234           }
2235      }
2236    wd->auto_align = auto_align;
2237    _sizing_eval(obj);
2238 }
2239
2240 EAPI void
2241 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2242 {
2243    ELM_CHECK_WIDTYPE(obj, widtype);
2244    Widget_Data *wd = elm_widget_data_get(obj);
2245    if (!wd)
2246      {
2247         fprintf(stderr, "Cannot get smart data\n");
2248         return;
2249      }
2250
2251    if (wd->vertical == vertical) return;
2252    wd->vertical = vertical;
2253
2254    if (_check_bar_item_number(wd) > 1)
2255      {
2256         _repack_items(wd);
2257      }
2258    _check_toolbar_line(wd);
2259 }
2260
2261 EAPI Evas_Object *
2262 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2263 {
2264    if (!it) return NULL;
2265    if (it->style == OBJECT) return NULL;
2266
2267    if (it->base_item) return it->base_item;
2268
2269    return NULL;
2270 }