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