1 #include <Elementary.h>
3 #include "elm_widget_popup.h"
5 #define ELM_POPUP_ACTION_BUTTON_MAX 3
7 EAPI const char ELM_POPUP_SMART_NAME[] = "elm_popup";
9 static void _button_remove(Evas_Object *, int, Eina_Bool);
11 static const char ACCESS_TITLE_PART[] = "access.title";
12 static const char ACCESS_BODY_PART[] = "access.body";
14 static const char SIG_BLOCK_CLICKED[] = "block,clicked";
15 static const char SIG_TIMEOUT[] = "timeout";
16 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
17 {SIG_BLOCK_CLICKED, ""},
22 EVAS_SMART_SUBCLASS_NEW
23 (ELM_POPUP_SMART_NAME, _elm_popup, Elm_Popup_Smart_Class,
24 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
26 static void _on_content_del(void *data, Evas *e, Evas_Object *obj, void *event_info);
29 _visuals_set(Evas_Object *obj)
31 ELM_POPUP_DATA_GET(obj, sd);
33 if (!sd->title_text && !sd->title_icon)
34 elm_layout_signal_emit(obj, "elm,state,title_area,hidden", "elm");
36 elm_layout_signal_emit(obj, "elm,state,title_area,visible", "elm");
39 elm_layout_signal_emit(obj, "elm,state,action_area,visible", "elm");
41 elm_layout_signal_emit(obj, "elm,state,action_area,hidden", "elm");
45 _block_clicked_cb(void *data,
46 Evas_Object *obj __UNUSED__,
47 void *event_info __UNUSED__)
49 evas_object_smart_callback_call(data, SIG_BLOCK_CLICKED, NULL);
53 _timeout_cb(void *data,
54 Evas_Object *obj __UNUSED__,
55 void *event_info __UNUSED__)
57 evas_object_hide(data);
58 evas_object_smart_callback_call(data, SIG_TIMEOUT, NULL);
62 _access_object_get(const Evas_Object *obj, const char* part)
65 ELM_POPUP_DATA_GET(obj, sd);
67 po = (Evas_Object *)edje_object_part_object_get(ELM_WIDGET_DATA(sd)->resize_obj, part);
68 ao = evas_object_data_get(po, "_part_access_obj");
74 _on_show(void *data __UNUSED__,
77 void *event_info __UNUSED__)
79 ELM_POPUP_DATA_GET(obj, sd);
81 evas_object_show(sd->notify);
83 // FIX ME (WooHyun Jung) : This code is for arranging child-parent relation well.
84 // Without this code, Popup't top parent will be notify.(and there will be no parent for notify)
85 elm_widget_sub_object_add(elm_widget_parent_get(obj), sd->notify);
86 /* yeah, ugly, but again, this widget needs a rewrite */
87 elm_object_content_set(sd->notify, obj);
89 elm_object_focus_set(obj, EINA_TRUE);
93 _on_hide(void *data __UNUSED__,
96 void *event_info __UNUSED__)
98 ELM_POPUP_DATA_GET(obj, sd);
100 evas_object_hide(sd->notify);
102 elm_object_content_unset(sd->notify);
104 /* FIXME:elm_object_content_unset(notify) deletes callback to revert focus status. */
105 elm_object_focus_set(obj, EINA_FALSE);
109 _scroller_size_calc(Evas_Object *obj)
112 Evas_Coord h_title = 0;
113 Evas_Coord h_content = 0;
114 Evas_Coord h_action_area = 0;
115 const char *action_area_height;
117 ELM_POPUP_DATA_GET(obj, sd);
119 if (!sd->items) return;
121 sd->scr_size_recalc = EINA_FALSE;
124 evas_object_geometry_get(sd->notify, NULL, NULL, NULL, &h);
125 if (sd->title_text || sd->title_icon)
126 edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj,
127 "elm.bg.title", NULL, NULL, NULL, &h_title);
128 if (sd->button_count)
130 action_area_height = edje_object_data_get(
131 elm_layout_edje_get(sd->action_area), "action_area_height");
132 if (action_area_height)
134 (int)(atoi(action_area_height)
135 * elm_config_scale_get() * elm_object_scale_get(obj));
138 h_content = h - (h_title + h_action_area);
139 sd->max_sc_h = h_content;
143 _size_hints_changed_cb(void *data,
145 Evas_Object *obj __UNUSED__,
146 void *event_info __UNUSED__)
148 elm_layout_sizing_eval(data);
152 _list_del(Elm_Popup_Smart_Data *sd)
154 if (!sd->scr) return;
156 evas_object_event_callback_del
157 (sd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb);
159 evas_object_del(sd->tbl);
167 _items_remove(Elm_Popup_Smart_Data *sd)
169 Elm_Popup_Item *item;
171 if (!sd->items) return;
173 EINA_LIST_FREE (sd->items, item)
174 elm_widget_item_del(item);
180 _elm_popup_smart_del(Evas_Object *obj)
184 ELM_POPUP_DATA_GET(obj, sd);
186 evas_object_smart_callback_del
187 (sd->notify, "block,clicked", _block_clicked_cb);
188 evas_object_smart_callback_del(sd->notify, "timeout", _timeout_cb);
189 evas_object_event_callback_del
190 (sd->content, EVAS_CALLBACK_DEL, _on_content_del);
191 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _on_show);
192 sd->button_count = 0;
194 for (i = 0; i < ELM_POPUP_ACTION_BUTTON_MAX; i++)
198 evas_object_del(sd->buttons[i]->btn);
199 free(sd->buttons[i]);
200 sd->buttons[i] = NULL;
209 ELM_WIDGET_CLASS(_elm_popup_parent_sc)->base.del(obj);
213 _mirrored_set(Evas_Object *obj,
217 Elm_Popup_Item *item;
219 ELM_POPUP_DATA_GET(obj, sd);
221 elm_object_mirrored_set(sd->notify, rtl);
223 EINA_LIST_FOREACH(sd->items, elist, item)
224 edje_object_mirrored_set(VIEW(item), rtl);
228 _access_obj_process(Evas_Object *obj, Eina_Bool is_access)
232 ELM_POPUP_DATA_GET(obj, sd);
238 ao = _elm_access_edje_object_part_object_register
239 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_TITLE_PART);
240 _elm_access_text_set(_elm_access_object_get(ao),
241 ELM_ACCESS_TYPE, E_("Popup Title"));
242 _elm_access_text_set(_elm_access_object_get(ao),
243 ELM_ACCESS_INFO, sd->title_text);
246 if (sd->text_content_obj)
248 ao = _elm_access_edje_object_part_object_register
249 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BODY_PART);
250 _elm_access_text_set(_elm_access_object_get(ao),
251 ELM_ACCESS_TYPE, E_("Popup Body Text"));
252 _elm_access_text_set(_elm_access_object_get(ao),
253 ELM_ACCESS_INFO, elm_object_text_get(sd->text_content_obj));
260 _elm_access_edje_object_part_object_unregister
261 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_TITLE_PART);
264 if (sd->text_content_obj)
266 _elm_access_edje_object_part_object_unregister
267 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BODY_PART);
273 _elm_popup_smart_theme(Evas_Object *obj)
275 Elm_Popup_Item *item;
280 ELM_POPUP_DATA_GET(obj, sd);
282 if (!ELM_WIDGET_CLASS(_elm_popup_parent_sc)->theme(obj))
285 _mirrored_set(obj, elm_widget_mirrored_get(obj));
287 elm_object_style_set(sd->notify, elm_widget_style_get(obj));
289 if (sd->button_count)
291 snprintf(buf, sizeof(buf), "buttons%u", sd->button_count);
292 elm_layout_theme_set(sd->action_area, "popup", buf,
293 elm_widget_style_get(obj));
294 for (i = 0; i < ELM_POPUP_ACTION_BUTTON_MAX; i++)
296 if (!sd->buttons[i]) continue;
297 elm_object_style_set(sd->buttons[i]->btn, buf);
300 elm_layout_theme_set(sd->content_area, "popup", "content",
301 elm_widget_style_get(obj));
302 if (sd->text_content_obj)
304 snprintf(buf, sizeof(buf), "popup/%s", elm_widget_style_get(obj));
305 elm_object_style_set(sd->text_content_obj, buf);
309 EINA_LIST_FOREACH(sd->items, elist, item)
311 elm_widget_theme_object_set
312 (obj, VIEW(item), "popup", "item", elm_widget_style_get(obj));
315 edje_object_part_text_escaped_set
316 (VIEW(item), "elm.text", item->label);
317 edje_object_signal_emit
318 (VIEW(item), "elm,state,item,text,visible", "elm");
321 edje_object_signal_emit
322 (VIEW(item), "elm,state,item,icon,visible", "elm");
324 edje_object_signal_emit
325 (VIEW(item), "elm,state,item,disabled", "elm");
326 evas_object_show(VIEW(item));
327 edje_object_message_signal_process(VIEW(item));
329 _scroller_size_calc(obj);
333 elm_layout_text_set(obj, "elm.text.title", sd->title_text);
334 elm_layout_signal_emit(obj, "elm,state,title,text,visible", "elm");
337 elm_layout_signal_emit(obj, "elm,state,title,icon,visible", "elm");
340 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
341 elm_layout_sizing_eval(obj);
344 if (_elm_config->access_mode) _access_obj_process(obj, EINA_TRUE);
350 _item_sizing_eval(Elm_Popup_Item *item)
352 Evas_Coord min_w = -1, min_h = -1, max_w = -1, max_h = -1;
354 edje_object_size_min_restricted_calc
355 (VIEW(item), &min_w, &min_h, min_w, min_h);
356 evas_object_size_hint_min_set(VIEW(item), min_w, min_h);
357 evas_object_size_hint_max_set(VIEW(item), max_w, max_h);
361 _elm_popup_smart_sizing_eval(Evas_Object *obj)
364 Elm_Popup_Item *item;
365 Evas_Coord h_box = 0, minh_box = 0;
366 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
368 ELM_POPUP_DATA_GET(obj, sd);
372 EINA_LIST_FOREACH(sd->items, elist, item)
374 _item_sizing_eval(item);
375 evas_object_size_hint_min_get(VIEW(item), NULL, &minh_box);
376 if (minh_box != -1) h_box += minh_box;
378 evas_object_size_hint_min_set(sd->spacer, 0, MIN(h_box, sd->max_sc_h));
379 evas_object_size_hint_max_set(sd->spacer, -1, sd->max_sc_h);
381 evas_object_size_hint_min_get(sd->scr, &minw, &minh);
382 evas_object_size_hint_max_get(sd->scr, &minw, &minh);
385 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
387 evas_object_size_hint_min_set(obj, minw, minh);
388 evas_object_size_hint_max_set(obj, maxw, maxh);
392 _elm_popup_smart_sub_object_del(Evas_Object *obj,
395 Elm_Popup_Item *item;
397 ELM_POPUP_DATA_GET(obj, sd);
399 if (!ELM_WIDGET_CLASS(_elm_popup_parent_sc)->sub_object_del(obj, sobj))
402 if (sobj == sd->title_icon)
404 elm_layout_signal_emit(obj, "elm,state,title,icon,hidden", "elm");
405 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
406 sd->title_icon = NULL;
409 evas_object_data_get(sobj, "_popup_icon_parent_item")) != NULL)
411 if (sobj == item->icon)
413 edje_object_part_unswallow(VIEW(item), sobj);
414 edje_object_signal_emit
415 (VIEW(item), "elm,state,item,icon,hidden", "elm");
424 _on_content_del(void *data,
426 Evas_Object *obj __UNUSED__,
427 void *event_info __UNUSED__)
429 ELM_POPUP_DATA_GET(data, sd);
432 edje_object_part_unswallow
433 (data, edje_object_part_swallow_get(data, "elm.swallow.content"));
434 elm_layout_sizing_eval(data);
438 _on_text_content_del(void *data,
440 Evas_Object *obj __UNUSED__,
441 void *event_info __UNUSED__)
443 ELM_POPUP_DATA_GET(data, sd);
445 sd->text_content_obj = NULL;
446 edje_object_part_unswallow
447 (data, edje_object_part_swallow_get(data, "elm.swallow.content"));
448 elm_layout_sizing_eval(data);
452 _on_table_del(void *data,
454 Evas_Object *obj __UNUSED__,
455 void *event_info __UNUSED__)
457 ELM_POPUP_DATA_GET(data, sd);
463 elm_layout_sizing_eval(data);
467 _on_button_del(void *data,
470 void *event_info __UNUSED__)
474 ELM_POPUP_DATA_GET(data, sd);
476 for (i = 0; i < ELM_POPUP_ACTION_BUTTON_MAX; i++)
478 if (sd->buttons[i] && obj == sd->buttons[i]->btn &&
479 sd->buttons[i]->delete_me == EINA_TRUE)
481 _button_remove(data, i, EINA_FALSE);
488 _button_remove(Evas_Object *obj,
495 ELM_POPUP_DATA_GET(obj, sd);
497 if (!sd->button_count) return;
499 if (!sd->buttons[pos]) return;
501 if (delete) evas_object_del(sd->buttons[pos]->btn);
503 evas_object_event_callback_del
504 (sd->buttons[pos]->btn, EVAS_CALLBACK_DEL, _on_button_del);
505 free(sd->buttons[pos]);
507 sd->buttons[pos] = NULL;
508 sd->button_count -= 1;
512 /* shift left the remaining buttons */
513 for (i = pos; i < ELM_POPUP_ACTION_BUTTON_MAX - 1; i++)
515 sd->buttons[i] = sd->buttons[i + 1];
517 snprintf(buf, sizeof(buf), "actionbtn%d", pos + 1);
518 elm_object_part_content_unset(sd->action_area, buf);
519 snprintf(buf, sizeof(buf), "actionbtn%d", pos);
520 elm_object_part_content_set
521 (sd->action_area, buf, sd->buttons[i]->btn);
525 if (!sd->button_count)
528 edje_object_part_unswallow
529 (obj, edje_object_part_swallow_get(obj, "elm.swallow.action_area"));
530 evas_object_hide(sd->action_area);
531 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
535 snprintf(buf, sizeof(buf), "buttons%u", sd->button_count);
537 (sd->action_area, "popup", buf, elm_widget_style_get(obj));
542 _layout_change_cb(void *data,
543 Evas_Object *obj __UNUSED__,
544 const char *emission __UNUSED__,
545 const char *source __UNUSED__)
547 elm_layout_sizing_eval(data);
551 _restack_cb(void *data __UNUSED__,
554 void *event_info __UNUSED__)
556 ELM_POPUP_DATA_GET(obj, sd);
558 evas_object_layer_set(sd->notify, evas_object_layer_get(obj));
562 _list_add(Evas_Object *obj)
564 ELM_POPUP_DATA_GET(obj, sd);
566 sd->tbl = elm_table_add(obj);
568 evas_object_event_callback_add
569 (sd->tbl, EVAS_CALLBACK_DEL, _on_table_del, obj);
571 edje_object_part_swallow
572 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.content", sd->tbl);
573 evas_object_size_hint_weight_set
574 (sd->tbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
575 evas_object_size_hint_align_set(sd->tbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
576 evas_object_show(sd->tbl);
578 sd->spacer = evas_object_rectangle_add(evas_object_evas_get(obj));
579 evas_object_color_set(sd->spacer, 0, 0, 0, 0);
580 elm_table_pack(sd->tbl, sd->spacer, 0, 0, 1, 1);
583 sd->scr = elm_scroller_add(obj);
584 elm_scroller_content_min_limit(sd->scr, EINA_TRUE, EINA_FALSE);
585 elm_scroller_bounce_set(sd->scr, EINA_FALSE, EINA_TRUE);
586 evas_object_size_hint_weight_set
587 (sd->scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
588 evas_object_size_hint_align_set(sd->scr, EVAS_HINT_FILL, EVAS_HINT_FILL);
589 evas_object_event_callback_add
590 (sd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb,
592 elm_table_pack(sd->tbl, sd->scr, 0, 0, 1, 1);
593 evas_object_show(sd->scr);
596 sd->box = elm_box_add(obj);
597 evas_object_size_hint_weight_set(sd->box, EVAS_HINT_EXPAND, 0.0);
598 evas_object_size_hint_align_set(sd->box, EVAS_HINT_FILL, 0.0);
599 elm_object_content_set(sd->scr, sd->box);
600 evas_object_show(sd->box);
604 _item_select_cb(void *data,
605 Evas_Object *obj __UNUSED__,
606 const char *emission __UNUSED__,
607 const char *source __UNUSED__)
609 Elm_Popup_Item *item = data;
611 if (!item || item->disabled) return;
613 item->func((void *)item->base.data, WIDGET(item), data);
617 _item_text_set(Elm_Popup_Item *item,
620 if (!eina_stringshare_replace(&item->label, label)) return;
622 edje_object_part_text_escaped_set(VIEW(item), "elm.text", label);
625 edje_object_signal_emit
626 (VIEW(item), "elm,state,item,text,visible", "elm");
628 edje_object_signal_emit
629 (VIEW(item), "elm,state,item,text,hidden", "elm");
631 edje_object_message_signal_process(VIEW(item));
635 _item_text_set_hook(Elm_Object_Item *it,
639 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
641 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
643 if ((!part) || (!strcmp(part, "default")))
645 _item_text_set(item, label);
649 WRN("The part name is invalid! : popup=%p", WIDGET(item));
653 _item_text_get_hook(const Elm_Object_Item *it,
656 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
658 ELM_POPUP_ITEM_CHECK_OR_RETURN(it, NULL);
660 if ((!part) || (!strcmp(part, "default")))
663 WRN("The part name is invalid! : popup=%p", WIDGET(item));
669 _item_icon_set(Elm_Popup_Item *item,
672 if (item->icon == icon) return;
675 evas_object_del(item->icon);
680 elm_widget_sub_object_add(WIDGET(item), item->icon);
681 evas_object_data_set(item->icon, "_popup_icon_parent_item", item);
682 edje_object_part_swallow
683 (VIEW(item), "elm.swallow.content", item->icon);
684 edje_object_signal_emit
685 (VIEW(item), "elm,state,item,icon,visible", "elm");
688 edje_object_signal_emit(VIEW(item), "elm,state,item,icon,hidden", "elm");
690 edje_object_message_signal_process(item->base.view);
694 _item_content_set_hook(Elm_Object_Item *it,
696 Evas_Object *content)
698 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
700 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
702 if ((!(part)) || (!strcmp(part, "default")))
703 _item_icon_set(item, content);
705 WRN("The part name is invalid! : popup=%p", WIDGET(item));
709 _item_content_get_hook(const Elm_Object_Item *it,
712 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
714 ELM_POPUP_ITEM_CHECK_OR_RETURN(it, NULL);
716 if ((!(part)) || (!strcmp(part, "default")))
719 WRN("The part name is invalid! : popup=%p", WIDGET(item));
725 _item_icon_unset(Elm_Popup_Item *item)
727 Evas_Object *icon = item->icon;
729 if (!item->icon) return NULL;
730 elm_widget_sub_object_del(WIDGET(item), icon);
731 evas_object_data_del(icon, "_popup_icon_parent_item");
732 edje_object_part_unswallow(item->base.view, icon);
733 edje_object_signal_emit(VIEW(item), "elm,state,item,icon,hidden", "elm");
740 _item_content_unset_hook(const Elm_Object_Item *it,
743 Evas_Object *content = NULL;
744 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
746 ELM_POPUP_ITEM_CHECK_OR_RETURN(it, NULL);
748 if ((!(part)) || (!strcmp(part, "default")))
749 content = _item_icon_unset(item);
751 WRN("The part name is invalid! : popup=%p", WIDGET(item));
757 _item_disable_hook(Elm_Object_Item *it)
759 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
761 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
763 if (elm_widget_item_disabled_get(it))
764 edje_object_signal_emit(VIEW(item), "elm,state,item,disabled", "elm");
766 edje_object_signal_emit(VIEW(item), "elm,state,item,enabled", "elm");
770 _item_del_pre_hook(Elm_Object_Item *it)
772 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
774 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
775 ELM_POPUP_DATA_GET(WIDGET(item), sd);
778 evas_object_del(item->icon);
780 eina_stringshare_del(item->label);
781 sd->items = eina_list_remove(sd->items, item);
782 if (!eina_list_count(sd->items))
790 _item_signal_emit_hook(Elm_Object_Item *it,
791 const char *emission,
794 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
796 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
798 edje_object_signal_emit(VIEW(item), emission, source);
802 _access_activate_cb(void *data __UNUSED__,
803 Evas_Object *part_obj __UNUSED__,
804 Elm_Object_Item *item)
806 _item_select_cb(item, NULL, NULL, NULL);
810 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
812 Elm_Popup_Item *it = (Elm_Popup_Item *)data;
813 if (!it) return NULL;
815 if (it->base.disabled)
816 return strdup(E_("State: Disabled"));
822 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
824 Elm_Popup_Item *it = (Elm_Popup_Item *)data;
825 const char *txt = NULL;
826 Evas_Object *icon = NULL;
827 Eina_Strbuf *buf = NULL;
830 if (!it) return NULL;
837 buf = eina_strbuf_new();
838 eina_strbuf_append(buf, E_("icon "));
839 eina_strbuf_append(buf, txt);
840 str = eina_strbuf_string_steal(buf);
841 eina_strbuf_free(buf);
844 else if ((!txt) && icon) return strdup(E_("icon"));
845 else if (txt && (!icon)) return strdup(txt);
851 _access_widget_item_register(Elm_Popup_Item *it)
855 _elm_access_widget_item_register((Elm_Widget_Item *)it);
856 ao = _elm_access_object_get(it->base.access_obj);
857 _elm_access_callback_set(ao, ELM_ACCESS_INFO, _access_info_cb, it);
858 _elm_access_callback_set(ao, ELM_ACCESS_STATE, _access_state_cb, it);
859 _elm_access_text_set(ao, ELM_ACCESS_TYPE, E_("Popup_list"));
860 _elm_access_activate_callback_set(ao, _access_activate_cb, it);
865 _item_new(Elm_Popup_Item *item)
867 ELM_POPUP_DATA_GET(WIDGET(item), sd);
869 elm_widget_item_text_set_hook_set(item, _item_text_set_hook);
870 elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
871 elm_widget_item_content_set_hook_set(item, _item_content_set_hook);
872 elm_widget_item_content_get_hook_set(item, _item_content_get_hook);
873 elm_widget_item_content_unset_hook_set(item, _item_content_unset_hook);
874 elm_widget_item_disable_hook_set(item, _item_disable_hook);
875 elm_widget_item_del_pre_hook_set(item, _item_del_pre_hook);
876 elm_widget_item_signal_emit_hook_set(item, _item_signal_emit_hook);
877 VIEW(item) = edje_object_add
878 (evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
879 elm_widget_theme_object_set(WIDGET(item), VIEW(item), "popup", "item",
880 elm_widget_style_get(WIDGET(item)));
881 edje_object_mirrored_set(VIEW(item), elm_widget_mirrored_get(WIDGET(item)));
882 edje_object_signal_callback_add
883 (VIEW(item), "elm,action,click", "", _item_select_cb, item);
884 evas_object_size_hint_align_set
885 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
888 if (_elm_config->access_mode) _access_widget_item_register(item);
890 evas_object_show(VIEW(item));
894 _title_text_set(Evas_Object *obj,
898 Eina_Bool title_visibility_old, title_visibility_current;
900 ELM_POPUP_DATA_GET(obj, sd);
902 if (sd->title_text == text) return EINA_TRUE;
904 title_visibility_old = (sd->title_text) || (sd->title_icon);
905 eina_stringshare_replace(&sd->title_text, text);
907 //bare edje here because we're inside the hook, already
908 edje_object_part_text_escaped_set
909 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.text.title", text);
912 if (_elm_config->access_mode)
914 ao = _access_object_get(obj, ACCESS_TITLE_PART);
917 ao = _elm_access_edje_object_part_object_register
918 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_TITLE_PART);
919 _elm_access_text_set(_elm_access_object_get(ao),
920 ELM_ACCESS_TYPE, E_("Popup Title"));
922 _elm_access_text_set(_elm_access_object_get(ao), ELM_ACCESS_INFO, text);
926 elm_layout_signal_emit(obj, "elm,state,title,text,visible", "elm");
928 elm_layout_signal_emit(obj, "elm,state,title,text,hidden", "elm");
930 title_visibility_current = (sd->title_text) || (sd->title_icon);
932 if (title_visibility_old != title_visibility_current)
935 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
936 elm_layout_sizing_eval(obj);
942 _content_text_set(Evas_Object *obj,
945 Evas_Object *prev_content, *ao;
948 ELM_POPUP_DATA_GET(obj, sd);
956 prev_content = elm_layout_content_get
957 (sd->content_area, "elm.swallow.content");
960 evas_object_del(prev_content);
964 edje_object_part_swallow
965 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.content",
967 sd->text_content_obj = elm_label_add(obj);
969 evas_object_event_callback_add
970 (sd->text_content_obj, EVAS_CALLBACK_DEL, _on_text_content_del, obj);
972 snprintf(buf, sizeof(buf), "popup/%s", elm_widget_style_get(obj));
973 elm_object_style_set(sd->text_content_obj, buf);
974 elm_label_line_wrap_set(sd->text_content_obj, sd->content_text_wrap_type);
975 elm_object_text_set(sd->text_content_obj, text);
976 evas_object_size_hint_weight_set
977 (sd->text_content_obj, EVAS_HINT_EXPAND, 0.0);
978 evas_object_size_hint_align_set
979 (sd->text_content_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
980 elm_layout_content_set
981 (sd->content_area, "elm.swallow.content", sd->text_content_obj);
984 if (_elm_config->access_mode)
986 /* unregister label, ACCESS_BODY_PART will register */
987 elm_access_object_unregister(sd->text_content_obj);
989 ao = _access_object_get(obj, ACCESS_BODY_PART);
992 ao = _elm_access_edje_object_part_object_register
993 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BODY_PART);
994 _elm_access_text_set(_elm_access_object_get(ao),
995 ELM_ACCESS_TYPE, E_("Popup Body Text"));
997 _elm_access_text_set(_elm_access_object_get(ao), ELM_ACCESS_INFO, text);
1001 elm_layout_sizing_eval(obj);
1007 _elm_popup_smart_text_set(Evas_Object *obj,
1011 if (!part || !strcmp(part, "default"))
1012 return _content_text_set(obj, label);
1013 else if (!strcmp(part, "title,text"))
1014 return _title_text_set(obj, label);
1016 return _elm_popup_parent_sc->text_set(obj, part, label);
1020 _title_text_get(const Evas_Object *obj)
1022 ELM_POPUP_DATA_GET(obj, sd);
1024 return sd->title_text;
1028 _content_text_get(const Evas_Object *obj)
1030 const char *str = NULL;
1032 ELM_POPUP_DATA_GET(obj, sd);
1034 if (sd->text_content_obj)
1035 str = elm_object_text_get(sd->text_content_obj);
1041 _elm_popup_smart_text_get(const Evas_Object *obj,
1044 const char *str = NULL;
1046 if (!part || !strcmp(part, "default"))
1047 str = _content_text_get(obj);
1048 else if (!strcmp(part, "title,text"))
1049 str = _title_text_get(obj);
1051 str = _elm_popup_parent_sc->text_get(obj, part);
1057 _title_icon_set(Evas_Object *obj,
1060 Eina_Bool title_visibility_old, title_visibility_current;
1062 ELM_POPUP_DATA_GET(obj, sd);
1064 if (sd->title_icon == icon) return EINA_TRUE;
1065 title_visibility_old = (sd->title_text) || (sd->title_icon);
1066 if (sd->title_icon) evas_object_del(sd->title_icon);
1068 sd->title_icon = icon;
1069 title_visibility_current = (sd->title_text) || (sd->title_icon);
1071 //bare edje here because we're already in content_set virtual
1072 edje_object_part_swallow
1073 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.title.icon",
1077 elm_layout_signal_emit(obj, "elm,state,title,icon,visible", "elm");
1078 if (title_visibility_old != title_visibility_current) _visuals_set(obj);
1080 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
1081 elm_layout_sizing_eval(obj);
1087 _content_set(Evas_Object *obj,
1088 Evas_Object *content)
1090 Evas_Object *prev_content;
1092 ELM_POPUP_DATA_GET(obj, sd);
1094 if (sd->content && sd->content == content) return EINA_TRUE;
1101 elm_layout_content_get(sd->content_area, "elm.swallow.content");
1103 evas_object_del(prev_content);
1105 sd->content = content;
1108 //bare edje as to avoid loop
1109 edje_object_part_swallow
1110 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.content",
1113 elm_layout_content_set
1114 (sd->content_area, "elm.swallow.content", content);
1115 evas_object_show(content);
1117 evas_object_event_callback_add
1118 (content, EVAS_CALLBACK_DEL, _on_content_del, obj);
1120 elm_layout_sizing_eval(obj);
1126 _action_button_set(Evas_Object *obj,
1131 Action_Area_Data *adata;
1134 ELM_POPUP_DATA_GET(obj, sd);
1136 if (idx >= ELM_POPUP_ACTION_BUTTON_MAX) return;
1140 _button_remove(obj, idx, EINA_TRUE);
1144 if (!sd->buttons[idx]) sd->button_count++;
1147 sd->no_shift = EINA_TRUE;
1148 evas_object_del(sd->buttons[idx]->btn);
1149 sd->no_shift = EINA_FALSE;
1152 snprintf(buf, sizeof(buf), "buttons%u", sd->button_count);
1153 elm_layout_theme_set
1154 (sd->action_area, "popup", buf, elm_widget_style_get(obj));
1156 adata = ELM_NEW(Action_Area_Data);
1160 evas_object_event_callback_add
1161 (btn, EVAS_CALLBACK_DEL, _on_button_del, obj);
1163 sd->buttons[idx] = adata;
1165 snprintf(buf, sizeof(buf), "actionbtn%u", idx + 1);
1166 elm_object_part_content_set
1167 (sd->action_area, buf, sd->buttons[idx]->btn);
1168 evas_object_show(sd->buttons[i]->btn);
1170 edje_object_part_swallow
1171 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.action_area",
1173 if (sd->button_count == 1) _visuals_set(obj);
1175 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
1176 if (sd->items) _scroller_size_calc(obj);
1178 elm_layout_sizing_eval(obj);
1182 _elm_popup_smart_content_set(Evas_Object *obj,
1184 Evas_Object *content)
1188 if (!part || !strcmp(part, "default"))
1189 return _content_set(obj, content);
1190 else if (!strcmp(part, "title,icon"))
1191 return _title_icon_set(obj, content);
1192 else if (!strncmp(part, "button", 6))
1194 i = atoi(part + 6) - 1;
1196 if (i >= ELM_POPUP_ACTION_BUTTON_MAX)
1199 _action_button_set(obj, content, i);
1205 ERR("The part name is invalid! : popup=%p", obj);
1210 static Evas_Object *
1211 _title_icon_get(const Evas_Object *obj)
1213 ELM_POPUP_DATA_GET(obj, sd);
1215 return sd->title_icon;
1218 static Evas_Object *
1219 _content_get(const Evas_Object *obj)
1221 ELM_POPUP_DATA_GET(obj, sd);
1226 static Evas_Object *
1227 _action_button_get(const Evas_Object *obj,
1230 Evas_Object *button = NULL;
1232 ELM_POPUP_DATA_GET(obj, sd);
1233 if (!sd->button_count) return NULL;
1235 if (sd->buttons[idx])
1236 button = sd->buttons[idx]->btn;
1241 static Evas_Object *
1242 _elm_popup_smart_content_get(const Evas_Object *obj,
1245 Evas_Object *content = NULL;
1248 if (!part || !strcmp(part, "default"))
1249 content = _content_get(obj);
1250 else if (!strcmp(part, "title,text"))
1251 content = _title_icon_get(obj);
1252 else if (!strncmp(part, "button", 6))
1254 i = atoi(part + 6) - 1;
1256 if (i >= ELM_POPUP_ACTION_BUTTON_MAX)
1259 content = _action_button_get(obj, i);
1267 WRN("The part name is invalid! : popup=%p", obj);
1271 static Evas_Object *
1272 _content_unset(Evas_Object *obj)
1274 Evas_Object *content;
1276 ELM_POPUP_DATA_GET(obj, sd);
1278 if (!sd->content) return NULL;
1280 evas_object_event_callback_del
1281 (sd->content, EVAS_CALLBACK_DEL, _on_content_del);
1283 content = elm_layout_content_unset(sd->content_area, "elm.swallow.content");
1286 elm_layout_sizing_eval(obj);
1291 static Evas_Object *
1292 _title_icon_unset(Evas_Object *obj)
1296 ELM_POPUP_DATA_GET(obj, sd);
1298 if (!sd->title_icon) return NULL;
1300 icon = sd->title_icon;
1301 edje_object_part_unswallow(ELM_WIDGET_DATA(sd)->resize_obj, sd->title_icon);
1302 sd->title_icon = NULL;
1307 static Evas_Object *
1308 _elm_popup_smart_content_unset(Evas_Object *obj,
1311 Evas_Object *content = NULL;
1314 if (!part || !strcmp(part, "default"))
1315 content = _content_unset(obj);
1316 else if (!strcmp(part, "title,icon"))
1317 content = _title_icon_unset(obj);
1318 else if (!strncmp(part, "button", 6))
1320 i = atoi(part + 6) - 1;
1322 if (i >= ELM_POPUP_ACTION_BUTTON_MAX)
1325 _button_remove(obj, i, EINA_FALSE);
1333 ERR("The part name is invalid! : popup=%p", obj);
1339 _elm_popup_smart_focus_next(const Evas_Object *obj,
1340 Elm_Focus_Direction dir,
1344 Eina_List *items = NULL;
1346 ELM_POPUP_DATA_GET(obj, sd);
1349 if (_elm_config->access_mode)
1353 ao = _access_object_get(obj, ACCESS_TITLE_PART);
1354 items = eina_list_append(items, ao);
1357 ao = _access_object_get(obj, ACCESS_BODY_PART);
1358 if (ao) items = eina_list_append(items, ao);
1362 if (sd->content) items = eina_list_append(items, sd->content_area);
1365 if (sd->button_count) items = eina_list_append(items, sd->action_area);
1367 elm_widget_focus_list_next_get
1368 (obj, items, eina_list_data_get, dir, next);
1374 _elm_popup_smart_focus_direction(const Evas_Object *obj,
1375 const Evas_Object *base,
1377 Evas_Object **direction,
1381 Eina_List *items = NULL;
1383 ELM_POPUP_DATA_GET(obj, sd);
1386 if (_elm_config->access_mode)
1390 ao = _access_object_get(obj, ACCESS_TITLE_PART);
1391 items = eina_list_append(items, ao);
1394 ao = _access_object_get(obj, ACCESS_BODY_PART);
1395 if (ao) items = eina_list_append(items, ao);
1399 if (sd->content) items = eina_list_append(items, sd->content_area);
1402 if (sd->button_count) items = eina_list_append(items, sd->action_area);
1404 elm_widget_focus_list_direction_get
1405 (obj, base, items, eina_list_data_get, degree, direction, weight);
1411 _elm_popup_smart_add(Evas_Object *obj)
1413 EVAS_SMART_DATA_ALLOC(obj, Elm_Popup_Smart_Data);
1415 ELM_WIDGET_CLASS(_elm_popup_parent_sc)->base.add(obj);
1417 evas_object_size_hint_weight_set
1418 (ELM_WIDGET_DATA(priv)->resize_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1419 evas_object_size_hint_align_set
1420 (ELM_WIDGET_DATA(priv)->resize_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1422 elm_layout_theme_set(obj, "popup", "base", elm_widget_style_get(obj));
1424 priv->notify = elm_notify_add(obj);
1425 elm_notify_orient_set(priv->notify, ELM_NOTIFY_ORIENT_CENTER);
1426 elm_notify_allow_events_set(priv->notify, EINA_FALSE);
1427 evas_object_size_hint_weight_set
1428 (priv->notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1429 evas_object_size_hint_align_set
1430 (priv->notify, EVAS_HINT_FILL, EVAS_HINT_FILL);
1432 elm_object_style_set(priv->notify, "popup");
1434 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _on_show, NULL);
1435 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _on_hide, NULL);
1437 evas_object_event_callback_add
1438 (obj, EVAS_CALLBACK_RESTACK, _restack_cb, NULL);
1440 elm_layout_signal_callback_add
1441 (obj, "elm,state,title_area,visible", "elm", _layout_change_cb, obj);
1442 elm_layout_signal_callback_add
1443 (obj, "elm,state,title_area,hidden", "elm", _layout_change_cb, obj);
1444 elm_layout_signal_callback_add
1445 (obj, "elm,state,action_area,visible", "elm", _layout_change_cb, obj);
1446 elm_layout_signal_callback_add
1447 (obj, "elm,state,action_area,hidden", "elm", _layout_change_cb, obj);
1449 priv->content_area = elm_layout_add(obj);
1450 elm_layout_theme_set
1451 (priv->content_area, "popup", "content", elm_widget_style_get(obj));
1452 priv->action_area = elm_layout_add(obj);
1453 evas_object_size_hint_weight_set(priv->action_area, EVAS_HINT_EXPAND,
1455 evas_object_size_hint_align_set(priv->action_area, EVAS_HINT_FILL,
1457 evas_object_event_callback_add
1458 (priv->action_area, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1459 _size_hints_changed_cb, obj);
1460 evas_object_event_callback_add
1461 (priv->content_area, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1462 _size_hints_changed_cb, obj);
1464 priv->content_text_wrap_type = ELM_WRAP_MIXED;
1465 evas_object_smart_callback_add
1466 (priv->notify, "block,clicked", _block_clicked_cb, obj);
1468 evas_object_smart_callback_add(priv->notify, "timeout", _timeout_cb, obj);
1470 elm_widget_can_focus_set(obj, EINA_TRUE);
1476 _elm_popup_smart_parent_set(Evas_Object *obj,
1477 Evas_Object *parent)
1479 ELM_POPUP_DATA_GET(obj, sd);
1481 elm_notify_parent_set(sd->notify, parent);
1485 _elm_popup_smart_access(Evas_Object *obj, Eina_Bool is_access)
1487 _access_obj_process(obj, is_access);
1491 _elm_popup_smart_event(Evas_Object *obj,
1492 Evas_Object *src __UNUSED__,
1493 Evas_Callback_Type type,
1496 Evas_Event_Key_Down *ev = event_info;
1498 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
1499 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1500 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1502 if (!strcmp(ev->keyname, "Tab"))
1504 if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1505 elm_widget_focus_cycle(obj, ELM_FOCUS_PREVIOUS);
1507 elm_widget_focus_cycle(obj, ELM_FOCUS_NEXT);
1511 else if ((!strcmp(ev->keyname, "Left")) ||
1512 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
1514 elm_widget_focus_direction_go(obj, 270.0);
1517 else if ((!strcmp(ev->keyname, "Right")) ||
1518 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
1520 elm_widget_focus_direction_go(obj, 90.0);
1523 else if ((!strcmp(ev->keyname, "Up")) ||
1524 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
1526 elm_widget_focus_direction_go(obj, 0.0);
1529 else if ((!strcmp(ev->keyname, "Down")) ||
1530 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
1532 elm_widget_focus_direction_go(obj, 180.0);
1539 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1544 _elm_popup_smart_set_user(Elm_Popup_Smart_Class *sc)
1546 ELM_WIDGET_CLASS(sc)->base.add = _elm_popup_smart_add;
1547 ELM_WIDGET_CLASS(sc)->base.del = _elm_popup_smart_del;
1549 ELM_WIDGET_CLASS(sc)->parent_set = _elm_popup_smart_parent_set;
1550 ELM_WIDGET_CLASS(sc)->event = _elm_popup_smart_event;
1551 ELM_WIDGET_CLASS(sc)->theme = _elm_popup_smart_theme;
1552 ELM_WIDGET_CLASS(sc)->focus_next = _elm_popup_smart_focus_next;
1553 ELM_WIDGET_CLASS(sc)->access = _elm_popup_smart_access;
1554 ELM_WIDGET_CLASS(sc)->focus_direction = _elm_popup_smart_focus_direction;
1555 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_popup_smart_sub_object_del;
1557 ELM_CONTAINER_CLASS(sc)->content_set = _elm_popup_smart_content_set;
1558 ELM_CONTAINER_CLASS(sc)->content_get = _elm_popup_smart_content_get;
1559 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_popup_smart_content_unset;
1561 ELM_LAYOUT_CLASS(sc)->text_set = _elm_popup_smart_text_set;
1562 ELM_LAYOUT_CLASS(sc)->text_get = _elm_popup_smart_text_get;
1563 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_popup_smart_sizing_eval;
1566 EAPI const Elm_Popup_Smart_Class *
1567 elm_popup_smart_class_get(void)
1569 static Elm_Popup_Smart_Class _sc =
1570 ELM_POPUP_SMART_CLASS_INIT_NAME_VERSION(ELM_POPUP_SMART_NAME);
1571 static const Elm_Popup_Smart_Class *class = NULL;
1572 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
1577 _elm_popup_smart_set(&_sc);
1578 esc->callbacks = _smart_callbacks;
1585 elm_popup_add(Evas_Object *parent)
1589 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1591 obj = elm_widget_add(_elm_popup_smart_class_new(), parent);
1592 if (!obj) return NULL;
1594 if (!elm_widget_sub_object_add(parent, obj))
1595 ERR("could not add %p as sub object of %p", obj, parent);
1597 /* access: parent could be any object such as elm_list which does
1598 not know elc_popup as its child object in the focus_next(); */
1599 ELM_WIDGET_DATA_GET(obj, sd);
1600 sd->highlight_root = EINA_TRUE;
1606 elm_popup_content_text_wrap_type_set(Evas_Object *obj,
1609 ELM_POPUP_CHECK(obj);
1610 ELM_POPUP_DATA_GET(obj, sd);
1612 //Need to wrap the content text, so not allowing ELM_WRAP_NONE
1613 if (sd->content_text_wrap_type == ELM_WRAP_NONE) return;
1615 sd->content_text_wrap_type = wrap;
1616 if (sd->text_content_obj)
1617 elm_label_line_wrap_set(sd->text_content_obj, wrap);
1621 elm_popup_content_text_wrap_type_get(const Evas_Object *obj)
1623 ELM_POPUP_CHECK(obj) ELM_WRAP_LAST;
1624 ELM_POPUP_DATA_GET(obj, sd);
1626 return sd->content_text_wrap_type;
1630 elm_popup_orient_set(Evas_Object *obj,
1631 Elm_Popup_Orient orient)
1633 ELM_POPUP_CHECK(obj);
1634 ELM_POPUP_DATA_GET(obj, sd);
1636 if (orient >= ELM_POPUP_ORIENT_LAST) return;
1637 elm_notify_orient_set(sd->notify, (Elm_Notify_Orient)orient);
1640 EAPI Elm_Popup_Orient
1641 elm_popup_orient_get(const Evas_Object *obj)
1643 ELM_POPUP_CHECK(obj) - 1;
1644 ELM_POPUP_DATA_GET(obj, sd);
1646 return (Elm_Popup_Orient)elm_notify_orient_get(sd->notify);
1650 elm_popup_timeout_set(Evas_Object *obj,
1653 ELM_POPUP_CHECK(obj);
1654 ELM_POPUP_DATA_GET(obj, sd);
1656 elm_notify_timeout_set(sd->notify, timeout);
1660 elm_popup_timeout_get(const Evas_Object *obj)
1662 ELM_POPUP_CHECK(obj) 0.0;
1663 ELM_POPUP_DATA_GET(obj, sd);
1665 return elm_notify_timeout_get(sd->notify);
1669 elm_popup_allow_events_set(Evas_Object *obj,
1672 Eina_Bool allow_events = !!allow;
1674 ELM_POPUP_CHECK(obj);
1675 ELM_POPUP_DATA_GET(obj, sd);
1677 elm_notify_allow_events_set(sd->notify, allow_events);
1681 elm_popup_allow_events_get(const Evas_Object *obj)
1683 ELM_POPUP_CHECK(obj) EINA_FALSE;
1684 ELM_POPUP_DATA_GET(obj, sd);
1686 return elm_notify_allow_events_get(sd->notify);
1689 EAPI Elm_Object_Item *
1690 elm_popup_item_append(Evas_Object *obj,
1696 Evas_Object *prev_content;
1697 Elm_Popup_Item *item;
1699 ELM_POPUP_CHECK(obj) NULL;
1700 ELM_POPUP_DATA_GET(obj, sd);
1702 item = elm_widget_item_new(obj, Elm_Popup_Item);
1703 if (!item) return NULL;
1704 if (sd->content || sd->text_content_obj)
1706 prev_content = elm_layout_content_get
1707 (sd->content_area, "elm.swallow.content");
1709 evas_object_del(prev_content);
1712 //The first item is appended.
1717 item->base.data = data;
1720 _item_icon_set(item, icon);
1721 _item_text_set(item, label);
1723 elm_box_pack_end(sd->box, VIEW(item));
1724 sd->items = eina_list_append(sd->items, item);
1726 _scroller_size_calc(obj);
1727 elm_layout_sizing_eval(obj);
1729 return (Elm_Object_Item *)item;