3 #define SMART_NAME "e_ilist"
4 #define API_ENTRY E_Smart_Data * sd; sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME)))
5 #define INTERNAL_ENTRY E_Smart_Data * sd; sd = evas_object_smart_data_get(obj); if (!sd) return;
7 typedef struct _E_Smart_Data E_Smart_Data;
10 Evas_Coord x, y, w, h, iw, ih;
11 Evas_Object *o_smart, *o_edje, *o_box;
13 Eina_List *selected_items;
16 unsigned char selector : 1;
17 unsigned char multi_select : 1;
18 unsigned char on_hold : 1;
28 static void _e_smart_init(void);
29 static void _e_smart_add(Evas_Object *obj);
30 static void _e_smart_del(Evas_Object *obj);
31 static void _e_smart_show(Evas_Object *obj);
32 static void _e_smart_hide(Evas_Object *obj);
33 static void _e_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
34 static void _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
35 static void _e_smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
36 static void _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
37 static void _e_smart_clip_unset(Evas_Object *obj);
38 static void _e_smart_reconfigure(E_Smart_Data *sd);
39 static void _e_smart_event_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
40 static void _e_smart_event_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info);
41 static void _e_smart_event_key_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
43 static void _e_typebuf_add(Evas_Object *obj, const char *s);
44 static void _e_typebuf_match(Evas_Object *obj);
45 static Eina_Bool _e_typebuf_timer_cb(void *data);
46 static void _e_typebuf_timer_update(Evas_Object *obj);
47 static void _e_typebuf_timer_delete(Evas_Object *obj);
48 static void _e_typebuf_clean(Evas_Object *obj);
50 static void _e_ilist_item_theme_set(E_Ilist_Item *si, Eina_Bool custom, Eina_Bool header, Eina_Bool even);
51 static void _e_ilist_widget_hack_cb(E_Smart_Data *sd, Evas_Object *obj __UNUSED__, Evas_Object *scr);
53 static void _item_select(E_Ilist_Item *si);
54 static void _item_unselect(E_Ilist_Item *si);
56 static Evas_Smart *_e_smart = NULL;
59 e_ilist_add(Evas *evas)
62 return evas_object_smart_add(evas, _e_smart);
66 e_ilist_append(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, int header, void (*func)(void *data, void *data2), void (*func_hilight)(void *data, void *data2), void *data, void *data2)
69 Evas_Coord mw = 0, mh = 0;
74 si = E_NEW(E_Ilist_Item, 1);
76 si->o_base = edje_object_add(evas_object_evas_get(sd->o_smart));
78 isodd = eina_list_count(sd->items) & 0x1;
79 _e_ilist_item_theme_set(si, !!sd->theme, header, !isodd);
82 si->label = eina_stringshare_add(label);
83 edje_object_part_text_set(si->o_base, "e.text.label", label);
89 edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih);
90 edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon);
91 evas_object_show(si->o_icon);
96 Evas_Coord ew = 0, eh = 0;
98 evas_object_size_hint_min_get(si->o_end, &ew, &eh);
99 if ((ew <= 0) || (eh <= 0))
104 edje_extern_object_min_size_set(si->o_end, ew, eh);
105 edje_object_part_swallow(si->o_base, "e.swallow.end", si->o_end);
106 evas_object_show(si->o_end);
109 si->func_hilight = func_hilight;
113 sd->items = eina_list_append(sd->items, si);
115 edje_object_size_min_calc(si->o_base, &mw, &mh);
116 e_box_freeze(sd->o_box);
117 e_box_pack_end(sd->o_box, si->o_base);
118 e_box_pack_options_set(si->o_base, 1, 1, 1, 1, 0.5, 0.5,
119 mw, mh, 99999, 99999);
120 stacking = edje_object_data_get(si->o_base, "stacking");
123 if (!strcmp(stacking, "below")) evas_object_lower(si->o_base);
124 else if (!strcmp(stacking, "above"))
125 evas_object_raise(si->o_base);
127 e_box_thaw(sd->o_box);
129 evas_object_lower(sd->o_box);
130 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_DOWN,
131 _e_smart_event_mouse_down, si);
132 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_UP,
133 _e_smart_event_mouse_up, si);
134 evas_object_show(si->o_base);
138 e_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, int header, void (*func)(void *data, void *data2), void (*func_hilight)(void *data, void *data2), void *data, void *data2, int relative)
140 E_Ilist_Item *si, *ri;
141 Evas_Coord mw = 0, mh = 0;
143 const char *stacking;
146 si = E_NEW(E_Ilist_Item, 1);
148 si->o_base = edje_object_add(evas_object_evas_get(sd->o_smart));
150 isodd = eina_list_count(sd->items) & 0x1;
151 _e_ilist_item_theme_set(si, !!sd->theme, header, !isodd);
154 si->label = eina_stringshare_add(label);
155 edje_object_part_text_set(si->o_base, "e.text.label", label);
161 edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih);
162 edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon);
163 evas_object_show(si->o_icon);
168 Evas_Coord ew = 0, eh = 0;
169 evas_object_size_hint_min_get(si->o_end, &ew, &eh);
170 if ((ew <= 0) || (eh <= 0))
175 edje_extern_object_min_size_set(si->o_end, ew, eh);
176 edje_object_part_swallow(si->o_base, "e.swallow.end", si->o_end);
177 evas_object_show(si->o_end);
180 si->func_hilight = func_hilight;
185 ri = eina_list_nth(sd->items, relative);
187 sd->items = eina_list_append_relative(sd->items, si, ri);
189 sd->items = eina_list_append(sd->items, si);
191 edje_object_size_min_calc(si->o_base, &mw, &mh);
192 e_box_freeze(sd->o_box);
194 e_box_pack_after(sd->o_box, si->o_base, ri->o_base);
196 e_box_pack_end(sd->o_box, si->o_base);
197 e_box_pack_options_set(si->o_base, 1, 1, 1, 1, 0.5, 0.5,
198 mw, mh, 99999, 99999);
199 stacking = edje_object_data_get(si->o_base, "stacking");
202 if (!strcmp(stacking, "below")) evas_object_lower(si->o_base);
203 else if (!strcmp(stacking, "above"))
204 evas_object_raise(si->o_base);
206 e_box_thaw(sd->o_box);
208 evas_object_lower(sd->o_box);
209 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_DOWN,
210 _e_smart_event_mouse_down, si);
211 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_UP,
212 _e_smart_event_mouse_up, si);
213 evas_object_show(si->o_base);
217 e_ilist_prepend(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, int header, void (*func)(void *data, void *data2), void (*func_hilight)(void *data, void *data2), void *data, void *data2)
220 Evas_Coord mw = 0, mh = 0;
224 si = E_NEW(E_Ilist_Item, 1);
226 si->o_base = edje_object_add(evas_object_evas_get(sd->o_smart));
228 isodd = eina_list_count(sd->items) & 0x1;
229 _e_ilist_item_theme_set(si, !!sd->theme, header, !isodd);
232 si->label = eina_stringshare_add(label);
233 edje_object_part_text_set(si->o_base, "e.text.label", label);
239 edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih);
240 edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon);
241 evas_object_show(si->o_icon);
246 Evas_Coord ew = 0, eh = 0;
247 evas_object_size_hint_min_get(si->o_end, &ew, &eh);
248 if ((ew <= 0) || (eh <= 0))
253 edje_extern_object_min_size_set(si->o_end, ew, eh);
254 edje_object_part_swallow(si->o_base, "e.swallow.end", si->o_end);
255 evas_object_show(si->o_end);
258 si->func_hilight = func_hilight;
262 sd->items = eina_list_prepend(sd->items, si);
264 edje_object_size_min_calc(si->o_base, &mw, &mh);
265 e_box_freeze(sd->o_box);
266 e_box_pack_start(sd->o_box, si->o_base);
267 e_box_pack_options_set(si->o_base, 1, 1, 1, 1, 0.5, 0.5,
268 mw, mh, 99999, 99999);
269 e_box_thaw(sd->o_box);
271 evas_object_lower(sd->o_box);
272 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_DOWN,
273 _e_smart_event_mouse_down, si);
274 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_UP,
275 _e_smart_event_mouse_up, si);
276 evas_object_show(si->o_base);
280 e_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, Evas_Object *end, const char *label, int header, void (*func)(void *data, void *data2), void (*func_hilight)(void *data, void *data2), void *data, void *data2, int relative)
282 E_Ilist_Item *si, *ri;
283 Evas_Coord mw = 0, mh = 0;
287 si = E_NEW(E_Ilist_Item, 1);
289 si->o_base = edje_object_add(evas_object_evas_get(sd->o_smart));
291 isodd = eina_list_count(sd->items) & 0x1;
292 _e_ilist_item_theme_set(si, !!sd->theme, header, !isodd);
295 si->label = eina_stringshare_add(label);
296 edje_object_part_text_set(si->o_base, "e.text.label", label);
302 edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih);
303 edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon);
304 evas_object_show(si->o_icon);
309 Evas_Coord ew = 0, eh = 0;
311 evas_object_size_hint_min_get(si->o_end, &ew, &eh);
312 if ((ew <= 0) || (eh <= 0))
317 edje_extern_object_min_size_set(si->o_end, ew, eh);
318 edje_object_part_swallow(si->o_base, "e.swallow.end", si->o_end);
319 evas_object_show(si->o_end);
322 si->func_hilight = func_hilight;
327 ri = eina_list_nth(sd->items, relative);
329 sd->items = eina_list_prepend_relative(sd->items, si, ri);
331 sd->items = eina_list_prepend(sd->items, si);
333 edje_object_size_min_calc(si->o_base, &mw, &mh);
334 e_box_freeze(sd->o_box);
336 e_box_pack_before(sd->o_box, si->o_base, ri->o_base);
338 e_box_pack_end(sd->o_box, si->o_base);
339 e_box_pack_options_set(si->o_base, 1, 1, 1, 1, 0.5, 0.5,
340 mw, mh, 99999, 99999);
341 e_box_thaw(sd->o_box);
343 evas_object_lower(sd->o_box);
344 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_DOWN,
345 _e_smart_event_mouse_down, si);
346 evas_object_event_callback_add(si->o_base, EVAS_CALLBACK_MOUSE_UP,
347 _e_smart_event_mouse_up, si);
348 evas_object_show(si->o_base);
352 e_ilist_clear(Evas_Object *obj)
354 E_Ilist_Item *si = NULL;
359 EINA_LIST_FREE(sd->items, si)
362 if (si->o_icon) evas_object_del(si->o_icon);
363 if (si->o_end) evas_object_del(si->o_end);
364 if (si->label) eina_stringshare_del(si->label);
365 evas_object_del(si->o_base);
368 if (sd->selected_items) sd->selected_items = eina_list_free(sd->selected_items);
374 e_ilist_freeze(Evas_Object *obj)
377 e_box_freeze(sd->o_box);
381 e_ilist_thaw(Evas_Object *obj)
384 e_box_thaw(sd->o_box);
388 e_ilist_count(Evas_Object *obj)
391 return eina_list_count(sd->items);
395 e_ilist_selector_get(Evas_Object *obj)
402 e_ilist_selector_set(Evas_Object *obj, int selector)
405 sd->selector = selector;
409 e_ilist_multi_select_get(Evas_Object *obj)
412 return sd->multi_select;
416 e_ilist_multi_select_set(Evas_Object *obj, Eina_Bool multi)
419 sd->multi_select = multi;
423 e_ilist_size_min_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
426 e_box_size_min_get(sd->o_box, w, h);
430 e_ilist_unselect(Evas_Object *obj)
432 E_Ilist_Item *si = NULL;
436 if (!sd->items) return;
437 if (sd->selected < 0) return;
438 EINA_LIST_FREE(sd->selected_items, si)
447 e_ilist_selected_set(Evas_Object *obj, int n)
449 E_Ilist_Item *si = NULL;
453 if (!sd->items) return;
455 i = eina_list_count(sd->items);
456 if (n >= i) n = i - 1;
460 e_ilist_unselect(obj);
461 if (!(si = eina_list_nth(sd->items, n))) return;
463 /* NB: Remove this if headers ever become selectable */
464 while (si->header && ((++n) < i))
465 if (!(si = eina_list_nth(sd->items, n))) return;
466 while (si->header && ((--n) >= 0))
467 if (!(si = eina_list_nth(sd->items, n))) return;
468 if (si->header) return;
472 if (si->func_hilight) si->func_hilight(si->data, si->data2);
473 if (sd->selector) return;
476 if (si->func) si->func(si->data, si->data2);
480 EAPI const Eina_List *
481 e_ilist_selected_items_get(Evas_Object *obj)
483 API_ENTRY return NULL;
484 return sd->selected_items;
488 e_ilist_selected_get(Evas_Object *obj)
491 E_Ilist_Item *li = NULL;
495 if (!sd->items) return -1;
496 if (!sd->multi_select)
500 EINA_LIST_FOREACH(sd->selected_items, l, li)
502 if (li && li->selected) j = i;
509 e_ilist_selected_label_get(Evas_Object *obj)
511 E_Ilist_Item *si = NULL;
513 API_ENTRY return NULL;
514 if (!sd->items) return NULL;
515 if (sd->multi_select) return NULL;
516 if (sd->selected < 0) return NULL;
517 si = eina_list_nth(sd->items, sd->selected);
523 eina_stringshare_add(edje_object_part_text_get(si->o_base,
526 if (si->label) return si->label;
532 e_ilist_selected_data_get(Evas_Object *obj)
534 E_Ilist_Item *si = NULL;
536 API_ENTRY return NULL;
537 if (!sd->items) return NULL;
538 if (sd->multi_select) return NULL;
539 if (sd->selected < 0) return NULL;
540 si = eina_list_nth(sd->items, sd->selected);
541 if (si) return si->data;
546 e_ilist_selected_data2_get(Evas_Object *obj)
548 E_Ilist_Item *si = NULL;
550 API_ENTRY return NULL;
551 if (!sd->items) return NULL;
552 if (sd->multi_select) return NULL;
553 if (sd->selected < 0) return NULL;
554 si = eina_list_nth(sd->items, sd->selected);
555 if (si) return si->data2;
560 e_ilist_selected_icon_get(Evas_Object *obj)
562 E_Ilist_Item *si = NULL;
564 API_ENTRY return NULL;
565 if (!sd->items) return NULL;
566 if (sd->multi_select) return NULL;
567 if (sd->selected < 0) return NULL;
568 si = eina_list_nth(sd->items, sd->selected);
569 if (si) return si->o_icon;
574 e_ilist_selected_end_get(Evas_Object *obj)
576 E_Ilist_Item *si = NULL;
578 API_ENTRY return NULL;
579 if (!sd->items) return NULL;
580 if (sd->multi_select) return NULL;
581 if (sd->selected < 0) return NULL;
582 si = eina_list_nth(sd->items, sd->selected);
583 if (si) return si->o_end;
588 e_ilist_selected_geometry_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
590 E_Ilist_Item *si = NULL;
593 if (!sd->items) return;
594 if (sd->selected < 0) return;
595 if (!(si = eina_list_nth(sd->items, sd->selected))) return;
596 evas_object_geometry_get(si->o_base, x, y, w, h);
602 e_ilist_selected_count_get(Evas_Object *obj)
605 if (!sd->items) return 0;
606 return eina_list_count(sd->selected_items);
610 e_ilist_remove_num(Evas_Object *obj, int n)
612 E_Ilist_Item *si = NULL;
616 if (!sd->items) return;
617 item = eina_list_nth_list(sd->items, n);
619 si = eina_list_data_get(item);
621 sd->items = eina_list_remove_list(sd->items, item);
622 if (si->selected) sd->selected_items = eina_list_remove(sd->selected_items, si);
624 if (sd->selected == n) sd->selected = -1;
625 if (si->o_icon) evas_object_del(si->o_icon);
626 if (si->o_end) evas_object_del(si->o_end);
627 if (si->label) eina_stringshare_del(si->label);
628 evas_object_del(si->o_base);
633 e_ilist_nth_label_get(Evas_Object *obj, int n)
635 E_Ilist_Item *si = NULL;
637 API_ENTRY return NULL;
638 if (!sd->items) return NULL;
639 si = eina_list_nth(sd->items, n);
645 eina_stringshare_add(edje_object_part_text_get(si->o_base,
648 if (si->label) return si->label;
654 e_ilist_nth_label_set(Evas_Object *obj, int n, const char *label)
656 E_Ilist_Item *si = NULL;
658 /* check for a NULL label first...simpler, faster check then doing
659 * API_ENTRY check first */
662 if (!sd->items) return;
663 si = eina_list_nth(sd->items, n);
666 if (eina_stringshare_replace(&si->label, label))
667 edje_object_part_text_set(si->o_base, "e.text.label", label);
672 e_ilist_nth_icon_get(Evas_Object *obj, int n)
674 E_Ilist_Item *si = NULL;
676 API_ENTRY return NULL;
677 if (!sd->items) return NULL;
678 si = eina_list_nth(sd->items, n);
679 if (si) return si->o_icon;
684 e_ilist_nth_icon_set(Evas_Object *obj, int n, Evas_Object *icon)
686 E_Ilist_Item *si = NULL;
689 if (!sd->items) return;
690 if (!(si = eina_list_nth(sd->items, n))) return;
693 edje_object_part_unswallow(si->o_base, si->o_icon);
694 evas_object_del(si->o_icon);
699 edje_extern_object_min_size_set(si->o_icon, sd->iw, sd->ih);
700 edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon);
701 evas_object_show(si->o_icon);
706 e_ilist_nth_end_get(Evas_Object *obj, int n)
708 E_Ilist_Item *si = NULL;
710 API_ENTRY return NULL;
711 if (!sd->items) return NULL;
712 si = eina_list_nth(sd->items, n);
713 if (si) return si->o_end;
718 e_ilist_nth_end_set(Evas_Object *obj, int n, Evas_Object *end)
720 E_Ilist_Item *si = NULL;
723 if (!sd->items) return;
724 if (!(si = eina_list_nth(sd->items, n))) return;
727 edje_object_part_unswallow(si->o_base, si->o_end);
728 evas_object_del(si->o_end);
733 edje_extern_object_min_size_set(si->o_end, sd->iw, sd->ih);
734 edje_object_part_swallow(si->o_base, "e.swallow.end", si->o_end);
735 evas_object_show(si->o_end);
740 e_ilist_nth_is_header(Evas_Object *obj, int n)
742 E_Ilist_Item *si = NULL;
745 if (!sd->items) return 0;
746 si = eina_list_nth(sd->items, n);
747 if (si) return si->header;
752 e_ilist_nth_geometry_get(Evas_Object *obj, int n, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
754 E_Ilist_Item *si = NULL;
757 if (!sd->items) return;
758 if (!(si = eina_list_nth(sd->items, n))) return;
759 evas_object_geometry_get(si->o_base, x, y, w, h);
765 e_ilist_icon_size_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
768 E_Ilist_Item *si = NULL;
771 if ((sd->iw == w) && (sd->ih == h)) return;
774 EINA_LIST_FOREACH(sd->items, l, si)
776 Evas_Coord mw = 0, mh = 0;
779 if (!si->o_icon) continue;
780 edje_extern_object_min_size_set(si->o_icon, w, h);
781 edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon);
785 Evas_Coord ew = 0, eh = 0;
787 evas_object_size_hint_min_get(si->o_end, &ew, &eh);
788 if ((ew <= 0) || (eh <= 0))
793 edje_extern_object_min_size_set(si->o_end, ew, eh);
796 edje_object_size_min_calc(si->o_base, &mw, &mh);
797 e_box_pack_options_set(si->o_icon, 1, 1, 1, 0, 0.5, 0.5,
798 mw, mh, 99999, 99999);
802 EAPI const Eina_List *
803 e_ilist_items_get(Evas_Object *obj)
805 API_ENTRY return NULL;
810 e_ilist_multi_select(Evas_Object *obj, int n)
812 E_Ilist_Item *si = NULL;
816 if ((!sd->items) || (!sd->multi_select)) return;
818 i = eina_list_count(sd->items);
819 if (n >= i) n = i - 1;
823 if (!(si = eina_list_nth(sd->items, n))) return;
824 if (si->header) return;
829 if (si->func_hilight) si->func_hilight(si->data, si->data2);
830 if (sd->selector) return;
833 if (si->func) si->func(si->data, si->data2);
838 if (si->func_hilight) si->func_hilight(si->data, si->data2);
839 if (sd->selector) return;
842 if (si->func) si->func(si->data, si->data2);
847 e_ilist_range_select(Evas_Object *obj, int n)
852 if ((!sd->items) || (!sd->multi_select)) return;
854 i = eina_list_count(sd->items);
855 if (n >= i) n = i - 1;
859 if (n < sd->selected) dir = 0;
862 if (!eina_list_nth(sd->items, n)) return;
865 for (j = (sd->selected + 1); ((j < i) && (j <= n)); j++)
866 e_ilist_multi_select(sd->o_smart, j);
870 for (j = (sd->selected - 1); ((j >= 0) && (j >= n)); j--)
871 e_ilist_multi_select(sd->o_smart, j);
876 e_ilist_custom_edje_file_set(Evas_Object *obj, const char *file, const char *group)
880 Eina_Bool even = EINA_FALSE;
882 API_ENTRY return EINA_FALSE;
884 if (!edje_object_file_set(sd->o_edje, file, group)) return EINA_FALSE;
885 eina_stringshare_replace(&sd->theme, group);
887 EINA_LIST_FOREACH(sd->items, l, si)
889 _e_ilist_item_theme_set(si, !!sd->theme, si->header, even);
891 edje_object_part_swallow(si->o_base, "e.swallow.icon", si->o_icon);
893 edje_object_part_swallow(si->o_base, "e.swallow.end", si->o_end);
899 /* SMART FUNCTIONS */
903 if (_e_smart) return;
905 static Evas_Smart_Class sc = EVAS_SMART_CLASS_INIT_NAME_VERSION(SMART_NAME);
908 sc.add = _e_smart_add;
909 sc.del = _e_smart_del;
910 sc.move = _e_smart_move;
911 sc.resize = _e_smart_resize;
912 sc.show = _e_smart_show;
913 sc.hide = _e_smart_hide;
914 sc.color_set = _e_smart_color_set;
915 sc.clip_set = _e_smart_clip_set;
916 sc.clip_unset = _e_smart_clip_unset;
918 _e_smart = evas_smart_class_new(&sc);
923 _e_smart_add(Evas_Object *obj)
928 sd = calloc(1, sizeof(E_Smart_Data));
930 evas_object_smart_data_set(obj, sd);
932 e = evas_object_evas_get(obj);
935 sd->x = sd->y = sd->w = sd->h = 0;
936 sd->iw = sd->ih = 24;
938 sd->multi_select = 0;
940 sd->typebuf.buf = NULL;
941 sd->typebuf.size = 0;
942 sd->typebuf.timer = NULL;
944 sd->o_box = e_box_add(e);
945 e_box_align_set(sd->o_box, 0.0, 0.0);
946 e_box_homogenous_set(sd->o_box, 0);
947 evas_object_smart_member_add(sd->o_box, obj);
948 evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
949 _e_smart_event_key_down, sd);
950 evas_object_propagate_events_set(obj, 0);
952 sd->o_edje = edje_object_add(e);
953 e_theme_edje_object_set(sd->o_edje, "base/theme/widgets", "e/ilist");
954 evas_object_smart_member_add(sd->o_edje, obj);
956 evas_object_smart_callback_add(obj, "changed", (Evas_Smart_Cb)_e_ilist_widget_hack_cb, sd);
960 _e_smart_del(Evas_Object *obj)
964 _e_typebuf_clean(obj);
967 evas_object_del(sd->o_box);
968 evas_object_del(sd->o_edje);
969 eina_stringshare_del(sd->theme);
974 _e_smart_show(Evas_Object *obj)
977 evas_object_show(sd->o_edje);
978 evas_object_show(sd->o_box);
982 _e_smart_hide(Evas_Object *obj)
985 evas_object_hide(sd->o_edje);
986 evas_object_hide(sd->o_box);
990 _e_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
993 if ((sd->x == x) && (sd->y == y)) return;
996 _e_smart_reconfigure(sd);
1000 _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
1003 if ((sd->w == w) && (sd->h == h)) return;
1006 _e_smart_reconfigure(sd);
1010 _e_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
1013 evas_object_color_set(sd->o_edje, r, g, b, a);
1014 evas_object_color_set(sd->o_box, r, g, b, a);
1018 _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
1021 evas_object_clip_set(sd->o_edje, clip);
1022 evas_object_clip_set(sd->o_box, clip);
1026 _e_smart_clip_unset(Evas_Object *obj)
1029 evas_object_clip_unset(sd->o_edje);
1030 evas_object_clip_unset(sd->o_box);
1034 _e_smart_reconfigure(E_Smart_Data *sd)
1036 evas_object_move(sd->o_edje, sd->x, sd->y);
1037 evas_object_resize(sd->o_edje, sd->w, sd->h);
1038 evas_object_move(sd->o_box, sd->x, sd->y);
1039 evas_object_resize(sd->o_box, sd->w, sd->h);
1043 _e_smart_event_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1046 Evas_Event_Mouse_Down *ev;
1053 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = 1;
1054 else sd->on_hold = 0;
1056 /* NB: Remove if headers ever become selectable */
1057 if (si->header) return;
1059 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1060 evas_object_smart_callback_call(sd->o_smart, "selected", NULL);
1064 _e_smart_event_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1067 Evas_Event_Mouse_Up *ev;
1068 E_Ilist_Item *si, *item;
1069 Eina_List *l = NULL;
1076 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = 1;
1077 else sd->on_hold = 0;
1079 /* NB: Remove if headers ever become selectable */
1080 if (si->header) return;
1088 if (!sd->items) return;
1091 EINA_LIST_FOREACH(sd->items, l, item)
1095 if (!sd->multi_select)
1096 e_ilist_selected_set(sd->o_smart, i);
1099 if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1100 e_ilist_range_select(sd->o_smart, i);
1101 else if (evas_key_modifier_is_set(ev->modifiers, "Control"))
1102 e_ilist_multi_select(sd->o_smart, i);
1104 e_ilist_selected_set(sd->o_smart, i);
1111 if (!sd->selector) return;
1112 if (!(si = eina_list_nth(sd->items, sd->selected))) return;
1113 if (si->func) si->func(si->data, si->data2);
1117 _e_smart_event_key_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
1119 Evas_Event_Key_Down *ev;
1128 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = 1;
1129 else sd->on_hold = 0;
1131 if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")))
1142 si = eina_list_nth(sd->items, n);
1144 while ((si) && (si->header));
1147 if (!sd->multi_select)
1148 e_ilist_selected_set(sd->o_smart, n);
1149 else if (evas_key_modifier_is_set(ev->modifiers, "Control"))
1150 e_ilist_multi_select(sd->o_smart, n);
1151 else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1152 e_ilist_range_select(sd->o_smart, n);
1154 e_ilist_selected_set(sd->o_smart, n);
1157 else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down")))
1162 if (n == ((int)eina_list_count(sd->items) - 1))
1168 si = eina_list_nth(sd->items, n);
1170 while ((si) && (si->header));
1173 if (!sd->multi_select)
1174 e_ilist_selected_set(sd->o_smart, n);
1175 else if (evas_key_modifier_is_set(ev->modifiers, "Control"))
1176 e_ilist_multi_select(sd->o_smart, n);
1177 else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1178 e_ilist_range_select(sd->o_smart, n);
1180 e_ilist_selected_set(sd->o_smart, n);
1183 else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home")))
1188 if (n == ((int)eina_list_count(sd->items) - 1))
1194 si = eina_list_nth(sd->items, n);
1196 while ((si) && (si->header));
1199 if (!sd->multi_select)
1200 e_ilist_selected_set(sd->o_smart, n);
1201 else if (evas_key_modifier_is_set(ev->modifiers, "Control"))
1202 e_ilist_multi_select(sd->o_smart, n);
1203 else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1204 e_ilist_range_select(sd->o_smart, n);
1206 e_ilist_selected_set(sd->o_smart, n);
1209 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
1211 n = eina_list_count(sd->items);
1220 si = eina_list_nth(sd->items, n);
1222 while ((si) && (si->header));
1225 if (!sd->multi_select)
1226 e_ilist_selected_set(sd->o_smart, n);
1227 else if (evas_key_modifier_is_set(ev->modifiers, "Control"))
1228 e_ilist_multi_select(sd->o_smart, n);
1229 else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
1230 e_ilist_range_select(sd->o_smart, n);
1232 e_ilist_selected_set(sd->o_smart, n);
1235 else if ((!strcmp(ev->keyname, "Return")) ||
1236 (!strcmp(ev->keyname, "KP_Enter")) ||
1237 (!strcmp(ev->keyname, "space") && !sd->typebuf.buf))
1241 si = eina_list_nth(sd->items, sd->selected);
1244 if (si->func) si->func(si->data, si->data2);
1248 else if (!strcmp(ev->keyname, "Escape"))
1249 _e_typebuf_clean(obj);
1250 else if (strcmp(ev->keyname, "BackSpace") && strcmp(ev->keyname, "Tab") && ev->string)
1251 _e_typebuf_add(obj, ev->string);
1257 _e_ilist_widget_hack_cb(E_Smart_Data *sd, Evas_Object *obj __UNUSED__, Evas_Object *scr)
1260 e_scrollframe_child_viewport_size_get(scr, &w, &h);
1261 evas_object_resize(sd->o_edje, w, h);
1265 _e_typebuf_add(Evas_Object *obj, const char *s)
1271 if (!sd->typebuf.buf)
1273 sd->typebuf.buf = malloc(16);
1274 if (sd->typebuf.buf)
1276 sd->typebuf.size = 16;
1277 sd->typebuf.buf[0] = '\0';
1281 _e_typebuf_clean(obj);
1286 len = strlen(sd->typebuf.buf);
1287 if (len + strlen(s) + 2 + 1 >= sd->typebuf.size)
1289 char *p = realloc(sd->typebuf.buf, sd->typebuf.size + strlen(s) + 16);
1292 sd->typebuf.buf = p;
1293 sd->typebuf.size = sd->typebuf.size + strlen(s) + 16;
1297 _e_typebuf_clean(obj);
1302 strcat(sd->typebuf.buf, s);
1303 edje_object_part_text_set(sd->o_edje, "e.text.typebuf_label", sd->typebuf.buf);
1304 edje_object_signal_emit(sd->o_edje, "e,state,typebuf,start", "e");
1305 _e_typebuf_match(obj);
1306 _e_typebuf_timer_update(obj);
1310 _e_typebuf_match(Evas_Object *obj)
1315 E_Ilist_Item *si = NULL;
1319 match = malloc(strlen(sd->typebuf.buf) + 2 + 1);
1323 strcat(match, sd->typebuf.buf);
1327 EINA_LIST_FOREACH(sd->items, l, si)
1329 const char *label = NULL;
1336 label = edje_object_part_text_get(si->o_base, "e.text.label");
1338 if (e_util_glob_case_match(label, match))
1340 e_ilist_selected_set(obj, n);
1351 _e_typebuf_timer_cb(void *data)
1353 Evas_Object *obj = data;
1355 _e_typebuf_clean(obj);
1356 return ECORE_CALLBACK_CANCEL;
1360 _e_typebuf_timer_update(Evas_Object *obj)
1364 if (sd->typebuf.timer)
1365 ecore_timer_del(sd->typebuf.timer);
1367 sd->typebuf.timer = ecore_timer_add(3.0, _e_typebuf_timer_cb, obj);
1371 _e_typebuf_timer_delete(Evas_Object *obj)
1375 if (sd->typebuf.timer)
1377 ecore_timer_del(sd->typebuf.timer);
1378 sd->typebuf.timer = NULL;
1383 _e_typebuf_clean(Evas_Object *obj)
1387 E_FREE(sd->typebuf.buf);
1388 sd->typebuf.size = 0;
1389 _e_typebuf_timer_delete(obj);
1390 edje_object_signal_emit(sd->o_edje, "e,state,typebuf,stop", "e");
1394 _item_select(E_Ilist_Item *si)
1396 const char *selectraise;
1397 E_Smart_Data *sd = si->sd;
1398 si->selected = EINA_TRUE;
1399 selectraise = edje_object_data_get(si->o_base, "selectraise");
1400 if ((selectraise) && (!strcmp(selectraise, "on")))
1401 evas_object_raise(si->o_base);
1402 edje_object_signal_emit(si->o_base, "e,state,selected", "e");
1405 if (strcmp(evas_object_type_get(si->o_icon), "e_icon"))
1406 edje_object_signal_emit(si->o_icon, "e,state,selected", "e");
1408 e_icon_selected_set(si->o_icon, EINA_TRUE);
1410 sd->selected_items = eina_list_append(sd->selected_items, si);
1414 _item_unselect(E_Ilist_Item *si)
1416 const char *stacking, *selectraise;
1417 E_Smart_Data *sd = si->sd;
1418 si->selected = EINA_FALSE;
1419 edje_object_signal_emit(si->o_base, "e,state,unselected", "e");
1422 if (strcmp(evas_object_type_get(si->o_icon), "e_icon"))
1423 edje_object_signal_emit(si->o_icon, "e,state,unselected", "e");
1425 e_icon_selected_set(si->o_icon, EINA_FALSE);
1427 stacking = edje_object_data_get(si->o_base, "stacking");
1428 selectraise = edje_object_data_get(si->o_base, "selectraise");
1429 if ((selectraise) && (!strcmp(selectraise, "on")))
1431 if ((stacking) && (!strcmp(stacking, "below")))
1432 evas_object_lower(si->o_base);
1434 sd->selected_items = eina_list_remove(sd->selected_items, si);
1438 _e_ilist_item_theme_set(E_Ilist_Item *si, Eina_Bool custom, Eina_Bool header, Eina_Bool even)
1440 E_Smart_Data *sd = si->sd;
1444 if ((!custom) || (!sd->theme))
1450 if (!e_theme_edje_object_set(si->o_base, "base/theme/widgets",
1451 "e/widgets/ilist_header_odd"))
1452 e_theme_edje_object_set(si->o_base, "base/theme/widgets",
1453 "e/widgets/ilist_header");
1456 e_theme_edje_object_set(si->o_base, "base/theme/widgets",
1457 "e/widgets/ilist_header");
1462 e_theme_edje_object_set(si->o_base, "base/theme/widgets",
1463 "e/widgets/ilist_odd");
1465 e_theme_edje_object_set(si->o_base, "base/theme/widgets",
1470 edje_object_file_get(sd->o_edje, &file, NULL);
1475 snprintf(buf, sizeof(buf), "%s/ilist_header", sd->theme);
1476 if (edje_object_file_set(si->o_base, file, buf)) return;
1477 _e_ilist_item_theme_set(si, EINA_FALSE, header, even);
1480 snprintf(buf, sizeof(buf), "%s/ilist_header_odd", sd->theme);
1481 if (edje_object_file_set(si->o_base, file, buf)) return;
1482 _e_ilist_item_theme_set(si, EINA_FALSE, header, even);
1487 snprintf(buf, sizeof(buf), "%s/ilist", sd->theme);
1488 if (edje_object_file_set(si->o_base, file, buf)) return;
1489 _e_ilist_item_theme_set(si, EINA_FALSE, header, even);
1492 snprintf(buf, sizeof(buf), "%s/ilist_odd", sd->theme);
1493 if (edje_object_file_set(si->o_base, file, buf)) return;
1494 _e_ilist_item_theme_set(si, EINA_FALSE, header, even);