\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
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
{\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
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
_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
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
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
{ \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
\r
_event_init(obj);\r
_view_init(obj);\r
- _view_update(obj);\r
\r
return obj;\r
}\r
*\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
* 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
{\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