\r
#define MAX_STR 256 \r
#define MAX_W_BTN 200 \r
+#define MIN_W_ENTRY 20 \r
\r
\r
typedef enum _Multibuttonentry_Pos\r
Evas_Object *label;\r
void *data;\r
Evas_Coord vw, rw; // vw: visual width, real width\r
+ Eina_Bool visible: 1; \r
};\r
\r
typedef struct _Widget_Data Widget_Data;\r
Evas_Object *box;\r
Evas_Object *entry;\r
Evas_Object *label;\r
+ Evas_Object *guidetext;\r
+ Evas_Object *end; // used to represent the total number of invisible buttons\r
\r
Eina_List *items;\r
Eina_List *current;\r
\r
+ int n_str;\r
+\r
Evas_Coord w_box, h_box;\r
+ int contracted; \r
+ Eina_Bool focused: 1; \r
};\r
\r
static const char *widtype = NULL;\r
\r
static void _del_hook(Evas_Object *obj);\r
static void _theme_hook(Evas_Object *obj);\r
+static void _on_focus_hook(void *data __UNUSED__, Evas_Object *obj);\r
static void _sizing_eval(Evas_Object *obj);\r
+static void _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void *event);\r
static void _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event);\r
static void _event_init(Evas_Object *obj);\r
+static void _contracted_state_set(Evas_Object *obj, int contracted);\r
+static void _view_update(Evas_Object *obj);\r
static void _set_label(Evas_Object *obj, const char* str);\r
+static void _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State state);\r
static void _change_current_button(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_obj(Evas_Object *obj, Evas_Object *btn);\r
static void _del_button_item(Elm_Multibuttonentry_Item *item);\r
static void _del_button(Evas_Object *obj);\r
-static Elm_Multibuttonentry_Item* _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, const Elm_Multibuttonentry_Item *reference, void *data);\r
+static Elm_Multibuttonentry_Item* _add_button_item(Evas_Object *obj, const 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
+//static void _entry_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);\r
+//static void _entry_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);\r
\r
\r
static void\r
}\r
\r
static void\r
+_on_focus_hook(void *data __UNUSED__, Evas_Object *obj)\r
+{\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ if (!wd) return;\r
+\r
+ _view_update(obj);\r
+}\r
+\r
+static void\r
_sizing_eval(Evas_Object *obj)\r
{\r
Widget_Data *wd = elm_widget_data_get(obj);\r
Evas_Coord minw = -1, minh = -1;\r
- //Evas_Coord w, h;\r
if (!wd) return;\r
\r
- //edje_object_size_min_restricted_calc(wd->base, &minw, &minh, minw, minh);\r
- //evas_object_size_hint_min_get(obj, &w, &h);\r
- \r
evas_object_size_hint_min_get(wd->box, &minw, &minh);\r
evas_object_size_hint_min_set(obj, minw, minh);\r
-\r
- //if (w > minw) minw = w;\r
- //if (h > minh) minh = h;\r
- //evas_object_size_hint_min_set(obj, minw, minh);\r
}\r
\r
static void \r
\r
wd->w_box = w;\r
wd->h_box = h;\r
+\r
+ _view_update(data);\r
}\r
\r
static void\r
Widget_Data *wd = elm_widget_data_get(obj);\r
if(!wd || !wd->base) return;\r
\r
- if(wd->box)\r
- {\r
+ if(wd->box){\r
evas_object_event_callback_add(wd->box, EVAS_CALLBACK_RESIZE, _resize_cb, obj);\r
evas_object_event_callback_add(wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hint_cb, obj);\r
}\r
+\r
+/*\r
+ if(wd->entry){\r
+ evas_object_smart_callback_add(wd->entry, "focused", _entry_focused, obj);\r
+ evas_object_smart_callback_add(wd->entry, "unfocused", _entry_unfocused, obj);\r
+ }\r
+*/\r
}\r
\r
static void\r
+_contracted_state_set(Evas_Object *obj, int contracted)\r
+{\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ Eina_List *l;\r
+ Elm_Multibuttonentry_Item *item;\r
+ if (!wd || !wd->box) return;\r
+\r
+ if(wd->contracted == contracted) return;\r
+\r
+ elm_scrolled_entry_entry_set(wd->entry, "");\r
+\r
+ if(contracted == 1){ \r
+ Evas_Coord w=0, w_label=0;\r
+ \r
+ // unpack all items and entry\r
+ EINA_LIST_FOREACH(wd->items, l, item) {\r
+ if (item) {\r
+ elm_box_unpack(wd->box, item->button);\r
+ evas_object_hide(item->button);\r
+ item->visible = EINA_FALSE;\r
+ }\r
+ }\r
+ elm_box_unpack(wd->box, wd->entry);\r
+ evas_object_hide(wd->entry);\r
+\r
+ \r
+ // pack buttons only 1line\r
+ w = wd->w_box;\r
+\r
+ // w -= w_label\r
+ if(wd->label) \r
+ evas_object_geometry_get(wd->label, NULL, NULL, &w_label, NULL);\r
+ w -= w_label;\r
+\r
+ // w -= w_btns \r
+ item = NULL;\r
+ int count = eina_list_count(wd->items);\r
+ EINA_LIST_FOREACH(wd->items, l, item) {\r
+ if (item) {\r
+ int w_label_count = 0;\r
+ char buf[MAX_STR] = {0,};\r
+\r
+ elm_box_pack_end(wd->box, item->button);\r
+ evas_object_show(item->button);\r
+ item->visible = EINA_TRUE;\r
+ \r
+ w -= item->vw;\r
+ count--;\r
+ \r
+ if(count > 0){\r
+ snprintf(buf, sizeof(buf), "... + %d", count);\r
+ elm_label_label_set(wd->end, buf);\r
+ evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
+ }\r
+\r
+ if(w < 0 || w < w_label_count){\r
+ elm_box_unpack(wd->box, item->button);\r
+ evas_object_hide(item->button);\r
+ item->visible = EINA_FALSE;\r
+\r
+ count++;\r
+ snprintf(buf, sizeof(buf), "... + %d", count);\r
+ elm_label_label_set(wd->end, buf);\r
+ evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
+\r
+ elm_box_pack_end(wd->box, wd->end);\r
+ evas_object_show(wd->end);\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ }else{\r
+ // unpack last label\r
+ elm_box_unpack(wd->box, wd->end);\r
+ evas_object_hide(wd->end);\r
+\r
+ // pack remain btns\r
+ item = NULL;\r
+ EINA_LIST_FOREACH(wd->items, l, item) {\r
+ if (item && !item->visible){\r
+ elm_box_pack_end(wd->box, item->button);\r
+ evas_object_show(item->button);\r
+ }\r
+ }\r
+\r
+ // pack entry\r
+ elm_box_pack_end(wd->box, wd->entry);\r
+ evas_object_show(wd->entry);\r
+ }\r
+\r
+ wd->contracted = contracted;\r
+ evas_object_smart_callback_call(obj, "contracted,state,changed", wd->contracted);\r
+}\r
+\r
+static void \r
+_view_update(Evas_Object *obj)\r
+{ \r
+ Widget_Data *wd = elm_widget_data_get(obj); \r
+ Evas_Coord w_label = 0, h_label = 0, w = 0, h = 0;\r
+ if (!wd || !wd->box || !wd->entry) return;\r
+\r
+ if(wd->contracted == 1){\r
+ _contracted_state_set(obj, 0);\r
+ _contracted_state_set(obj, 1);\r
+ }\r
+\r
+ if (wd->guidetext && (wd->contracted != 1)){\r
+ if(!eina_list_count(wd->items)){\r
+ if(elm_widget_focus_get(obj)){\r
+ elm_box_unpack(wd->box, wd->entry);\r
+ elm_box_unpack(wd->box, wd->guidetext);\r
+ evas_object_hide(wd->guidetext);\r
+ \r
+ elm_box_pack_end(wd->box, wd->entry);\r
+ evas_object_show(wd->entry);\r
+ \r
+ //elm_widget_focus_set(wd->entry, EINA_TRUE); //FIXME\r
+ }else{\r
+ elm_box_unpack(wd->box, wd->guidetext);\r
+ elm_box_unpack(wd->box, wd->entry);\r
+ evas_object_hide(wd->entry);\r
+\r
+ elm_box_pack_end(wd->box, wd->guidetext); \r
+ evas_object_show(wd->guidetext);\r
+ }\r
+ }else{\r
+ elm_box_unpack(wd->box, wd->entry);\r
+ elm_box_unpack(wd->box, wd->guidetext);\r
+ evas_object_hide(wd->guidetext);\r
+ \r
+ elm_box_pack_end(wd->box, wd->entry);\r
+ evas_object_show(wd->entry);\r
+ }\r
+ }\r
+}\r
+\r
+/*\r
+static void\r
+_entry_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)\r
+{\r
+ printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);\r
+ //if(data) _view_update(data);\r
+}\r
+\r
+static void\r
+_entry_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)\r
+{\r
+ printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);\r
+ //if(data) _view_update(data);\r
+}\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
\r
if(!wd->label){\r
if(!(wd->label = elm_label_add(obj))) return;\r
- elm_object_style_set(wd->label, "extended/multibuttonentry_mainlabel");\r
+ elm_object_style_set(wd->label, "extended/multibuttonentry_default");\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_weight_set(wd->label, 0.0, EVAS_HINT_EXPAND);\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
+ _view_update(obj);\r
+}\r
+\r
+static void\r
+_set_guidetext(Evas_Object *obj, const char* str)\r
+{\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ if(!wd || !str) return;\r
+\r
+ if(!wd->guidetext){\r
+ if(!(wd->guidetext = edje_object_add(evas_object_evas_get(obj)))) return;\r
+ _elm_theme_object_set(obj, wd->guidetext, "multibuttonentry", "guidetext", elm_widget_style_get(obj));\r
+ evas_object_size_hint_min_set(wd->guidetext, 350, 0);\r
+ evas_object_size_hint_weight_set(wd->guidetext, 0.0, EVAS_HINT_EXPAND);\r
+ evas_object_size_hint_align_set(wd->guidetext, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
+ }\r
+\r
+ if(wd->guidetext) edje_object_part_text_set(wd->guidetext, "elm.text", str);\r
+ _view_update(obj);\r
}\r
\r
static void\r
Widget_Data *wd = elm_widget_data_get(obj);\r
if(!wd || !wd->box || !wd->entry) return NULL;\r
\r
+ if(wd->contracted == 1) 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
\r
// add label\r
label = elm_label_add(obj);\r
- elm_object_style_set(label, "extended/multibuttonentry_buttonlabel");\r
+ elm_object_style_set(label, "extended/multibuttonentry_button");\r
elm_label_label_set(label, str);\r
elm_label_ellipsis_set(label, EINA_TRUE);\r
edje_object_part_swallow(btn, "elm.label", label);\r
item->data = data;\r
item->rw = w_btn;\r
item->vw =(MAX_W_BTN < w_btn) ? MAX_W_BTN : w_btn; \r
+ item->visible = EINA_TRUE;\r
\r
switch(pos){\r
case MULTIBUTONENTRY_POS_START:\r
- elm_box_pack_after(wd->box, btn, wd->label);\r
wd->items = eina_list_prepend(wd->items, item);\r
+ _view_update(obj);\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
wd->items = eina_list_append(wd->items, item);\r
+ _view_update(obj);\r
+ elm_box_pack_before(wd->box, btn, wd->entry);\r
break;\r
case MULTIBUTONENTRY_POS_BEFORE:\r
if(reference){ \r
- elm_box_pack_before(wd->box, btn, reference->button);\r
wd->items = eina_list_prepend_relative(wd->items, item, reference);\r
+ _view_update(obj);\r
+ elm_box_pack_before(wd->box, btn, reference->button);\r
}else{\r
- elm_box_pack_before(wd->box, btn, wd->entry);\r
wd->items = eina_list_append(wd->items, item);\r
+ _view_update(obj);\r
+ elm_box_pack_before(wd->box, btn, wd->entry);\r
}\r
break;\r
case MULTIBUTONENTRY_POS_AFTER:\r
if(reference){ \r
- elm_box_pack_after(wd->box, btn, reference->button);\r
wd->items = eina_list_append_relative(wd->items, item, reference);\r
+ _view_update(obj);\r
+ elm_box_pack_after(wd->box, btn, reference->button);\r
}else{ \r
- elm_box_pack_before(wd->box, btn, wd->entry);\r
wd->items = eina_list_append(wd->items, item);\r
+ _view_update(obj);\r
+ elm_box_pack_before(wd->box, btn, wd->entry);\r
}\r
break;\r
default:\r
strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);\r
str[MAX_STR - 1]= 0;\r
\r
- if((strcmp(str, "") == 0) && ((strcmp(ev->keyname, "BackSpace") == 0)||(strcmp(ev->keyname, "BackSpace(") == 0))){ \r
+ if((wd->n_str == 0) && (strcmp(str, "") == 0) && ((strcmp(ev->keyname, "BackSpace") == 0)||(strcmp(ev->keyname, "BackSpace(") == 0))){ \r
_del_button(data); \r
}else if((strcmp(str, "") != 0) && (strcmp(ev->keyname, "KP_Enter") == 0 ||strcmp(ev->keyname, "Return") == 0 )){\r
_add_button(data, str);\r
+ wd->n_str = 0;\r
+ return;\r
}else{\r
//\r
}\r
+\r
+ wd->n_str = strlen(str); \r
}\r
\r
static void \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_size_hint_min_set(wd->entry, MIN_W_ENTRY, 0);\r
evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, obj);\r
evas_object_size_hint_weight_set(wd->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);\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
+ if(!wd->end){\r
+ if(!(wd->end = elm_label_add(obj))) return;\r
+ elm_object_style_set(wd->end, "extended/multibuttonentry_default");\r
+ }\r
}\r
\r
/**\r
\r
elm_widget_del_hook_set(obj, _del_hook);\r
elm_widget_theme_hook_set(obj, _theme_hook);\r
+ elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);\r
\r
wd->base = edje_object_add(e);\r
_elm_theme_object_set(obj, wd->base, "multibuttonentry", "base", "default");\r
elm_widget_resize_object_set(obj, wd->base);\r
\r
+ wd->contracted = 0;\r
+ wd->n_str = 0;\r
+ \r
_view_init(obj);\r
_event_init(obj);\r
\r
}\r
\r
/**\r
+ * Get the entry of the multibuttonentry object\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @return The entry object, or NULL if none\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI Evas_Object *\r
+elm_multibuttonentry_entry_get(Evas_Object *obj)\r
+{\r
+ ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ if (!wd) return NULL;\r
+\r
+ return wd->entry;\r
+}\r
+\r
+/**\r
* Get the label\r
*\r
* @param obj The multibuttonentry object\r
}\r
\r
/**\r
- * Get the entry of the multibuttonentry object\r
+ * Get the guide text\r
*\r
* @param obj The multibuttonentry object\r
- * @return The entry object, or NULL if none\r
+ * @return The guide text, or NULL if none\r
*\r
* @ingroup Multibuttonentry\r
*/\r
-EAPI Evas_Object *\r
-elm_multibuttonentry_entry_get(Evas_Object *obj)\r
+EAPI const char *\r
+elm_multibuttonentry_guide_text_get(Evas_Object *obj)\r
{\r
ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
Widget_Data *wd = elm_widget_data_get(obj);\r
if (!wd) return NULL;\r
\r
- return wd->entry;\r
+ if(wd->guidetext){\r
+ return elm_label_label_get(wd->guidetext);\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ * Set the guide text\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @param label The guide text string\r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void\r
+elm_multibuttonentry_guide_text_set(Evas_Object *obj, const char *guidetext)\r
+{\r
+ ELM_CHECK_WIDTYPE(obj, widtype);\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ if (!wd || !guidetext) return;\r
+\r
+ _set_guidetext(obj, guidetext); \r
+}\r
+\r
+/**\r
+ * Get the value of contracted state.\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @param the value of contracted state. \r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI int\r
+elm_multibuttonentry_contracted_state_get(Evas_Object *obj)\r
+{\r
+ ELM_CHECK_WIDTYPE(obj, widtype) -1;\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ if (!wd) return -1;\r
+\r
+ return wd->contracted;\r
+}\r
+\r
+/**\r
+ * Set/Unset the multibuttonentry to contracted state of single line\r
+ *\r
+ * @param obj The multibuttonentry object\r
+ * @param the value of contracted state. set this to 1 to set the multibuttonentry to contracted state of single line. set this to 0 to unset the contracted state. \r
+ *\r
+ * @ingroup Multibuttonentry\r
+ */\r
+EAPI void\r
+elm_multibuttonentry_contracted_state_set(Evas_Object *obj, int contracted)\r
+{\r
+ ELM_CHECK_WIDTYPE(obj, widtype);\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ if (!wd || !wd->box || (wd->contracted == contracted)) return;\r
+\r
+ _contracted_state_set(obj, contracted);\r
}\r
\r
/**\r