remove some warnings
[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 \r
12 #define MAX_STR 256             \r
13 #define MAX_W_BTN 200           \r
14 #define MIN_W_ENTRY 20  \r
15 \r
16 \r
17 typedef enum _Multibuttonentry_Pos\r
18 {\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
25 \r
26 typedef enum _Multibuttonentry_Button_State\r
27 {\r
28  MULTIBUTONENTRY_BUTTON_STATE_DEFAULT,\r
29  MULTIBUTONENTRY_BUTTON_STATE_SELECTED,\r
30  MULTIBUTONENTRY_BUTTON_STATE_NUM\r
31 }Multibuttonentry_Button_State;\r
32 \r
33 \r
34 struct _Multibuttonentry_Item {\r
35         Evas_Object *multibuttonentry;\r
36         Evas_Object *button;\r
37         Evas_Object *label;\r
38         void *data;\r
39         Evas_Coord vw, rw; // vw: visual width, real width\r
40         Eina_Bool  visible: 1;  \r
41 };\r
42 \r
43 typedef struct _Widget_Data Widget_Data;\r
44 struct _Widget_Data {\r
45         Evas_Object *base;\r
46         Evas_Object *box;\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 \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
86 \r
87 \r
88 static void\r
89 _del_hook(Evas_Object *obj)\r
90 {\r
91         Widget_Data *wd = elm_widget_data_get(obj);\r
92         if(!wd) return;\r
93 \r
94         if (wd->items) {\r
95                 Elm_Multibuttonentry_Item *item;\r
96                 EINA_LIST_FREE(wd->items, item) {\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->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
108 }\r
109 \r
110 static void\r
111 _theme_hook(Evas_Object *obj)\r
112 {\r
113         Widget_Data *wd = elm_widget_data_get(obj);\r
114         Eina_List *l;\r
115         Elm_Multibuttonentry_Item *item;\r
116         if (!wd) return;\r
117         \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
121 \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
126         }\r
127 \r
128         _sizing_eval(obj);\r
129 }\r
130 \r
131 static void\r
132 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)\r
133 {\r
134    Widget_Data *wd = elm_widget_data_get(obj);\r
135    if (!wd) return;\r
136 \r
137    _view_update(obj);\r
138 }\r
139 \r
140 static void\r
141 _sizing_eval(Evas_Object *obj)\r
142 {\r
143         Widget_Data *wd = elm_widget_data_get(obj);\r
144         Evas_Coord minw = -1, minh = -1;\r
145         if (!wd) return;\r
146 \r
147         evas_object_size_hint_min_get(wd->box, &minw, &minh);\r
148         evas_object_size_hint_min_set(obj, minw, minh);\r
149 }\r
150 \r
151 static void \r
152 _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void *event)\r
153 {\r
154         Evas_Object *eo = (Evas_Object *)data;\r
155         Widget_Data *wd = elm_widget_data_get(data);\r
156         if (!wd) return;\r
157 \r
158         _sizing_eval(eo);\r
159 }\r
160 \r
161 static void \r
162 _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event)\r
163 {\r
164         Widget_Data *wd = elm_widget_data_get(data);\r
165         Evas_Coord w, h;\r
166         if (!wd) return;\r
167 \r
168         evas_object_geometry_get(wd->box, NULL, NULL, &w, &h);\r
169 \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
172         else ;\r
173 \r
174         wd->w_box = w;\r
175         wd->h_box = h;\r
176 \r
177         _view_update(data);\r
178 }\r
179 \r
180 static void\r
181 _event_init(Evas_Object *obj)\r
182 {\r
183         Widget_Data *wd = elm_widget_data_get(obj);\r
184         if(!wd || !wd->base)    return;\r
185 \r
186         if(wd->box){\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
189         }\r
190 \r
191 /*\r
192         if(wd->entry){\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
195         }\r
196 */\r
197 }\r
198 \r
199 static void\r
200 _contracted_state_set(Evas_Object *obj, int contracted)\r
201 {\r
202         Widget_Data *wd = elm_widget_data_get(obj);\r
203         Eina_List *l;\r
204         Elm_Multibuttonentry_Item *item;\r
205         if (!wd || !wd->box) return;\r
206 \r
207         if(wd->contracted == contracted) return;\r
208 \r
209         elm_scrolled_entry_entry_set(wd->entry, "");\r
210 \r
211         if(contracted == 1){            \r
212                 Evas_Coord w=0, w_label=0;\r
213                 \r
214                 // unpack all items and entry\r
215                 EINA_LIST_FOREACH(wd->items, l, item) {\r
216                         if (item) {\r
217                                 elm_box_unpack(wd->box, item->button);\r
218                                 evas_object_hide(item->button);\r
219                                 item->visible = EINA_FALSE;\r
220                         }\r
221                 }\r
222                 elm_box_unpack(wd->box, wd->entry);\r
223                 evas_object_hide(wd->entry);\r
224 \r
225                 \r
226                 // pack buttons only 1line\r
227                 w = wd->w_box;\r
228 \r
229                 // w -= w_label\r
230                 if(wd->label) \r
231                         evas_object_geometry_get(wd->label, NULL, NULL, &w_label, NULL);\r
232                 w -= w_label;\r
233 \r
234                 // w -= w_btns          \r
235                 item = NULL;\r
236                 int count = eina_list_count(wd->items);\r
237                 EINA_LIST_FOREACH(wd->items, l, item) {\r
238                         if (item) {\r
239                                 int w_label_count = 0;\r
240                                 char buf[MAX_STR] = {0,};\r
241 \r
242                                 elm_box_pack_end(wd->box, item->button);\r
243                                 evas_object_show(item->button);\r
244                                 item->visible = EINA_TRUE;\r
245                                 \r
246                                 w -= item->vw;\r
247                                 count--;\r
248                                 \r
249                                 if(count > 0){\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
253                                 }\r
254 \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
259 \r
260                                         count++;\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
264 \r
265                                         elm_box_pack_end(wd->box, wd->end);\r
266                                         evas_object_show(wd->end);\r
267 \r
268                                         break;\r
269                                 }\r
270                         }\r
271                 }\r
272 \r
273         }else{\r
274                 // unpack last label\r
275                 elm_box_unpack(wd->box, wd->end);\r
276                 evas_object_hide(wd->end);\r
277 \r
278                 // pack remain btns\r
279                 item = NULL;\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
284                         }\r
285                 }\r
286 \r
287                 // pack entry\r
288                 elm_box_pack_end(wd->box, wd->entry);\r
289                 evas_object_show(wd->entry);\r
290         }\r
291 \r
292         wd->contracted = contracted;\r
293         evas_object_smart_callback_call(obj, "contracted,state,changed", wd->contracted);\r
294 }\r
295 \r
296 static void \r
297 _view_update(Evas_Object *obj)\r
298 {       \r
299         Widget_Data *wd = elm_widget_data_get(obj);     \r
300         if (!wd || !wd->box || !wd->entry) return;\r
301 \r
302         if(wd->contracted == 1){\r
303                 _contracted_state_set(obj, 0);\r
304                 _contracted_state_set(obj, 1);\r
305         }\r
306 \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
313                                                         \r
314                                 elm_box_pack_end(wd->box, wd->entry);\r
315                                 evas_object_show(wd->entry);\r
316                                 \r
317                                 //elm_widget_focus_set(wd->entry, EINA_TRUE);   //FIXME\r
318                         }else{\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
322 \r
323                                 elm_box_pack_end(wd->box, wd->guidetext);                                                       \r
324                                 evas_object_show(wd->guidetext);\r
325                         }\r
326                 }else{\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
330                                                 \r
331                         elm_box_pack_end(wd->box, wd->entry);\r
332                         evas_object_show(wd->entry);\r
333                 }\r
334         }\r
335 }\r
336 \r
337 /*\r
338 static void\r
339 _entry_focused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)\r
340 {\r
341         printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);\r
342         //if(data) _view_update(data);\r
343 }\r
344 \r
345 static void\r
346 _entry_unfocused(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)\r
347 {\r
348         printf("\n>>>>>>[%s][%d]\n", __FUNCTION__, __LINE__);\r
349         //if(data) _view_update(data);\r
350 }\r
351 */\r
352 \r
353 static void\r
354 _set_label(Evas_Object *obj, const char* str)\r
355 {\r
356         Widget_Data *wd = elm_widget_data_get(obj);\r
357         if(!wd || !str) return;\r
358 \r
359         if(!wd->label){\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
369         }\r
370 \r
371         elm_label_label_set(wd->label, str);\r
372         _view_update(obj);\r
373 }\r
374 \r
375 static void\r
376 _set_guidetext(Evas_Object *obj, const char* str)\r
377 {\r
378         Widget_Data *wd = elm_widget_data_get(obj);\r
379         if(!wd || !str) return;\r
380 \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
387         }\r
388 \r
389         if(wd->guidetext) edje_object_part_text_set(wd->guidetext, "elm.text", str);\r
390         _view_update(obj);\r
391 }\r
392 \r
393 static void\r
394 _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State state)\r
395 {\r
396         Widget_Data *wd = elm_widget_data_get(obj);\r
397         Elm_Multibuttonentry_Item *item = NULL;\r
398         if (!wd) return;\r
399 \r
400         if(wd->current) \r
401                 item = eina_list_data_get(wd->current);\r
402 \r
403         if(item && item->button){\r
404                 switch(state){\r
405                         case MULTIBUTONENTRY_BUTTON_STATE_DEFAULT:\r
406                                 edje_object_signal_emit(item->button, "default", "");\r
407                                 wd->current = NULL;\r
408                                 break;\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
412                                 break;\r
413                         default:\r
414                                 edje_object_signal_emit(item->button, "default", "");\r
415                                 wd->current = NULL;\r
416                                 break;\r
417                 }\r
418         }\r
419 }\r
420 \r
421 static void\r
422 _change_current_button(Evas_Object *obj, Evas_Object *btn)\r
423 {\r
424         Widget_Data *wd = elm_widget_data_get(obj);\r
425         Eina_List *l;\r
426         Elm_Multibuttonentry_Item *item;\r
427         if (!wd) return;\r
428 \r
429         // change the state of previous button to "default"\r
430         _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_DEFAULT);\r
431         \r
432         // change the current\r
433         EINA_LIST_FOREACH(wd->items, l, item) {\r
434                 if(item->button == btn){\r
435                         wd->current = l;\r
436                         break;\r
437                 }\r
438         }\r
439 \r
440         // chagne the state of current button to "focused"\r
441         _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_SELECTED);\r
442         \r
443 }\r
444 \r
445 static void\r
446 _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)\r
447 {\r
448         Widget_Data *wd = elm_widget_data_get(data);\r
449         static char str[MAX_STR];\r
450         if (!wd) return;\r
451 \r
452         strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);\r
453         str[MAX_STR - 1]= 0;\r
454 \r
455         if(strlen(str)) \r
456                 _add_button(data, str);\r
457 \r
458         _change_current_button(data, obj);\r
459 }\r
460 \r
461 static void\r
462 _del_button_obj(Evas_Object *obj, Evas_Object *btn)\r
463 {\r
464         Widget_Data *wd = elm_widget_data_get(obj);\r
465         Evas_Object *label;\r
466         if(!wd || !btn) return;\r
467         \r
468         if(btn){        \r
469                 // del label\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
473 \r
474                 // del button\r
475                 evas_object_del(btn);           \r
476         }\r
477 }\r
478 \r
479 static void\r
480 _del_button_item(Elm_Multibuttonentry_Item *item)\r
481 {\r
482         Eina_List *l;\r
483         Elm_Multibuttonentry_Item *_item;\r
484         if(!item) return;\r
485         Widget_Data *wd;\r
486 \r
487         Evas_Object *obj = item->multibuttonentry;\r
488         wd = elm_widget_data_get(obj);\r
489         if (!wd) return;\r
490 \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
497                         free(_item);\r
498                         if(wd->current == l)    \r
499                                 wd->current = NULL;\r
500                         break;\r
501                 }\r
502         }\r
503 }\r
504 \r
505 static void\r
506 _del_button(Evas_Object *obj)\r
507 {\r
508         Widget_Data *wd = elm_widget_data_get(obj);\r
509         Elm_Multibuttonentry_Item *item;\r
510         if(!wd || !wd->items) return;\r
511 \r
512         if(!wd->current){\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
516         }else{\r
517                 item = eina_list_data_get(wd->current);\r
518                 if(item){       \r
519                         _del_button_item(item);\r
520                 }\r
521         }\r
522 }\r
523 \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
526 {\r
527         Elm_Multibuttonentry_Item *item;\r
528         Evas_Object *btn;\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
533 \r
534         if(wd->contracted == 1) return NULL;\r
535 \r
536         // add button\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
542 \r
543         // add label\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
549 \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
556 \r
557         // append item list\r
558         item = ELM_NEW(Elm_Multibuttonentry_Item);\r
559         if (item) {\r
560                 item->multibuttonentry = obj;\r
561                 item->button = btn;\r
562                 item->label = label;\r
563                 item->data = data;\r
564                 item->rw = w_btn;\r
565                 item->vw =(MAX_W_BTN < w_btn) ? MAX_W_BTN : w_btn;              \r
566                 item->visible = EINA_TRUE;\r
567                 \r
568                 switch(pos){\r
569                         case MULTIBUTONENTRY_POS_START:\r
570                                 wd->items = eina_list_prepend(wd->items, item);\r
571                                 _view_update(obj);\r
572                                 elm_box_pack_after(wd->box, btn, wd->label);\r
573                                 break;\r
574                         case MULTIBUTONENTRY_POS_END:\r
575                                 wd->items = eina_list_append(wd->items, item);\r
576                                 _view_update(obj);\r
577                                 elm_box_pack_before(wd->box, btn, wd->entry);\r
578                                 break;\r
579                         case MULTIBUTONENTRY_POS_BEFORE:\r
580                                 if(reference){  \r
581                                         wd->items = eina_list_prepend_relative(wd->items, item, reference);\r
582                                         _view_update(obj);\r
583                                         elm_box_pack_before(wd->box, btn, reference->button);\r
584                                 }else{\r
585                                         wd->items = eina_list_append(wd->items, item);\r
586                                         _view_update(obj);\r
587                                         elm_box_pack_before(wd->box, btn, wd->entry);\r
588                                 }\r
589                                 break;\r
590                         case MULTIBUTONENTRY_POS_AFTER:\r
591                                 if(reference){  \r
592                                         wd->items = eina_list_append_relative(wd->items, item, reference);\r
593                                         _view_update(obj);\r
594                                         elm_box_pack_after(wd->box, btn, reference->button);\r
595                                 }else{  \r
596                                         wd->items = eina_list_append(wd->items, item);\r
597                                         _view_update(obj);\r
598                                         elm_box_pack_before(wd->box, btn, wd->entry);\r
599                                 }\r
600                                 break;\r
601                         default:\r
602                                 break;\r
603                 }\r
604         }\r
605 \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
612         }\r
613 \r
614         evas_object_smart_callback_call(obj, "added", item);\r
615 \r
616         return item;\r
617 }\r
618 \r
619 static void\r
620 _add_button(Evas_Object *obj, char *str)\r
621 {\r
622         Widget_Data *wd = elm_widget_data_get(obj);\r
623         if(!wd) return;\r
624 \r
625         //remove entry text\r
626         elm_scrolled_entry_entry_set(wd->entry, "");\r
627 \r
628         // add button\r
629         _add_button_item(obj, str, MULTIBUTONENTRY_POS_END, NULL, NULL);\r
630 }\r
631 \r
632 static void\r
633 _evas_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info )\r
634 {\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
639         \r
640         strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);\r
641         str[MAX_STR - 1]= 0;\r
642 \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
647                 wd->n_str = 0;\r
648                 return;\r
649         }else{\r
650                 //\r
651         }\r
652 \r
653         wd->n_str = strlen(str); \r
654 }\r
655 \r
656 static void \r
657 _view_init(Evas_Object *obj)\r
658 {       \r
659         Widget_Data *wd = elm_widget_data_get(obj);     \r
660         if (!wd) return;\r
661         \r
662         if(!wd->box){\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
668         }\r
669         \r
670         if(!wd->entry){\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
681         }\r
682 \r
683         if(!wd->end){\r
684                 if(!(wd->end = elm_label_add(obj))) return;\r
685                 elm_object_style_set(wd->end, "extended/multibuttonentry_default");\r
686         }\r
687 }\r
688 \r
689 /**\r
690  * Add a new multibuttonentry to the parent\r
691  *\r
692  * @param parent The parent object\r
693  * @return The new object or NULL if it cannot be created\r
694  *\r
695  * @ingroup Multibuttonentry\r
696  */\r
697 EAPI Evas_Object *\r
698 elm_multibuttonentry_add(Evas_Object *parent)\r
699 {\r
700         Evas_Object *obj;\r
701         Evas *e;\r
702         Widget_Data *wd;\r
703         if (!parent) return NULL;\r
704 \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
713 \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
717         \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
721         \r
722         wd->contracted = 0;\r
723         wd->n_str = 0;\r
724         \r
725         _view_init(obj);\r
726         _event_init(obj);\r
727 \r
728         return obj;\r
729 }\r
730 \r
731 /**\r
732  * Get the entry of the multibuttonentry object\r
733  *\r
734  * @param obj The multibuttonentry object\r
735  * @return The entry object, or NULL if none\r
736  *\r
737  * @ingroup Multibuttonentry\r
738  */\r
739 EAPI Evas_Object *\r
740 elm_multibuttonentry_entry_get(Evas_Object *obj)\r
741 {\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
745 \r
746         return wd->entry;\r
747 }\r
748 \r
749 /**\r
750  * Get the label\r
751  *\r
752  * @param obj The multibuttonentry object\r
753  * @return The label, or NULL if none\r
754  *\r
755  * @ingroup Multibuttonentry\r
756  */\r
757 EAPI const char *\r
758 elm_multibuttonentry_label_get(Evas_Object *obj)\r
759 {\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
763 \r
764         if(wd->label){\r
765                 return elm_label_label_get(wd->label);\r
766         }\r
767 \r
768         return NULL;\r
769 }\r
770 \r
771 /**\r
772  * Set the label\r
773  *\r
774  * @param obj The multibuttonentry object\r
775  * @param label The text label string\r
776  *\r
777  * @ingroup Multibuttonentry\r
778  */\r
779 EAPI void\r
780 elm_multibuttonentry_label_set(Evas_Object *obj, const char *label)\r
781 {\r
782         ELM_CHECK_WIDTYPE(obj, widtype);\r
783         Widget_Data *wd = elm_widget_data_get(obj);\r
784         if (!wd || !label) return;\r
785 \r
786         _set_label(obj, label); \r
787 }\r
788 \r
789 /**\r
790  * Get the guide text\r
791  *\r
792  * @param obj The multibuttonentry object\r
793  * @return The guide text, or NULL if none\r
794  *\r
795  * @ingroup Multibuttonentry\r
796  */\r
797 EAPI const char *\r
798 elm_multibuttonentry_guide_text_get(Evas_Object *obj)\r
799 {\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
803 \r
804         if(wd->guidetext){\r
805                 return elm_label_label_get(wd->guidetext);\r
806         }\r
807 \r
808         return NULL;\r
809 }\r
810 \r
811 /**\r
812  * Set the guide text\r
813  *\r
814  * @param obj The multibuttonentry object\r
815  * @param label The guide text string\r
816  *\r
817  * @ingroup Multibuttonentry\r
818  */\r
819 EAPI void\r
820 elm_multibuttonentry_guide_text_set(Evas_Object *obj, const char *guidetext)\r
821 {\r
822         ELM_CHECK_WIDTYPE(obj, widtype);\r
823         Widget_Data *wd = elm_widget_data_get(obj);\r
824         if (!wd || !guidetext) return;\r
825 \r
826         _set_guidetext(obj, guidetext); \r
827 }\r
828 \r
829 /**\r
830  * Get the value of contracted state.\r
831  *\r
832  * @param obj The multibuttonentry object\r
833  * @param the value of contracted state. \r
834  *\r
835  * @ingroup Multibuttonentry\r
836  */\r
837 EAPI int\r
838 elm_multibuttonentry_contracted_state_get(Evas_Object *obj)\r
839 {\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
843 \r
844         return wd->contracted;\r
845 }\r
846 \r
847 /**\r
848  * Set/Unset the multibuttonentry to contracted state of single line\r
849  *\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
852  *\r
853  * @ingroup Multibuttonentry\r
854  */\r
855 EAPI void\r
856 elm_multibuttonentry_contracted_state_set(Evas_Object *obj, int contracted)\r
857 {\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
861 \r
862         _contracted_state_set(obj, contracted);\r
863 }\r
864 \r
865 /**\r
866  * Prepend a new item to the multibuttonentry \r
867  *\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
872  *\r
873  * @ingroup Multibuttonentry\r
874  */\r
875 EAPI Elm_Multibuttonentry_Item *\r
876 elm_multibuttonentry_item_add_start(Evas_Object *obj, const char *label, void *data)\r
877 {\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
882 \r
883         item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_START, NULL, data);\r
884         return item; \r
885 }\r
886 \r
887 /**\r
888  * Append a new item to the multibuttonentry \r
889  *\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
894  *\r
895  * @ingroup Multibuttonentry\r
896  */\r
897 EAPI Elm_Multibuttonentry_Item *\r
898 elm_multibuttonentry_item_add_end(Evas_Object *obj, const char *label, void *data)\r
899 {\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
904 \r
905         item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_END, NULL, data);\r
906         return item; \r
907 }\r
908 \r
909 /**\r
910  * Add a new item to the multibuttonentry before the indicated object\r
911  *\r
912  * reference.\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
918  *\r
919  * @ingroup Multibuttonentry\r
920  */\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
923 {\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
928 \r
929         item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_BEFORE, before, data);\r
930         return item; \r
931 }\r
932 \r
933 /**\r
934  * Add a new item to the multibuttonentry after the indicated object\r
935  *\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
941  *\r
942  * @ingroup Multibuttonentry\r
943  */\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
946 {\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
951 \r
952         item = _add_button_item(obj, label, MULTIBUTONENTRY_POS_AFTER, after, data);\r
953         return item; \r
954 }\r
955 \r
956 /**\r
957  * Get a list of items in the multibuttonentry\r
958  *\r
959  * @param obj The multibuttonentry object\r
960  * @return The list of items, or NULL if none\r
961  *\r
962  * @ingroup Multibuttonentry\r
963  */\r
964 EAPI const Eina_List *\r
965 elm_multibuttonentry_items_get(Evas_Object *obj)\r
966 {\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
970         return wd->items;\r
971 }\r
972 \r
973 /**\r
974  * Get the first item in the multibuttonentry\r
975  *\r
976  * @param obj The multibuttonentry object\r
977  * @return The first item, or NULL if none\r
978  *\r
979  * @ingroup Multibuttonentry\r
980  */\r
981 EAPI Elm_Multibuttonentry_Item *\r
982 elm_multibuttonentry_item_first_get(Evas_Object *obj)\r
983 {\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
988 }\r
989 \r
990 /**\r
991  * Get the last item in the multibuttonentry\r
992  *\r
993  * @param obj The multibuttonentry object\r
994  * @return The last item, or NULL if none\r
995  *\r
996  * @ingroup Multibuttonentry\r
997  */\r
998 EAPI Elm_Multibuttonentry_Item *\r
999 elm_multibuttonentry_item_last_get(Evas_Object *obj)\r
1000 {\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
1005 }\r
1006 \r
1007 /**\r
1008  * Get the selected item in the multibuttonentry\r
1009  *\r
1010  * @param obj The multibuttonentry object\r
1011  * @return The selected item, or NULL if none\r
1012  *\r
1013  * @ingroup Multibuttonentry\r
1014  */\r
1015 EAPI Elm_Multibuttonentry_Item *\r
1016 elm_multibuttonentry_item_selected_get(Evas_Object *obj)\r
1017 {\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
1022 }\r
1023 \r
1024 /**\r
1025  * Set the selected state of an item\r
1026  *\r
1027  * @param item The item\r
1028  *\r
1029  * @ingroup Multibuttonentry\r
1030  */\r
1031 EAPI void\r
1032 elm_multibuttonentry_item_selected_set(Elm_Multibuttonentry_Item *item)\r
1033 {\r
1034         Widget_Data *wd;\r
1035         Eina_List *l;\r
1036         Elm_Multibuttonentry_Item *_item;\r
1037 \r
1038         if (!item) return;\r
1039         ELM_CHECK_WIDTYPE(item->multibuttonentry, widtype);\r
1040         wd = elm_widget_data_get(item->multibuttonentry);\r
1041         if (!wd) return;\r
1042 \r
1043         EINA_LIST_FOREACH(wd->items, l, _item) {\r
1044                 if (_item == item) {\r
1045                         _change_current_button(item->multibuttonentry, item->button);\r
1046                 }\r
1047         }\r
1048 }\r
1049 \r
1050 /**\r
1051  * unselect all of items.\r
1052  *\r
1053  * @param obj The multibuttonentry object\r
1054  *\r
1055  * @ingroup Multibuttonentry\r
1056  */\r
1057 EAPI void\r
1058 elm_multibuttonentry_item_unselect_all(Evas_Object *obj)\r
1059 {\r
1060         ELM_CHECK_WIDTYPE(obj, widtype);\r
1061         Widget_Data *wd = elm_widget_data_get(obj);\r
1062         if (!wd) return;\r
1063 \r
1064         _change_current_button_state(obj, MULTIBUTONENTRY_BUTTON_STATE_DEFAULT);\r
1065 }\r
1066 \r
1067 /**\r
1068  * Remove all items in the multibuttonentry.\r
1069  *\r
1070  * @param obj The multibuttonentry object\r
1071  *\r
1072  * @ingroup Multibuttonentry\r
1073  */\r
1074 EAPI void\r
1075 elm_multibuttonentry_items_del(Evas_Object *obj)\r
1076 {\r
1077         ELM_CHECK_WIDTYPE(obj, widtype);\r
1078         Widget_Data *wd = elm_widget_data_get(obj);\r
1079         if (!wd) return;\r
1080         \r
1081         if (wd->items){\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
1086                         free(item);\r
1087                 }\r
1088                 wd->items = NULL;\r
1089         }\r
1090         wd->current = NULL;\r
1091 }\r
1092 \r
1093 /**\r
1094  * Delete a given item\r
1095  *\r
1096  * @param item The item\r
1097  *\r
1098  * @ingroup Multibuttonentry\r
1099  */\r
1100 EAPI void\r
1101 elm_multibuttonentry_item_del(Elm_Multibuttonentry_Item *item)\r
1102 {\r
1103         if (!item) return;\r
1104          _del_button_item(item);\r
1105 }\r
1106 \r
1107 /**\r
1108  * Get the label of a given item\r
1109  *\r
1110  * @param item The item\r
1111  * @return The label of a given item, or NULL if none\r
1112  *\r
1113  * @ingroup Multibuttonentry\r
1114  */\r
1115 EAPI const char *\r
1116 elm_multibuttonentry_item_label_get(Elm_Multibuttonentry_Item *item)\r
1117 {\r
1118         Widget_Data *wd;\r
1119         Eina_List *l;\r
1120         Elm_Multibuttonentry_Item *_item;\r
1121 \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
1126 \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
1131                 }\r
1132 \r
1133         return NULL;\r
1134 }\r
1135 \r
1136 /**\r
1137  * Set the label of a given item\r
1138  *\r
1139  * @param item The item\r
1140  * @param label The text label string\r
1141  *\r
1142  * @ingroup Multibuttonentry\r
1143  */\r
1144 EAPI void\r
1145 elm_multibuttonentry_item_label_set(Elm_Multibuttonentry_Item *item, const char *str)\r
1146 {\r
1147         Widget_Data *wd;\r
1148         Eina_List *l;\r
1149         Elm_Multibuttonentry_Item *_item;\r
1150 \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
1155 \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
1160                         break;\r
1161                 }\r
1162 }\r
1163 \r
1164 /**\r
1165  * Get the previous item in the multibuttonentry\r
1166  *\r
1167  * @param item The item\r
1168  * @return The item before the item @p item\r
1169  *\r
1170  * @ingroup Multibuttonentry\r
1171  */\r
1172 EAPI Elm_Multibuttonentry_Item *\r
1173 elm_multibuttonentry_item_prev(Elm_Multibuttonentry_Item *item)\r
1174 {\r
1175         Widget_Data *wd;\r
1176         Eina_List *l;\r
1177         Elm_Multibuttonentry_Item *_item;\r
1178 \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
1183 \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
1189                 }\r
1190         return NULL;\r
1191 }\r
1192 \r
1193 /**\r
1194  * Get the next item in the multibuttonentry\r
1195  *\r
1196  * @param item The item\r
1197  * @return The item after the item @p item\r
1198  *\r
1199  * @ingroup Multibuttonentry\r
1200  */\r
1201 EAPI Elm_Multibuttonentry_Item *\r
1202 elm_multibuttonentry_item_next(Elm_Multibuttonentry_Item *item)\r
1203 {\r
1204         Widget_Data *wd;\r
1205         Eina_List *l;\r
1206         Elm_Multibuttonentry_Item *_item;\r
1207 \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
1212 \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
1218                 }\r
1219         return NULL;\r
1220 }\r
1221 \r
1222 /**\r
1223  * Get private data of item\r
1224  *\r
1225  * @param item The item\r
1226  * @return The data pointer stored, or NULL if none was stored\r
1227  *\r
1228  * @ingroup Multibuttonentry\r
1229  */\r
1230 EAPI void *\r
1231 elm_multibuttonentry_item_data_get(Elm_Multibuttonentry_Item *item)\r
1232 {\r
1233         if (!item) return NULL;\r
1234         return item->data;\r
1235 }\r
1236 \r
1237 /**\r
1238  * Set private data of item\r
1239  *\r
1240  * @param item The item\r
1241  * @param data The ponter to the data to be attached\r
1242  *\r
1243  * @ingroup Multibuttonentry\r
1244  */\r
1245 EAPI void\r
1246 elm_multibuttonentry_item_data_set(Elm_Multibuttonentry_Item *item, void *data)\r
1247 {\r
1248         if (!item) return;\r
1249         item->data = data;\r
1250 }\r
1251 \r