5c7e9b7ff5e75897fc3aa7fc7c1a8501d197e2c9
[framework/uifw/elementary.git] / src / lib / elm_multibuttonentry.c
1 #include <Elementary.h>\r
2 #include "elm_priv.h"\r
3 \r
4 /**\r
5  * @defgroup Multibuttonentry Multibuttonentry\r
6  * @ingroup Elementary\r
7  *\r
8  * This is a Multibuttonentry.\r
9  */\r
10       \r
11 #define MAX_STR 256      \r
12 #define MAX_W_BTN 200      \r
13 #define MIN_W_ENTRY 20   \r
14 \r
15 typedef enum _Multibuttonentry_Pos\r
16 {\r
17    MULTIBUTONENTRY_POS_START,\r
18    MULTIBUTONENTRY_POS_END,\r
19    MULTIBUTONENTRY_POS_BEFORE,\r
20    MULTIBUTONENTRY_POS_AFTER,\r
21    MULTIBUTONENTRY_POS_NUM\r
22 } Multibuttonentry_Pos;\r
23 \r
24 typedef enum _Multibuttonentry_Button_State\r
25 {\r
26    MULTIBUTONENTRY_BUTTON_STATE_DEFAULT,\r
27    MULTIBUTONENTRY_BUTTON_STATE_SELECTED,\r
28    MULTIBUTONENTRY_BUTTON_STATE_NUM\r
29 } Multibuttonentry_Button_State;\r
30 \r
31 struct _Multibuttonentry_Item \r
32    {\r
33    Evas_Object *multibuttonentry;\r
34    Evas_Object *button;\r
35    Evas_Object *label;\r
36    void *data;\r
37    Evas_Coord vw, rw; // vw: visual width, real width\r
38    Eina_Bool  visible: 1;   \r
39 };\r
40 \r
41 typedef struct _Widget_Data Widget_Data;\r
42 struct _Widget_Data \r
43    {\r
44    Evas_Object *base;\r
45    Evas_Object *box;\r
46    Evas_Object *rect;\r
47    Evas_Object *entry;\r
48    Evas_Object *label;\r
49    Evas_Object *guidetext;\r
50    Evas_Object *end;   // used to represent the total number of invisible buttons\r
51 \r
52    Eina_List *items;\r
53    Eina_List *current;\r
54 \r
55    int n_str;\r
56 \r
57    Evas_Coord w_box, h_box;\r
58    int  contracted;   \r
59    Eina_Bool  focused: 1;   \r
60 };\r
61 \r
62 static const char *widtype = NULL;\r
63 static void _del_hook(Evas_Object *obj);\r
64 static void _theme_hook(Evas_Object *obj);\r
65 static void _on_focus_hook(void *data __UNUSED__, Evas_Object *obj);\r
66 static void _sizing_eval(Evas_Object *obj);\r
67 static void _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void *event);\r
68 static void _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event);\r
69 static void   _event_init(Evas_Object *obj);\r
70 static void _contracted_state_set(Evas_Object *obj, int contracted);\r
71 static void _view_update(Evas_Object *obj);\r
72 static void   _set_label(Evas_Object *obj, const char* str);\r
73 static void _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State state);\r
74 static void   _change_current_button(Evas_Object *obj, Evas_Object *btn);\r
75 static void   _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);\r
76 static void   _del_button_obj(Evas_Object *obj, Evas_Object *btn);\r
77 static void   _del_button_item(Elm_Multibuttonentry_Item *item);\r
78 static void   _del_button(Evas_Object *obj);\r
79 static Elm_Multibuttonentry_Item* _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, const Elm_Multibuttonentry_Item *reference, void *data);\r
80 static void   _add_button(Evas_Object *obj, char *str);\r
81 static void   _evas_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info );\r
82 static void   _view_init(Evas_Object *obj);\r
83 //static void _entry_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);\r
84 //static void _entry_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);\r
85 \r
86 static void\r
87 _del_hook(Evas_Object *obj)\r
88 {\r
89    Widget_Data *wd = elm_widget_data_get(obj);\r
90    if (!wd) return;\r
91 \r
92    if (wd->items) \r
93      {\r
94         Elm_Multibuttonentry_Item *item;\r
95         EINA_LIST_FREE(wd->items, item) \r
96           {\r
97              _del_button_obj(obj, item->button);\r
98              free(item);\r
99           }\r
100         wd->items = NULL;\r
101      }\r
102    wd->current = NULL;\r
103 \r
104    if (wd->rect) evas_object_del (wd->rect);\r
105    if (wd->entry) evas_object_del (wd->entry);\r
106    if (wd->label) evas_object_del (wd->label);\r
107    if (wd->guidetext) evas_object_del (wd->guidetext);\r
108    if (wd->end) evas_object_del (wd->end);   \r
109 }\r
110 \r
111 static void\r
112 _theme_hook(Evas_Object *obj)\r
113 {\r
114    Widget_Data *wd = elm_widget_data_get(obj);\r
115    Eina_List *l;\r
116    Elm_Multibuttonentry_Item *item;\r
117    if (!wd) return;\r
118    \r
119    _elm_theme_object_set(obj, wd->base, "multibuttonentry", "base", elm_widget_style_get(obj));\r
120    if (wd->box)   edje_object_part_swallow (wd->base, "box.swallow", wd->box);\r
121    edje_object_scale_set(wd->base, elm_widget_scale_get(obj) * _elm_config->scale);\r
122 \r
123    EINA_LIST_FOREACH(wd->items, l, item) \r
124      {\r
125         if (item->button)   \r
126          _elm_theme_object_set (obj, item->button, "multibuttonentry", "btn", elm_widget_style_get (obj));\r
127         if (item->label)      \r
128          edje_object_part_swallow (item->button, "elm.label", item->label);\r
129         edje_object_scale_set(item->button, elm_widget_scale_get(obj) * _elm_config->scale);\r
130      }\r
131 \r
132    _sizing_eval(obj);\r
133 }\r
134 \r
135 static void\r
136 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)\r
137 {\r
138    Widget_Data *wd = elm_widget_data_get(obj);\r
139    if (!wd) return;\r
140    _view_update(obj);\r
141 }\r
142 \r
143 static void\r
144 _sizing_eval(Evas_Object *obj)\r
145 {\r
146    Widget_Data *wd = elm_widget_data_get(obj);\r
147    Evas_Coord minw = -1, minh = -1;\r
148    Evas_Coord left, right, top, bottom;\r
149    if (!wd) return;\r
150 \r
151    evas_object_size_hint_min_get(wd->box, &minw, &minh);\r
152    edje_object_part_geometry_get(wd->base, "top.left.pad", NULL, NULL, &left, &top);\r
153    edje_object_part_geometry_get(wd->base, "bottom.right.pad", NULL, NULL, &right, &bottom);   \r
154 \r
155    minw += (left + right);\r
156    minh += (top + bottom);\r
157    \r
158    evas_object_size_hint_min_set(obj, minw, minh);\r
159 }\r
160 \r
161 static void \r
162 _signal_mouse_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)\r
163 {\r
164    Widget_Data *wd = elm_widget_data_get(data);\r
165    if(!wd || !wd->base) return;\r
166 \r
167    evas_object_smart_callback_call(data, "clicked", NULL);\r
168 }\r
169 \r
170 static void \r
171 _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void *event)\r
172 {\r
173    Evas_Object *eo = (Evas_Object *)data;\r
174    Widget_Data *wd = elm_widget_data_get(data);\r
175    if (!wd) return;\r
176    _sizing_eval(eo);\r
177 }\r
178 \r
179 static void \r
180 _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event)\r
181 {\r
182    Widget_Data *wd = elm_widget_data_get(data);\r
183    Evas_Coord w, h;\r
184    if (!wd) return;\r
185 \r
186    evas_object_geometry_get(wd->box, NULL, NULL, &w, &h);\r
187 \r
188    if (wd->h_box < h) evas_object_smart_callback_call (data, "expanded", NULL);\r
189    else if (wd->h_box > h) evas_object_smart_callback_call (data, "contracted", NULL);\r
190    else ;\r
191 \r
192    wd->w_box = w;\r
193    wd->h_box = h;\r
194 \r
195    _view_update(data);\r
196 }\r
197 \r
198 static void\r
199 _event_init(Evas_Object *obj)\r
200 {\r
201    Widget_Data *wd = elm_widget_data_get(obj);\r
202    if (!wd || !wd->base)   return;\r
203 \r
204    if(wd->base)\r
205          {\r
206             edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "*", _signal_mouse_clicked, obj);\r
207          }\r
208 \r
209    if (wd->box)\r
210      {\r
211         evas_object_event_callback_add(wd->box, EVAS_CALLBACK_RESIZE, _resize_cb, obj);\r
212         evas_object_event_callback_add(wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hint_cb, obj);\r
213      }\r
214 \r
215 /*\r
216    if (wd->entry)\r
217    {\r
218       evas_object_smart_callback_add(wd->entry, "focused", _entry_focused, obj);\r
219       evas_object_smart_callback_add(wd->entry, "unfocused", _entry_unfocused, obj);\r
220    }\r
221 */\r
222 }\r
223 \r
224 static void\r
225 _contracted_state_set(Evas_Object *obj, int contracted)\r
226 {\r
227    Widget_Data *wd = elm_widget_data_get(obj);\r
228    Eina_List *l;\r
229    Elm_Multibuttonentry_Item *item;\r
230    if (!wd || !wd->box) return;\r
231 \r
232    if (wd->contracted == contracted) return;\r
233 \r
234    elm_scrolled_entry_entry_set(wd->entry, "");\r
235 \r
236    if (contracted == 1)\r
237      {      \r
238         Evas_Coord w=0, w_tmp=0;\r
239         \r
240         // unpack all items and entry\r
241         EINA_LIST_FOREACH(wd->items, l, item) \r
242           {\r
243              if (item) \r
244                {\r
245                   elm_box_unpack(wd->box, item->button);\r
246                   evas_object_hide(item->button);\r
247                   item->visible = EINA_FALSE;\r
248                }\r
249           }\r
250         elm_box_unpack(wd->box, wd->entry);\r
251         evas_object_hide(wd->entry);\r
252 \r
253         \r
254         // pack buttons only 1line\r
255         w = wd->w_box;\r
256 \r
257         // w -= w_rect\r
258         if (wd->rect) evas_object_geometry_get (wd->rect, NULL, NULL, &w_tmp, NULL);\r
259         w -= w_tmp;\r
260 \r
261         // w -= w_label\r
262         if (wd->label) evas_object_geometry_get (wd->label, NULL, NULL, &w_tmp, NULL);\r
263         w -= w_tmp;\r
264 \r
265         // w -= w_btns      \r
266         item = NULL;\r
267         int count = eina_list_count(wd->items);\r
268         EINA_LIST_FOREACH(wd->items, l, item) \r
269           {\r
270              if (item) \r
271                {\r
272                   int w_label_count = 0;\r
273                   char buf[MAX_STR] = {0,};\r
274 \r
275                   elm_box_pack_end(wd->box, item->button);\r
276                   evas_object_show(item->button);\r
277                   item->visible = EINA_TRUE;\r
278                   \r
279                   w -= item->vw;\r
280                   count--;\r
281                   \r
282                   if (count > 0)\r
283                     {\r
284                        snprintf(buf, sizeof(buf), "... + %d", count);\r
285                        elm_label_label_set(wd->end, buf);\r
286                        evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
287                     }\r
288 \r
289                   if (w < 0 || w < w_label_count)\r
290                     {\r
291                        elm_box_unpack(wd->box, item->button);\r
292                        evas_object_hide(item->button);\r
293                        item->visible = EINA_FALSE;\r
294 \r
295                        count++;\r
296                        snprintf(buf, sizeof(buf), "... + %d", count);\r
297                        elm_label_label_set(wd->end, buf);\r
298                        evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
299 \r
300                        elm_box_pack_end(wd->box, wd->end);\r
301                        evas_object_show(wd->end);\r
302 \r
303                        break;\r
304                     }\r
305                }\r
306           }\r
307 \r
308      }\r
309    else\r
310      {\r
311         // unpack last label\r
312         elm_box_unpack(wd->box, wd->end);\r
313         evas_object_hide(wd->end);\r
314 \r
315         // pack remain btns\r
316         item = NULL;\r
317         EINA_LIST_FOREACH(wd->items, l, item) \r
318           {\r
319              if (item && !item->visible)\r
320                {\r
321                   elm_box_pack_end(wd->box, item->button);\r
322                   evas_object_show(item->button);\r
323                }\r
324           }\r
325 \r
326         // pack entry\r
327         elm_box_pack_end(wd->box, wd->entry);\r
328         evas_object_show(wd->entry);\r
329      }\r
330 \r
331    wd->contracted = contracted;\r
332    evas_object_smart_callback_call(obj, "contracted,state,changed", wd->contracted);\r
333 }\r
334 \r
335 static void \r
336 _view_update(Evas_Object *obj)\r
337 {   \r
338    Widget_Data *wd = elm_widget_data_get(obj);   \r
339    if (!wd || !wd->box || !wd->entry) return;\r
340 \r
341    if (wd->contracted == 1)\r
342      {\r
343         _contracted_state_set(obj, 0);\r
344         _contracted_state_set(obj, 1);\r
345      }\r
346 \r
347    if (wd->guidetext && (wd->contracted != 1))\r
348      {\r
349         if (!eina_list_count (wd->items))\r
350           {\r
351              if (elm_widget_focus_get (obj))\r
352                {\r
353                   elm_box_unpack(wd->box, wd->entry);\r
354                   elm_box_unpack(wd->box, wd->guidetext);\r
355                   evas_object_hide(wd->guidetext);\r
356                            \r
357                   elm_box_pack_end(wd->box, wd->entry);\r
358                   evas_object_show(wd->entry);\r
359                   \r
360                   //elm_widget_focus_set(wd->entry, EINA_TRUE);   //FIXME\r
361                }\r
362              else\r
363                {\r
364                   elm_box_unpack(wd->box, wd->guidetext);\r
365                   elm_box_unpack(wd->box, wd->entry);\r
366                   evas_object_hide(wd->entry);\r
367 \r
368                   elm_box_pack_end(wd->box, wd->guidetext);                     \r
369                   evas_object_show(wd->guidetext);\r
370                }\r
371           }\r
372         else\r
373           {\r
374              elm_box_unpack(wd->box, wd->entry);\r
375              elm_box_unpack(wd->box, wd->guidetext);\r
376              evas_object_hide(wd->guidetext);\r
377                       \r
378              elm_box_pack_end(wd->box, wd->entry);\r
379              evas_object_show(wd->entry);\r
380           }\r
381      }\r
382 }\r
383 \r
384 /*\r
385 static void\r
386 _entry_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)\r
387 {\r
388    printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);\r
389    //if (data) _view_update (data);\r
390 }\r
391 \r
392 static void\r
393 _entry_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)\r
394 {\r
395    printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);\r
396    //if (data) _view_update (data);\r
397 }\r
398 */\r
399 \r
400 static void\r
401 _set_label(Evas_Object *obj, const char* str)\r
402 {\r
403    Widget_Data *wd = elm_widget_data_get(obj);\r
404    if (!wd || !str)   return;\r
405 \r
406    if (!wd->label)\r
407      {\r
408         if (! (wd->label = elm_label_add (obj))) return;\r
409         elm_object_style_set(wd->label, "extended/multibuttonentry_default");\r
410         elm_label_ellipsis_set(wd->label, EINA_TRUE);\r
411         elm_label_wrap_width_set(wd->label, 180);\r
412         elm_label_text_align_set(wd->label, "left");\r
413         evas_object_size_hint_weight_set(wd->label, 0.0, EVAS_HINT_EXPAND);\r
414         evas_object_size_hint_align_set(wd->label, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
415         if (wd->box)\r
416           {\r
417              if (wd->rect) elm_box_pack_after (wd->box, wd->label, wd->rect);\r
418              else elm_box_pack_start(wd->box, wd->label);\r
419           }\r
420         evas_object_show(wd->label);\r
421      }\r
422 \r
423    elm_label_label_set(wd->label, str);\r
424    _view_update(obj);\r
425 }\r
426 \r
427 static void\r
428 _set_guidetext(Evas_Object *obj, const char* str)\r
429 {\r
430    Widget_Data *wd = elm_widget_data_get(obj);\r
431    if (!wd || !str)   return;\r
432 \r
433    if (!wd->guidetext)\r
434      {\r
435         if (! (wd->guidetext = edje_object_add (evas_object_evas_get (obj)))) return;\r
436         _elm_theme_object_set(obj, wd->guidetext, "multibuttonentry", "guidetext", elm_widget_style_get(obj));\r
437         evas_object_size_hint_min_set(wd->guidetext, 280, 0);\r
438         evas_object_size_hint_weight_set(wd->guidetext, 0.0, EVAS_HINT_EXPAND);\r
439         evas_object_size_hint_align_set(wd->guidetext, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
440      }\r
441 \r
442    if (wd->guidetext) edje_object_part_text_set (wd->guidetext, "elm.text", str);\r
443    _view_update(obj);\r
444 }\r
445 \r
446 static void\r
447 _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State state)\r
448 {\r
449    Widget_Data *wd = elm_widget_data_get(obj);\r
450    Elm_Multibuttonentry_Item *item = NULL;\r
451    if (!wd) return;\r
452 \r
453    if (wd->current)   \r
454       item = eina_list_data_get(wd->current);\r
455 \r
456    if (item && item->button)\r
457      {\r
458         switch(state)\r
459           {\r
460              case MULTIBUTONENTRY_BUTTON_STATE_DEFAULT:\r
461                 edje_object_signal_emit(item->button, "default", "");\r
462                 wd->current = NULL;\r
463                 break;\r
464              case MULTIBUTONENTRY_BUTTON_STATE_SELECTED:\r
465                 edje_object_signal_emit(item->button, "focused", "");\r
466                                 evas_object_smart_callback_call(obj, "selected", item); // will be removed!\r
467                 evas_object_smart_callback_call(obj, "item,selected", item);\r
468                 break;\r
469              default:\r
470                 edje_object_signal_emit(item->button, "default", "");\r
471                 wd->current = NULL;\r
472                 break;\r
473           }\r
474      }\r
475 }\r
476 \r
477 static void\r
478 _change_current_button(Evas_Object *obj, Evas_Object *btn)\r
479 {\r
480    Widget_Data *wd = elm_widget_data_get(obj);\r
481    Eina_List *l;\r
482    Elm_Multibuttonentry_Item *item;\r
483    if (!wd) return;\r
484 \r
485    // change the state of previous button to "default"\r
486    _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_DEFAULT);\r
487    \r
488    // change the current\r
489    EINA_LIST_FOREACH(wd->items, l, item) \r
490      {\r
491         if (item->button == btn)\r
492           {\r
493              wd->current = l;\r
494              break;\r
495           }\r
496      }\r
497 \r
498    // chagne the state of current button to "focused"\r
499    _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_SELECTED);\r
500    \r
501 }\r
502 \r
503 static void\r
504 _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)\r
505 {\r
506    Widget_Data *wd = elm_widget_data_get(data);\r
507    static char str[MAX_STR];\r
508    Elm_Multibuttonentry_Item *item = NULL;\r
509    if (!wd) return;\r
510 \r
511    strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);\r
512    str[MAX_STR - 1]= 0;\r
513 \r
514    if (strlen (str))   \r
515       _add_button(data, str);\r
516 \r
517    _change_current_button(data, obj);\r
518 \r
519    if (wd->current)\r
520       if(item = eina_list_data_get(wd->current))\r
521          evas_object_smart_callback_call(data, "item,clicked", item);\r
522 }\r
523 \r
524 static void\r
525 _del_button_obj(Evas_Object *obj, Evas_Object *btn)\r
526 {\r
527    Widget_Data *wd = elm_widget_data_get(obj);\r
528    Evas_Object *label;\r
529    if (!wd || !btn)   return;\r
530    \r
531    if (btn)\r
532      {   \r
533         // del label\r
534         label = edje_object_part_swallow_get(btn, "elm.label");\r
535         edje_object_part_unswallow(btn, label);\r
536         evas_object_del(label);            \r
537 \r
538         // del button\r
539         evas_object_del(btn);      \r
540      }\r
541 }\r
542 \r
543 static void\r
544 _del_button_item(Elm_Multibuttonentry_Item *item)\r
545 {\r
546    Eina_List *l;\r
547    Elm_Multibuttonentry_Item *_item;\r
548    if (!item) return;\r
549    Widget_Data *wd;\r
550 \r
551    Evas_Object *obj = item->multibuttonentry;\r
552    wd = elm_widget_data_get(obj);\r
553    if (!wd) return;\r
554 \r
555    EINA_LIST_FOREACH(wd->items, l, _item) \r
556      {\r
557         if (_item == item) \r
558           {\r
559              wd->items = eina_list_remove(wd->items, _item);\r
560              elm_box_unpack(wd->box, _item->button);\r
561              evas_object_smart_callback_call(obj, "deleted", _item); // will be removed!\r
562              evas_object_smart_callback_call(obj, "item,deleted", _item);\r
563              _del_button_obj(obj, _item->button);\r
564              free(_item);\r
565              if (wd->current == l)   \r
566                 wd->current = NULL;\r
567              break;\r
568           }\r
569      }\r
570 }\r
571 \r
572 static void\r
573 _del_button(Evas_Object *obj)\r
574 {\r
575    Widget_Data *wd = elm_widget_data_get(obj);\r
576    Elm_Multibuttonentry_Item *item;\r
577    if (!wd || !wd->items) return;\r
578 \r
579    if (!wd->current)\r
580      {\r
581         // let the last button focus\r
582         item = eina_list_data_get(eina_list_last(wd->items));   \r
583         if (item->button)   _change_current_button (obj, item->button);            \r
584      }\r
585    else\r
586      {\r
587         item = eina_list_data_get(wd->current);\r
588         if (item)\r
589           {   \r
590              _del_button_item(item);\r
591           }\r
592      }\r
593 }\r
594 \r
595 static Elm_Multibuttonentry_Item*\r
596 _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, const Elm_Multibuttonentry_Item *reference, void *data)\r
597 {\r
598    Elm_Multibuttonentry_Item *item;\r
599    Evas_Object *btn;\r
600    Evas_Object *label;\r
601    Evas_Coord w_label, h_label, w_btn, h_btn, padding_outer, padding_inner;\r
602    Widget_Data *wd = elm_widget_data_get(obj);\r
603    if (!wd || !wd->box || !wd->entry) return NULL;\r
604 \r
605    if (wd->contracted == 1) return NULL;\r
606 \r
607    // add button\r
608    btn = edje_object_add(evas_object_evas_get(obj));\r
609    _elm_theme_object_set(obj, btn, "multibuttonentry", "btn", elm_widget_style_get(obj));\r
610    edje_object_signal_callback_add(btn, "clicked", "elm", _button_clicked, obj);\r
611    evas_object_size_hint_weight_set(btn, 0.0, 0.0);\r
612    evas_object_show(btn);\r
613 \r
614    // add label\r
615    label = elm_label_add(obj);\r
616    elm_object_style_set(label, "extended/multibuttonentry_button");\r
617    elm_label_label_set(label, str);\r
618    elm_label_ellipsis_set(label, EINA_TRUE);\r
619    edje_object_part_swallow(btn, "elm.label", label);\r
620 \r
621    // decide the size of button\r
622    evas_object_size_hint_min_get(label, &w_label, &h_label);\r
623    edje_object_part_geometry_get(btn, "elm.base", NULL, NULL, NULL, &h_btn);\r
624    edje_object_part_geometry_get(btn, "left.padding", NULL, NULL, &padding_outer, NULL);\r
625    edje_object_part_geometry_get(btn, "left.inner.padding", NULL, NULL, &padding_inner, NULL);    \r
626    w_btn = w_label + 2*padding_outer + 2*padding_inner;   \r
627 \r
628    // append item list\r
629    item = ELM_NEW(Elm_Multibuttonentry_Item);\r
630    if (item) \r
631      {\r
632         item->multibuttonentry = obj;\r
633         item->button = btn;\r
634         item->label = label;\r
635         item->data = data;\r
636         item->rw = w_btn;\r
637         item->vw =(MAX_W_BTN < w_btn) ? MAX_W_BTN : w_btn;      \r
638         item->visible = EINA_TRUE;\r
639         \r
640         switch(pos)\r
641           {\r
642              case MULTIBUTONENTRY_POS_START:\r
643                 wd->items = eina_list_prepend(wd->items, item);\r
644                 _view_update(obj);\r
645                 elm_box_pack_after(wd->box, btn, wd->label);\r
646                 break;\r
647              case MULTIBUTONENTRY_POS_END:\r
648                 wd->items = eina_list_append(wd->items, item);\r
649                 _view_update(obj);\r
650                 elm_box_pack_before(wd->box, btn, wd->entry);\r
651                 break;\r
652              case MULTIBUTONENTRY_POS_BEFORE:\r
653                 if (reference)\r
654                   {   \r
655                      wd->items = eina_list_prepend_relative(wd->items, item, reference);\r
656                      _view_update(obj);\r
657                      elm_box_pack_before(wd->box, btn, reference->button);\r
658                   }\r
659                 else\r
660                   {\r
661                      wd->items = eina_list_append(wd->items, item);\r
662                      _view_update(obj);\r
663                      elm_box_pack_before(wd->box, btn, wd->entry);\r
664                   }\r
665                 break;\r
666              case MULTIBUTONENTRY_POS_AFTER:\r
667                 if (reference)\r
668                   {   \r
669                      wd->items = eina_list_append_relative(wd->items, item, reference);\r
670                      _view_update(obj);\r
671                      elm_box_pack_after(wd->box, btn, reference->button);\r
672                   }\r
673                 else\r
674                   {   \r
675                      wd->items = eina_list_append(wd->items, item);\r
676                      _view_update(obj);\r
677                      elm_box_pack_before(wd->box, btn, wd->entry);\r
678                   }\r
679                 break;\r
680              default:\r
681                 break;\r
682           }\r
683      }\r
684 \r
685    //resize btn and label\r
686    evas_object_resize(btn, item->vw, h_btn);\r
687    evas_object_size_hint_min_set(btn, item->vw, h_btn);\r
688    if ( (item->rw != item->vw) &&  (item->vw - 2*padding_outer - 2*padding_inner >=0))\r
689      {\r
690         evas_object_resize(label, item->vw - 2*padding_outer - 2*padding_inner, h_label);   \r
691         elm_label_wrap_width_set(label, item->vw - 2*padding_outer - 2*padding_inner ); \r
692      }\r
693 \r
694    evas_object_smart_callback_call(obj, "added", item); // will be removed!\r
695    evas_object_smart_callback_call(obj, "item,added", item);\r
696 \r
697    return item;\r
698 }\r
699 \r
700 static void\r
701 _add_button(Evas_Object *obj, char *str)\r
702 {\r
703    Widget_Data *wd = elm_widget_data_get(obj);\r
704    if (!wd) return;\r
705 \r
706    //remove entry text\r
707    elm_scrolled_entry_entry_set(wd->entry, "");\r
708 \r
709    // add button\r
710    _add_button_item(obj, str, MULTIBUTONENTRY_POS_END, NULL, NULL);\r
711 }\r
712 \r
713 static void\r
714 _evas_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info )\r
715 {\r
716    Widget_Data *wd = elm_widget_data_get(data);\r
717    Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;\r
718    static char str[MAX_STR];   \r
719    if (!wd || !wd->base || !wd->box) return;\r
720    \r
721    strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);\r
722    str[MAX_STR - 1]= 0;\r
723 \r
724    if ( (wd->n_str == 0) &&  (strcmp (str, "") == 0) &&  ( (strcmp (ev->keyname, "BackSpace") == 0)|| (strcmp (ev->keyname, "BackSpace (") == 0)))\r
725      { \r
726         _del_button(data);   \r
727      }\r
728    else if ( (strcmp (str, "") != 0) &&  (strcmp (ev->keyname, "KP_Enter") == 0 ||strcmp (ev->keyname, "Return") == 0 ))\r
729      {\r
730         _add_button(data, str);\r
731         wd->n_str = 0;\r
732         return;\r
733      }\r
734    else\r
735      {\r
736         //\r
737      }\r
738 \r
739    wd->n_str = strlen(str); \r
740 }\r
741 \r
742 static void \r
743 _view_init(Evas_Object *obj)\r
744 {   \r
745    Widget_Data *wd = elm_widget_data_get(obj);   \r
746    if (!wd) return;\r
747    \r
748    if (!wd->box)\r
749      {\r
750         if (! (wd->box = elm_box_add (obj))) return;\r
751         elm_widget_sub_object_add(obj, wd->box);\r
752         elm_box_extended_set(wd->box, EINA_TRUE);\r
753         elm_box_homogenous_set(wd->box, EINA_FALSE);\r
754         edje_object_part_swallow(wd->base, "box.swallow", wd->box);\r
755      }\r
756    \r
757    if (!wd->rect)\r
758      {\r
759         Evas_Coord w, h;\r
760         if (! (wd->rect = edje_object_add (evas_object_evas_get (obj)))) return;\r
761         _elm_theme_object_set(obj, wd->rect, "multibuttonentry", "rect", elm_widget_style_get(obj));\r
762         elm_widget_sub_object_add(obj, wd->rect);\r
763         edje_object_part_geometry_get(wd->rect, "elm.base", NULL, NULL, &w, &h);\r
764         evas_object_size_hint_min_set(wd->rect, w, h);      \r
765         evas_object_size_hint_weight_set(wd->rect, 0.0, EVAS_HINT_EXPAND);\r
766         evas_object_size_hint_align_set(wd->rect, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
767         if (wd->box)   elm_box_pack_start (wd->box, wd->rect);\r
768         evas_object_show(wd->rect);\r
769      }\r
770    \r
771    if (!wd->entry)\r
772      {\r
773         if (! (wd->entry = elm_scrolled_entry_add (obj))) return;\r
774         elm_scrolled_entry_single_line_set(wd->entry, EINA_TRUE);\r
775         elm_scrolled_entry_entry_set(wd->entry, "");\r
776         elm_scrolled_entry_cursor_end_set(wd->entry);\r
777         evas_object_size_hint_min_set(wd->entry, MIN_W_ENTRY, 0);\r
778         evas_object_event_callback_add(wd->entry, EVAS_CALLBACK_KEY_UP, _evas_key_up_cb, obj);\r
779         evas_object_size_hint_weight_set(wd->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);\r
780         evas_object_size_hint_align_set(wd->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);\r
781         if (wd->box)   elm_box_pack_end (wd->box, wd->entry);\r
782         evas_object_show(wd->entry);\r
783      }\r
784 \r
785    if (!wd->end)\r
786      {\r
787         if (! (wd->end = elm_label_add (obj))) return;\r
788         elm_object_style_set(wd->end, "extended/multibuttonentry_default");\r
789      }\r
790 }\r
791 \r
792 /**\r
793  * Add a new multibuttonentry to the parent\r
794  *\r
795  * @param parent The parent object\r
796  * @return The new object or NULL if it cannot be created\r
797  *\r
798  * @ingroup Multibuttonentry\r
799  */\r
800 EAPI Evas_Object *\r
801 elm_multibuttonentry_add(Evas_Object *parent)\r
802 {\r
803    Evas_Object *obj;\r
804    Evas *e;\r
805    Widget_Data *wd;\r
806    if (!parent) return NULL;\r
807 \r
808    wd = ELM_NEW(Widget_Data);\r
809    e = evas_object_evas_get(parent);\r
810    if (!e) return NULL; \r
811    obj = elm_widget_add(e);\r
812    ELM_SET_WIDTYPE(widtype, "multibuttonentry");\r
813    elm_widget_type_set(obj, "multibuttonentry");\r
814    elm_widget_sub_object_add(parent, obj);\r
815    elm_widget_data_set(obj, wd);\r
816 \r
817    elm_widget_del_hook_set(obj, _del_hook);\r
818    elm_widget_theme_hook_set(obj, _theme_hook);\r
819    elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);\r
820    \r
821    wd->base = edje_object_add(e);\r
822    _elm_theme_object_set(obj, wd->base, "multibuttonentry", "base", "default");\r
823    elm_widget_resize_object_set(obj, wd->base);\r
824    \r
825    wd->contracted = 0;\r
826    wd->n_str = 0;\r
827    \r
828    _view_init(obj);\r
829    _event_init(obj);\r
830 \r
831    return obj;\r
832 }\r
833 \r
834 /**\r
835  * Get the entry of the multibuttonentry object\r
836  *\r
837  * @param obj The multibuttonentry object\r
838  * @return The entry object, or NULL if none\r
839  *\r
840  * @ingroup Multibuttonentry\r
841  */\r
842 EAPI Evas_Object *\r
843 elm_multibuttonentry_entry_get(Evas_Object *obj)\r
844 {\r
845    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
846    Widget_Data *wd = elm_widget_data_get(obj);\r
847    if (!wd)   return NULL;\r
848 \r
849    return wd->entry;\r
850 }\r
851 \r
852 /**\r
853  * Get the label\r
854  *\r
855  * @param obj The multibuttonentry object\r
856  * @return The label, or NULL if none\r
857  *\r
858  * @ingroup Multibuttonentry\r
859  */\r
860 EAPI const char *\r
861 elm_multibuttonentry_label_get(Evas_Object *obj)\r
862 {\r
863    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
864    Widget_Data *wd = elm_widget_data_get(obj);\r
865    if (!wd) return NULL;\r
866    if (wd->label) return elm_label_label_get(wd->label);\r
867    return NULL;\r
868 }\r
869 \r
870 /**\r
871  * Set the label\r
872  *\r
873  * @param obj The multibuttonentry object\r
874  * @param label The text label string\r
875  *\r
876  * @ingroup Multibuttonentry\r
877  */\r
878 EAPI void\r
879 elm_multibuttonentry_label_set(Evas_Object *obj, const char *label)\r
880 {\r
881    ELM_CHECK_WIDTYPE(obj, widtype);\r
882    Widget_Data *wd = elm_widget_data_get(obj);\r
883    if (!wd || !label) return;\r
884    _set_label(obj, label);   \r
885 }\r
886 \r
887 /**\r
888  * Get the guide text\r
889  *\r
890  * @param obj The multibuttonentry object\r
891  * @return The guide text, or NULL if none\r
892  *\r
893  * @ingroup Multibuttonentry\r
894  */\r
895 EAPI const char *\r
896 elm_multibuttonentry_guide_text_get(Evas_Object *obj)\r
897 {\r
898    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
899    Widget_Data *wd = elm_widget_data_get(obj);\r
900    if (!wd)   return NULL;\r
901    if (wd->guidetext) return elm_label_label_get(wd->guidetext);\r
902    return NULL;\r
903 }\r
904 \r
905 /**\r
906  * Set the guide text\r
907  *\r
908  * @param obj The multibuttonentry object\r
909  * @param label The guide text string\r
910  *\r
911  * @ingroup Multibuttonentry\r
912  */\r
913 EAPI void\r
914 elm_multibuttonentry_guide_text_set(Evas_Object *obj, const char *guidetext)\r
915 {\r
916    ELM_CHECK_WIDTYPE(obj, widtype);\r
917    Widget_Data *wd = elm_widget_data_get(obj);\r
918    if (!wd || !guidetext) return;\r
919    _set_guidetext(obj, guidetext);   \r
920 }\r
921 \r
922 /**\r
923  * Get the value of contracted state.\r
924  *\r
925  * @param obj The multibuttonentry object\r
926  * @param the value of contracted state. \r
927  *\r
928  * @ingroup Multibuttonentry\r
929  */\r
930 EAPI int\r
931 elm_multibuttonentry_contracted_state_get(Evas_Object *obj)\r
932 {\r
933    ELM_CHECK_WIDTYPE(obj, widtype) -1;\r
934    Widget_Data *wd = elm_widget_data_get(obj);\r
935    if (!wd) return -1;\r
936    return wd->contracted;\r
937 }\r
938 \r
939 /**\r
940  * Set/Unset the multibuttonentry to contracted state of single line\r
941  *\r
942  * @param obj The multibuttonentry object\r
943  * @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
944  *\r
945  * @ingroup Multibuttonentry\r
946  */\r
947 EAPI void\r
948 elm_multibuttonentry_contracted_state_set(Evas_Object *obj, int contracted)\r
949 {\r
950    ELM_CHECK_WIDTYPE(obj, widtype);\r
951    Widget_Data *wd = elm_widget_data_get(obj);\r
952    if (!wd || !wd->box || (wd->contracted == contracted)) return;\r
953    _contracted_state_set(obj, contracted);\r
954 }\r
955 \r
956 /**\r
957  * Prepend a new item to the multibuttonentry \r
958  *\r
959  * @param obj The multibuttonentry object\r
960  * @param label The label of new item\r
961  * @param data The ponter to the data to be attached\r
962  * @return A handle to the item added or NULL if not possible\r
963  *\r
964  * @ingroup Multibuttonentry\r
965  */\r
966 EAPI Elm_Multibuttonentry_Item *\r
967 elm_multibuttonentry_item_add_start(Evas_Object *obj, const char *label, void *data)\r
968 {\r
969    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
970    Widget_Data *wd = elm_widget_data_get(obj);\r
971    Elm_Multibuttonentry_Item *item;\r
972    if (!wd || !label) return NULL;\r
973    item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_START, NULL, data);\r
974    return item; \r
975 }\r
976 \r
977 /**\r
978  * Append a new item to the multibuttonentry \r
979  *\r
980  * @param obj The multibuttonentry object\r
981  * @param label The label of new item\r
982  * @param data The ponter to the data to be attached\r
983  * @return A handle to the item added or NULL if not possible\r
984  *\r
985  * @ingroup Multibuttonentry\r
986  */\r
987 EAPI Elm_Multibuttonentry_Item *\r
988 elm_multibuttonentry_item_add_end(Evas_Object *obj, const char *label, void *data)\r
989 {\r
990    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
991    Widget_Data *wd = elm_widget_data_get(obj);\r
992    Elm_Multibuttonentry_Item *item;\r
993    if (!wd || !label) return NULL;\r
994    item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_END, NULL, data);\r
995    return item; \r
996 }\r
997 \r
998 /**\r
999  * Add a new item to the multibuttonentry before the indicated object\r
1000  *\r
1001  * reference.\r
1002  * @param obj The multibuttonentry object\r
1003  * @param label The label of new item\r
1004  * @param before The item before which to add it\r
1005  * @param data The ponter to the data to be attached\r
1006  * @return A handle to the item added or NULL if not possible\r
1007  *\r
1008  * @ingroup Multibuttonentry\r
1009  */\r
1010 EAPI Elm_Multibuttonentry_Item *\r
1011 elm_multibuttonentry_item_add_before(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *before, void *data)\r
1012 {\r
1013    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
1014    Widget_Data *wd = elm_widget_data_get(obj);\r
1015    Elm_Multibuttonentry_Item *item;\r
1016    if (!wd || !label) return NULL;\r
1017    item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_BEFORE, before, data);\r
1018    return item; \r
1019 }\r
1020 \r
1021 /**\r
1022  * Add a new item to the multibuttonentry after the indicated object\r
1023  *\r
1024  * @param obj The multibuttonentry object\r
1025  * @param label The label of new item\r
1026  * @param after The item after which to add it\r
1027  * @param data The ponter to the data to be attached\r
1028  * @return A handle to the item added or NULL if not possible\r
1029  *\r
1030  * @ingroup Multibuttonentry\r
1031  */\r
1032 EAPI Elm_Multibuttonentry_Item *\r
1033 elm_multibuttonentry_item_add_after(Evas_Object *obj, const char *label, Elm_Multibuttonentry_Item *after, void *data)\r
1034 {\r
1035    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
1036    Widget_Data *wd = elm_widget_data_get(obj);\r
1037    Elm_Multibuttonentry_Item *item;\r
1038    if (!wd || !label) return NULL;\r
1039    item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_AFTER, after, data);\r
1040    return item; \r
1041 }\r
1042 \r
1043 /**\r
1044  * Get a list of items in the multibuttonentry\r
1045  *\r
1046  * @param obj The multibuttonentry object\r
1047  * @return The list of items, or NULL if none\r
1048  *\r
1049  * @ingroup Multibuttonentry\r
1050  */\r
1051 EAPI const Eina_List *\r
1052 elm_multibuttonentry_items_get(Evas_Object *obj)\r
1053 {\r
1054    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
1055    Widget_Data *wd = elm_widget_data_get(obj);\r
1056    if (!wd) return NULL;\r
1057    return wd->items;\r
1058 }\r
1059 \r
1060 /**\r
1061  * Get the first item in the multibuttonentry\r
1062  *\r
1063  * @param obj The multibuttonentry object\r
1064  * @return The first item, or NULL if none\r
1065  *\r
1066  * @ingroup Multibuttonentry\r
1067  */\r
1068 EAPI Elm_Multibuttonentry_Item *\r
1069 elm_multibuttonentry_item_first_get(Evas_Object *obj)\r
1070 {\r
1071    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
1072    Widget_Data *wd = elm_widget_data_get(obj);\r
1073    if (!wd || !wd->items) return NULL;\r
1074    return eina_list_data_get(wd->items);\r
1075 }\r
1076 \r
1077 /**\r
1078  * Get the last item in the multibuttonentry\r
1079  *\r
1080  * @param obj The multibuttonentry object\r
1081  * @return The last item, or NULL if none\r
1082  *\r
1083  * @ingroup Multibuttonentry\r
1084  */\r
1085 EAPI Elm_Multibuttonentry_Item *\r
1086 elm_multibuttonentry_item_last_get(Evas_Object *obj)\r
1087 {\r
1088    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
1089    Widget_Data *wd = elm_widget_data_get(obj);\r
1090    if (!wd || !wd->items) return NULL;\r
1091    return eina_list_data_get(eina_list_last(wd->items));\r
1092 }\r
1093 \r
1094 /**\r
1095  * Get the selected item in the multibuttonentry\r
1096  *\r
1097  * @param obj The multibuttonentry object\r
1098  * @return The selected item, or NULL if none\r
1099  *\r
1100  * @ingroup Multibuttonentry\r
1101  */\r
1102 EAPI Elm_Multibuttonentry_Item *\r
1103 elm_multibuttonentry_item_selected_get(Evas_Object *obj)\r
1104 {\r
1105    ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
1106    Widget_Data *wd = elm_widget_data_get(obj);\r
1107    if (!wd || !wd->current) return NULL;\r
1108    return eina_list_data_get(wd->current);\r
1109 }\r
1110 \r
1111 /**\r
1112  * Set the selected state of an item\r
1113  *\r
1114  * @param item The item\r
1115  *\r
1116  * @ingroup Multibuttonentry\r
1117  */\r
1118 EAPI void\r
1119 elm_multibuttonentry_item_selected_set(Elm_Multibuttonentry_Item *item)\r
1120 {\r
1121    Widget_Data *wd;\r
1122    Eina_List *l;\r
1123    Elm_Multibuttonentry_Item *_item;\r
1124    if (!item) return;\r
1125    ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype);\r
1126    wd = elm_widget_data_get(item->multibuttonentry);\r
1127    if (!wd) return;\r
1128 \r
1129    EINA_LIST_FOREACH(wd->items, l, _item) \r
1130      {\r
1131         if (_item == item) \r
1132           {\r
1133              _change_current_button(item->multibuttonentry, item->button);\r
1134           }\r
1135      }\r
1136 }\r
1137 \r
1138 /**\r
1139  * unselect all of items.\r
1140  *\r
1141  * @param obj The multibuttonentry object\r
1142  *\r
1143  * @ingroup Multibuttonentry\r
1144  */\r
1145 EAPI void\r
1146 elm_multibuttonentry_item_unselect_all(Evas_Object *obj)\r
1147 {\r
1148    ELM_CHECK_WIDTYPE(obj, widtype);\r
1149    Widget_Data *wd = elm_widget_data_get(obj);\r
1150    if (!wd) return;\r
1151    _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_DEFAULT);\r
1152 }\r
1153 \r
1154 /**\r
1155  * Remove all items in the multibuttonentry.\r
1156  *\r
1157  * @param obj The multibuttonentry object\r
1158  *\r
1159  * @ingroup Multibuttonentry\r
1160  */\r
1161 EAPI void\r
1162 elm_multibuttonentry_items_del(Evas_Object *obj)\r
1163 {\r
1164    ELM_CHECK_WIDTYPE(obj, widtype);\r
1165    Widget_Data *wd = elm_widget_data_get(obj);\r
1166    if (!wd) return;\r
1167    \r
1168    if (wd->items)\r
1169      {\r
1170         Elm_Multibuttonentry_Item *item;\r
1171         EINA_LIST_FREE(wd->items, item) \r
1172           {\r
1173              elm_box_unpack(wd->box, item->button);\r
1174              _del_button_obj(obj, item->button);\r
1175              free(item);\r
1176           }\r
1177         wd->items = NULL;\r
1178      }\r
1179    wd->current = NULL;\r
1180 }\r
1181 \r
1182 /**\r
1183  * Delete a given item\r
1184  *\r
1185  * @param item The item\r
1186  *\r
1187  * @ingroup Multibuttonentry\r
1188  */\r
1189 EAPI void\r
1190 elm_multibuttonentry_item_del(Elm_Multibuttonentry_Item *item)\r
1191 {\r
1192    if (!item) return;\r
1193    _del_button_item(item);\r
1194 }\r
1195 \r
1196 /**\r
1197  * Get the label of a given item\r
1198  *\r
1199  * @param item The item\r
1200  * @return The label of a given item, or NULL if none\r
1201  *\r
1202  * @ingroup Multibuttonentry\r
1203  */\r
1204 EAPI const char *\r
1205 elm_multibuttonentry_item_label_get(Elm_Multibuttonentry_Item *item)\r
1206 {\r
1207    Widget_Data *wd;\r
1208    Eina_List *l;\r
1209    Elm_Multibuttonentry_Item *_item;\r
1210    if (!item) return NULL;\r
1211    ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype) NULL;\r
1212    wd = elm_widget_data_get(item->multibuttonentry);\r
1213    if (!wd || !wd->items) return NULL;\r
1214 \r
1215    EINA_LIST_FOREACH(wd->items, l, _item)\r
1216       if (_item == item)\r
1217         {\r
1218            Evas_Object *label = edje_object_part_swallow_get(_item->button, "elm.label");\r
1219            if (label)   return elm_label_label_get (label);\r
1220         }\r
1221 \r
1222    return NULL;\r
1223 }\r
1224 \r
1225 /**\r
1226  * Set the label of a given item\r
1227  *\r
1228  * @param item The item\r
1229  * @param label The text label string\r
1230  *\r
1231  * @ingroup Multibuttonentry\r
1232  */\r
1233 EAPI void\r
1234 elm_multibuttonentry_item_label_set(Elm_Multibuttonentry_Item *item, const char *str)\r
1235 {\r
1236    Widget_Data *wd;\r
1237    Eina_List *l;\r
1238    Elm_Multibuttonentry_Item *_item;  \r
1239    if (!item || !str) return;\r
1240    ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype);\r
1241    wd = elm_widget_data_get(item->multibuttonentry);\r
1242    if (!wd || !wd->items) return;\r
1243 \r
1244    EINA_LIST_FOREACH(wd->items, l, _item)\r
1245       if (_item == item) \r
1246         {\r
1247            Evas_Object *label = edje_object_part_swallow_get(_item->button, "elm.label");\r
1248            if (label)   elm_label_label_set (label, str);\r
1249            break;\r
1250         }\r
1251 }\r
1252 \r
1253 /**\r
1254  * Get the previous item in the multibuttonentry\r
1255  *\r
1256  * @param item The item\r
1257  * @return The item before the item @p item\r
1258  *\r
1259  * @ingroup Multibuttonentry\r
1260  */\r
1261 EAPI Elm_Multibuttonentry_Item *\r
1262 elm_multibuttonentry_item_prev(Elm_Multibuttonentry_Item *item)\r
1263 {\r
1264    Widget_Data *wd;\r
1265    Eina_List *l;\r
1266    Elm_Multibuttonentry_Item *_item;\r
1267    if (!item) return NULL;\r
1268    ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype) NULL;\r
1269    wd = elm_widget_data_get(item->multibuttonentry);\r
1270    if (!wd || !wd->items) return NULL;\r
1271 \r
1272    EINA_LIST_FOREACH(wd->items, l, _item)\r
1273       if (_item == item) \r
1274         {\r
1275            l = eina_list_prev(l);\r
1276            if (!l) return NULL;\r
1277            return eina_list_data_get(l);\r
1278         }\r
1279    return NULL;\r
1280 }\r
1281 \r
1282 /**\r
1283  * Get the next item in the multibuttonentry\r
1284  *\r
1285  * @param item The item\r
1286  * @return The item after the item @p item\r
1287  *\r
1288  * @ingroup Multibuttonentry\r
1289  */\r
1290 EAPI Elm_Multibuttonentry_Item *\r
1291 elm_multibuttonentry_item_next(Elm_Multibuttonentry_Item *item)\r
1292 {\r
1293    Widget_Data *wd;\r
1294    Eina_List *l;\r
1295    Elm_Multibuttonentry_Item *_item;\r
1296    if (!item) return NULL;\r
1297    ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype) NULL;\r
1298    wd = elm_widget_data_get(item->multibuttonentry);\r
1299    if (!wd || !wd->items) return NULL;\r
1300 \r
1301    EINA_LIST_FOREACH(wd->items, l, _item)\r
1302       if (_item == item) \r
1303         {\r
1304            l = eina_list_next(l);\r
1305            if (!l) return NULL;\r
1306            return eina_list_data_get(l);\r
1307         }\r
1308    return NULL;\r
1309 }\r
1310 \r
1311 /**\r
1312  * Get private data of item\r
1313  *\r
1314  * @param item The item\r
1315  * @return The data pointer stored, or NULL if none was stored\r
1316  *\r
1317  * @ingroup Multibuttonentry\r
1318  */\r
1319 EAPI void *\r
1320 elm_multibuttonentry_item_data_get(Elm_Multibuttonentry_Item *item)\r
1321 {\r
1322    if (!item) return NULL;\r
1323    return item->data;\r
1324 }\r
1325 \r
1326 /**\r
1327  * Set private data of item\r
1328  *\r
1329  * @param item The item\r
1330  * @param data The ponter to the data to be attached\r
1331  *\r
1332  * @ingroup Multibuttonentry\r
1333  */\r
1334 EAPI void\r
1335 elm_multibuttonentry_item_data_set(Elm_Multibuttonentry_Item *item, void *data)\r
1336 {\r
1337    if (!item) return;\r
1338    item->data = data;\r
1339 }\r
1340 \r