1 #include <Elementary.h>
3 #include "elm_widget_popup.h"
5 #define ELM_POPUP_ACTION_BUTTON_MAX 3
6 #define OUTLINE_TEXT "Center popup is opened, double tap to close the popup"
8 EAPI const char ELM_POPUP_SMART_NAME[] = "elm_popup";
10 static void _button_remove(Evas_Object *, int, Eina_Bool);
12 static const char ACCESS_TITLE_PART[] = "access.title";
13 static const char ACCESS_BODY_PART[] = "access.body";
14 static const char ACCESS_BASE_PART[] = "access.base";
16 static const char SIG_BLOCK_CLICKED[] = "block,clicked";
17 static const char SIG_TIMEOUT[] = "timeout";
18 static const char SIG_ACCESS_CHANGED[] = "access,changed";
19 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
20 {SIG_BLOCK_CLICKED, ""},
22 {SIG_ACCESS_CHANGED, ""},
26 EVAS_SMART_SUBCLASS_NEW
27 (ELM_POPUP_SMART_NAME, _elm_popup, Elm_Popup_Smart_Class,
28 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
30 static void _on_content_del(void *data, Evas *e, Evas_Object *obj, void *event_info);
33 _elm_popup_smart_translate(Evas_Object *obj)
35 ELM_POPUP_DATA_GET(obj, sd);
39 EINA_LIST_FOREACH(sd->items, l, it)
40 elm_widget_item_translate(it);
46 _visuals_set(Evas_Object *obj)
48 ELM_POPUP_DATA_GET(obj, sd);
50 if (!sd->title_text && !sd->title_icon)
51 elm_layout_signal_emit(obj, "elm,state,title_area,hidden", "elm");
53 elm_layout_signal_emit(obj, "elm,state,title_area,visible", "elm");
56 elm_layout_signal_emit(obj, "elm,state,action_area,visible", "elm");
58 elm_layout_signal_emit(obj, "elm,state,action_area,hidden", "elm");
63 _item_update(Elm_Popup_Item *item)
67 edje_object_part_text_escaped_set
68 (VIEW(item), "elm.text", item->label);
69 edje_object_signal_emit
70 (VIEW(item), "elm,state,item,text,visible", "elm");
73 edje_object_signal_emit
74 (VIEW(item), "elm,state,item,icon,visible", "elm");
75 if (item->base.disabled)
76 edje_object_signal_emit
77 (VIEW(item), "elm,state,item,disabled", "elm");
78 evas_object_show(VIEW(item));
79 edje_object_message_signal_process(VIEW(item));
83 _block_clicked_cb(void *data,
84 Evas_Object *obj __UNUSED__,
85 void *event_info __UNUSED__)
87 evas_object_smart_callback_call(data, SIG_BLOCK_CLICKED, NULL);
91 _timeout_cb(void *data,
92 Evas_Object *obj __UNUSED__,
93 void *event_info __UNUSED__)
95 evas_object_hide(data);
96 evas_object_smart_callback_call(data, SIG_TIMEOUT, NULL);
100 _access_object_get(const Evas_Object *obj, const char* part)
102 Evas_Object *po, *ao;
103 ELM_POPUP_DATA_GET(obj, sd);
105 po = (Evas_Object *)edje_object_part_object_get(ELM_WIDGET_DATA(sd)->resize_obj, part);
106 ao = evas_object_data_get(po, "_part_access_obj");
112 _on_show(void *data __UNUSED__,
115 void *event_info __UNUSED__)
117 ELM_POPUP_DATA_GET(obj, sd);
119 evas_object_show(sd->notify);
121 // FIX ME (WooHyun Jung) : This code is for arranging child-parent relation well.
122 // Without this code, Popup't top parent will be notify.(and there will be no parent for notify)
123 elm_widget_sub_object_add(elm_widget_parent_get(obj), sd->notify);
124 /* yeah, ugly, but again, this widget needs a rewrite */
125 elm_object_content_set(sd->notify, obj);
127 elm_object_focus_set(obj, EINA_TRUE);
131 _on_hide(void *data __UNUSED__,
134 void *event_info __UNUSED__)
136 ELM_POPUP_DATA_GET(obj, sd);
138 evas_object_hide(sd->notify);
140 elm_object_content_unset(sd->notify);
142 /* FIXME:elm_object_content_unset(notify) deletes callback to revert focus status. */
143 elm_object_focus_set(obj, EINA_FALSE);
147 _scroller_size_calc(Evas_Object *obj)
150 Evas_Coord h_title = 0;
151 Evas_Coord h_content = 0;
152 Evas_Coord h_action_area = 0;
153 const char *action_area_height;
155 ELM_POPUP_DATA_GET(obj, sd);
157 if (!sd->items) return;
159 sd->scr_size_recalc = EINA_FALSE;
162 evas_object_geometry_get(sd->notify, NULL, NULL, NULL, &h);
163 if (sd->title_text || sd->title_icon)
164 edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj,
165 "elm.bg.title", NULL, NULL, NULL, &h_title);
166 if (sd->button_count)
168 action_area_height = edje_object_data_get(
169 elm_layout_edje_get(sd->action_area), "action_area_height");
170 if (action_area_height)
172 (int)(atoi(action_area_height)
173 * elm_config_scale_get() * elm_object_scale_get(obj));
176 h_content = h - (h_title + h_action_area);
177 sd->max_sc_h = h_content;
181 _size_hints_changed_cb(void *data,
183 Evas_Object *obj __UNUSED__,
184 void *event_info __UNUSED__)
186 elm_layout_sizing_eval(data);
190 _list_del(Elm_Popup_Smart_Data *sd)
192 if (!sd->scr) return;
194 evas_object_event_callback_del
195 (sd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb);
197 evas_object_del(sd->tbl);
205 _items_remove(Elm_Popup_Smart_Data *sd)
207 Elm_Popup_Item *item;
209 if (!sd->items) return;
211 EINA_LIST_FREE (sd->items, item)
212 elm_widget_item_del(item);
218 _elm_popup_smart_del(Evas_Object *obj)
220 Evas_Object *notify = NULL;
223 ELM_POPUP_DATA_GET(obj, sd);
225 evas_object_smart_callback_del
226 (sd->notify, "block,clicked", _block_clicked_cb);
227 evas_object_smart_callback_del(sd->notify, "timeout", _timeout_cb);
228 evas_object_event_callback_del
229 (sd->content, EVAS_CALLBACK_DEL, _on_content_del);
230 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _on_show);
231 sd->button_count = 0;
233 for (i = 0; i < ELM_POPUP_ACTION_BUTTON_MAX; i++)
237 evas_object_del(sd->buttons[i]->btn);
238 free(sd->buttons[i]);
239 sd->buttons[i] = NULL;
248 if (elm_widget_parent_get(obj) == sd->notify)
253 ELM_WIDGET_CLASS(_elm_popup_parent_sc)->base.del(obj);
257 evas_object_del(notify);
262 _mirrored_set(Evas_Object *obj,
266 Elm_Popup_Item *item;
268 ELM_POPUP_DATA_GET(obj, sd);
270 elm_object_mirrored_set(sd->notify, rtl);
272 EINA_LIST_FOREACH(sd->items, elist, item)
273 edje_object_mirrored_set(VIEW(item), rtl);
277 _access_base_activate_cb(void *data,
278 Evas_Object *part_obj __UNUSED__,
279 Elm_Object_Item *item __UNUSED__)
281 evas_object_del(data);
285 _access_obj_process(Evas_Object *obj, Eina_Bool is_access)
289 ELM_POPUP_DATA_GET(obj, sd);
295 ao = _elm_access_edje_object_part_object_register
296 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_TITLE_PART);
297 _elm_access_text_set(_elm_access_object_get(ao),
298 ELM_ACCESS_TYPE, E_("Popup Title"));
299 _elm_access_text_set(_elm_access_object_get(ao),
300 ELM_ACCESS_INFO, sd->title_text);
303 if (sd->text_content_obj)
305 ao = _elm_access_edje_object_part_object_register
306 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BODY_PART);
307 _elm_access_text_set(_elm_access_object_get(ao),
308 ELM_ACCESS_TYPE, E_("Popup Body Text"));
309 _elm_access_text_set(_elm_access_object_get(ao),
310 ELM_ACCESS_INFO, elm_object_text_get(sd->text_content_obj));
313 /* register outline */
314 if (!sd->button_count)
316 ao = _elm_access_edje_object_part_object_register
317 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BASE_PART);
318 _elm_access_text_set(_elm_access_object_get(ao),
319 ELM_ACCESS_TYPE, E_(OUTLINE_TEXT));
320 _elm_access_activate_callback_set
321 (_elm_access_object_get(ao), _access_base_activate_cb, obj);
328 _elm_access_edje_object_part_object_unregister
329 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_TITLE_PART);
332 if (sd->text_content_obj)
334 _elm_access_edje_object_part_object_unregister
335 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BODY_PART);
338 /* unregister outline */
339 if (!sd->button_count)
340 _elm_access_edje_object_part_object_unregister
341 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BASE_PART);
346 _elm_popup_smart_theme(Evas_Object *obj)
348 Elm_Popup_Item *item;
352 ELM_POPUP_DATA_GET(obj, sd);
354 if (!ELM_WIDGET_CLASS(_elm_popup_parent_sc)->theme(obj))
357 _mirrored_set(obj, elm_widget_mirrored_get(obj));
359 elm_object_style_set(sd->notify, elm_widget_style_get(obj));
361 if (sd->button_count)
363 snprintf(buf, sizeof(buf), "buttons%u", sd->button_count);
364 elm_layout_theme_set(sd->action_area, "popup", buf,
365 elm_widget_style_get(obj));
367 elm_layout_theme_set(sd->content_area, "popup", "content",
368 elm_widget_style_get(obj));
369 if (sd->text_content_obj)
371 snprintf(buf, sizeof(buf), "popup/%s", elm_widget_style_get(obj));
372 elm_object_style_set(sd->text_content_obj, buf);
376 EINA_LIST_FOREACH(sd->items, elist, item)
378 elm_widget_theme_object_set
379 (obj, VIEW(item), "popup", "item", elm_widget_style_get(obj));
382 _scroller_size_calc(obj);
386 elm_layout_text_set(obj, "elm.text.title", sd->title_text);
387 elm_layout_signal_emit(obj, "elm,state,title,text,visible", "elm");
390 elm_layout_signal_emit(obj, "elm,state,title,icon,visible", "elm");
393 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
394 elm_layout_sizing_eval(obj);
397 if (_elm_config->access_mode) _access_obj_process(obj, EINA_TRUE);
403 _item_sizing_eval(Elm_Popup_Item *item)
405 Evas_Coord min_w = -1, min_h = -1, max_w = -1, max_h = -1;
407 edje_object_size_min_restricted_calc
408 (VIEW(item), &min_w, &min_h, min_w, min_h);
409 evas_object_size_hint_min_set(VIEW(item), min_w, min_h);
410 evas_object_size_hint_max_set(VIEW(item), max_w, max_h);
414 _elm_popup_smart_sizing_eval(Evas_Object *obj)
417 Elm_Popup_Item *item;
418 Evas_Coord h_box = 0, minh_box = 0;
419 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
421 ELM_POPUP_DATA_GET(obj, sd);
425 EINA_LIST_FOREACH(sd->items, elist, item)
427 _item_sizing_eval(item);
428 evas_object_size_hint_min_get(VIEW(item), NULL, &minh_box);
429 if (minh_box != -1) h_box += minh_box;
431 evas_object_size_hint_min_set(sd->spacer, 0, MIN(h_box, sd->max_sc_h));
432 evas_object_size_hint_max_set(sd->spacer, -1, sd->max_sc_h);
434 evas_object_size_hint_min_get(sd->scr, &minw, &minh);
435 evas_object_size_hint_max_get(sd->scr, &minw, &minh);
438 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
440 evas_object_size_hint_min_set(obj, minw, minh);
441 evas_object_size_hint_max_set(obj, maxw, maxh);
445 _elm_popup_smart_sub_object_del(Evas_Object *obj,
448 Elm_Popup_Item *item;
450 ELM_POPUP_DATA_GET(obj, sd);
452 if (!ELM_WIDGET_CLASS(_elm_popup_parent_sc)->sub_object_del(obj, sobj))
455 if (sobj == sd->title_icon)
457 elm_layout_signal_emit(obj, "elm,state,title,icon,hidden", "elm");
458 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
459 sd->title_icon = NULL;
462 evas_object_data_get(sobj, "_popup_icon_parent_item")) != NULL)
464 if (sobj == item->icon)
466 edje_object_part_unswallow(VIEW(item), sobj);
467 edje_object_signal_emit
468 (VIEW(item), "elm,state,item,icon,hidden", "elm");
477 _on_content_del(void *data,
479 Evas_Object *obj __UNUSED__,
480 void *event_info __UNUSED__)
482 ELM_POPUP_DATA_GET(data, sd);
485 edje_object_part_unswallow
486 (data, edje_object_part_swallow_get(data, "elm.swallow.content"));
487 elm_layout_sizing_eval(data);
491 _on_text_content_del(void *data,
493 Evas_Object *obj __UNUSED__,
494 void *event_info __UNUSED__)
496 ELM_POPUP_DATA_GET(data, sd);
498 sd->text_content_obj = NULL;
499 edje_object_part_unswallow
500 (data, edje_object_part_swallow_get(data, "elm.swallow.content"));
501 elm_layout_sizing_eval(data);
505 _on_table_del(void *data,
507 Evas_Object *obj __UNUSED__,
508 void *event_info __UNUSED__)
510 ELM_POPUP_DATA_GET(data, sd);
516 elm_layout_sizing_eval(data);
520 _on_button_del(void *data,
523 void *event_info __UNUSED__)
527 ELM_POPUP_DATA_GET(data, sd);
529 for (i = 0; i < ELM_POPUP_ACTION_BUTTON_MAX; i++)
531 if (sd->buttons[i] && obj == sd->buttons[i]->btn &&
532 sd->buttons[i]->delete_me == EINA_TRUE)
534 _button_remove(data, i, EINA_FALSE);
541 _button_remove(Evas_Object *obj,
548 ELM_POPUP_DATA_GET(obj, sd);
550 if (!sd->button_count) return;
552 if (!sd->buttons[pos]) return;
554 if (delete) evas_object_del(sd->buttons[pos]->btn);
556 evas_object_event_callback_del
557 (sd->buttons[pos]->btn, EVAS_CALLBACK_DEL, _on_button_del);
558 free(sd->buttons[pos]);
560 sd->buttons[pos] = NULL;
561 sd->button_count -= 1;
565 /* shift left the remaining buttons */
566 for (i = pos; i < ELM_POPUP_ACTION_BUTTON_MAX - 1; i++)
568 sd->buttons[i] = sd->buttons[i + 1];
570 snprintf(buf, sizeof(buf), "actionbtn%d", pos + 1);
571 elm_object_part_content_unset(sd->action_area, buf);
572 snprintf(buf, sizeof(buf), "actionbtn%d", pos);
573 elm_object_part_content_set
574 (sd->action_area, buf, sd->buttons[i]->btn);
578 if (!sd->button_count)
581 edje_object_part_unswallow
582 (obj, edje_object_part_swallow_get(obj, "elm.swallow.action_area"));
583 evas_object_hide(sd->action_area);
584 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
588 snprintf(buf, sizeof(buf), "buttons%u", sd->button_count);
590 (sd->action_area, "popup", buf, elm_widget_style_get(obj));
595 _layout_change_cb(void *data,
596 Evas_Object *obj __UNUSED__,
597 const char *emission __UNUSED__,
598 const char *source __UNUSED__)
600 elm_layout_sizing_eval(data);
604 _restack_cb(void *data __UNUSED__,
607 void *event_info __UNUSED__)
609 ELM_POPUP_DATA_GET(obj, sd);
611 evas_object_layer_set(sd->notify, evas_object_layer_get(obj));
615 _list_add(Evas_Object *obj)
617 ELM_POPUP_DATA_GET(obj, sd);
619 sd->tbl = elm_table_add(obj);
621 evas_object_event_callback_add
622 (sd->tbl, EVAS_CALLBACK_DEL, _on_table_del, obj);
624 edje_object_part_swallow
625 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.content", sd->tbl);
626 evas_object_size_hint_weight_set
627 (sd->tbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
628 evas_object_size_hint_align_set(sd->tbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
629 evas_object_show(sd->tbl);
631 sd->spacer = evas_object_rectangle_add(evas_object_evas_get(obj));
632 evas_object_color_set(sd->spacer, 0, 0, 0, 0);
633 elm_table_pack(sd->tbl, sd->spacer, 0, 0, 1, 1);
636 sd->scr = elm_scroller_add(obj);
637 elm_scroller_content_min_limit(sd->scr, EINA_TRUE, EINA_FALSE);
638 elm_scroller_bounce_set(sd->scr, EINA_FALSE, EINA_TRUE);
639 evas_object_size_hint_weight_set
640 (sd->scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
641 evas_object_size_hint_align_set(sd->scr, EVAS_HINT_FILL, EVAS_HINT_FILL);
642 evas_object_event_callback_add
643 (sd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb,
645 elm_table_pack(sd->tbl, sd->scr, 0, 0, 1, 1);
646 evas_object_show(sd->scr);
649 sd->box = elm_box_add(obj);
650 evas_object_size_hint_weight_set(sd->box, EVAS_HINT_EXPAND, 0.0);
651 evas_object_size_hint_align_set(sd->box, EVAS_HINT_FILL, 0.0);
652 elm_object_content_set(sd->scr, sd->box);
653 evas_object_show(sd->box);
657 _item_select_cb(void *data,
658 Evas_Object *obj __UNUSED__,
659 const char *emission __UNUSED__,
660 const char *source __UNUSED__)
662 Elm_Popup_Item *item = data;
664 if (!item || item->disabled) return;
666 item->func((void *)item->base.data, WIDGET(item), data);
670 _item_text_set(Elm_Popup_Item *item,
673 if (!eina_stringshare_replace(&item->label, label)) return;
675 edje_object_part_text_escaped_set(VIEW(item), "elm.text", label);
678 edje_object_signal_emit
679 (VIEW(item), "elm,state,item,text,visible", "elm");
681 edje_object_signal_emit
682 (VIEW(item), "elm,state,item,text,hidden", "elm");
684 edje_object_message_signal_process(VIEW(item));
688 _item_text_set_hook(Elm_Object_Item *it,
692 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
694 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
696 if ((!part) || (!strcmp(part, "default")))
698 _item_text_set(item, label);
702 WRN("The part name is invalid! : popup=%p", WIDGET(item));
706 _item_text_get_hook(const Elm_Object_Item *it,
709 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
711 ELM_POPUP_ITEM_CHECK_OR_RETURN(it, NULL);
713 if ((!part) || (!strcmp(part, "default")))
716 WRN("The part name is invalid! : popup=%p", WIDGET(item));
722 _item_icon_set(Elm_Popup_Item *item,
725 if (item->icon == icon) return;
728 evas_object_del(item->icon);
733 elm_widget_sub_object_add(WIDGET(item), item->icon);
734 evas_object_data_set(item->icon, "_popup_icon_parent_item", item);
735 edje_object_part_swallow
736 (VIEW(item), "elm.swallow.content", item->icon);
737 edje_object_signal_emit
738 (VIEW(item), "elm,state,item,icon,visible", "elm");
741 edje_object_signal_emit(VIEW(item), "elm,state,item,icon,hidden", "elm");
743 edje_object_message_signal_process(item->base.view);
747 _item_content_set_hook(Elm_Object_Item *it,
749 Evas_Object *content)
751 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
753 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
755 if ((!(part)) || (!strcmp(part, "default")))
756 _item_icon_set(item, content);
758 WRN("The part name is invalid! : popup=%p", WIDGET(item));
762 _item_content_get_hook(const Elm_Object_Item *it,
765 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
767 ELM_POPUP_ITEM_CHECK_OR_RETURN(it, NULL);
769 if ((!(part)) || (!strcmp(part, "default")))
772 WRN("The part name is invalid! : popup=%p", WIDGET(item));
778 _item_icon_unset(Elm_Popup_Item *item)
780 Evas_Object *icon = item->icon;
782 if (!item->icon) return NULL;
783 elm_widget_sub_object_del(WIDGET(item), icon);
784 evas_object_data_del(icon, "_popup_icon_parent_item");
785 edje_object_part_unswallow(item->base.view, icon);
786 edje_object_signal_emit(VIEW(item), "elm,state,item,icon,hidden", "elm");
793 _item_content_unset_hook(const Elm_Object_Item *it,
796 Evas_Object *content = NULL;
797 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
799 ELM_POPUP_ITEM_CHECK_OR_RETURN(it, NULL);
801 if ((!(part)) || (!strcmp(part, "default")))
802 content = _item_icon_unset(item);
804 WRN("The part name is invalid! : popup=%p", WIDGET(item));
810 _item_disable_hook(Elm_Object_Item *it)
812 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
814 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
816 if (elm_widget_item_disabled_get(it))
817 edje_object_signal_emit(VIEW(item), "elm,state,item,disabled", "elm");
819 edje_object_signal_emit(VIEW(item), "elm,state,item,enabled", "elm");
823 _item_del_pre_hook(Elm_Object_Item *it)
825 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
827 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
828 ELM_POPUP_DATA_GET(WIDGET(item), sd);
831 evas_object_del(item->icon);
833 eina_stringshare_del(item->label);
834 sd->items = eina_list_remove(sd->items, item);
835 if (!eina_list_count(sd->items))
843 _item_signal_emit_hook(Elm_Object_Item *it,
844 const char *emission,
847 Elm_Popup_Item *item = (Elm_Popup_Item *)it;
849 ELM_POPUP_ITEM_CHECK_OR_RETURN(it);
851 edje_object_signal_emit(VIEW(item), emission, source);
855 _access_activate_cb(void *data __UNUSED__,
856 Evas_Object *part_obj __UNUSED__,
857 Elm_Object_Item *item)
859 _item_select_cb(item, NULL, NULL, NULL);
863 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
865 Elm_Popup_Item *it = (Elm_Popup_Item *)data;
866 if (!it) return NULL;
868 if (it->base.disabled)
869 return strdup(E_("State: Disabled"));
875 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
877 Elm_Popup_Item *it = (Elm_Popup_Item *)data;
878 const char *txt = NULL;
879 Evas_Object *icon = NULL;
880 Eina_Strbuf *buf = NULL;
883 if (!it) return NULL;
890 buf = eina_strbuf_new();
891 eina_strbuf_append(buf, E_("icon "));
892 eina_strbuf_append(buf, txt);
893 str = eina_strbuf_string_steal(buf);
894 eina_strbuf_free(buf);
897 else if ((!txt) && icon) return strdup(E_("icon"));
898 else if (txt && (!icon)) return strdup(txt);
904 _access_widget_item_register(Elm_Popup_Item *it)
908 _elm_access_widget_item_register((Elm_Widget_Item *)it);
909 ao = _elm_access_object_get(it->base.access_obj);
910 _elm_access_callback_set(ao, ELM_ACCESS_INFO, _access_info_cb, it);
911 _elm_access_callback_set(ao, ELM_ACCESS_STATE, _access_state_cb, it);
912 _elm_access_text_set(ao, ELM_ACCESS_TYPE, E_("Popup_list"));
913 _elm_access_activate_callback_set(ao, _access_activate_cb, it);
918 _item_new(Elm_Popup_Item *item)
920 int orientation = -1;
922 ELM_POPUP_DATA_GET(WIDGET(item), sd);
924 elm_widget_item_text_set_hook_set(item, _item_text_set_hook);
925 elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
926 elm_widget_item_content_set_hook_set(item, _item_content_set_hook);
927 elm_widget_item_content_get_hook_set(item, _item_content_get_hook);
928 elm_widget_item_content_unset_hook_set(item, _item_content_unset_hook);
929 elm_widget_item_disable_hook_set(item, _item_disable_hook);
930 elm_widget_item_del_pre_hook_set(item, _item_del_pre_hook);
931 elm_widget_item_signal_emit_hook_set(item, _item_signal_emit_hook);
932 VIEW(item) = edje_object_add
933 (evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj));
935 orientation = sd->orientation;
936 if (orientation == 90 || orientation == 270)
937 elm_widget_theme_object_set
938 (WIDGET(item), VIEW(item), "popup", "item/landscape", elm_widget_style_get(WIDGET(item)));
940 elm_widget_theme_object_set
941 (WIDGET(item), VIEW(item), "popup", "item", elm_widget_style_get(WIDGET(item)));
942 edje_object_mirrored_set(VIEW(item), elm_widget_mirrored_get(WIDGET(item)));
943 edje_object_signal_callback_add
944 (VIEW(item), "elm,action,click", "", _item_select_cb, item);
945 evas_object_size_hint_align_set
946 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
949 if (_elm_config->access_mode) _access_widget_item_register(item);
951 evas_object_show(VIEW(item));
955 _title_text_set(Evas_Object *obj,
959 Eina_Bool title_visibility_old, title_visibility_current;
961 ELM_POPUP_DATA_GET(obj, sd);
963 if (sd->title_text == text) return EINA_TRUE;
965 title_visibility_old = (sd->title_text) || (sd->title_icon);
966 eina_stringshare_replace(&sd->title_text, text);
968 //bare edje here because we're inside the hook, already
969 edje_object_part_text_escaped_set
970 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.text.title", text);
973 if (_elm_config->access_mode)
975 ao = _access_object_get(obj, ACCESS_TITLE_PART);
978 ao = _elm_access_edje_object_part_object_register
979 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_TITLE_PART);
980 _elm_access_text_set(_elm_access_object_get(ao),
981 ELM_ACCESS_TYPE, E_("Popup Title"));
983 _elm_access_text_set(_elm_access_object_get(ao), ELM_ACCESS_INFO, text);
987 elm_layout_signal_emit(obj, "elm,state,title,text,visible", "elm");
989 elm_layout_signal_emit(obj, "elm,state,title,text,hidden", "elm");
991 title_visibility_current = (sd->title_text) || (sd->title_icon);
993 if (title_visibility_old != title_visibility_current)
996 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
997 elm_layout_sizing_eval(obj);
1003 _content_text_set(Evas_Object *obj,
1006 Evas_Object *prev_content, *ao;
1009 ELM_POPUP_DATA_GET(obj, sd);
1017 prev_content = elm_layout_content_get
1018 (sd->content_area, "elm.swallow.content");
1021 evas_object_del(prev_content);
1023 if (!text) goto end;
1025 edje_object_part_swallow
1026 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.content",
1028 sd->text_content_obj = elm_label_add(obj);
1030 evas_object_event_callback_add
1031 (sd->text_content_obj, EVAS_CALLBACK_DEL, _on_text_content_del, obj);
1033 snprintf(buf, sizeof(buf), "popup/%s", elm_widget_style_get(obj));
1034 elm_object_style_set(sd->text_content_obj, buf);
1035 elm_label_line_wrap_set(sd->text_content_obj, sd->content_text_wrap_type);
1036 elm_object_text_set(sd->text_content_obj, text);
1037 evas_object_size_hint_weight_set
1038 (sd->text_content_obj, EVAS_HINT_EXPAND, 0.0);
1039 evas_object_size_hint_align_set
1040 (sd->text_content_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1041 elm_layout_content_set
1042 (sd->content_area, "elm.swallow.content", sd->text_content_obj);
1045 if (_elm_config->access_mode)
1047 /* unregister label, ACCESS_BODY_PART will register */
1048 elm_access_object_unregister(sd->text_content_obj);
1050 ao = _access_object_get(obj, ACCESS_BODY_PART);
1053 ao = _elm_access_edje_object_part_object_register
1054 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BODY_PART);
1055 _elm_access_text_set(_elm_access_object_get(ao),
1056 ELM_ACCESS_TYPE, E_("Popup Body Text"));
1058 _elm_access_text_set(_elm_access_object_get(ao), ELM_ACCESS_INFO, text);
1062 elm_layout_sizing_eval(obj);
1068 _elm_popup_smart_text_set(Evas_Object *obj,
1072 if (!part || !strcmp(part, "default"))
1073 return _content_text_set(obj, label);
1074 else if (!strcmp(part, "title,text"))
1075 return _title_text_set(obj, label);
1077 return _elm_popup_parent_sc->text_set(obj, part, label);
1081 _title_text_get(const Evas_Object *obj)
1083 ELM_POPUP_DATA_GET(obj, sd);
1085 return sd->title_text;
1089 _content_text_get(const Evas_Object *obj)
1091 const char *str = NULL;
1093 ELM_POPUP_DATA_GET(obj, sd);
1095 if (sd->text_content_obj)
1096 str = elm_object_text_get(sd->text_content_obj);
1102 _elm_popup_smart_text_get(const Evas_Object *obj,
1105 const char *str = NULL;
1107 if (!part || !strcmp(part, "default"))
1108 str = _content_text_get(obj);
1109 else if (!strcmp(part, "title,text"))
1110 str = _title_text_get(obj);
1112 str = _elm_popup_parent_sc->text_get(obj, part);
1118 _title_icon_set(Evas_Object *obj,
1121 Eina_Bool title_visibility_old, title_visibility_current;
1123 ELM_POPUP_DATA_GET(obj, sd);
1125 if (sd->title_icon == icon) return EINA_TRUE;
1126 title_visibility_old = (sd->title_text) || (sd->title_icon);
1127 if (sd->title_icon) evas_object_del(sd->title_icon);
1129 sd->title_icon = icon;
1130 title_visibility_current = (sd->title_text) || (sd->title_icon);
1132 //bare edje here because we're already in content_set virtual
1133 edje_object_part_swallow
1134 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.title.icon",
1138 elm_layout_signal_emit(obj, "elm,state,title,icon,visible", "elm");
1139 if (title_visibility_old != title_visibility_current) _visuals_set(obj);
1141 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
1142 elm_layout_sizing_eval(obj);
1148 _content_set(Evas_Object *obj,
1149 Evas_Object *content)
1151 Evas_Object *prev_content;
1153 ELM_POPUP_DATA_GET(obj, sd);
1155 if (sd->content && sd->content == content) return EINA_TRUE;
1162 elm_layout_content_get(sd->content_area, "elm.swallow.content");
1164 evas_object_del(prev_content);
1166 sd->content = content;
1169 //bare edje as to avoid loop
1170 edje_object_part_swallow
1171 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.content",
1174 elm_layout_content_set
1175 (sd->content_area, "elm.swallow.content", content);
1176 evas_object_show(content);
1178 evas_object_event_callback_add
1179 (content, EVAS_CALLBACK_DEL, _on_content_del, obj);
1181 elm_layout_sizing_eval(obj);
1187 _action_button_set(Evas_Object *obj,
1192 Action_Area_Data *adata;
1196 ELM_POPUP_DATA_GET(obj, sd);
1198 if (idx >= ELM_POPUP_ACTION_BUTTON_MAX) return;
1202 _button_remove(obj, idx, EINA_TRUE);
1206 if (!sd->buttons[idx]) sd->button_count++;
1209 sd->no_shift = EINA_TRUE;
1210 evas_object_del(sd->buttons[idx]->btn);
1211 sd->no_shift = EINA_FALSE;
1214 if (_elm_config->access_mode)
1216 /* if popup has a button, popup should be closed by the button
1217 so outline(ACCESS_BASE_PART) is not necessary any more */
1218 ao = _access_object_get(obj, ACCESS_BASE_PART);
1220 if (ao && sd->button_count)
1221 _elm_access_edje_object_part_object_unregister
1222 (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_BASE_PART);
1225 snprintf(buf, sizeof(buf), "buttons%u", sd->button_count);
1226 elm_layout_theme_set
1227 (sd->action_area, "popup", buf, elm_widget_style_get(obj));
1229 adata = ELM_NEW(Action_Area_Data);
1233 evas_object_event_callback_add
1234 (btn, EVAS_CALLBACK_DEL, _on_button_del, obj);
1236 sd->buttons[idx] = adata;
1238 snprintf(buf, sizeof(buf), "actionbtn%u", idx + 1);
1239 elm_object_part_content_set
1240 (sd->action_area, buf, sd->buttons[idx]->btn);
1241 evas_object_show(sd->buttons[i]->btn);
1243 edje_object_part_swallow
1244 (ELM_WIDGET_DATA(sd)->resize_obj, "elm.swallow.action_area",
1246 if (sd->button_count == 1) _visuals_set(obj);
1248 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
1249 if (sd->items) _scroller_size_calc(obj);
1251 elm_layout_sizing_eval(obj);
1255 _elm_popup_smart_content_set(Evas_Object *obj,
1257 Evas_Object *content)
1261 if (!part || !strcmp(part, "default"))
1262 return _content_set(obj, content);
1263 else if (!strcmp(part, "title,icon"))
1264 return _title_icon_set(obj, content);
1265 else if (!strncmp(part, "button", 6))
1267 i = atoi(part + 6) - 1;
1269 if (i >= ELM_POPUP_ACTION_BUTTON_MAX)
1272 _action_button_set(obj, content, i);
1278 ERR("The part name is invalid! : popup=%p", obj);
1283 static Evas_Object *
1284 _title_icon_get(const Evas_Object *obj)
1286 ELM_POPUP_DATA_GET(obj, sd);
1288 return sd->title_icon;
1291 static Evas_Object *
1292 _content_get(const Evas_Object *obj)
1294 ELM_POPUP_DATA_GET(obj, sd);
1299 static Evas_Object *
1300 _action_button_get(const Evas_Object *obj,
1303 Evas_Object *button = NULL;
1305 ELM_POPUP_DATA_GET(obj, sd);
1306 if (!sd->button_count) return NULL;
1308 if (sd->buttons[idx])
1309 button = sd->buttons[idx]->btn;
1314 static Evas_Object *
1315 _elm_popup_smart_content_get(const Evas_Object *obj,
1318 Evas_Object *content = NULL;
1321 if (!part || !strcmp(part, "default"))
1322 content = _content_get(obj);
1323 else if (!strcmp(part, "title,text"))
1324 content = _title_icon_get(obj);
1325 else if (!strncmp(part, "button", 6))
1327 i = atoi(part + 6) - 1;
1329 if (i >= ELM_POPUP_ACTION_BUTTON_MAX)
1332 content = _action_button_get(obj, i);
1340 WRN("The part name is invalid! : popup=%p", obj);
1344 static Evas_Object *
1345 _content_unset(Evas_Object *obj)
1347 Evas_Object *content;
1349 ELM_POPUP_DATA_GET(obj, sd);
1351 if (!sd->content) return NULL;
1353 evas_object_event_callback_del
1354 (sd->content, EVAS_CALLBACK_DEL, _on_content_del);
1356 content = elm_layout_content_unset(sd->content_area, "elm.swallow.content");
1359 elm_layout_sizing_eval(obj);
1364 static Evas_Object *
1365 _title_icon_unset(Evas_Object *obj)
1369 ELM_POPUP_DATA_GET(obj, sd);
1371 if (!sd->title_icon) return NULL;
1373 icon = sd->title_icon;
1374 edje_object_part_unswallow(ELM_WIDGET_DATA(sd)->resize_obj, sd->title_icon);
1375 sd->title_icon = NULL;
1380 static Evas_Object *
1381 _elm_popup_smart_content_unset(Evas_Object *obj,
1384 Evas_Object *content = NULL;
1387 if (!part || !strcmp(part, "default"))
1388 content = _content_unset(obj);
1389 else if (!strcmp(part, "title,icon"))
1390 content = _title_icon_unset(obj);
1391 else if (!strncmp(part, "button", 6))
1393 i = atoi(part + 6) - 1;
1395 if (i >= ELM_POPUP_ACTION_BUTTON_MAX)
1398 _button_remove(obj, i, EINA_FALSE);
1406 ERR("The part name is invalid! : popup=%p", obj);
1412 _elm_popup_smart_focus_next(const Evas_Object *obj,
1413 Elm_Focus_Direction dir,
1417 Eina_List *items = NULL;
1418 Elm_Popup_Item * it = NULL;
1421 ELM_POPUP_DATA_GET(obj, sd);
1424 if (_elm_config->access_mode)
1426 ao = _access_object_get(obj, ACCESS_BASE_PART);
1427 if (ao) items = eina_list_append(items, ao);
1431 ao = _access_object_get(obj, ACCESS_TITLE_PART);
1432 items = eina_list_append(items, ao);
1435 ao = _access_object_get(obj, ACCESS_BODY_PART);
1436 if (ao) items = eina_list_append(items, ao);
1440 if (sd->content) items = eina_list_append(items, sd->content_area);
1442 EINA_LIST_FOREACH(sd->items, l, it)
1443 items = eina_list_append(items, it->base.access_obj);
1445 if (sd->button_count) items = eina_list_append(items, sd->action_area);
1447 if (_elm_config->access_mode)
1448 return elm_widget_focus_list_next_get(obj, items, eina_list_data_get, dir, next);
1450 if (!elm_widget_focus_list_next_get(obj, items, eina_list_data_get, dir, next))
1451 *next = (Evas_Object *)obj;
1457 _elm_popup_smart_focus_direction(const Evas_Object *obj,
1458 const Evas_Object *base,
1460 Evas_Object **direction,
1464 Eina_List *items = NULL;
1465 Elm_Popup_Item * it = NULL;
1468 ELM_POPUP_DATA_GET(obj, sd);
1471 if (_elm_config->access_mode)
1473 ao = _access_object_get(obj, ACCESS_BASE_PART);
1474 if (ao) items = eina_list_append(items, ao);
1478 ao = _access_object_get(obj, ACCESS_TITLE_PART);
1479 items = eina_list_append(items, ao);
1482 ao = _access_object_get(obj, ACCESS_BODY_PART);
1483 if (ao) items = eina_list_append(items, ao);
1487 if (sd->content) items = eina_list_append(items, sd->content_area);
1489 EINA_LIST_FOREACH(sd->items, l, it)
1490 items = eina_list_append(items, it->base.access_obj);
1493 if (sd->button_count) items = eina_list_append(items, sd->action_area);
1495 elm_widget_focus_list_direction_get
1496 (obj, base, items, eina_list_data_get, degree, direction, weight);
1501 static void _rotation_changed_cb(void *data,
1502 Evas_Object *o __UNUSED__,
1503 const char *emission __UNUSED__,
1504 const char *source __UNUSED__)
1508 Evas_Object *popup = data;
1509 Elm_Popup_Item *item;
1511 ELM_POPUP_CHECK(popup);
1512 ELM_POPUP_DATA_GET(popup, sd);
1514 rotation = ELM_WIDGET_DATA(sd)->orient_mode;
1516 if (sd->orientation == rotation) return;
1518 sd->orientation = rotation;
1522 EINA_LIST_FOREACH(sd->items, elist, item)
1524 if (rotation == 90 || rotation == 270)
1525 elm_widget_theme_object_set
1526 (WIDGET(item), VIEW(item), "popup", "item/landscape", elm_widget_style_get(WIDGET(item)));
1528 elm_widget_theme_object_set
1529 (WIDGET(item), VIEW(item), "popup", "item", elm_widget_style_get(WIDGET(item)));
1532 _scroller_size_calc(popup);
1533 elm_layout_sizing_eval(popup);
1538 _elm_popup_smart_add(Evas_Object *obj)
1542 EVAS_SMART_DATA_ALLOC(obj, Elm_Popup_Smart_Data);
1544 ELM_WIDGET_CLASS(_elm_popup_parent_sc)->base.add(obj);
1546 evas_object_size_hint_weight_set
1547 (ELM_WIDGET_DATA(priv)->resize_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1548 evas_object_size_hint_align_set
1549 (ELM_WIDGET_DATA(priv)->resize_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1551 elm_layout_theme_set(obj, "popup", "base", elm_widget_style_get(obj));
1553 priv->notify = elm_notify_add(obj);
1554 elm_notify_align_set(priv->notify, 0.5, 0.5);
1555 elm_notify_allow_events_set(priv->notify, EINA_FALSE);
1556 evas_object_size_hint_weight_set
1557 (priv->notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1558 evas_object_size_hint_align_set
1559 (priv->notify, EVAS_HINT_FILL, EVAS_HINT_FILL);
1561 elm_object_style_set(priv->notify, "popup");
1563 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _on_show, NULL);
1564 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _on_hide, NULL);
1566 evas_object_event_callback_add
1567 (obj, EVAS_CALLBACK_RESTACK, _restack_cb, NULL);
1569 elm_layout_signal_callback_add
1570 (obj, "elm,state,title_area,visible", "elm", _layout_change_cb, obj);
1571 elm_layout_signal_callback_add
1572 (obj, "elm,state,title_area,hidden", "elm", _layout_change_cb, obj);
1573 elm_layout_signal_callback_add
1574 (obj, "elm,state,action_area,visible", "elm", _layout_change_cb, obj);
1575 elm_layout_signal_callback_add
1576 (obj, "elm,state,action_area,hidden", "elm", _layout_change_cb, obj);
1578 priv->content_area = elm_layout_add(obj);
1579 elm_layout_theme_set
1580 (priv->content_area, "popup", "content", elm_widget_style_get(obj));
1581 priv->action_area = elm_layout_add(obj);
1582 evas_object_size_hint_weight_set(priv->action_area, EVAS_HINT_EXPAND,
1584 evas_object_size_hint_align_set(priv->action_area, EVAS_HINT_FILL,
1586 evas_object_event_callback_add
1587 (priv->action_area, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1588 _size_hints_changed_cb, obj);
1589 evas_object_event_callback_add
1590 (priv->content_area, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1591 _size_hints_changed_cb, obj);
1593 priv->content_text_wrap_type = ELM_WRAP_MIXED;
1594 evas_object_smart_callback_add
1595 (priv->notify, "block,clicked", _block_clicked_cb, obj);
1597 evas_object_smart_callback_add(priv->notify, "timeout", _timeout_cb, obj);
1599 elm_widget_can_focus_set(obj, EINA_TRUE);
1604 if (_elm_config->access_mode)
1606 ao = _elm_access_edje_object_part_object_register
1607 (obj, ELM_WIDGET_DATA(priv)->resize_obj, ACCESS_BASE_PART);
1608 _elm_access_text_set(_elm_access_object_get(ao),
1609 ELM_ACCESS_TYPE, E_(OUTLINE_TEXT));
1610 _elm_access_activate_callback_set
1611 (_elm_access_object_get(ao), _access_base_activate_cb, obj);
1616 _elm_popup_smart_parent_set(Evas_Object *obj,
1617 Evas_Object *parent)
1619 ELM_POPUP_DATA_GET(obj, sd);
1621 elm_notify_parent_set(sd->notify, parent);
1625 _elm_popup_smart_access(Evas_Object *obj, Eina_Bool is_access)
1627 _access_obj_process(obj, is_access);
1629 evas_object_smart_callback_call(obj, SIG_ACCESS_CHANGED, NULL);
1633 _elm_popup_smart_event(Evas_Object *obj,
1634 Evas_Object *src __UNUSED__,
1635 Evas_Callback_Type type,
1638 Evas_Event_Key_Down *ev = event_info;
1640 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
1641 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1642 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1644 if (!strcmp(ev->keyname, "Tab"))
1646 if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1647 elm_widget_focus_cycle(obj, ELM_FOCUS_PREVIOUS);
1649 elm_widget_focus_cycle(obj, ELM_FOCUS_NEXT);
1653 else if ((!strcmp(ev->keyname, "Left")) ||
1654 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
1656 elm_widget_focus_direction_go(obj, 270.0);
1659 else if ((!strcmp(ev->keyname, "Right")) ||
1660 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
1662 elm_widget_focus_direction_go(obj, 90.0);
1665 else if ((!strcmp(ev->keyname, "Up")) ||
1666 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
1668 elm_widget_focus_direction_go(obj, 0.0);
1671 else if ((!strcmp(ev->keyname, "Down")) ||
1672 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
1674 elm_widget_focus_direction_go(obj, 180.0);
1681 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1686 _elm_popup_smart_set_user(Elm_Popup_Smart_Class *sc)
1688 ELM_WIDGET_CLASS(sc)->base.add = _elm_popup_smart_add;
1689 ELM_WIDGET_CLASS(sc)->base.del = _elm_popup_smart_del;
1691 ELM_WIDGET_CLASS(sc)->parent_set = _elm_popup_smart_parent_set;
1692 ELM_WIDGET_CLASS(sc)->event = _elm_popup_smart_event;
1693 ELM_WIDGET_CLASS(sc)->theme = _elm_popup_smart_theme;
1694 ELM_WIDGET_CLASS(sc)->translate = _elm_popup_smart_translate;
1695 ELM_WIDGET_CLASS(sc)->focus_next = _elm_popup_smart_focus_next;
1696 ELM_WIDGET_CLASS(sc)->access = _elm_popup_smart_access;
1697 ELM_WIDGET_CLASS(sc)->focus_direction = _elm_popup_smart_focus_direction;
1698 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_popup_smart_sub_object_del;
1700 ELM_CONTAINER_CLASS(sc)->content_set = _elm_popup_smart_content_set;
1701 ELM_CONTAINER_CLASS(sc)->content_get = _elm_popup_smart_content_get;
1702 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_popup_smart_content_unset;
1704 ELM_LAYOUT_CLASS(sc)->text_set = _elm_popup_smart_text_set;
1705 ELM_LAYOUT_CLASS(sc)->text_get = _elm_popup_smart_text_get;
1706 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_popup_smart_sizing_eval;
1709 EAPI const Elm_Popup_Smart_Class *
1710 elm_popup_smart_class_get(void)
1712 static Elm_Popup_Smart_Class _sc =
1713 ELM_POPUP_SMART_CLASS_INIT_NAME_VERSION(ELM_POPUP_SMART_NAME);
1714 static const Elm_Popup_Smart_Class *class = NULL;
1715 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
1720 _elm_popup_smart_set(&_sc);
1721 esc->callbacks = _smart_callbacks;
1728 elm_popup_add(Evas_Object *parent)
1732 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1734 obj = elm_widget_add(_elm_popup_smart_class_new(), parent);
1735 if (!obj) return NULL;
1737 if (!elm_widget_sub_object_add(parent, obj))
1738 ERR("could not add %p as sub object of %p", obj, parent);
1740 /* access: parent could be any object such as elm_list which does
1741 not know elc_popup as its child object in the focus_next(); */
1742 ELM_WIDGET_DATA_GET(obj, sd);
1743 ELM_POPUP_DATA_GET(obj, sd1);
1745 sd->highlight_root = EINA_TRUE;
1746 sd1->orientation = sd->orient_mode;
1748 _elm_widget_orient_signal_emit(obj);
1750 elm_layout_signal_callback_add
1751 (obj, "elm,state,orientation,changed", "", _rotation_changed_cb, obj);
1757 elm_popup_content_text_wrap_type_set(Evas_Object *obj,
1760 ELM_POPUP_CHECK(obj);
1761 ELM_POPUP_DATA_GET(obj, sd);
1763 //Need to wrap the content text, so not allowing ELM_WRAP_NONE
1764 if (sd->content_text_wrap_type == ELM_WRAP_NONE) return;
1766 sd->content_text_wrap_type = wrap;
1767 if (sd->text_content_obj)
1768 elm_label_line_wrap_set(sd->text_content_obj, wrap);
1772 elm_popup_content_text_wrap_type_get(const Evas_Object *obj)
1774 ELM_POPUP_CHECK(obj) ELM_WRAP_LAST;
1775 ELM_POPUP_DATA_GET(obj, sd);
1777 return sd->content_text_wrap_type;
1781 elm_popup_orient_set(Evas_Object *obj,
1782 Elm_Popup_Orient orient)
1784 ELM_POPUP_CHECK(obj);
1785 ELM_POPUP_DATA_GET(obj, sd);
1787 if (orient >= ELM_POPUP_ORIENT_LAST) return;
1788 double horizontal = 0, vertical = 0;
1792 case ELM_POPUP_ORIENT_TOP:
1793 horizontal = 0.5; vertical = 0.0;
1796 case ELM_POPUP_ORIENT_CENTER:
1797 horizontal = 0.5; vertical = 0.5;
1800 case ELM_POPUP_ORIENT_BOTTOM:
1801 horizontal = 0.5; vertical = 1.0;
1804 case ELM_POPUP_ORIENT_LEFT:
1805 horizontal = 0.0; vertical = 0.5;
1808 case ELM_POPUP_ORIENT_RIGHT:
1809 horizontal = 1.0; vertical = 0.5;
1812 case ELM_POPUP_ORIENT_TOP_LEFT:
1813 horizontal = 0.0; vertical = 0.0;
1816 case ELM_POPUP_ORIENT_TOP_RIGHT:
1817 horizontal = 1.0; vertical = 0.0;
1820 case ELM_POPUP_ORIENT_BOTTOM_LEFT:
1821 horizontal = 0.0; vertical = 1.0;
1824 case ELM_POPUP_ORIENT_BOTTOM_RIGHT:
1825 horizontal = 1.0; vertical = 1.0;
1828 elm_notify_align_set(sd->notify, horizontal, vertical);
1831 EAPI Elm_Popup_Orient
1832 elm_popup_orient_get(const Evas_Object *obj)
1834 ELM_POPUP_CHECK(obj) - 1;
1835 ELM_POPUP_DATA_GET(obj, sd);
1837 return (Elm_Popup_Orient)elm_notify_orient_get(sd->notify);
1841 elm_popup_timeout_set(Evas_Object *obj,
1844 ELM_POPUP_CHECK(obj);
1845 ELM_POPUP_DATA_GET(obj, sd);
1847 elm_notify_timeout_set(sd->notify, timeout);
1851 elm_popup_timeout_get(const Evas_Object *obj)
1853 ELM_POPUP_CHECK(obj) 0.0;
1854 ELM_POPUP_DATA_GET(obj, sd);
1856 return elm_notify_timeout_get(sd->notify);
1860 elm_popup_allow_events_set(Evas_Object *obj,
1863 Eina_Bool allow_events = !!allow;
1865 ELM_POPUP_CHECK(obj);
1866 ELM_POPUP_DATA_GET(obj, sd);
1868 elm_notify_allow_events_set(sd->notify, allow_events);
1872 elm_popup_allow_events_get(const Evas_Object *obj)
1874 ELM_POPUP_CHECK(obj) EINA_FALSE;
1875 ELM_POPUP_DATA_GET(obj, sd);
1877 return elm_notify_allow_events_get(sd->notify);
1880 EAPI Elm_Object_Item *
1881 elm_popup_item_append(Evas_Object *obj,
1887 Evas_Object *prev_content;
1888 Elm_Popup_Item *item;
1890 ELM_POPUP_CHECK(obj) NULL;
1891 ELM_POPUP_DATA_GET(obj, sd);
1893 item = elm_widget_item_new(obj, Elm_Popup_Item);
1894 if (!item) return NULL;
1895 if (sd->content || sd->text_content_obj)
1897 prev_content = elm_layout_content_get
1898 (sd->content_area, "elm.swallow.content");
1900 evas_object_del(prev_content);
1903 //The first item is appended.
1908 item->base.data = data;
1911 _item_icon_set(item, icon);
1912 _item_text_set(item, label);
1914 elm_box_pack_end(sd->box, VIEW(item));
1915 sd->items = eina_list_append(sd->items, item);
1917 _scroller_size_calc(obj);
1918 elm_layout_sizing_eval(obj);
1920 return (Elm_Object_Item *)item;