1 #include <Elementary.h>
\r
2 #include "elm_priv.h"
\r
5 * @defgroup Multibuttonentry Multibuttonentry
\r
6 * @ingroup Elementary
\r
8 * This is a Multibuttonentry.
\r
12 #define MAX_STR 256
\r
13 #define MAX_W_BTN 200
\r
14 #define MIN_W_ENTRY 20
\r
17 typedef enum _Multibuttonentry_Pos
\r
19 MULTIBUTONENTRY_POS_START,
\r
20 MULTIBUTONENTRY_POS_END,
\r
21 MULTIBUTONENTRY_POS_BEFORE,
\r
22 MULTIBUTONENTRY_POS_AFTER,
\r
23 MULTIBUTONENTRY_POS_NUM
\r
24 }Multibuttonentry_Pos;
\r
26 typedef enum _Multibuttonentry_Button_State
\r
28 MULTIBUTONENTRY_BUTTON_STATE_DEFAULT,
\r
29 MULTIBUTONENTRY_BUTTON_STATE_SELECTED,
\r
30 MULTIBUTONENTRY_BUTTON_STATE_NUM
\r
31 }Multibuttonentry_Button_State;
\r
34 struct _Multibuttonentry_Item {
\r
35 Evas_Object *multibuttonentry;
\r
36 Evas_Object *button;
\r
39 Evas_Coord vw, rw; // vw: visual width, real width
\r
40 Eina_Bool visible: 1;
\r
43 typedef struct _Widget_Data Widget_Data;
\r
44 struct _Widget_Data {
\r
49 Evas_Object *guidetext;
\r
50 Evas_Object *end; // used to represent the total number of invisible buttons
\r
57 Evas_Coord w_box, h_box;
\r
59 Eina_Bool focused: 1;
\r
62 static const char *widtype = NULL;
\r
64 static void _del_hook(Evas_Object *obj);
\r
65 static void _theme_hook(Evas_Object *obj);
\r
66 static void _on_focus_hook(void *data __UNUSED__, Evas_Object *obj);
\r
67 static void _sizing_eval(Evas_Object *obj);
\r
68 static void _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void *event);
\r
69 static void _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event);
\r
70 static void _event_init(Evas_Object *obj);
\r
71 static void _contracted_state_set(Evas_Object *obj, int contracted);
\r
72 static void _view_update(Evas_Object *obj);
\r
73 static void _set_label(Evas_Object *obj, const char* str);
\r
74 static void _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State state);
\r
75 static void _change_current_button(Evas_Object *obj, Evas_Object *btn);
\r
76 static void _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
\r
77 static void _del_button_obj(Evas_Object *obj, Evas_Object *btn);
\r
78 static void _del_button_item(Elm_Multibuttonentry_Item *item);
\r
79 static void _del_button(Evas_Object *obj);
\r
80 static Elm_Multibuttonentry_Item* _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, const Elm_Multibuttonentry_Item *reference, void *data);
\r
81 static void _add_button(Evas_Object *obj, char *str);
\r
82 static void _evas_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info );
\r
83 static void _view_init(Evas_Object *obj);
\r
84 //static void _entry_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
\r
85 //static void _entry_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
\r
89 _del_hook(Evas_Object *obj)
\r
91 Widget_Data *wd = elm_widget_data_get(obj);
\r
95 Elm_Multibuttonentry_Item *item;
\r
96 EINA_LIST_FREE(wd->items, item) {
\r
97 _del_button_obj(obj, item->button);
\r
102 wd->current = NULL;
\r
104 if(wd->entry) evas_object_del(wd->entry);
\r
105 if(wd->label) evas_object_del(wd->label);
\r
106 if(wd->guidetext) evas_object_del(wd->guidetext);
\r
107 if(wd->end) evas_object_del(wd->end);
\r
111 _theme_hook(Evas_Object *obj)
\r
113 Widget_Data *wd = elm_widget_data_get(obj);
\r
115 Elm_Multibuttonentry_Item *item;
\r
118 _elm_theme_object_set(obj, wd->base, "multibuttonentry", "base", elm_widget_style_get(obj));
\r
119 if(wd->box) edje_object_part_swallow(wd->base, "box.swallow", wd->box);
\r
120 edje_object_scale_set(wd->base, elm_widget_scale_get(obj) * _elm_config->scale);
\r
122 EINA_LIST_FOREACH(wd->items, l, item) {
\r
123 if(item->button) _elm_theme_object_set(obj, item->button, "multibuttonentry", "btn", elm_widget_style_get(obj));
\r
124 if(item->label) edje_object_part_swallow(item->button, "elm.label", item->label);
\r
125 edje_object_scale_set(item->button, elm_widget_scale_get(obj) * _elm_config->scale);
\r
132 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
\r
134 Widget_Data *wd = elm_widget_data_get(obj);
\r
141 _sizing_eval(Evas_Object *obj)
\r
143 Widget_Data *wd = elm_widget_data_get(obj);
\r
144 Evas_Coord minw = -1, minh = -1;
\r
147 evas_object_size_hint_min_get(wd->box, &minw, &minh);
\r
148 evas_object_size_hint_min_set(obj, minw, minh);
\r
152 _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void *event)
\r
154 Evas_Object *eo = (Evas_Object *)data;
\r
155 Widget_Data *wd = elm_widget_data_get(data);
\r
162 _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event)
\r
164 Widget_Data *wd = elm_widget_data_get(data);
\r
168 evas_object_geometry_get(wd->box, NULL, NULL, &w, &h);
\r
170 if(wd->h_box < h) evas_object_smart_callback_call(data, "expanded", NULL);
\r
171 else if(wd->h_box > h) evas_object_smart_callback_call(data, "contracted", NULL);
\r
177 _view_update(data);
\r
181 _event_init(Evas_Object *obj)
\r
183 Widget_Data *wd = elm_widget_data_get(obj);
\r
184 if(!wd || !wd->base) return;
\r
187 evas_object_event_callback_add(wd->box, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
\r
188 evas_object_event_callback_add(wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hint_cb, obj);
\r
193 evas_object_smart_callback_add(wd->entry, "focused", _entry_focused, obj);
\r
194 evas_object_smart_callback_add(wd->entry, "unfocused", _entry_unfocused, obj);
\r
200 _contracted_state_set(Evas_Object *obj, int contracted)
\r
202 Widget_Data *wd = elm_widget_data_get(obj);
\r
204 Elm_Multibuttonentry_Item *item;
\r
205 if (!wd || !wd->box) return;
\r
207 if(wd->contracted == contracted) return;
\r
209 elm_scrolled_entry_entry_set(wd->entry, "");
\r
211 if(contracted == 1){
\r
212 Evas_Coord w=0, w_label=0;
\r
214 // unpack all items and entry
\r
215 EINA_LIST_FOREACH(wd->items, l, item) {
\r
217 elm_box_unpack(wd->box, item->button);
\r
218 evas_object_hide(item->button);
\r
219 item->visible = EINA_FALSE;
\r
222 elm_box_unpack(wd->box, wd->entry);
\r
223 evas_object_hide(wd->entry);
\r
226 // pack buttons only 1line
\r
231 evas_object_geometry_get(wd->label, NULL, NULL, &w_label, NULL);
\r
236 int count = eina_list_count(wd->items);
\r
237 EINA_LIST_FOREACH(wd->items, l, item) {
\r
239 int w_label_count = 0;
\r
240 char buf[MAX_STR] = {0,};
\r
242 elm_box_pack_end(wd->box, item->button);
\r
243 evas_object_show(item->button);
\r
244 item->visible = EINA_TRUE;
\r
250 snprintf(buf, sizeof(buf), "... + %d", count);
\r
251 elm_label_label_set(wd->end, buf);
\r
252 evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);
\r
255 if(w < 0 || w < w_label_count){
\r
256 elm_box_unpack(wd->box, item->button);
\r
257 evas_object_hide(item->button);
\r
258 item->visible = EINA_FALSE;
\r
261 snprintf(buf, sizeof(buf), "... + %d", count);
\r
262 elm_label_label_set(wd->end, buf);
\r
263 evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);
\r
265 elm_box_pack_end(wd->box, wd->end);
\r
266 evas_object_show(wd->end);
\r
274 // unpack last label
\r
275 elm_box_unpack(wd->box, wd->end);
\r
276 evas_object_hide(wd->end);
\r
278 // pack remain btns
\r
280 EINA_LIST_FOREACH(wd->items, l, item) {
\r
281 if (item && !item->visible){
\r
282 elm_box_pack_end(wd->box, item->button);
\r
283 evas_object_show(item->button);
\r
288 elm_box_pack_end(wd->box, wd->entry);
\r
289 evas_object_show(wd->entry);
\r
292 wd->contracted = contracted;
\r
293 evas_object_smart_callback_call(obj, "contracted,state,changed", wd->contracted);
\r
297 _view_update(Evas_Object *obj)
\r
299 Widget_Data *wd = elm_widget_data_get(obj);
\r
300 if (!wd || !wd->box || !wd->entry) return;
\r
302 if(wd->contracted == 1){
\r
303 _contracted_state_set(obj, 0);
\r
304 _contracted_state_set(obj, 1);
\r
307 if (wd->guidetext && (wd->contracted != 1)){
\r
308 if(!eina_list_count(wd->items)){
\r
309 if(elm_widget_focus_get(obj)){
\r
310 elm_box_unpack(wd->box, wd->entry);
\r
311 elm_box_unpack(wd->box, wd->guidetext);
\r
312 evas_object_hide(wd->guidetext);
\r
314 elm_box_pack_end(wd->box, wd->entry);
\r
315 evas_object_show(wd->entry);
\r
317 //elm_widget_focus_set(wd->entry, EINA_TRUE); //FIXME
\r
319 elm_box_unpack(wd->box, wd->guidetext);
\r
320 elm_box_unpack(wd->box, wd->entry);
\r
321 evas_object_hide(wd->entry);
\r
323 elm_box_pack_end(wd->box, wd->guidetext);
\r
324 evas_object_show(wd->guidetext);
\r
327 elm_box_unpack(wd->box, wd->entry);
\r
328 elm_box_unpack(wd->box, wd->guidetext);
\r
329 evas_object_hide(wd->guidetext);
\r
331 elm_box_pack_end(wd->box, wd->entry);
\r
332 evas_object_show(wd->entry);
\r
339 _entry_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
\r
341 printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);
\r
342 //if(data) _view_update(data);
\r
346 _entry_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
\r
348 printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);
\r
349 //if(data) _view_update(data);
\r
354 _set_label(Evas_Object *obj, const char* str)
\r
356 Widget_Data *wd = elm_widget_data_get(obj);
\r
357 if(!wd || !str) return;
\r
360 if(!(wd->label = elm_label_add(obj))) return;
\r
361 elm_object_style_set(wd->label, "extended/multibuttonentry_default");
\r
362 elm_label_ellipsis_set(wd->label, EINA_TRUE);
\r
363 elm_label_wrap_width_set(wd->label, 180);
\r
364 elm_label_text_align_set(wd->label, "left");
\r
365 evas_object_size_hint_weight_set(wd->label, 0.0, EVAS_HINT_EXPAND);
\r
366 evas_object_size_hint_align_set(wd->label, EVAS_HINT_FILL, EVAS_HINT_FILL);
\r
367 if(wd->box) elm_box_pack_start(wd->box, wd->label);
\r
368 evas_object_show(wd->label);
\r
371 elm_label_label_set(wd->label, str);
\r
376 _set_guidetext(Evas_Object *obj, const char* str)
\r
378 Widget_Data *wd = elm_widget_data_get(obj);
\r
379 if(!wd || !str) return;
\r
381 if(!wd->guidetext){
\r
382 if(!(wd->guidetext = edje_object_add(evas_object_evas_get(obj)))) return;
\r
383 _elm_theme_object_set(obj, wd->guidetext, "multibuttonentry", "guidetext", elm_widget_style_get(obj));
\r
384 evas_object_size_hint_min_set(wd->guidetext, 280, 0);
\r
385 evas_object_size_hint_weight_set(wd->guidetext, 0.0, EVAS_HINT_EXPAND);
\r
386 evas_object_size_hint_align_set(wd->guidetext, EVAS_HINT_FILL, EVAS_HINT_FILL);
\r
389 if(wd->guidetext) edje_object_part_text_set(wd->guidetext, "elm.text", str);
\r
394 _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State state)
\r
396 Widget_Data *wd = elm_widget_data_get(obj);
\r
397 Elm_Multibuttonentry_Item *item = NULL;
\r
401 item = eina_list_data_get(wd->current);
\r
403 if(item && item->button){
\r
405 case MULTIBUTONENTRY_BUTTON_STATE_DEFAULT:
\r
406 edje_object_signal_emit(item->button, "default", "");
\r
407 wd->current = NULL;
\r
409 case MULTIBUTONENTRY_BUTTON_STATE_SELECTED:
\r
410 edje_object_signal_emit(item->button, "focused", "");
\r
411 evas_object_smart_callback_call(obj, "selected", item);
\r
414 edje_object_signal_emit(item->button, "default", "");
\r
415 wd->current = NULL;
\r
422 _change_current_button(Evas_Object *obj, Evas_Object *btn)
\r
424 Widget_Data *wd = elm_widget_data_get(obj);
\r
426 Elm_Multibuttonentry_Item *item;
\r
429 // change the state of previous button to "default"
\r
430 _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_DEFAULT);
\r
432 // change the current
\r
433 EINA_LIST_FOREACH(wd->items, l, item) {
\r
434 if(item->button == btn){
\r
440 // chagne the state of current button to "focused"
\r
441 _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_SELECTED);
\r
446 _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
\r
448 Widget_Data *wd = elm_widget_data_get(data);
\r
449 static char str[MAX_STR];
\r
452 strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);
\r
453 str[MAX_STR - 1]= 0;
\r
456 _add_button(data, str);
\r
458 _change_current_button(data, obj);
\r
462 _del_button_obj(Evas_Object *obj, Evas_Object *btn)
\r
464 Widget_Data *wd = elm_widget_data_get(obj);
\r
465 Evas_Object *label;
\r
466 if(!wd || !btn) return;
\r
470 label = edje_object_part_swallow_get(btn, "elm.label");
\r
471 edje_object_part_unswallow(btn, label);
\r
472 evas_object_del(label);
\r
475 evas_object_del(btn);
\r
480 _del_button_item(Elm_Multibuttonentry_Item *item)
\r
483 Elm_Multibuttonentry_Item *_item;
\r
487 Evas_Object *obj = item->multibuttonentry;
\r
488 wd = elm_widget_data_get(obj);
\r
491 EINA_LIST_FOREACH(wd->items, l, _item) {
\r
492 if (_item == item) {
\r
493 wd->items = eina_list_remove(wd->items, _item);
\r
494 elm_box_unpack(wd->box, _item->button);
\r
495 evas_object_smart_callback_call(obj, "deleted", _item);
\r
496 _del_button_obj(obj, _item->button);
\r
498 if(wd->current == l)
\r
499 wd->current = NULL;
\r
506 _del_button(Evas_Object *obj)
\r
508 Widget_Data *wd = elm_widget_data_get(obj);
\r
509 Elm_Multibuttonentry_Item *item;
\r
510 if(!wd || !wd->items) return;
\r
513 // let the last button focus
\r
514 item = eina_list_data_get(eina_list_last(wd->items));
\r
515 if(item->button) _change_current_button(obj, item->button);
\r
517 item = eina_list_data_get(wd->current);
\r
519 _del_button_item(item);
\r
524 static Elm_Multibuttonentry_Item*
\r
525 _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, const Elm_Multibuttonentry_Item *reference, void *data)
\r
527 Elm_Multibuttonentry_Item *item;
\r
529 Evas_Object *label;
\r
530 Evas_Coord w_label, h_label, w_btn, h_btn, padding_outer, padding_inner;
\r
531 Widget_Data *wd = elm_widget_data_get(obj);
\r
532 if(!wd || !wd->box || !wd->entry) return NULL;
\r
534 if(wd->contracted == 1) return NULL;
\r
537 btn = edje_object_add(evas_object_evas_get(obj));
\r
538 _elm_theme_object_set(obj, btn, "multibuttonentry", "btn", elm_widget_style_get(obj));
\r
539 edje_object_signal_callback_add(btn, "clicked", "elm", _button_clicked, obj);
\r
540 evas_object_size_hint_weight_set(btn, 0.0, 0.0);
\r
541 evas_object_show(btn);
\r
544 label = elm_label_add(obj);
\r
545 elm_object_style_set(label, "extended/multibuttonentry_button");
\r
546 elm_label_label_set(label, str);
\r
547 elm_label_ellipsis_set(label, EINA_TRUE);
\r
548 edje_object_part_swallow(btn, "elm.label", label);
\r
550 // decide the size of button
\r
551 evas_object_size_hint_min_get(label, &w_label, &h_label);
\r
552 edje_object_part_geometry_get(btn, "elm.base", NULL, NULL, NULL, &h_btn);
\r
553 edje_object_part_geometry_get(btn, "left.padding", NULL, NULL, &padding_outer, NULL);
\r
554 edje_object_part_geometry_get(btn, "left.inner.padding", NULL, NULL, &padding_inner, NULL);
\r
555 w_btn = w_label + 2*padding_outer + 2*padding_inner;
\r
557 // append item list
\r
558 item = ELM_NEW(Elm_Multibuttonentry_Item);
\r
560 item->multibuttonentry = obj;
\r
561 item->button = btn;
\r
562 item->label = label;
\r
565 item->vw =(MAX_W_BTN < w_btn) ? MAX_W_BTN : w_btn;
\r
566 item->visible = EINA_TRUE;
\r
569 case MULTIBUTONENTRY_POS_START:
\r
570 wd->items = eina_list_prepend(wd->items, item);
\r
572 elm_box_pack_after(wd->box, btn, wd->label);
\r
574 case MULTIBUTONENTRY_POS_END:
\r
575 wd->items = eina_list_append(wd->items, item);
\r
577 elm_box_pack_before(wd->box, btn, wd->entry);
\r
579 case MULTIBUTONENTRY_POS_BEFORE:
\r
581 wd->items = eina_list_prepend_relative(wd->items, item, reference);
\r
583 elm_box_pack_before(wd->box, btn, reference->button);
\r
585 wd->items = eina_list_append(wd->items, item);
\r
587 elm_box_pack_before(wd->box, btn, wd->entry);
\r
590 case MULTIBUTONENTRY_POS_AFTER:
\r
592 wd->items = eina_list_append_relative(wd->items, item, reference);
\r
594 elm_box_pack_after(wd->box, btn, reference->button);
\r
596 wd->items = eina_list_append(wd->items, item);
\r
598 elm_box_pack_before(wd->box, btn, wd->entry);
\r
606 //resize btn and label
\r
607 evas_object_resize(btn, item->vw, h_btn);
\r
608 evas_object_size_hint_min_set(btn, item->vw, h_btn);
\r
609 if((item->rw != item->vw) && (item->vw - 2*padding_outer - 4*padding_inner >=0)){
\r
610 evas_object_resize(label, item->vw - 2*padding_outer - 2*padding_inner, h_label);
\r
611 elm_label_wrap_width_set(label, item->vw - 2*padding_outer - 4*padding_inner );
\r
614 evas_object_smart_callback_call(obj, "added", item);
\r
620 _add_button(Evas_Object *obj, char *str)
\r
622 Widget_Data *wd = elm_widget_data_get(obj);
\r
625 //remove entry text
\r
626 elm_scrolled_entry_entry_set(wd->entry, "");
\r
629 _add_button_item(obj, str, MULTIBUTONENTRY_POS_END, NULL, NULL);
\r
633 _evas_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info )
\r
635 Widget_Data *wd = elm_widget_data_get(data);
\r
636 Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;
\r
637 static char str[MAX_STR];
\r
638 if(!wd || !wd->base || !wd->box) return;
\r
640 strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);
\r
641 str[MAX_STR - 1]= 0;
\r
643 if((wd->n_str == 0) && (strcmp(str, "") == 0) && ((strcmp(ev->keyname, "BackSpace") == 0)||(strcmp(ev->keyname, "BackSpace(") == 0))){
\r
644 _del_button(data);
\r
645 }else if((strcmp(str, "") != 0) && (strcmp(ev->keyname, "KP_Enter") == 0 ||strcmp(ev->keyname, "Return") == 0 )){
\r
646 _add_button(data, str);
\r
653 wd->n_str = strlen(str);
\r
657 _view_init(Evas_Object *obj)
\r
659 Widget_Data *wd = elm_widget_data_get(obj);
\r
663 if(!(wd->box = elm_box_add(obj))) return;
\r
664 elm_widget_sub_object_add(obj, wd->box);
\r
665 elm_box_extended_set(wd->box, EINA_TRUE);
\r
666 elm_box_homogenous_set(wd->box, EINA_FALSE);
\r
667 edje_object_part_swallow(wd->base, "box.swallow", wd->box);
\r
671 if(!(wd->entry = elm_scrolled_entry_add(obj))) return;
\r
672 elm_scrolled_entry_single_line_set(wd->entry, EINA_TRUE);
\r
673 elm_scrolled_entry_entry_set(wd->entry, "");
\r
674 elm_scrolled_entry_cursor_end_set(wd->entry);
\r
675 evas_object_size_hint_min_set(wd->entry, MIN_W_ENTRY, 0);
\r
676 evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, obj);
\r
677 evas_object_size_hint_weight_set(wd->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
\r
678 evas_object_size_hint_align_set(wd->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
\r
679 elm_box_pack_end(wd->box, wd->entry);
\r
680 evas_object_show(wd->entry);
\r
684 if(!(wd->end = elm_label_add(obj))) return;
\r
685 elm_object_style_set(wd->end, "extended/multibuttonentry_default");
\r
690 * Add a new multibuttonentry to the parent
\r
692 * @param parent The parent object
\r
693 * @return The new object or NULL if it cannot be created
\r
695 * @ingroup Multibuttonentry
\r
698 elm_multibuttonentry_add(Evas_Object *parent)
\r
703 if (!parent) return NULL;
\r
705 wd = ELM_NEW(Widget_Data);
\r
706 e = evas_object_evas_get(parent);
\r
707 if (!e) return NULL;
\r
708 obj = elm_widget_add(e);
\r
709 ELM_SET_WIDTYPE(widtype, "multibuttonentry");
\r
710 elm_widget_type_set(obj, "multibuttonentry");
\r
711 elm_widget_sub_object_add(parent, obj);
\r
712 elm_widget_data_set(obj, wd);
\r
714 elm_widget_del_hook_set(obj, _del_hook);
\r
715 elm_widget_theme_hook_set(obj, _theme_hook);
\r
716 elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
\r
718 wd->base = edje_object_add(e);
\r
719 _elm_theme_object_set(obj, wd->base, "multibuttonentry", "base", "default");
\r
720 elm_widget_resize_object_set(obj, wd->base);
\r
722 wd->contracted = 0;
\r
732 * Get the entry of the multibuttonentry object
\r
734 * @param obj The multibuttonentry object
\r
735 * @return The entry object, or NULL if none
\r
737 * @ingroup Multibuttonentry
\r
740 elm_multibuttonentry_entry_get(Evas_Object *obj)
\r
742 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
743 Widget_Data *wd = elm_widget_data_get(obj);
\r
744 if (!wd) return NULL;
\r
752 * @param obj The multibuttonentry object
\r
753 * @return The label, or NULL if none
\r
755 * @ingroup Multibuttonentry
\r
758 elm_multibuttonentry_label_get(Evas_Object *obj)
\r
760 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
761 Widget_Data *wd = elm_widget_data_get(obj);
\r
762 if (!wd) return NULL;
\r
765 return elm_label_label_get(wd->label);
\r
774 * @param obj The multibuttonentry object
\r
775 * @param label The text label string
\r
777 * @ingroup Multibuttonentry
\r
780 elm_multibuttonentry_label_set(Evas_Object *obj, const char *label)
\r
782 ELM_CHECK_WIDTYPE(obj, widtype);
\r
783 Widget_Data *wd = elm_widget_data_get(obj);
\r
784 if (!wd || !label) return;
\r
786 _set_label(obj, label);
\r
790 * Get the guide text
\r
792 * @param obj The multibuttonentry object
\r
793 * @return The guide text, or NULL if none
\r
795 * @ingroup Multibuttonentry
\r
798 elm_multibuttonentry_guide_text_get(Evas_Object *obj)
\r
800 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
801 Widget_Data *wd = elm_widget_data_get(obj);
\r
802 if (!wd) return NULL;
\r
805 return elm_label_label_get(wd->guidetext);
\r
812 * Set the guide text
\r
814 * @param obj The multibuttonentry object
\r
815 * @param label The guide text string
\r
817 * @ingroup Multibuttonentry
\r
820 elm_multibuttonentry_guide_text_set(Evas_Object *obj, const char *guidetext)
\r
822 ELM_CHECK_WIDTYPE(obj, widtype);
\r
823 Widget_Data *wd = elm_widget_data_get(obj);
\r
824 if (!wd || !guidetext) return;
\r
826 _set_guidetext(obj, guidetext);
\r
830 * Get the value of contracted state.
\r
832 * @param obj The multibuttonentry object
\r
833 * @param the value of contracted state.
\r
835 * @ingroup Multibuttonentry
\r
838 elm_multibuttonentry_contracted_state_get(Evas_Object *obj)
\r
840 ELM_CHECK_WIDTYPE(obj, widtype) -1;
\r
841 Widget_Data *wd = elm_widget_data_get(obj);
\r
842 if (!wd) return -1;
\r
844 return wd->contracted;
\r
848 * Set/Unset the multibuttonentry to contracted state of single line
\r
850 * @param obj The multibuttonentry object
\r
851 * @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
853 * @ingroup Multibuttonentry
\r
856 elm_multibuttonentry_contracted_state_set(Evas_Object *obj, int contracted)
\r
858 ELM_CHECK_WIDTYPE(obj, widtype);
\r
859 Widget_Data *wd = elm_widget_data_get(obj);
\r
860 if (!wd || !wd->box || (wd->contracted == contracted)) return;
\r
862 _contracted_state_set(obj, contracted);
\r
866 * Prepend a new item to the multibuttonentry
\r
868 * @param obj The multibuttonentry object
\r
869 * @param label The label of new item
\r
870 * @param data The ponter to the data to be attached
\r
871 * @return A handle to the item added or NULL if not possible
\r
873 * @ingroup Multibuttonentry
\r
875 EAPI Elm_Multibuttonentry_Item *
\r
876 elm_multibuttonentry_item_add_start(Evas_Object *obj, const char *label, void *data)
\r
878 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
879 Widget_Data *wd = elm_widget_data_get(obj);
\r
880 Elm_Multibuttonentry_Item *item;
\r
881 if (!wd || !label) return NULL;
\r
883 item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_START, NULL, data);
\r
888 * Append a new item to the multibuttonentry
\r
890 * @param obj The multibuttonentry object
\r
891 * @param label The label of new item
\r
892 * @param data The ponter to the data to be attached
\r
893 * @return A handle to the item added or NULL if not possible
\r
895 * @ingroup Multibuttonentry
\r
897 EAPI Elm_Multibuttonentry_Item *
\r
898 elm_multibuttonentry_item_add_end(Evas_Object *obj, const char *label, void *data)
\r
900 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
901 Widget_Data *wd = elm_widget_data_get(obj);
\r
902 Elm_Multibuttonentry_Item *item;
\r
903 if (!wd || !label) return NULL;
\r
905 item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_END, NULL, data);
\r
910 * Add a new item to the multibuttonentry before the indicated object
\r
913 * @param obj The multibuttonentry object
\r
914 * @param label The label of new item
\r
915 * @param before The item before which to add it
\r
916 * @param data The ponter to the data to be attached
\r
917 * @return A handle to the item added or NULL if not possible
\r
919 * @ingroup Multibuttonentry
\r
921 EAPI Elm_Multibuttonentry_Item *
\r
922 elm_multibuttonentry_item_add_before(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *before, void *data)
\r
924 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
925 Widget_Data *wd = elm_widget_data_get(obj);
\r
926 Elm_Multibuttonentry_Item *item;
\r
927 if (!wd || !label) return NULL;
\r
929 item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_BEFORE, before, data);
\r
934 * Add a new item to the multibuttonentry after the indicated object
\r
936 * @param obj The multibuttonentry object
\r
937 * @param label The label of new item
\r
938 * @param after The item after which to add it
\r
939 * @param data The ponter to the data to be attached
\r
940 * @return A handle to the item added or NULL if not possible
\r
942 * @ingroup Multibuttonentry
\r
944 EAPI Elm_Multibuttonentry_Item *
\r
945 elm_multibuttonentry_item_add_after(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *after, void *data)
\r
947 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
948 Widget_Data *wd = elm_widget_data_get(obj);
\r
949 Elm_Multibuttonentry_Item *item;
\r
950 if (!wd || !label) return NULL;
\r
952 item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_AFTER, after, data);
\r
957 * Get a list of items in the multibuttonentry
\r
959 * @param obj The multibuttonentry object
\r
960 * @return The list of items, or NULL if none
\r
962 * @ingroup Multibuttonentry
\r
964 EAPI const Eina_List *
\r
965 elm_multibuttonentry_items_get(Evas_Object *obj)
\r
967 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
968 Widget_Data *wd = elm_widget_data_get(obj);
\r
969 if (!wd) return NULL;
\r
974 * Get the first item in the multibuttonentry
\r
976 * @param obj The multibuttonentry object
\r
977 * @return The first item, or NULL if none
\r
979 * @ingroup Multibuttonentry
\r
981 EAPI Elm_Multibuttonentry_Item *
\r
982 elm_multibuttonentry_item_first_get(Evas_Object *obj)
\r
984 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
985 Widget_Data *wd = elm_widget_data_get(obj);
\r
986 if (!wd || !wd->items) return NULL;
\r
987 return eina_list_data_get(wd->items);
\r
991 * Get the last item in the multibuttonentry
\r
993 * @param obj The multibuttonentry object
\r
994 * @return The last item, or NULL if none
\r
996 * @ingroup Multibuttonentry
\r
998 EAPI Elm_Multibuttonentry_Item *
\r
999 elm_multibuttonentry_item_last_get(Evas_Object *obj)
\r
1001 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
1002 Widget_Data *wd = elm_widget_data_get(obj);
\r
1003 if (!wd || !wd->items) return NULL;
\r
1004 return eina_list_data_get(eina_list_last(wd->items));
\r
1008 * Get the selected item in the multibuttonentry
\r
1010 * @param obj The multibuttonentry object
\r
1011 * @return The selected item, or NULL if none
\r
1013 * @ingroup Multibuttonentry
\r
1015 EAPI Elm_Multibuttonentry_Item *
\r
1016 elm_multibuttonentry_item_selected_get(Evas_Object *obj)
\r
1018 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
1019 Widget_Data *wd = elm_widget_data_get(obj);
\r
1020 if (!wd || !wd->current) return NULL;
\r
1021 return eina_list_data_get(wd->current);
\r
1025 * Set the selected state of an item
\r
1027 * @param item The item
\r
1029 * @ingroup Multibuttonentry
\r
1032 elm_multibuttonentry_item_selected_set(Elm_Multibuttonentry_Item *item)
\r
1036 Elm_Multibuttonentry_Item *_item;
\r
1038 if (!item) return;
\r
1039 ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype);
\r
1040 wd = elm_widget_data_get(item->multibuttonentry);
\r
1043 EINA_LIST_FOREACH(wd->items, l, _item) {
\r
1044 if (_item == item) {
\r
1045 _change_current_button(item->multibuttonentry, item->button);
\r
1051 * unselect all of items.
\r
1053 * @param obj The multibuttonentry object
\r
1055 * @ingroup Multibuttonentry
\r
1058 elm_multibuttonentry_item_unselect_all(Evas_Object *obj)
\r
1060 ELM_CHECK_WIDTYPE(obj, widtype);
\r
1061 Widget_Data *wd = elm_widget_data_get(obj);
\r
1064 _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_DEFAULT);
\r
1068 * Remove all items in the multibuttonentry.
\r
1070 * @param obj The multibuttonentry object
\r
1072 * @ingroup Multibuttonentry
\r
1075 elm_multibuttonentry_items_del(Evas_Object *obj)
\r
1077 ELM_CHECK_WIDTYPE(obj, widtype);
\r
1078 Widget_Data *wd = elm_widget_data_get(obj);
\r
1082 Elm_Multibuttonentry_Item *item;
\r
1083 EINA_LIST_FREE(wd->items, item) {
\r
1084 elm_box_unpack(wd->box, item->button);
\r
1085 _del_button_obj(obj, item->button);
\r
1090 wd->current = NULL;
\r
1094 * Delete a given item
\r
1096 * @param item The item
\r
1098 * @ingroup Multibuttonentry
\r
1101 elm_multibuttonentry_item_del(Elm_Multibuttonentry_Item *item)
\r
1103 if (!item) return;
\r
1104 _del_button_item(item);
\r
1108 * Get the label of a given item
\r
1110 * @param item The item
\r
1111 * @return The label of a given item, or NULL if none
\r
1113 * @ingroup Multibuttonentry
\r
1116 elm_multibuttonentry_item_label_get(Elm_Multibuttonentry_Item *item)
\r
1120 Elm_Multibuttonentry_Item *_item;
\r
1122 if (!item) return NULL;
\r
1123 ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype) NULL;
\r
1124 wd = elm_widget_data_get(item->multibuttonentry);
\r
1125 if (!wd || !wd->items) return NULL;
\r
1127 EINA_LIST_FOREACH(wd->items, l, _item)
\r
1128 if (_item == item){
\r
1129 Evas_Object *label = edje_object_part_swallow_get(_item->button, "elm.label");
\r
1130 if(label) return elm_label_label_get(label);
\r
1137 * Set the label of a given item
\r
1139 * @param item The item
\r
1140 * @param label The text label string
\r
1142 * @ingroup Multibuttonentry
\r
1145 elm_multibuttonentry_item_label_set(Elm_Multibuttonentry_Item *item, const char *str)
\r
1149 Elm_Multibuttonentry_Item *_item;
\r
1151 if (!item || !str) return;
\r
1152 ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype);
\r
1153 wd = elm_widget_data_get(item->multibuttonentry);
\r
1154 if (!wd || !wd->items) return;
\r
1156 EINA_LIST_FOREACH(wd->items, l, _item)
\r
1157 if (_item == item) {
\r
1158 Evas_Object *label = edje_object_part_swallow_get(_item->button, "elm.label");
\r
1159 if(label) elm_label_label_set(label, str);
\r
1165 * Get the previous item in the multibuttonentry
\r
1167 * @param item The item
\r
1168 * @return The item before the item @p item
\r
1170 * @ingroup Multibuttonentry
\r
1172 EAPI Elm_Multibuttonentry_Item *
\r
1173 elm_multibuttonentry_item_prev(Elm_Multibuttonentry_Item *item)
\r
1177 Elm_Multibuttonentry_Item *_item;
\r
1179 if (!item) return NULL;
\r
1180 ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype) NULL;
\r
1181 wd = elm_widget_data_get(item->multibuttonentry);
\r
1182 if (!wd || !wd->items) return NULL;
\r
1184 EINA_LIST_FOREACH(wd->items, l, _item)
\r
1185 if (_item == item) {
\r
1186 l = eina_list_prev(l);
\r
1187 if (!l) return NULL;
\r
1188 return eina_list_data_get(l);
\r
1194 * Get the next item in the multibuttonentry
\r
1196 * @param item The item
\r
1197 * @return The item after the item @p item
\r
1199 * @ingroup Multibuttonentry
\r
1201 EAPI Elm_Multibuttonentry_Item *
\r
1202 elm_multibuttonentry_item_next(Elm_Multibuttonentry_Item *item)
\r
1206 Elm_Multibuttonentry_Item *_item;
\r
1208 if (!item) return NULL;
\r
1209 ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype) NULL;
\r
1210 wd = elm_widget_data_get(item->multibuttonentry);
\r
1211 if (!wd || !wd->items) return NULL;
\r
1213 EINA_LIST_FOREACH(wd->items, l, _item)
\r
1214 if (_item == item) {
\r
1215 l = eina_list_next(l);
\r
1216 if (!l) return NULL;
\r
1217 return eina_list_data_get(l);
\r
1223 * Get private data of item
\r
1225 * @param item The item
\r
1226 * @return The data pointer stored, or NULL if none was stored
\r
1228 * @ingroup Multibuttonentry
\r
1231 elm_multibuttonentry_item_data_get(Elm_Multibuttonentry_Item *item)
\r
1233 if (!item) return NULL;
\r
1234 return item->data;
\r
1238 * Set private data of item
\r
1240 * @param item The item
\r
1241 * @param data The ponter to the data to be attached
\r
1243 * @ingroup Multibuttonentry
\r
1246 elm_multibuttonentry_item_data_set(Elm_Multibuttonentry_Item *item, void *data)
\r
1248 if (!item) return;
\r
1249 item->data = data;
\r