[elm_multibuttonentry] added APIs
authorHyunsil Park <hyunsil.park@samsung.com>
Sun, 22 Aug 2010 18:49:34 +0000 (03:49 +0900)
committerHyunsil Park <hyunsil.park@samsung.com>
Sun, 22 Aug 2010 18:49:34 +0000 (03:49 +0900)
src/lib/Elementary.h.in [changed mode: 0644->0755]
src/lib/elm_multibuttonentry.c

old mode 100644 (file)
new mode 100755 (executable)
index cb99193..7f8323a
@@ -2433,11 +2433,31 @@ extern "C" {
     */
  
    /* multibuttonentry */
+   typedef struct _Multibuttonentry_Item Elm_Multibuttonentry_Item;
    EAPI Evas_Object    *elm_multibuttonentry_add(Evas_Object *parent);
    EAPI const char             *elm_multibuttonentry_label_get(Evas_Object *obj);
    EAPI void                   elm_multibuttonentry_label_set(Evas_Object *obj, const char *label);
+   EAPI Evas_Object                            *elm_multibuttonentry_entry_get(Evas_Object *obj);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_add_start(Evas_Object *obj, const char *label, void *data);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_add_end(Evas_Object *obj, const char *label, void *data);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_add_before(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *before, void *data);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_add_after(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *after, void *data);
+   EAPI const Eina_List *                              elm_multibuttonentry_items_get(Evas_Object *obj);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_first_get(Evas_Object *obj);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_last_get(Evas_Object *obj);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_selected_get(Evas_Object *obj);
+   EAPI void                                           elm_multibuttonentry_item_selected_set(Elm_Multibuttonentry_Item *item);
+   EAPI void                                           elm_multibuttonentry_item_del(Elm_Multibuttonentry_Item *item);
+   EAPI void                                           elm_multibuttonentry_items_del(Evas_Object *obj);
+   EAPI const char                                     *elm_multibuttonentry_item_label_get(Elm_Multibuttonentry_Item *item);
+   EAPI void                                           elm_multibuttonentry_item_label_set(Elm_Multibuttonentry_Item *item, const char *str);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_prev(Elm_Multibuttonentry_Item *item);
+   EAPI Elm_Multibuttonentry_Item      *elm_multibuttonentry_item_next(Elm_Multibuttonentry_Item *item);
+   EAPI void                                           *elm_multibuttonentry_item_data_get(Elm_Multibuttonentry_Item *item);
+   EAPI void                                           elm_multibuttonentry_item_data_set(Elm_Multibuttonentry_Item *item, void *data);
    /* smart callback called:
     * "selected"
+    * "added"
     */
    /* available styles:
     * default
index a82c794..d255252 100755 (executable)
                \r
 \r
 #define MAX_STR 256            \r
-#define MAX_LABEL 20   \r
-#define MIN_ENTRY_WIDTH 50\r
 \r
-typedef struct _Multibuttonentry_Item Multibuttonentry_Item;\r
+\r
+typedef enum _Multibuttonentry_Pos\r
+{\r
+ MULTIBUTONENTRY_POS_START,\r
+ MULTIBUTONENTRY_POS_END,\r
+ MULTIBUTONENTRY_POS_BEFORE,\r
+ MULTIBUTONENTRY_POS_AFTER,\r
+ MULTIBUTONENTRY_POS_NUM\r
+}Multibuttonentry_Pos;\r
+\r
 struct _Multibuttonentry_Item {\r
        Evas_Object *multibuttonentry;\r
        Evas_Object *button;\r
-       Evas_Object *hbox;\r
-       Evas_Object *row;\r
-\r
-       Evas_Coord rw;\r
-       Evas_Coord w;\r
+       void *data;\r
+       Evas_Coord vw, rw; // vw: visual width, real width\r
 };\r
 \r
 typedef struct _Widget_Data Widget_Data;\r
 struct _Widget_Data {\r
        Evas_Object *base;\r
-       Evas_Object *vbox;\r
+       Evas_Object *box;\r
        Evas_Object *entry;\r
-       \r
-       char label[MAX_LABEL];\r
+       Evas_Object *label;\r
 \r
        Eina_List *items;\r
        Eina_List *current;\r
-       \r
-       Evas_Coord w_vbox, h_vbox;\r
-       Evas_Coord w_base, h_base;\r
+\r
+       Evas_Coord w_box, h_box;\r
 };\r
 \r
+\r
 static void _del_hook(Evas_Object *obj);\r
 static void _theme_hook(Evas_Object *obj);\r
 static void _sizing_eval(Evas_Object *obj);\r
 static void _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event);\r
-static void _view_init(Evas_Object *obj);\r
-static void _view_update(Evas_Object *obj);\r
-static Evas_Object* _add_row(Evas_Object *obj, const char* label);\r
-static Multibuttonentry_Item* _add_button_item(Evas_Object *obj, char *str);\r
-\r
-static void _del_row(Evas_Object *obj, Evas_Object *row);\r
-\r
-\r
-\r
+static void    _event_init(Evas_Object *obj);\r
+static void    _set_label(Evas_Object *obj, const char* str);\r
+static void    _change_current_button(Evas_Object *obj, Evas_Object *btn);\r
+static void    _del_button_obj(Evas_Object *obj, Evas_Object *btn);\r
+static void    _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);\r
+static void    _del_button(Evas_Object *obj);\r
+static Elm_Multibuttonentry_Item*      _add_button_item(Evas_Object *obj, char *str, Multibuttonentry_Pos pos, const Elm_Multibuttonentry_Item *reference, void *data);\r
+static void    _add_button(Evas_Object *obj, char *str);\r
+static void    _evas_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info );\r
+static void    _view_init(Evas_Object *obj);\r
 \r
 \r
 static void\r
 _del_hook(Evas_Object *obj)\r
 {\r
-       Eina_List *rows;\r
-       Eina_List *l;\r
-       Evas_Object *cur_row;\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
        if(!wd) return;\r
 \r
-       rows = evas_object_box_children_get(wd->vbox);\r
-       EINA_LIST_FOREACH(rows, l, cur_row){\r
-               rows = eina_list_remove(rows, cur_row);\r
-               if(cur_row){\r
-                       _del_row(obj, cur_row);\r
-               }\r
+       if(wd->box){\r
+               elm_box_unpack_all(wd->box);\r
+               wd->box = NULL;\r
        }\r
-       evas_object_box_remove_all(wd->vbox, 1);\r
 \r
        if (wd->items) {\r
-               Multibuttonentry_Item *item;\r
+               Elm_Multibuttonentry_Item *item;\r
                EINA_LIST_FREE(wd->items, item) {\r
+                       _del_button_obj(obj, item->button);\r
                        free(item);\r
                }\r
+               wd->items = NULL;\r
        }\r
-       \r
+       wd->current = NULL;\r
 }\r
 \r
 static void\r
@@ -88,7 +87,6 @@ _theme_hook(Evas_Object *obj)
        if (!wd) return;\r
        \r
        _elm_theme_object_set(obj, wd->base, "multibuttonentry", "base", elm_widget_style_get(obj));\r
-       _view_update(obj);\r
        _sizing_eval(obj);\r
 }\r
 \r
@@ -111,16 +109,45 @@ _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event)
 {\r
        Widget_Data *wd = elm_widget_data_get(data);    \r
        if (!wd) return;\r
-       evas_object_geometry_get(wd->base, NULL, NULL, &wd->w_base, &wd->h_base);\r
-       evas_object_geometry_get(wd->vbox, NULL, NULL, &wd->w_vbox, &wd->h_vbox);\r
-       _view_update(data);\r
+       evas_object_geometry_get(wd->box, NULL, NULL, &wd->w_box, &wd->h_box);\r
+       _sizing_eval(obj);\r
+}\r
+\r
+static void\r
+_event_init(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if(!wd || !wd->base)    return;\r
+\r
+       evas_object_event_callback_add(wd->base, EVAS_CALLBACK_RESIZE, _resize_cb, obj);\r
+}\r
+\r
+static void\r
+_set_label(Evas_Object *obj, const char* str)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if(!wd) return;\r
+\r
+       if(!wd->label){\r
+               if(!(wd->label = elm_label_add(obj))) return;\r
+               elm_object_style_set(wd->label, "extended/multibuttonentry");\r
+               elm_label_ellipsis_set(wd->label, EINA_TRUE);\r
+               elm_label_wrap_width_set(wd->label, 100);\r
+               elm_label_text_align_set(wd->label, "left");\r
+               evas_object_size_hint_weight_set(wd->label, 0.0, 0.0);\r
+               evas_object_size_hint_align_set(wd->label, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
+               if(wd->box)     elm_box_pack_start(wd->box, wd->label);\r
+               evas_object_show(wd->label);\r
+       }\r
+\r
+       elm_label_label_set(wd->label, str);\r
 }\r
 \r
 static void\r
 _change_current_button(Evas_Object *obj, Evas_Object *btn)\r
 {\r
        Eina_List *l;\r
-       Multibuttonentry_Item *item;\r
+       Elm_Multibuttonentry_Item *item;\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
        Evas_Object *label;\r
        if (!wd) return;\r
@@ -147,6 +174,8 @@ _change_current_button(Evas_Object *obj, Evas_Object *btn)
                edje_object_signal_emit(item->button,"focused", "");\r
                label = edje_object_part_swallow_get(item->button, "elm.label");\r
                if(label)       elm_label_text_color_set(label, 255, 255, 255, 255);    \r
+\r
+               evas_object_smart_callback_call(obj, "selected", item);\r
        }\r
 }\r
 \r
@@ -154,37 +183,115 @@ static void
 _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)\r
 {\r
        Widget_Data *wd = elm_widget_data_get(data);\r
+       Elm_Multibuttonentry_Item *item;\r
+       Evas_Object *label;\r
+       const char *str = NULL;\r
        if (!wd) return;\r
 \r
        _change_current_button(data, obj);\r
-       evas_object_smart_callback_call(data, "selected", "test");\r
 }\r
 \r
 static void\r
-_event_init(Evas_Object *obj)\r
+_del_button_obj(Evas_Object *obj, Evas_Object *btn)\r
 {\r
+       Eina_List *l;\r
+       Elm_Multibuttonentry_Item *item;\r
+       Evas_Object *label;\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
-       if(!wd || !wd->base)    return;\r
+       if(!wd || !btn) return;\r
+       \r
+       if(btn){        \r
+               // del label\r
+               label = edje_object_part_swallow_get(btn, "elm.label");\r
+               edje_object_part_unswallow(btn, label);\r
+               evas_object_del(label);                         \r
+\r
+               // del button\r
+               evas_object_del(btn);           \r
+       }\r
+}\r
 \r
-       evas_object_event_callback_add(wd->base, EVAS_CALLBACK_RESIZE, _resize_cb, obj);\r
+static void\r
+_item_del(Elm_Multibuttonentry_Item *item)\r
+{\r
+       Eina_List *l;\r
+       Elm_Multibuttonentry_Item *_item;\r
+       Widget_Data *wd;\r
+\r
+       wd = elm_widget_data_get(item->multibuttonentry);\r
+       if (!wd) return;\r
+\r
+       EINA_LIST_FOREACH(wd->items, l, _item) {\r
+               if (_item == item) {\r
+                       wd->items = eina_list_remove(wd->items, _item);\r
+                       elm_box_unpack(wd->box, _item->button);\r
+                       _del_button_obj(_item->multibuttonentry, _item->button);\r
+                       free(_item);\r
+                       if(wd->current == l)    \r
+                               wd->current = NULL;\r
+                       break;\r
+               }\r
+       }\r
 }\r
 \r
-static Multibuttonentry_Item*\r
-_add_button_item(Evas_Object *obj, char *str)\r
+static void\r
+_del_button(Evas_Object *obj)\r
 {\r
-       Multibuttonentry_Item *item;\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       Evas_Object* last_row;\r
+       Evas_Object *hbox;\r
+       Evas_Object *last_btn;\r
+       Elm_Multibuttonentry_Item *item;\r
+       if(!wd || !wd->items) return;\r
+\r
+       if(!wd->current){\r
+               // let the last button focus\r
+               item = eina_list_data_get(eina_list_last(wd->items));   \r
+               if(item->button)        _change_current_button(obj, item->button);                              \r
+       }else{\r
+               item = eina_list_data_get(wd->current);\r
+               if(item){       \r
+                       _item_del(item);\r
+               }\r
+       }\r
+}\r
+\r
+static Elm_Multibuttonentry_Item*\r
+_add_button_item(Evas_Object *obj, char *str, Multibuttonentry_Pos pos, const Elm_Multibuttonentry_Item *reference, void *data)\r
+{\r
+       Elm_Multibuttonentry_Item *item;\r
        Evas_Object *btn;\r
        Evas_Object *label;\r
-       Evas_Coord w_label, w_btn, padding_outer, padding_inner;\r
+       Evas_Coord w_label, h_label, w_btn, h_btn, padding_outer, padding_inner;\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
-       if(!wd) return NULL;\r
+       if(!wd || !wd->box || !wd->entry) return NULL;\r
 \r
        // add button\r
        btn = edje_object_add(evas_object_evas_get(obj));\r
-       _elm_theme_object_set(obj, btn, "multibuttonentry", "btn", elm_widget_style_get(obj)); \r
-       evas_object_show(btn);\r
-\r
+       _elm_theme_object_set(obj, btn, "multibuttonentry", "btn", elm_widget_style_get(obj));\r
        edje_object_signal_callback_add(btn, "clicked", "elm", _button_clicked, obj);\r
+       evas_object_size_hint_weight_set(btn, 0.0, 0.0);\r
+\r
+       switch(pos){\r
+               case MULTIBUTONENTRY_POS_START:\r
+                       elm_box_pack_after(wd->box, btn, wd->label);\r
+                       break;\r
+               case MULTIBUTONENTRY_POS_END:\r
+                       elm_box_pack_before(wd->box, btn, wd->entry);\r
+                       break;\r
+               case MULTIBUTONENTRY_POS_BEFORE:\r
+                       if(reference)   elm_box_pack_before(wd->box, btn, reference->button);\r
+                       else    elm_box_pack_before(wd->box, btn, wd->entry);\r
+                       break;\r
+               case MULTIBUTONENTRY_POS_AFTER:\r
+                       if(reference)   elm_box_pack_after(wd->box, btn, reference->button);\r
+                       else    elm_box_pack_before(wd->box, btn, wd->entry);\r
+                       break;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       evas_object_show(btn);\r
 \r
        // add label\r
        label = elm_label_add(obj);\r
@@ -192,412 +299,54 @@ _add_button_item(Evas_Object *obj, char *str)
        elm_label_label_set(label, str);\r
        elm_label_ellipsis_set(label, EINA_TRUE);\r
        elm_label_wrap_width_set(label, 5000);\r
-       elm_label_text_align_set(label, "middle");\r
        edje_object_part_swallow(btn, "elm.label", label);\r
        evas_object_show(label);\r
 \r
        // decide the size of button\r
-       evas_object_size_hint_min_get(label, &w_label, NULL);\r
+       evas_object_size_hint_min_get(label, &w_label, &h_label);\r
+       edje_object_part_geometry_get(btn, "elm.base", NULL, NULL, NULL, &h_btn);\r
        edje_object_part_geometry_get(btn, "left.padding", NULL, NULL, &padding_outer, NULL);\r
        edje_object_part_geometry_get(btn, "left.inner.padding", NULL, NULL, &padding_inner, NULL);     \r
-       w_btn = w_label + 2*padding_outer + 2*padding_inner;\r
-       evas_object_resize(btn, w_btn, 0);\r
+       w_btn = w_label + 2*padding_outer + 2*padding_inner;    \r
+\r
 \r
        // append item list\r
-       item = ELM_NEW(Multibuttonentry_Item);\r
+       item = ELM_NEW(Elm_Multibuttonentry_Item);\r
        if (item) {\r
+               item->multibuttonentry = obj;\r
                item->button = btn;\r
-               item->w = w_btn;\r
+               item->data = data;\r
                item->rw = w_btn;\r
-               item->multibuttonentry = obj;\r
+               item->vw =(wd->w_box < w_btn) ? wd->w_box : w_btn;              \r
                wd->items = eina_list_append(wd->items, item);\r
        }\r
 \r
-       return item;\r
-}\r
-\r
-static void\r
-_del_button_item(Evas_Object *obj, Evas_Object *btn)\r
-{\r
-       Eina_List *l;\r
-       Multibuttonentry_Item *item;\r
-       Evas_Object *label;\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       if(!wd || !btn) return;\r
-       \r
-       EINA_LIST_FOREACH(wd->items, l, item) {\r
-               if(item->button == btn){\r
-                       wd->items = eina_list_remove(wd->items, item);\r
-\r
-                       // del label\r
-                       label = edje_object_part_swallow_get(btn, "elm.label");\r
-                       edje_object_part_unswallow(btn, label);\r
-                       evas_object_del(label);                         \r
-\r
-                       // del button\r
-                       evas_object_del(btn);\r
-\r
-                       // del item\r
-                       free(item);\r
-\r
-                       wd->current = NULL;\r
-                       \r
-                       break;\r
-               }\r
-       }\r
-\r
-}\r
-\r
 \r
-static void\r
-_set_label(Evas_Object *obj, Evas_Object *row, const char* label)\r
-{\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       if(!wd || !row) return;\r
+       evas_object_resize(btn, item->vw, h_btn);\r
 \r
-       strncpy(wd->label, label, MAX_LABEL);\r
-       wd->label[MAX_LABEL - 1]= 0;\r
-       edje_object_part_text_set(row, "elm.label", wd->label);\r
-}\r
-\r
-static Evas_Object*\r
-_add_row(Evas_Object *obj, const char* label)\r
-{\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       Evas_Object *row;\r
-       Evas_Object *hbox;      \r
-       if(!wd || !wd->base || !wd->vbox)       return NULL;\r
-\r
-       // row\r
-       row = edje_object_add(evas_object_evas_get(obj));\r
-       _elm_theme_object_set(obj, row, "multibuttonentry", "row", elm_widget_style_get(obj));  \r
-       evas_object_show(row);\r
-       evas_object_box_append(wd->vbox, row);\r
-       evas_object_box_align_set(wd->vbox, 0.0, 0.0);\r
-\r
-       // label\r
-       if(label){\r
-               _set_label(obj, row, label);\r
+       if(item->rw != item->vw){\r
+               evas_object_resize(label, item->vw - 4*padding_outer - 4*padding_inner, h_label);       \r
+               elm_label_wrap_width_set(label, item->vw - 4*padding_outer - 6*padding_inner ); \r
        }\r
 \r
-       // hbox \r
-       hbox = evas_object_box_add( evas_object_evas_get(obj));\r
-       evas_object_box_layout_set(hbox, evas_object_box_layout_horizontal, NULL, NULL);        \r
-       evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);\r
-       evas_object_box_align_set(hbox, 0.0, 0.0);\r
-       edje_object_part_swallow(row, "elm.hbox", hbox);\r
-       evas_object_show(hbox);\r
-       \r
-       // add entry\r
-       edje_object_part_swallow(row, "elm.entry", wd->entry);\r
+       evas_object_size_hint_min_set(btn, item->vw, h_btn);\r
 \r
-       return row;\r
-}\r
+       evas_object_smart_callback_call(obj, "added", item);\r
 \r
-\r
-static void\r
-_del_row(Evas_Object *obj, Evas_Object *row)\r
-{\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       Evas_Object *hbox;\r
-       Evas_Object *entry;\r
-       if(!wd || !wd->vbox || !row)    return;\r
-       \r
-       hbox = edje_object_part_swallow_get(row, "elm.hbox");\r
-       entry = edje_object_part_swallow_get(row, "elm.entry");\r
-\r
-       if(hbox){\r
-               evas_object_box_remove_all(hbox, 1);\r
-               edje_object_part_unswallow(row, hbox);\r
-               evas_object_del(hbox);\r
-       }\r
-\r
-       if(entry){\r
-               edje_object_part_unswallow(row, entry);\r
-       }\r
-\r
-       evas_object_box_remove(wd->vbox, row);\r
-       evas_object_del(row);\r
+       return item;\r
 }\r
 \r
-\r
 static void\r
 _add_button(Evas_Object *obj, char *str)\r
 {\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
-       Evas_Object* last_row;\r
-       Evas_Object *hbox;\r
-       Evas_Object *last_btn;\r
-       Evas_Object *btn;\r
-       Evas_Coord x_row, w_row, x_last_btn, w_last_btn, w_new_btn;\r
-       Evas_Coord row_rel2, last_btn_rel2;\r
        if(!wd) return;\r
 \r
-       if(!(last_row = eina_list_data_get(eina_list_last(evas_object_box_children_get(wd->vbox))))) return;\r
-       if(!(hbox = edje_object_part_swallow_get(last_row, "elm.hbox"))) return;\r
-       last_btn = eina_list_data_get(eina_list_last(evas_object_box_children_get(hbox)));\r
-\r
-\r
        //remove entry text\r
-       elm_entry_entry_set(wd->entry, "");\r
+       elm_scrolled_entry_entry_set(wd->entry, "");\r
 \r
        // add button\r
-       Multibuttonentry_Item *item = _add_button_item(obj, str);\r
-       btn = item->button;\r
-       edje_object_signal_emit(last_row,"default", "");\r
-\r
-       // position\r
-       evas_object_geometry_get(last_row, &x_row, NULL, &w_row, NULL);\r
-       evas_object_geometry_get(last_btn, &x_last_btn, NULL, &w_last_btn, NULL);\r
-       evas_object_geometry_get(btn, NULL, NULL, &w_new_btn, NULL);\r
-       \r
-       row_rel2 = x_row + w_row;\r
-       last_btn_rel2 = x_last_btn + w_last_btn;\r
-               \r
-\r
-       if((last_btn_rel2 < row_rel2) && (row_rel2 - last_btn_rel2 > w_new_btn))\r
-       {\r
-               evas_object_box_append(hbox, btn);\r
-               item->hbox = hbox;\r
-               item->row = last_row;\r
-       \r
-               if((row_rel2 - (last_btn_rel2 + w_new_btn)) < MIN_ENTRY_WIDTH){\r
-                       edje_object_part_unswallow(last_row, wd->entry);\r
-                       _add_row(obj, NULL);\r
-                       _view_update(obj);\r
-               }\r
-       }\r
-       else if(!evas_object_box_children_get(hbox))\r
-       {       \r
-               Evas_Coord w_label, h_label;\r
-               edje_object_part_geometry_get(last_row, "elm.label", NULL, NULL, &w_label, &h_label);   \r
-               evas_object_resize(btn, w_row - w_label, 0);\r
-               item->rw = w_row - w_label;\r
-               evas_object_box_append(hbox, btn);\r
-               item->hbox = hbox;\r
-               item->row = last_row;\r
-\r
-               if(w_new_btn > w_row - w_label){\r
-                       Evas_Coord w, h, padding_outer, padding_inner, base_w, base_h;\r
-                       Evas_Object *label;\r
-\r
-                       edje_object_part_geometry_get(btn, "elm.base", NULL, NULL, &base_w, &base_h);   \r
-                       label = edje_object_part_swallow_get(btn, "elm.label");\r
-                       \r
-                       edje_object_part_geometry_get(btn, "left.padding", NULL, NULL, &padding_outer, NULL);\r
-                       edje_object_part_geometry_get(btn, "left.inner.padding", NULL, NULL, &padding_inner, NULL); \r
-                       edje_object_part_geometry_get(btn, "elm.label", NULL, NULL, &w, &h); \r
-\r
-                       evas_object_resize(btn, w_row - w_label, 0);\r
-                       item->rw = w_row - w_label;\r
-                       evas_object_resize(label, item->rw - 4*padding_outer - 4*padding_inner, h_label);       \r
-                       elm_label_wrap_width_set(label, item->rw - 4*padding_outer - 6*padding_inner ); \r
-               }\r
-\r
-               edje_object_part_unswallow(last_row, wd->entry);\r
-               _add_row(obj, NULL);\r
-               _view_update(obj);\r
-       }\r
-       else\r
-       {\r
-               Evas_Coord w_label, h_label;\r
-               Evas_Object *row;\r
-                       \r
-               edje_object_part_unswallow(last_row, wd->entry);        \r
-               row = _add_row(obj, NULL);\r
-               hbox = edje_object_part_swallow_get(row, "elm.hbox");\r
-               edje_object_part_geometry_get(row, "elm.label", NULL, NULL, &w_label, &h_label);\r
-\r
-\r
-\r
-               if(w_new_btn > w_row - w_label){\r
-                       Evas_Coord w, h, padding_outer, padding_inner, base_w, base_h;\r
-                       Evas_Object *label;\r
-\r
-                       edje_object_part_geometry_get(btn, "elm.base", NULL, NULL, &base_w, &base_h);   \r
-                       label = edje_object_part_swallow_get(btn, "elm.label");\r
-                       \r
-                       edje_object_part_geometry_get(btn, "left.padding", NULL, NULL, &padding_outer, NULL);\r
-                       edje_object_part_geometry_get(btn, "left.inner.padding", NULL, NULL, &padding_inner, NULL); \r
-                       edje_object_part_geometry_get(btn, "elm.label", NULL, NULL, &w, &h); \r
-\r
-                       evas_object_resize(btn, w_row - w_label, 0);\r
-                       item->rw = w_row - w_label;\r
-                       evas_object_resize(label, item->rw - 4*padding_outer - 4*padding_inner, h_label);       \r
-                       elm_label_wrap_width_set(label, item->rw - 4*padding_outer - 6*padding_inner ); \r
-                       \r
-                       \r
-                       edje_object_part_unswallow(last_row, wd->entry);\r
-                       _add_row(obj, NULL);\r
-               }\r
-\r
-\r
-               evas_object_box_append(hbox, btn);\r
-               item->hbox = hbox;\r
-               item->row = row;\r
-                       \r
-               _view_update(obj);\r
-       }       \r
-}\r
-\r
-static void _remove_unused_row(Evas_Object *obj)\r
-{\r
-       Eina_List *rows;\r
-       Eina_List *l;\r
-       Evas_Object *cur_row;\r
-       Evas_Object *last_rows;\r
-       Evas_Object* hbox;\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       if(!wd) return;\r
-\r
-\r
-       rows = evas_object_box_children_get(wd->vbox);\r
-       EINA_LIST_FOREACH(rows, l, cur_row){\r
-               hbox = edje_object_part_swallow_get(cur_row, "elm.hbox");\r
-\r
-               if(hbox){\r
-                       if(rows != l && !evas_object_box_children_get(hbox)){\r
-                               int space;\r
-                               edje_object_part_geometry_get(eina_list_data_get(eina_list_prev(l)), "elm.space", NULL, NULL, &space, NULL);\r
-\r
-                               Evas_Object *prev_row = eina_list_data_get(eina_list_prev(l));\r
-                               hbox = edje_object_part_swallow_get(prev_row, "elm.hbox");\r
-                               \r
-                               if(hbox && eina_list_count(evas_object_box_children_get(hbox)) == 0){\r
-                                       edje_object_signal_emit(cur_row,"empty", "");\r
-                                       rows = eina_list_remove(rows, cur_row);\r
-                                       _del_row(obj, cur_row);\r
-                               }else if((eina_list_data_get(eina_list_last(evas_object_box_children_get(wd->vbox))) == cur_row) && (space < MIN_ENTRY_WIDTH)){\r
-                                       break;\r
-                               }else{\r
-                                       edje_object_signal_emit(cur_row,"empty", "");\r
-                                       rows = eina_list_remove(rows, cur_row);\r
-                                       _del_row(obj, cur_row);\r
-                               }\r
-\r
-                       }\r
-               }\r
-       }\r
-\r
-       last_rows = eina_list_data_get(eina_list_last(evas_object_box_children_get(wd->vbox)));\r
-       if(last_rows) edje_object_part_swallow(last_rows, "elm.entry", wd->entry);\r
-\r
-}\r
-\r
-static void\r
-_del_button(Evas_Object *obj)\r
-{\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       Evas_Object* last_row;\r
-       Evas_Object *hbox;\r
-       Evas_Object *last_btn;\r
-       if(!wd) return;\r
-\r
-\r
-       if(!wd->current){\r
-               // let the last button focus\r
-               if(!(last_row = eina_list_data_get(eina_list_last(evas_object_box_children_get(wd->vbox))))) return;\r
-               if(!(hbox = edje_object_part_swallow_get(last_row, "elm.hbox"))) return;\r
-               last_btn = eina_list_data_get(eina_list_last(evas_object_box_children_get(hbox)));\r
-\r
-               if(last_btn)    {\r
-                       _change_current_button(obj, last_btn);                          \r
-               }else{\r
-                       if(!(last_row = eina_list_data_get(eina_list_prev(eina_list_last(evas_object_box_children_get(wd->vbox))))) )return;\r
-                       if(!(hbox = edje_object_part_swallow_get(last_row, "elm.hbox"))) return;\r
-                       last_btn = eina_list_data_get(eina_list_last(evas_object_box_children_get(hbox)));\r
-                       if(last_btn)\r
-                               _change_current_button(obj, last_btn);          \r
-               }\r
-               \r
-       }else{\r
-               Eina_List *l;\r
-               Multibuttonentry_Item *item;\r
-               Eina_List *rows;\r
-               Evas_Object* cur_row;\r
-               Evas_Object* cur_box;\r
-               Evas_Coord w_entry;\r
-               Evas_Coord pre_space, next_space;\r
-               Eina_List *next;\r
-\r
-\r
-               if(!(rows = evas_object_box_children_get(wd->vbox))) return;\r
-\r
-\r
-               next = eina_list_next(wd->current);\r
-               item = eina_list_data_get(wd->current);\r
-\r
-               EINA_LIST_FOREACH(rows, l, cur_row){\r
-                       if(cur_row == item->row){\r
-                               rows = l;\r
-                               break;\r
-                       }\r
-               }                               \r
-               \r
-               cur_row = item->row;\r
-               if(!(cur_box = edje_object_part_swallow_get(cur_row, "elm.hbox"))) return;\r
-               \r
-\r
-               edje_object_part_geometry_get(cur_row, "elm.space", NULL, NULL, &pre_space, NULL);      \r
-               edje_object_part_geometry_get(eina_list_data_get(eina_list_next(rows)), "elm.space", NULL, NULL, &next_space, NULL);    \r
-               \r
-               if(item){\r
-                       pre_space += item->rw;\r
-                       evas_object_box_remove(item->hbox, item->button);\r
-                       _del_button_item(obj, item->button);\r
-                       if(cur_box)\r
-                               if(eina_list_count(evas_object_box_children_get(cur_box)) == 0)\r
-                                               edje_object_signal_emit(cur_row,"empty", "");\r
-                       //_remove_unused_row(obj);\r
-               }\r
-\r
-       \r
-               l = next;\r
-               EINA_LIST_FOREACH(l, l, item) { \r
-                       if(item->hbox != cur_box){      \r
-                               if(!cur_box) break;\r
-                               \r
-                               if(item->w < pre_space){        \r
-                                       next_space += item->rw;\r
-                                       evas_object_box_remove(item->hbox, item->button);\r
-                                       evas_object_resize(item->button, item->w, 0);\r
-                                       evas_object_box_append(cur_box, item->button);\r
-                                       pre_space -= item->w;\r
-                                       item->hbox = cur_box;\r
-                                       item->row = cur_row;\r
-                               }\r
-                               else if((eina_list_count(evas_object_box_children_get(cur_box)) == 0)){\r
-                                       next_space += item->rw;\r
-                                       evas_object_box_remove(item->hbox, item->button);\r
-                                       evas_object_resize(item->button, item->rw, 0);\r
-                                       evas_object_box_append(cur_box, item->button);\r
-                                       pre_space -= item->w;\r
-                                       item->hbox = cur_box;\r
-                                       item->row = cur_row;\r
-                               }\r
-                               else{\r
-                                               \r
-                                       if(!(rows = eina_list_next(rows)))      break;\r
-                                       if(!(cur_row = eina_list_data_get(rows)))       break;\r
-                                       if(!(cur_box = edje_object_part_swallow_get(cur_row, "elm.hbox"))) break;\r
-                                       \r
-                                       pre_space = next_space;\r
-                                       edje_object_part_geometry_get(eina_list_data_get(eina_list_next(rows)), "elm.space", NULL, NULL, &next_space, NULL);\r
-                               }\r
-\r
-\r
-                               if(cur_box)\r
-                                       if(eina_list_count(evas_object_box_children_get(cur_box)) == 0)\r
-                                               edje_object_signal_emit(cur_row,"empty", "");\r
-\r
-                               \r
-                               _remove_unused_row(obj);\r
-                       }\r
-               }\r
-\r
-               _remove_unused_row(obj);\r
-               \r
-       }\r
+       Elm_Multibuttonentry_Item *item = _add_button_item(obj, str, MULTIBUTONENTRY_POS_END, NULL, NULL);\r
 }\r
 \r
 static void\r
@@ -606,17 +355,14 @@ _evas_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info )
     Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;\r
        Widget_Data *wd = elm_widget_data_get(data);\r
        static char str[MAX_STR];       \r
-       if(!wd || !wd->base || !wd->vbox || wd->entry != obj) return;\r
-\r
-       strncpy(str, elm_entry_entry_get(wd->entry), MAX_STR);\r
+       if(!wd || !wd->base || !wd->box) return;\r
+       \r
+       strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);\r
        str[MAX_STR - 1]= 0;\r
 \r
-       //printf("\n>>>>>>[%s][%d]key val = %s\n", __FUNCTION__, __LINE__, ev->keyname);\r
-       \r
        if((strcmp(str, "") == 0) && ((strcmp(ev->keyname, "BackSpace") == 0)||(strcmp(ev->keyname, "BackSpace(") == 0))){ \r
                _del_button(data);      \r
-       }\r
-       else if((strcmp(str, "") != 0) && (strcmp(ev->keyname, "KP_Enter") == 0 ||strcmp(ev->keyname, "Return") == 0 )){\r
+       }else if((strcmp(str, "") != 0) && (strcmp(ev->keyname, "KP_Enter") == 0 ||strcmp(ev->keyname, "Return") == 0 )){\r
                _add_button(data, str);\r
        }else{\r
                //\r
@@ -628,40 +374,35 @@ _view_init(Evas_Object *obj)
 {      \r
        Widget_Data *wd = elm_widget_data_get(obj);     \r
        if (!wd) return;\r
+       \r
+       if(!wd->box){\r
+               if(!(wd->box = elm_box_add(obj))) return;\r
+               elm_box_extended_set(wd->box, EINA_TRUE);\r
+               elm_box_homogenous_set(wd->box, EINA_FALSE);\r
+               edje_object_part_swallow(wd->base, "box.swallow", wd->box);\r
+               evas_object_show(wd->box);\r
+       }\r
 \r
-       if(!wd->entry){\r
-               wd->entry = elm_entry_add(obj);\r
-               elm_entry_single_line_set(wd->entry, EINA_TRUE);\r
-               elm_entry_ellipsis_set(wd->entry, EINA_TRUE);\r
-               elm_entry_entry_set(wd->entry, "");\r
-               elm_entry_cursor_end_set(wd->entry);\r
-               //elm_entry_background_color_set(wd->entry, 255, 0, 255, 255);\r
-               evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, obj);          \r
+       if(!wd->label){\r
+               _set_label(obj, "To: ");        \r
        }\r
        \r
-       if(!wd->vbox){\r
-               wd->vbox = evas_object_box_add(evas_object_evas_get(obj));\r
-               evas_object_box_layout_set(wd->vbox, evas_object_box_layout_vertical, NULL, NULL);      \r
-               edje_object_part_swallow(wd->base, "vbox.swallow", wd->vbox);\r
-               evas_object_show(wd->vbox);\r
-               _add_row(obj, "To:");\r
+       if(!wd->entry){\r
+               Evas_Coord h_label;\r
+               if(!(wd->entry = elm_scrolled_entry_add(obj))) return;\r
+               elm_scrolled_entry_single_line_set(wd->entry, EINA_TRUE);\r
+               elm_scrolled_entry_entry_set(wd->entry, "");\r
+               elm_scrolled_entry_cursor_end_set(wd->entry);\r
+               evas_object_event_callback_add(elm_scrolled_entry_entry_object_get(wd->entry), EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, obj);\r
+               evas_object_geometry_get(wd->entry, NULL, NULL, NULL, &h_label);\r
+               evas_object_size_hint_min_set(wd->entry, 20, h_label);\r
+               evas_object_size_hint_weight_set(wd->entry, 1.0, 1.0);\r
+               evas_object_size_hint_align_set(wd->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
+               elm_box_pack_end(wd->box, wd->entry);\r
+               evas_object_show(wd->entry);\r
        }\r
 }\r
 \r
-static void \r
-_view_update(Evas_Object *obj)\r
-{      \r
-       Widget_Data *wd = elm_widget_data_get(obj);     \r
-       Eina_List *l;\r
-       Evas_Object *item;\r
-       Eina_List* list;        \r
-       if (!wd || !wd->vbox) return;\r
-\r
-       list = evas_object_box_children_get(wd->vbox);\r
-       EINA_LIST_FOREACH(list, l, item)\r
-               evas_object_resize(item, wd->w_vbox, wd->h_vbox);\r
-}\r
-\r
 /**\r
  * Add a new multibuttonentry to the parent\r
  *\r
@@ -694,7 +435,6 @@ elm_multibuttonentry_add(Evas_Object *parent)
        \r
        _event_init(obj);\r
        _view_init(obj);\r
-       _view_update(obj);\r
 \r
        return obj;\r
 }\r
@@ -707,15 +447,15 @@ elm_multibuttonentry_add(Evas_Object *parent)
  *\r
  * @ingroup Multibuttonentry\r
  */\r
-\r
 EAPI const char *\r
 elm_multibuttonentry_label_get(Evas_Object *obj)\r
 {\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
        if (!wd) return NULL;\r
 \r
-       if(wd->label)\r
-               return wd->label;\r
+       if(wd->label){\r
+               return elm_label_label_get(wd->label);\r
+       }\r
 \r
        return NULL;\r
 }\r
@@ -724,7 +464,7 @@ elm_multibuttonentry_label_get(Evas_Object *obj)
  * Set the label\r
  *\r
  * @param obj The multibuttonentry object\r
- * @param label The text label string in UTF-8\r
+ * @param label The text label string\r
  *\r
  * @ingroup Multibuttonentry\r
  */\r
@@ -733,10 +473,384 @@ elm_multibuttonentry_label_set(Evas_Object *obj, const char *label)
 {\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
        Evas_Object *row;\r
-       if (!wd || !wd->vbox) return;\r
+       if (!wd) return;\r
 \r
-       if(!(row = eina_list_data_get(evas_object_box_children_get(wd->vbox)))) return;\r
-       _set_label(obj, row, label);    \r
+       _set_label(obj, label); \r
 }\r
 \r
+/**\r
+ * Get the entry of the multibuttonentry object\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @return entry object\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Evas_Object *\r
+elm_multibuttonentry_entry_get(Evas_Object *obj)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   if (!wd)    return NULL;\r
+   \r
+   return wd->entry;\r
+}\r
+\r
+/**\r
+ * Prepend a new item to the multibuttonentry \r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @param label The label of new item\r
+ * @param data The ponter to the data to be attached\r
+ * @return A handle to the item added or NULL if not possible\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_add_start(Evas_Object *obj, const char *label, void *data)\r
+{\r
+       Elm_Multibuttonentry_Item *item;\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return NULL;\r
+\r
+       item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_START, NULL, data);\r
+       return item; \r
+}\r
+\r
+/**\r
+ * Append a new item to the multibuttonentry \r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @param label The label of new item\r
+ * @param data The ponter to the data to be attached\r
+ * @return A handle to the item added or NULL if not possible\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_add_end(Evas_Object *obj, const char *label, void *data)\r
+{\r
+       Elm_Multibuttonentry_Item *item;\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return NULL;\r
+\r
+       item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_END, NULL, data);\r
+       return item; \r
+}\r
+\r
+/**\r
+ * Add a new item to the multibuttonentry before the indicated object\r
+ *\r
+ * reference.\r
+ * @param obj The multibuttonentry object\r
+ * @param label The label of new item\r
+ * @param data The ponter to the data to be attached\r
+ * @return A handle to the item added or NULL if not possible\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_add_before(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *before, void *data)\r
+{\r
+       Elm_Multibuttonentry_Item *item;\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return NULL;\r
+\r
+       item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_BEFORE, before, data);\r
+       return item; \r
+}\r
+\r
+/**\r
+ * Add a new item to the multibuttonentry after the indicated object\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @param label The label of new item\r
+ * @param data The ponter to the data to be attached\r
+ * @return A handle to the item added or NULL if not possible\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_add_after(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *after, void *data)\r
+{\r
+       Elm_Multibuttonentry_Item *item;\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return NULL;\r
+\r
+       item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_AFTER, after, data);\r
+       return item; \r
+}\r
+\r
+/**\r
+ * Get a list of items in the multibuttonentry\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @return The list of items, or NULL if none\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI const Eina_List *\r
+elm_multibuttonentry_items_get(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return NULL;\r
+       return wd->items;\r
+}\r
+\r
+/**\r
+ * Get the first item in the multibuttonentry\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @return The first item, or NULL if none\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_first_get(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd;\r
+       if (!obj) return NULL;\r
+       wd = elm_widget_data_get(obj);\r
+       if (!wd || !wd->items) return NULL;\r
+       return eina_list_data_get(wd->items);\r
+}\r
+\r
+/**\r
+ * Get the last item in the multibuttonentry\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @return The last item, or NULL if none\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_last_get(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd;\r
+       if (!obj) return NULL;\r
+       wd = elm_widget_data_get(obj);\r
+       if (!wd || !wd->items) return NULL;\r
+       return eina_list_data_get(eina_list_last(wd->items));\r
+}\r
+\r
+/**\r
+ * Get the selected item in the multibuttonentry\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @return The selected item, or NULL if none\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_selected_get(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd || !wd->current) return NULL;\r
+       return eina_list_data_get(wd->current);\r
+}\r
+\r
+/**\r
+ * Set the selected state of an item\r
+ *\r
+ * @param item The item\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void\r
+elm_multibuttonentry_item_selected_set(Elm_Multibuttonentry_Item *item)\r
+{\r
+       Widget_Data *wd;\r
+       Eina_List *l;\r
+       Elm_Multibuttonentry_Item *_item;\r
+       int cnt = 0;\r
+\r
+       if (!item) return;\r
+       wd = elm_widget_data_get(item->multibuttonentry);\r
+       if (!wd) return;\r
+\r
+       EINA_LIST_FOREACH(wd->items, l, _item) {\r
+               if (_item == item) {\r
+                       _change_current_button(item->multibuttonentry, item->button);\r
+               }\r
+       }\r
+}\r
+\r
+/**\r
+ * Remove all items in the multibuttonentry.\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void\r
+elm_multibuttonentry_items_del(Evas_Object *obj)\r
+{\r
+       Widget_Data *wd = elm_widget_data_get(obj);\r
+       if (!wd) return;\r
+       \r
+       if (wd->items){\r
+               Elm_Multibuttonentry_Item *item;\r
+               EINA_LIST_FREE(wd->items, item) {\r
+                       elm_box_unpack(wd->box, item->button);\r
+                       _del_button_obj(obj, item->button);\r
+                       free(item);\r
+               }\r
+               wd->items = NULL;\r
+       }\r
+       wd->current = NULL;\r
+}\r
+\r
+/**\r
+ * Delete a given item\r
+ *\r
+ * @param item The item\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void\r
+elm_multibuttonentry_item_del(Elm_Multibuttonentry_Item *item)\r
+{\r
+       if (!item) return;\r
+        _item_del(item);\r
+}\r
+\r
+/**\r
+ * Get the label of a given item\r
+ *\r
+ * @param item The item\r
+ * @return The label of a given item, or NULL if none\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI const char *\r
+elm_multibuttonentry_item_label_get(Elm_Multibuttonentry_Item *item)\r
+{\r
+       Widget_Data *wd;\r
+       Eina_List *l;\r
+       Elm_Multibuttonentry_Item *_item;\r
+\r
+       if (!item) return NULL;\r
+       wd = elm_widget_data_get(item->multibuttonentry);\r
+       if (!wd || !wd->items) return NULL;\r
+\r
+       EINA_LIST_FOREACH(wd->items, l, _item)\r
+               if (_item == item){\r
+                       Evas_Object *label = edje_object_part_swallow_get(_item->button, "elm.label");\r
+                       if(label)       return elm_label_label_get(label);\r
+               }\r
+\r
+       return NULL;\r
+}\r
+\r
+/**\r
+ * Set the label of a given item\r
+ *\r
+ * @param item The item\r
+ * @param label The text label string\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void\r
+elm_multibuttonentry_item_label_set(Elm_Multibuttonentry_Item *item, const char *str)\r
+{\r
+       Widget_Data *wd;\r
+       Eina_List *l;\r
+       Elm_Multibuttonentry_Item *_item;\r
+\r
+       if (!item || !str) return;\r
+       wd = elm_widget_data_get(item->multibuttonentry);\r
+       if (!wd || !wd->items) return;\r
+\r
+       EINA_LIST_FOREACH(wd->items, l, _item)\r
+               if (_item == item) {\r
+                       Evas_Object *label = edje_object_part_swallow_get(_item->button, "elm.label");\r
+                       if(label)       elm_label_label_set(label, str);\r
+                       break;\r
+               }\r
+}\r
+\r
+/**\r
+ * Get the previous item in the multibuttonentry\r
+ *\r
+ * @param item The item\r
+ * @return The item before the item @p item\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_prev(Elm_Multibuttonentry_Item *item)\r
+{\r
+       Widget_Data *wd;\r
+       Eina_List *l;\r
+       Elm_Multibuttonentry_Item *_item;\r
+\r
+       if (!item) return NULL;\r
+       wd = elm_widget_data_get(item->multibuttonentry);\r
+       if (!wd || !wd->items) return NULL;\r
+\r
+       EINA_LIST_FOREACH(wd->items, l, _item)\r
+               if (_item == item) {\r
+                       l = eina_list_prev(l);\r
+                       if (!l) return NULL;\r
+                       return eina_list_data_get(l);\r
+               }\r
+       return NULL;\r
+}\r
+\r
+/**\r
+ * Get the next item in the multibuttonentry\r
+ *\r
+ * @param item The item\r
+ * @return The item after the item @p item\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Elm_Multibuttonentry_Item *\r
+elm_multibuttonentry_item_next(Elm_Multibuttonentry_Item *item)\r
+{\r
+       Widget_Data *wd;\r
+       Eina_List *l;\r
+       Elm_Multibuttonentry_Item *_item;\r
+\r
+       if (!item) return NULL;\r
+       wd = elm_widget_data_get(item->multibuttonentry);\r
+       if (!wd || !wd->items) return NULL;\r
+\r
+       EINA_LIST_FOREACH(wd->items, l, _item)\r
+               if (_item == item) {\r
+                       l = eina_list_next(l);\r
+                       if (!l) return NULL;\r
+                       return eina_list_data_get(l);\r
+               }\r
+       return NULL;\r
+}\r
+\r
+/**\r
+ * Get private data of item\r
+ *\r
+ * @param item The item\r
+ * @return The data pointer stored, or NULL if none was stored\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void *\r
+elm_multibuttonentry_item_data_get(Elm_Multibuttonentry_Item *item)\r
+{\r
+       if (!item) return NULL;\r
+       return item->data;\r
+}\r
+\r
+/**\r
+ * Set private data of item\r
+ *\r
+ * @param item The item\r
+ * @param data The ponter to the data to be attached\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void\r
+elm_multibuttonentry_item_data_set(Elm_Multibuttonentry_Item *item, void *data)\r
+{\r
+       if (!item) return;\r
+       item->data = data;\r
+}\r
 \r