1 #include <Elementary_Cursor.h>
2 #include "test.h"
3 #ifdef HAVE_CONFIG_H
4 #include "elementary_config.h"
5 #endif
6 
7 #ifdef _WIN32
8 # include <evil_private.h> /* strcasestr */
9 #endif
10 
11 #include <Elementary.h>
12 
13 #include "test_explode.h"
14 
15 Evas_Object * _elm_min_set(Evas_Object *obj, Evas_Object *parent,
16                            Evas_Coord w, Evas_Coord h);
17 
18 struct _api_data
19 {
20    unsigned int state;  /* What state we are testing       */
21    void *box;           /* Use this to get box content     */
22 
23    Elm_Genlist_Item_Class *itc;
24    Elm_Genlist_Item_Class *itc1;
25    Elm_Genlist_Item_Class *itc2;
26    void *gl;
27 
28    void *filter_data;   /* The data used for filtering     */
29    Elm_Genlist_Item_Scrollto_Type type;
30    Elm_List_Mode mode;
31    int max_items, show_item;
32    int scrollto;
33 };
34 typedef struct _api_data api_data;
35 
36 enum _api_state
37 {
38    HORIZONTAL_SET,
39    NO_SELECT_MODE_SET,
40    COMPRESS_MODE_SET,
41    BOUNCE_SET,
42    HOMOGENEOUS_SET,
43    SCROLLER_POLICY_SET,
44    TOOLTIP_TEXT_SET,
45    ITEM_CURSOR_SET,
46    ITEM_STYLE_SET,
47    API_STATE_LAST
48 };
49 typedef enum _api_state api_state;
50 
51 static int bounce_max = 50;
52 
53 static void
set_api_state(api_data * api)54 set_api_state(api_data *api)
55 {
56    const Eina_List *items = elm_box_children_get(api->box);
57    if (!eina_list_count(items))
58      return;
59 
60    Evas_Object *gl = eina_list_nth(items, 0); /* Genlist is the first item */
61    /* use elm_box_children_get() to get list of children */
62    switch(api->state)
63      {/* Put all api-changes under switch */
64       case HORIZONTAL_SET: /* 0 */
65          elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
66          break;
67 
68       case NO_SELECT_MODE_SET: /* 1 */
69          elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_NONE);
70          elm_genlist_mode_set(gl, ELM_LIST_SCROLL); /* Back to default */
71          break;
72 
73       case COMPRESS_MODE_SET: /* 2 */
74          elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_DEFAULT);
75          elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
76          break;
77 
78       case BOUNCE_SET: /* 3 */
79          elm_scroller_bounce_set(gl, EINA_FALSE, EINA_FALSE);
80          break;
81 
82       case HOMOGENEOUS_SET: /* 4 */
83          elm_scroller_bounce_set(gl, EINA_TRUE, EINA_TRUE); /* Back to default */
84          elm_genlist_homogeneous_set(gl, EINA_TRUE);
85          break;
86 
87       case SCROLLER_POLICY_SET: /* 5 */
88          elm_genlist_homogeneous_set(gl, EINA_FALSE); /* Back to default */
89          elm_scroller_policy_set(gl, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
90          break;
91 
92       case TOOLTIP_TEXT_SET: /* 6 */
93            {
94               elm_genlist_item_tooltip_text_set(elm_genlist_first_item_get(gl), "Tooltip text from API");
95               elm_genlist_item_bring_in(elm_genlist_first_item_get(gl),
96                                          ELM_GENLIST_ITEM_SCROLLTO_IN);
97            }
98          break;
99 
100       case ITEM_CURSOR_SET: /* 7 */
101          elm_genlist_item_cursor_set(elm_genlist_first_item_get(gl), ELM_CURSOR_HAND2);
102          break;
103 
104       case ITEM_STYLE_SET: /* 8 */
105 		 elm_object_item_style_set(elm_genlist_first_item_get(gl), "double_label");
106          break;
107       default:
108          return;
109      }
110 }
111 
112 static void
_api_bt_clicked(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)113 _api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
114 {  /* Will add here a SWITCH command containing code to modify test-object */
115    /* in accordance a->state value. */
116    api_data *a = data;
117    char str[128];
118 
119    INF("clicked event on API Button: api_state=<%d>", a->state);
120    set_api_state(a);
121    a->state++;
122    sprintf(str, "Next API function (%u)", a->state);
123    elm_object_text_set(obj, str);
124    elm_object_disabled_set(obj, a->state == API_STATE_LAST);
125 }
126 /* Hint:
127  * In this example some calls to elm_genlist_item_append() are used which give the
128  * value of an int as 'item data' and 'func data' after casting into (void*). For
129  * sure this works only on architectures where sizeof(int)==sizeof(void*).
130  * For real world usage you should hold a data structure or value in your
131  * application and then give only a pointer to this data as data pointer.
132  */
133 
134 typedef struct _Testitem
135 {
136    Elm_Object_Item *item;
137    int mode;
138    int onoff;
139    Eina_Bool checked;
140 } Testitem;
141 
142 static char *
gl_text_get1(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)143 gl_text_get1(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
144 {
145    char buf[256];
146    int num = (int)(uintptr_t)data;
147 
148    snprintf(buf, sizeof(buf), "Item # %i", num);
149 
150    return strdup(buf);
151 }
152 
gl_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)153 Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
154 {
155    char buf[PATH_MAX];
156    Evas_Object *ic = elm_icon_add(obj);
157    if (!strcmp(part, "elm.swallow.end"))
158      snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
159    else
160      snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
161    elm_image_file_set(ic, buf, NULL);
162    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
163    return ic;
164 }
165 
on_bt_clicked(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)166 static void on_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
167 {
168    printf("button clicked\n");
169 }
170 
on_ck_changed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)171 static void on_ck_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
172 {
173    printf("checkbox changed\n");
174 }
175 
gl_content_full_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)176 Evas_Object *gl_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
177 {
178    Evas_Object *fr, *bx, *ic, *bt, *ck;
179 
180    if (strcmp(part, "elm.swallow.content") != 0) return NULL;
181 
182    fr = elm_frame_add(obj);
183    elm_layout_text_set(fr, NULL, "A Frame");
184 
185    bx = elm_box_add(fr);
186    elm_box_horizontal_set(bx, EINA_TRUE);
187 
188    ic = elm_icon_add(bx);
189    elm_icon_standard_set(ic, "go-home");
190    evas_object_size_hint_min_set(ic,
191                                  ELM_SCALE_SIZE(32),
192                                  ELM_SCALE_SIZE(32));
193    evas_object_size_hint_align_set(ic, 0.5, EVAS_HINT_FILL);
194    evas_object_show(ic);
195    elm_box_pack_end(bx, ic);
196 
197    bt = elm_button_add(bx);
198    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
199    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
200    evas_object_smart_callback_add(bt, "clicked", on_bt_clicked, NULL);
201    elm_layout_text_set(bt, NULL, "Click Me");
202    evas_object_show(bt);
203    elm_box_pack_end(bx, bt);
204 
205    ck = elm_check_add(bx);
206    evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
207    evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
208    evas_object_smart_callback_add(ck, "changed", on_ck_changed, NULL);
209    elm_layout_text_set(ck, NULL, "some checkbox");
210    evas_object_show(ck);
211    elm_box_pack_end(bx, ck);
212 
213    elm_layout_content_set(fr, NULL, bx);
214 
215    return fr;
216 }
217 
218 
gl_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)219 Eina_Bool gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
220 {
221    return EINA_FALSE;
222 }
223 
gl_reusable_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part,Evas_Object * old)224 Evas_Object *gl_reusable_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part, Evas_Object *old)
225 {
226    if (old && !strcmp(part, "elm.swallow.end"))
227      {
228         // Reuse old content
229         // Here need to add initializing and state changing
230         // for cached content.
231         // printf("content reuse for cached content %p, %s\n", old, part);
232         return old;
233      }
234    else
235      {
236         // Create new content object for non-reused part.
237         //printf("content create in reuse %p, %s\n", old, part);
238         char buf[PATH_MAX];
239         Evas_Object *ic = elm_icon_add(obj);
240         if (!strcmp(part, "elm.swallow.end"))
241           snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
242         else
243           snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
244         elm_image_file_set(ic, buf, NULL);
245         evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
246         return ic;
247      }
248 
249    // If return NULL value, content_get will be called to get new content.
250    // return NULL;
251 }
252 
253 static void
gl_sel(void * data,Evas_Object * obj,void * event_info)254 gl_sel(void *data, Evas_Object *obj, void *event_info)
255 {
256    printf("sel item data [%p] on genlist obj [%p], item pointer [%p], index [%d]\n",
257           data, obj, event_info, elm_genlist_item_index_get(event_info));
258 }
259 
260 static void
_move(void * data,Evas * evas EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)261 _move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
262 {
263    Evas_Object *gl = data;
264    Evas_Event_Mouse_Move *ev = event_info;
265    int where = 0;
266    Elm_Object_Item *gli;
267    gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where);
268    if (gli)
269      INF("<%s> over %p, where %i\n", __func__, elm_object_item_data_get(gli), where);
270    else
271      INF("<%s> over none, where %i\n", __func__,where);
272 }
273 
274 
275 /***  Genlist  ***************************************************************/
276 static void
_bt50_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)277 _bt50_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
278 {
279    elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_IN);
280 }
281 
282 static void
_bt1500_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)283 _bt1500_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
284 {
285    elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
286 }
287 
288 static void
_gl_selected(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)289 _gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
290 {
291    printf("selected: %p\n", event_info);
292 }
293 
294 static void
_gl_double_clicked(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)295 _gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
296 {
297    printf("double clicked: %p\n", event_info);
298    Elm_Object_Item *it = event_info;
299    if (!elm_genlist_item_pin_get(it))
300      elm_genlist_item_pin_set(it, EINA_TRUE);
301    else
302      elm_genlist_item_pin_set(it, EINA_FALSE);
303 }
304 
305 static void
_gl_right_clicked(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)306 _gl_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
307 {
308    printf("right clicked: %p\n", event_info);
309 }
310 
311 static void
_gl_longpress(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)312 _gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
313 {
314    printf("longpress %p\n", event_info);
315 }
316 
317 static void
_gl_changed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)318 _gl_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
319 {
320 //   printf("changed %p\n", event_info);
321 }
322 
323 static void
_cleanup_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)324 _cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
325 {
326    api_data *api = (api_data *)data;
327    if (api->filter_data) free(api->filter_data);
328    free(api);
329 }
330 
331 typedef struct
332 {
333    Evas_Object *gl;
334    Elm_Object_Item *it1, *it2;
335    int state;
336 } Bounce;
337 
338 #ifdef CLOCK_PROCESS_CPUTIME_ID
339 static unsigned long long frames = 0;
340 
341 static void
_bounce_cb_frame(void * data EINA_UNUSED,Evas * e EINA_UNUSED,void * event_info EINA_UNUSED)342 _bounce_cb_frame(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
343 {
344    frames++;
345 }
346 #endif
347 
348 static Eina_Bool
_bounce_cb(void * data)349 _bounce_cb(void *data)
350 {
351    Bounce *bounce = data;
352    bounce->state++;
353    if (bounce->state & 0x1)
354      elm_genlist_item_bring_in(bounce->it2, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
355    else
356      elm_genlist_item_bring_in(bounce->it1, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
357 
358 #ifdef CLOCK_PROCESS_CPUTIME_ID
359    static struct timespec t0;
360    if (bounce->state == 2)
361      {
362         evas_event_callback_add(evas_object_evas_get(bounce->gl),
363                                 EVAS_CALLBACK_RENDER_FLUSH_POST,
364                                 _bounce_cb_frame, NULL);
365         clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t0);
366      }
367 #endif
368 
369    if (bounce->state > bounce_max)
370      {
371 #ifdef CLOCK_PROCESS_CPUTIME_ID
372         struct timespec t;
373         unsigned long long tll, t0ll, tdll;
374 
375         clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t);
376         t0ll = (((unsigned long long)t0.tv_sec) * 1000000000ULL) + t0.tv_nsec;
377         tll = (((unsigned long long)t.tv_sec) * 1000000000ULL) + t.tv_nsec;
378         tdll = tll - t0ll;
379         printf("NS since 2 = %llu , %llu frames = %llu / frame\n",
380                tdll, frames, tdll / frames);
381 #endif
382         if (getenv("ELM_TEST_AUTOBOUNCE")) elm_exit();
383      }
384    return EINA_TRUE;
385 }
386 
387 static void
_btbounce_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)388 _btbounce_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
389 {
390    Ecore_Timer *tim = evas_object_data_get(obj, "timer");
391    if (!tim)
392      {
393         _bounce_cb(data);
394         tim = ecore_timer_add(0.5, _bounce_cb, data);
395         evas_object_data_set(obj, "timer", tim);
396      }
397 }
398 
399 static void
_btdel_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)400 _btdel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
401 {
402    Bounce *bounce = data;
403    Ecore_Timer *tim = evas_object_data_get(obj, "timer");
404    if (tim)
405      {
406         ecore_timer_del(tim);
407         evas_object_data_del(obj, "timer");
408      }
409    free(bounce);
410 }
411 
412 void
test_genlist(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)413 test_genlist(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
414 {
415    Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
416    Evas_Object *over;
417    Elm_Object_Item *gli;
418    int i, max;
419    Bounce *bounce;
420    api_data *api = calloc(1, sizeof(api_data));
421 
422    win = elm_win_util_standard_add("genlist", "Genlist");
423    elm_win_autodel_set(win, EINA_TRUE);
424    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
425 
426    bxx = elm_box_add(win);
427    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
428    elm_win_resize_object_add(win, bxx);
429    evas_object_show(bxx);
430 
431    bx = elm_box_add(win);
432    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
433    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
434    api->box = bx;
435    evas_object_show(bx);
436 
437    bt = elm_button_add(win);
438    elm_object_text_set(bt, "Next API function");
439    evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
440    elm_box_pack_end(bxx, bt);
441    elm_object_disabled_set(bt, api->state == API_STATE_LAST);
442    evas_object_show(bt);
443 
444    elm_box_pack_end(bxx, bx);
445 
446    gl = elm_genlist_add(win);
447    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
448    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
449    evas_object_smart_callback_add(gl, "clicked,right", _gl_right_clicked, NULL);
450    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
451    evas_object_smart_callback_add(gl, "changed", _gl_changed, NULL);
452    // FIXME: This causes genlist to resize the horiz axis very slowly :(
453    // Reenable this and resize the window horizontally, then try to resize it back
454    //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
455    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
456    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
457    elm_box_pack_end(bx, gl);
458    evas_object_show(gl);
459 
460    over = evas_object_rectangle_add(evas_object_evas_get(win));
461    evas_object_color_set(over, 0, 0, 0, 0);
462    evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
463    evas_object_repeat_events_set(over, EINA_TRUE);
464    evas_object_show(over);
465    evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
466    elm_win_resize_object_add(win, over);
467 
468    api->itc1 = elm_genlist_item_class_new();
469    api->itc1->item_style = "default";
470    api->itc1->func.text_get = gl_text_get1;
471    api->itc1->func.content_get = NULL; // gl_content_get;
472    api->itc1->func.state_get = gl_state_get;
473    api->itc1->func.del = NULL;
474    // use content_reuse function for reusing
475    // repeated content objects instead of content_get
476    api->itc1->func.reusable_content_get = gl_reusable_content_get;
477 
478    bt_50 = elm_button_add(win);
479    elm_object_text_set(bt_50, "Go to 50");
480    evas_object_show(bt_50);
481    elm_box_pack_end(bx, bt_50);
482 
483    bt_1500 = elm_button_add(win);
484    elm_object_text_set(bt_1500, "Go to 1500");
485    evas_object_show(bt_1500);
486    elm_box_pack_end(bx, bt_1500);
487 
488    bounce = calloc(1, sizeof(Bounce));
489    bt = elm_button_add(win);
490    elm_object_text_set(bt, "Bounce");
491    evas_object_show(bt);
492    elm_box_pack_end(bx, bt);
493    bounce->gl = gl;
494    evas_object_smart_callback_add(bt, "clicked", _btbounce_cb, bounce);
495    evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _btdel_cb, bounce);
496 
497    max = 2000;
498    if (getenv("ELM_TEST_AUTOBOUNCE"))
499      {
500         max = 200;
501         bounce_max = atoi(getenv("ELM_TEST_AUTOBOUNCE"));
502      }
503    for (i = 0; i < max; i++)
504      {
505         gli = elm_genlist_item_append(gl, api->itc1,
506                                       (void *)(uintptr_t)i/* item data */,
507                                       NULL/* parent */,
508                                       ELM_GENLIST_ITEM_NONE,
509                                       gl_sel/* func */,
510                                       (void *)(uintptr_t)(i * 10)/* func data */);
511 
512         if (i == 50)
513           evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
514         else if (i == 1500)
515           evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
516 
517         if (i == 100) bounce->it1 = gli;
518         if (i == 120) bounce->it2 = gli;
519      }
520    elm_genlist_item_class_free(api->itc1);
521 
522    evas_object_resize(win, 480, 400);
523    explode_win_enable(win);
524    evas_object_show(win);
525 
526    if (max == 200) _btbounce_cb(bounce, bt, NULL);
527 }
528 
529 
530 /***  Genlist 2  *************************************************************/
531 static void
my_gl_clear(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)532 my_gl_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
533 {
534    elm_genlist_clear(data);
535 }
536 
537 static char *
gl_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)538 gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
539 {
540    char buf[256];
541    snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
542    return strdup(buf);
543 }
544 static void
my_gl_add(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)545 my_gl_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
546 {
547    api_data *api = data;
548    Evas_Object *gl = api->gl;
549    static int i = 0;
550 
551    if (!api->itc1)
552      {
553         ERR("Genlist item class should not be null. Something very bad is happening!!");
554         return;
555      }
556 
557    api->itc1->item_style = "default";
558    api->itc1->func.text_get = gl_text_get;
559    api->itc1->func.content_get = gl_content_get;
560    api->itc1->func.state_get = gl_state_get;
561    api->itc1->func.del = NULL;
562 
563    elm_genlist_item_append(gl, api->itc1,
564                            (void *)(uintptr_t)i/* item data */,
565                            NULL/* parent */,
566                            ELM_GENLIST_ITEM_NONE,
567                            gl_sel/* func */,
568                            (void *)(uintptr_t)(i * 10)/* func data */);
569    i++;
570 }
571 
572 static void
my_gl_insert_before(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)573 my_gl_insert_before(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
574 {
575    api_data *api = data;
576    Evas_Object *gl = api->gl;
577    static int i = 0;
578    Elm_Object_Item *gli_selected;
579 
580    if (!api->itc1)
581      {
582         ERR("Genlist item class should not be null. Something very bad is happening!!");
583         return;
584      }
585 
586    api->itc1->item_style = "default";
587    api->itc1->func.text_get = gl_text_get;
588    api->itc1->func.content_get = gl_content_get;
589    api->itc1->func.state_get = gl_state_get;
590    api->itc1->func.del = NULL;
591 
592    gli_selected = elm_genlist_selected_item_get(gl);
593    if (!gli_selected)
594      {
595         printf("no item selected\n");
596         return ;
597      }
598 
599    elm_genlist_item_insert_before(gl, api->itc1,
600                                   (void *)(uintptr_t)i/* item data */,
601                                   NULL/* parent */,
602                                   gli_selected /* item before */,
603                                   ELM_GENLIST_ITEM_NONE,
604                                   gl_sel/* func */,
605                                   (void *)(uintptr_t)(i * 10)/* func data */);
606    i++;
607 }
608 
609 static void
my_gl_insert_after(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)610 my_gl_insert_after(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
611 {
612    api_data *api = data;
613    Evas_Object *gl = api->gl;
614    static int i = 0;
615    Elm_Object_Item *gli_selected;
616 
617    if (!api->itc1)
618      {
619         ERR("Genlist item class should not be null. Something very bad is happening!!");
620         return;
621      }
622 
623    api->itc1->item_style = "default";
624    api->itc1->func.text_get = gl_text_get;
625    api->itc1->func.content_get = gl_content_get;
626    api->itc1->func.state_get = gl_state_get;
627    api->itc1->func.del = NULL;
628 
629    gli_selected = elm_genlist_selected_item_get(gl);
630    if (!gli_selected)
631      {
632         printf("no item selected\n");
633         return ;
634      }
635 
636    elm_genlist_item_insert_after(gl, api->itc1,
637                                  (void *)(uintptr_t)i/* item data */,
638                                  NULL/* parent */,
639                                  gli_selected /* item after */,
640                                  ELM_GENLIST_ITEM_NONE,
641                                  gl_sel/* func */,
642                                  (void *)(uintptr_t)(i * 10)/* func data */);
643    i++;
644 }
645 
646 static void
my_gl_del(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)647 my_gl_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
648 {
649    api_data *api = data;
650    Evas_Object *gl = api->gl;
651    Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
652    if (!gli)
653      {
654         printf("no item selected\n");
655         return;
656      }
657    elm_object_item_del(gli);
658 }
659 
660 static void
my_gl_disable(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)661 my_gl_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
662 {
663    api_data *api = data;
664    Evas_Object *gl = api->gl;
665    Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
666    if (!gli)
667      {
668         printf("no item selected\n");
669         return;
670      }
671    elm_object_item_disabled_set(gli, EINA_TRUE);
672    elm_genlist_item_selected_set(gli, EINA_FALSE);
673    elm_genlist_item_update(gli);
674 }
675 
676 static void
my_gl_update_all(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)677 my_gl_update_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
678 {
679    api_data *api = data;
680    Evas_Object *gl = api->gl;
681    int i = 0;
682    Elm_Object_Item *it = elm_genlist_first_item_get(gl);
683    while (it)
684      {
685         elm_genlist_item_update(it);
686         INF("%i", i);
687         i++;
688         it = elm_genlist_item_next_get(it);
689      }
690 }
691 
692 static void
my_gl_first(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)693 my_gl_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
694 {
695    api_data *api = data;
696    Evas_Object *gl = api->gl;
697    Elm_Object_Item *gli = elm_genlist_first_item_get(gl);
698    if (!gli) return;
699    elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
700    elm_genlist_item_selected_set(gli, 1);
701 }
702 
703 static void
my_gl_last(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)704 my_gl_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
705 {
706    api_data *api = data;
707    Evas_Object *gl = api->gl;
708    Elm_Object_Item *gli = elm_genlist_last_item_get(gl);
709    if (!gli) return;
710    elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
711    elm_genlist_item_selected_set(gli, 1);
712 }
713 
714 static Eina_Bool
my_gl_flush_delay(void * data EINA_UNUSED)715 my_gl_flush_delay(void *data EINA_UNUSED)
716 {
717    elm_cache_all_flush();
718    return ECORE_CALLBACK_CANCEL;
719 }
720 
721 static void
my_gl_flush(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)722 my_gl_flush(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
723 {
724    ecore_timer_add(1.2, my_gl_flush_delay, NULL);
725 }
726 
727 static void
_genlist_del_cb(void * data,Evas * evas EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)728 _genlist_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
729                 void *event_info EINA_UNUSED)
730 {
731    if (!data) return;
732 
733    elm_genlist_item_class_free(data);
734 }
735 
736 void
test_genlist2(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)737 test_genlist2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
738 {
739    Evas_Object *win, *bg, *gl, *bx, *bx2, *bx3, *bt;
740    Elm_Object_Item *gli[10];
741    char buf[PATH_MAX];
742 
743    api_data *api = calloc(1, sizeof(api_data));
744    win = elm_win_add(NULL, "genlist2", ELM_WIN_BASIC);
745    elm_win_title_set(win, "Genlist 2");
746    elm_win_autodel_set(win, EINA_TRUE);
747    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
748 
749    bg = elm_bg_add(win);
750    snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
751    elm_bg_file_set(bg, buf, NULL);
752    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
753    elm_win_resize_object_add(win, bg);
754    evas_object_show(bg);
755 
756    bx = elm_box_add(win);
757    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
758    elm_win_resize_object_add(win, bx);
759    evas_object_show(bx);
760 
761    gl = elm_genlist_add(win);
762    elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
763    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
764    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
765    api->gl = gl;
766    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
767    evas_object_show(gl);
768 
769    api->itc1 = elm_genlist_item_class_new();
770    api->itc1->item_style = "default";
771    api->itc1->func.text_get = gl_text_get;
772    api->itc1->func.content_get  = gl_content_get;
773    api->itc1->func.state_get = gl_state_get;
774    api->itc1->func.del = NULL;
775 
776    gli[0] = elm_genlist_item_append(gl, api->itc1,
777                                     (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
778                                     (void *)1001/* func data */);
779    gli[1] = elm_genlist_item_append(gl, api->itc1,
780                                     (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
781                                     (void *)1002/* func data */);
782    gli[2] = elm_genlist_item_append(gl, api->itc1,
783                                     (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
784                                     (void *)1003/* func data */);
785    gli[3] = elm_genlist_item_prepend(gl, api->itc1,
786                                      (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
787                                      (void *)1004/* func data */);
788    gli[4] = elm_genlist_item_prepend(gl, api->itc1,
789                                      (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
790                                      (void *)1005/* func data */);
791    gli[5] = elm_genlist_item_insert_before(gl, api->itc1,
792                                            (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
793                                            gl_sel/* func */, (void *)1006/* func data */);
794    gli[6] = elm_genlist_item_insert_after(gl, api->itc1,
795                                           (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
796                                           gl_sel/* func */, (void *)1007/* func data */);
797    elm_box_pack_end(bx, gl);
798 
799    bx2 = elm_box_add(win);
800    elm_box_horizontal_set(bx2, EINA_TRUE);
801    elm_box_homogeneous_set(bx2, EINA_TRUE);
802    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
803    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
804 
805    bt = elm_button_add(win);
806    elm_object_text_set(bt, "/\\");
807    evas_object_smart_callback_add(bt, "clicked", my_gl_first, api);
808    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
809    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
810    elm_box_pack_end(bx2, bt);
811    evas_object_show(bt);
812 
813    bt = elm_button_add(win);
814    elm_object_text_set(bt, "\\/");
815    evas_object_smart_callback_add(bt, "clicked", my_gl_last, api);
816    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
817    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
818    elm_box_pack_end(bx2, bt);
819    evas_object_show(bt);
820 
821    bt = elm_button_add(win);
822    elm_object_text_set(bt, "#");
823    evas_object_smart_callback_add(bt, "clicked", my_gl_disable, api);
824    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
825    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
826    elm_box_pack_end(bx2, bt);
827    evas_object_show(bt);
828 
829    bt = elm_button_add(win);
830    elm_object_text_set(bt, "U");
831    evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, api);
832    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
833    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
834    elm_box_pack_end(bx2, bt);
835    evas_object_show(bt);
836 
837    elm_box_pack_end(bx, bx2);
838    evas_object_show(bx2);
839 
840    bx2 = elm_box_add(win);
841    elm_box_horizontal_set(bx2, EINA_TRUE);
842    elm_box_homogeneous_set(bx2, EINA_TRUE);
843    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
844    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
845 
846    bt = elm_button_add(win);
847    elm_object_text_set(bt, "X");
848    evas_object_smart_callback_add(bt, "clicked", my_gl_clear, gl);
849    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
850    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
851    elm_box_pack_end(bx2, bt);
852    evas_object_show(bt);
853 
854    bt = elm_button_add(win);
855    elm_object_text_set(bt, "+");
856    evas_object_smart_callback_add(bt, "clicked", my_gl_add, api);
857    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
858    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
859    elm_box_pack_end(bx2, bt);
860    evas_object_show(bt);
861 
862    bt = elm_button_add(win);
863    elm_object_text_set(bt, "-");
864    evas_object_smart_callback_add(bt, "clicked", my_gl_del, api);
865    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
866    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
867    elm_box_pack_end(bx2, bt);
868    evas_object_show(bt);
869 
870    elm_box_pack_end(bx, bx2);
871    evas_object_show(bx2);
872 
873    bx3 = elm_box_add(win);
874    elm_box_horizontal_set(bx3, EINA_TRUE);
875    elm_box_homogeneous_set(bx3, EINA_TRUE);
876    evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
877    evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
878 
879    bt = elm_button_add(win);
880    elm_object_text_set(bt, "+ before");
881    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, api);
882    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
883    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
884    elm_box_pack_end(bx3, bt);
885    evas_object_show(bt);
886 
887    bt = elm_button_add(win);
888    elm_object_text_set(bt, "+ after");
889    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, api);
890    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
891    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
892    elm_box_pack_end(bx3, bt);
893    evas_object_show(bt);
894 
895    bt = elm_button_add(win);
896    elm_object_text_set(bt, "Flush");
897    evas_object_smart_callback_add(bt, "clicked", my_gl_flush, api);
898    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
899    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
900    elm_box_pack_end(bx3, bt);
901    evas_object_show(bt);
902 
903    elm_box_pack_end(bx, bx3);
904    evas_object_show(bx3);
905 
906    evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _genlist_del_cb, api->itc1);
907 
908    evas_object_resize(win, 320, 320);
909    evas_object_show(win);
910 }
911 
912 
913 /***  Genlist 3  *************************************************************/
914 char *
gl2_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)915 gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
916 {
917    const Testitem *tit = data;
918    char buf[256];
919    snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
920    return strdup(buf);
921 }
922 
923 Evas_Object *
gl2_content_get(void * data,Evas_Object * obj,const char * part)924 gl2_content_get(void *data, Evas_Object *obj, const char *part)
925 {
926    const Testitem *tit = data;
927    char buf[PATH_MAX];
928    Evas_Object *ic = elm_icon_add(obj);
929    if (!strcmp(part, "elm.swallow.icon"))
930      {
931         if (!(tit->mode & 0x3))
932           snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
933         else if ((tit->mode & 0x3) == 1)
934           snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
935         else if ((tit->mode & 0x3) == 2)
936           snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get());
937         else if ((tit->mode & 0x3) == 3)
938           snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
939         elm_image_file_set(ic, buf, NULL);
940      }
941    else if (!strcmp(part, "elm.swallow.end"))
942      {
943         if (!(tit->mode & 0x3))
944           snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
945         else if ((tit->mode & 0x3) == 1)
946           snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
947         else if ((tit->mode & 0x3) == 2)
948           snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get());
949         else if ((tit->mode & 0x3) == 3)
950           snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get());
951         elm_image_file_set(ic, buf, NULL);
952      }
953    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
954    return ic;
955 }
956 
957 Eina_Bool
gl2_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)958 gl2_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
959 {
960    return EINA_FALSE;
961 }
962 
963 static void
my_gl_update(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)964 my_gl_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
965 {
966    Testitem *tit = data;
967    tit->mode++;
968    elm_genlist_item_update(tit->item);
969 }
970 
971 static void
my_gl_labels_update(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)972 my_gl_labels_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
973 {
974    Testitem *tit = data;
975    tit->mode++;
976    elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT);
977 }
978 
979 static void
my_gl_contents_update(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)980 my_gl_contents_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
981 {
982    Testitem *tit = data;
983    tit->mode++;
984    elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT);
985 }
986 
987 void
test_genlist3(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)988 test_genlist3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
989 {
990    Evas_Object *win, *gl, *bx, *bx2, *bt;
991    static Testitem tit[3];
992 
993    api_data *api = calloc(1, sizeof(api_data));
994    win = elm_win_util_standard_add("genlist3", "Genlist 3");
995    elm_win_autodel_set(win, EINA_TRUE);
996    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
997 
998    bx = elm_box_add(win);
999    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1000    elm_win_resize_object_add(win, bx);
1001    evas_object_show(bx);
1002 
1003    gl = elm_genlist_add(win);
1004    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1005    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1006    evas_object_show(gl);
1007 
1008    api->itc1 = elm_genlist_item_class_new();
1009    api->itc1->item_style = "default";
1010    api->itc1->func.text_get = gl2_text_get;
1011    api->itc1->func.content_get = gl2_content_get;
1012    api->itc1->func.state_get = gl2_state_get;
1013    api->itc1->func.del = NULL;
1014 
1015    tit[0].mode = 0;
1016    tit[0].item = elm_genlist_item_append(gl, api->itc1,
1017                                          &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1018                                          NULL/* func data */);
1019    tit[1].mode = 1;
1020    tit[1].item = elm_genlist_item_append(gl, api->itc1,
1021                                          &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1022                                          NULL/* func data */);
1023    tit[2].mode = 2;
1024    tit[2].item = elm_genlist_item_append(gl, api->itc1,
1025                                          &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1026                                          NULL/* func data */);
1027 
1028    elm_box_pack_end(bx, gl);
1029    evas_object_show(bx);
1030 
1031    bx2 = elm_box_add(win);
1032    elm_box_horizontal_set(bx2, EINA_TRUE);
1033    elm_box_homogeneous_set(bx2, EINA_TRUE);
1034    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1035    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1036 
1037    bt = elm_button_add(win);
1038    elm_object_text_set(bt, "[1]");
1039    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1040    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1041    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1042    elm_box_pack_end(bx2, bt);
1043    evas_object_show(bt);
1044 
1045    bt = elm_button_add(win);
1046    elm_object_text_set(bt, "labels");
1047    evas_object_smart_callback_add(bt, "clicked", my_gl_labels_update, &(tit[1]));
1048    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1049    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1050    elm_box_pack_end(bx2, bt);
1051    evas_object_show(bt);
1052 
1053    bt = elm_button_add(win);
1054    elm_object_text_set(bt, "contents");
1055    evas_object_smart_callback_add(bt, "clicked", my_gl_contents_update, &(tit[2]));
1056    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1057    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1058    elm_box_pack_end(bx2, bt);
1059    evas_object_show(bt);
1060 
1061    elm_box_pack_end(bx, bx2);
1062    evas_object_show(bx2);
1063 
1064    elm_genlist_item_class_free(api->itc1);
1065    evas_object_resize(win, 320, 320);
1066    evas_object_show(win);
1067 }
1068 
1069 
1070 /***  Genlist 4  *************************************************************/
1071 static void
my_gl_item_check_changed(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1072 my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1073 {
1074    Testitem *tit = data;
1075    tit->onoff = elm_check_state_get(obj);
1076    printf("item %p onoff = %i\n", tit, tit->onoff);
1077 }
1078 
1079 char *
gl3_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1080 gl3_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1081 {
1082    const Testitem *tit = data;
1083    char buf[256];
1084    snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
1085    return strdup(buf);
1086 }
1087 
1088 Evas_Object *
gl3_content_get(void * data,Evas_Object * obj,const char * part)1089 gl3_content_get(void *data, Evas_Object *obj, const char *part)
1090 {
1091    const Testitem *tit = data;
1092    if (!strcmp(part, "elm.swallow.icon"))
1093      {
1094         Evas_Object *lb;
1095 
1096         lb = elm_label_add(obj);
1097         elm_label_line_wrap_set(lb, ELM_WRAP_CHAR);
1098         elm_label_wrap_width_set(lb, 201);
1099         elm_object_text_set(lb, "ashj ascjscjh n asjkl hcjlh ls hzshnn zjh sh zxjcjsnd h dfw sdv edev efe fwefvv vsd cvs ws wf  fvwf wd fwe f  we wef we wfe rfwewef wfv wswf wefg sdfws w wsdcfwcf wsc vdv  sdsd sdcd cv wsc sdcv wsc d sdcdcsd sdcdsc wdvd sdcsd wscxcv wssvd sd");
1100         return lb;
1101      }
1102    else if (!strcmp(part, "elm.swallow.end"))
1103      {
1104         Evas_Object *ck;
1105         ck = elm_check_add(obj);
1106         evas_object_propagate_events_set(ck, EINA_FALSE);
1107         elm_check_state_set(ck, tit->onoff);
1108         evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed, data);
1109         return ck;
1110      }
1111    return NULL;
1112 }
1113 
1114 Eina_Bool
gl3_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1115 gl3_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1116 {
1117    return EINA_FALSE;
1118 }
1119 
1120 static void
_realized(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * ei)1121 _realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei)
1122 {
1123    Evas_Object *check;
1124    Eina_List *items;
1125    items = NULL;
1126 
1127    if (!ei) return;
1128    Elm_Object_Item *item = ei;
1129 
1130    check = elm_object_item_part_content_get(item, "elm.swallow.end");
1131 
1132    if (!check) return;
1133 
1134    items = eina_list_append(items, check);
1135    elm_object_item_access_order_set(item, items);
1136 }
1137 
1138 void
test_genlist4(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1139 test_genlist4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1140 {
1141    Evas_Object *win, *gl, *bx, *bx2, *bt;
1142    static Testitem tit[3];
1143 
1144    api_data *api = calloc(1, sizeof(api_data));
1145    win = elm_win_util_standard_add("genlist4", "Genlist 4");
1146    elm_win_autodel_set(win, EINA_TRUE);
1147    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1148 
1149    bx = elm_box_add(win);
1150    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1151    elm_win_resize_object_add(win, bx);
1152    evas_object_show(bx);
1153 
1154    gl = elm_genlist_add(win);
1155    elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
1156    elm_genlist_multi_select_set(gl, EINA_TRUE);
1157    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1158    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1159    api->gl = gl;
1160    evas_object_show(gl);
1161 
1162    evas_object_smart_callback_add(gl, "realized", _realized, NULL);
1163 
1164    api->itc1 = elm_genlist_item_class_new();
1165    api->itc1->item_style = "default";
1166    api->itc1->func.text_get = gl3_text_get;
1167    api->itc1->func.content_get = gl3_content_get;
1168    api->itc1->func.state_get = gl3_state_get;
1169    api->itc1->func.del = NULL;
1170 
1171    tit[0].mode = 0;
1172    tit[0].item = elm_genlist_item_append(gl, api->itc1,
1173                                          &(tit[0])/* item data */, NULL/* parent */,
1174                                          ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1175                                          NULL/* func data */);
1176    tit[1].mode = 1;
1177    tit[1].item = elm_genlist_item_append(gl, api->itc1,
1178                                          &(tit[1])/* item data */, NULL/* parent */,
1179                                          ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1180                                          NULL/* func data */);
1181    tit[2].mode = 2;
1182    tit[2].item = elm_genlist_item_append(gl, api->itc1,
1183                                          &(tit[2])/* item data */, NULL/* parent */,
1184                                          ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1185                                          NULL/* func data */);
1186 
1187    elm_genlist_item_class_free(api->itc1);
1188    elm_box_pack_end(bx, gl);
1189    evas_object_show(bx);
1190 
1191    bx2 = elm_box_add(win);
1192    elm_box_horizontal_set(bx2, EINA_TRUE);
1193    elm_box_homogeneous_set(bx2, EINA_TRUE);
1194    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1195    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1196 
1197    bt = elm_button_add(win);
1198    elm_object_text_set(bt, "[1]");
1199    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1200    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1201    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1202    elm_box_pack_end(bx2, bt);
1203    evas_object_show(bt);
1204 
1205    bt = elm_button_add(win);
1206    elm_object_text_set(bt, "[2]");
1207    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
1208    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1209    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1210    elm_box_pack_end(bx2, bt);
1211    evas_object_show(bt);
1212 
1213    bt = elm_button_add(win);
1214    elm_object_text_set(bt, "[3]");
1215    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
1216    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1217    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1218    elm_box_pack_end(bx2, bt);
1219    evas_object_show(bt);
1220 
1221    elm_box_pack_end(bx, bx2);
1222    evas_object_show(bx2);
1223 
1224    evas_object_resize(win, 320, 320);
1225    evas_object_show(win);
1226 }
1227 
1228 
1229 /***  Genlist 5  *************************************************************/
1230 static void
my_gl_item_check_changed2(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1231 my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1232 {
1233    Testitem *tit = data;
1234    tit->onoff = elm_check_state_get(obj);
1235    printf("item %p onoff = %i\n", tit, tit->onoff);
1236 }
1237 
1238 char *
gl5_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part)1239 gl5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
1240 {
1241    const Testitem *tit = data;
1242    char buf[256] = { 0 };
1243    if (!strcmp(part, "elm.text"))
1244      {
1245         snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
1246      }
1247    else if (!strcmp(part, "elm.text.sub"))
1248      {
1249         snprintf(buf, sizeof(buf), "%i bottles on the wall", tit->mode);
1250      }
1251    return strdup(buf);
1252 }
1253 
1254 Evas_Object *
gl5_content_get(void * data,Evas_Object * obj,const char * part)1255 gl5_content_get(void *data, Evas_Object *obj, const char *part)
1256 {
1257    const Testitem *tit = data;
1258    char buf[PATH_MAX];
1259    if (!strcmp(part, "elm.swallow.icon"))
1260      {
1261         Evas_Object *bx = elm_box_add(obj);
1262         Evas_Object *ic;
1263         elm_box_horizontal_set(bx, EINA_TRUE);
1264         ic = elm_icon_add(obj);
1265         snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1266         elm_image_file_set(ic, buf, NULL);
1267         elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
1268         evas_object_show(ic);
1269         elm_box_pack_end(bx, ic);
1270         ic = elm_icon_add(obj);
1271         elm_image_file_set(ic, buf, NULL);
1272         elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
1273         evas_object_show(ic);
1274         elm_box_pack_end(bx, ic);
1275         elm_box_horizontal_set(bx, EINA_TRUE);
1276         evas_object_show(bx);
1277         return bx;
1278      }
1279    else if (!strcmp(part, "elm.swallow.end"))
1280      {
1281         Evas_Object *ck;
1282         ck = elm_check_add(obj);
1283         evas_object_propagate_events_set(ck, EINA_FALSE);
1284         elm_check_state_set(ck, tit->onoff);
1285         evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed2, data);
1286         evas_object_show(ck);
1287         return ck;
1288      }
1289    return NULL;
1290 }
1291 
1292 Eina_Bool
gl5_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1293 gl5_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1294 {
1295    return EINA_FALSE;
1296 }
1297 
1298 static void
item_drag_up(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1299 item_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1300 {
1301    INF("drag up");
1302 }
1303 
1304 static void
item_drag_down(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1305 item_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1306 {
1307    INF("drag down");
1308 }
1309 
1310 static void
item_drag_left(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1311 item_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1312 {
1313    INF("drag left");
1314 }
1315 
1316 static void
item_drag_right(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1317 item_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1318 {
1319    INF("drag right");
1320 }
1321 
1322 static void
scroll_top(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1323 scroll_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1324 {
1325    INF("Top edge!");
1326 }
1327 
1328 static void
scroll_bottom(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1329 scroll_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1330 {
1331    INF("Bottom edge!");
1332 }
1333 
1334 static void
scroll_left(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1335 scroll_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1336 {
1337    INF("Left edge!");
1338 }
1339 
1340 static void
scroll_right(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1341 scroll_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1342 {
1343    INF("Right edge!");
1344 }
1345 
1346 static void
item_drag(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1347 item_drag(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1348 {
1349    INF("drag");
1350 }
1351 
1352 static void
item_drag_stop(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1353 item_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1354 {
1355    INF("drag stop");
1356 }
1357 
1358 static void
item_longpress(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1359 item_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1360 {
1361    INF("longpress");
1362 }
1363 
1364 void
test_genlist5(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1365 test_genlist5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1366 {
1367    Evas_Object *win, *gl, *bx, *bx2, *bt;
1368    static Testitem tit[3];
1369 
1370    api_data *api = calloc(1, sizeof(api_data));
1371    win = elm_win_util_standard_add("genlist5", "Genlist 5");
1372    elm_win_autodel_set(win, EINA_TRUE);
1373    elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
1374    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1375 
1376    bx = elm_box_add(win);
1377    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1378    elm_win_resize_object_add(win, bx);
1379    evas_object_show(bx);
1380 
1381    gl = elm_genlist_add(win);
1382    elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
1383    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1384    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1385    api->gl = gl;
1386    evas_object_show(gl);
1387 
1388    api->itc1 = elm_genlist_item_class_new();
1389    api->itc1->item_style = "double_label";
1390    api->itc1->func.text_get = gl5_text_get;
1391    api->itc1->func.content_get = gl5_content_get;
1392    api->itc1->func.state_get = gl5_state_get;
1393    api->itc1->func.del = NULL;
1394 
1395    tit[0].mode = 0;
1396    tit[0].item = elm_genlist_item_append(gl, api->itc1,
1397                                          &(tit[0])/* item data */, NULL/* parent */,
1398                                          ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1399                                          NULL/* func data */);
1400    tit[1].mode = 1;
1401    tit[1].item = elm_genlist_item_append(gl, api->itc1,
1402                                          &(tit[1])/* item data */, NULL/* parent */,
1403                                          ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1404                                          NULL/* func data */);
1405    tit[2].mode = 2;
1406    tit[2].item = elm_genlist_item_append(gl, api->itc1,
1407                                          &(tit[2])/* item data */, NULL/* parent */,
1408                                          ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
1409                                          NULL/* func data */);
1410 
1411    elm_box_pack_end(bx, gl);
1412    evas_object_show(bx);
1413 
1414    evas_object_smart_callback_add(gl, "drag,start,up", item_drag_up, NULL);
1415    evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL);
1416    evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL);
1417    evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL);
1418    evas_object_smart_callback_add(gl, "drag", item_drag, NULL);
1419    evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL);
1420    evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL);
1421 
1422    bx2 = elm_box_add(win);
1423    elm_box_horizontal_set(bx2, EINA_TRUE);
1424    elm_box_homogeneous_set(bx2, EINA_TRUE);
1425    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1426    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1427 
1428    bt = elm_button_add(win);
1429    elm_object_text_set(bt, "[1]");
1430    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1431    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1432    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1433    elm_box_pack_end(bx2, bt);
1434    evas_object_show(bt);
1435 
1436    bt = elm_button_add(win);
1437    elm_object_text_set(bt, "[2]");
1438    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
1439    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1440    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1441    elm_box_pack_end(bx2, bt);
1442    evas_object_show(bt);
1443 
1444    bt = elm_button_add(win);
1445    elm_object_text_set(bt, "[3]");
1446    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
1447    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1448    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1449    elm_box_pack_end(bx2, bt);
1450    evas_object_show(bt);
1451 
1452    elm_box_pack_end(bx, bx2);
1453    evas_object_show(bx2);
1454 
1455    elm_genlist_item_class_free(api->itc1);
1456    evas_object_resize(win, 320, 320);
1457    evas_object_show(win);
1458 }
1459 
1460 
1461 /***  Genlist Tree  **********************************************************/
1462 static void
gl4_sel(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1463 gl4_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1464 {
1465    Elm_Object_Item *glit = event_info;
1466    int depth = elm_genlist_item_expanded_depth_get(glit);
1467    printf("item sel callback %p - expanded depth = %d\n", glit, depth);
1468 }
1469 
1470 static void
gl4_exp(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)1471 gl4_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
1472 {
1473    api_data *api = data;
1474    Elm_Object_Item *glit = event_info;
1475    Evas_Object *gl = elm_object_item_widget_get(glit);
1476    int val = (int)(uintptr_t) elm_object_item_data_get(glit);
1477    int i = 0;
1478 
1479    printf("expand %p\n", glit);
1480    val *= 10;
1481    for (i = 0; i < 30; i++)
1482      {
1483         elm_genlist_item_append(gl, api->itc2,
1484                                 (void *)(uintptr_t) (val + i)/* item data */,
1485                                 glit/* parent */,
1486                                 ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
1487                                 NULL/* func data */);
1488      }
1489 }
1490 
1491 static void
gl4_con(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1492 gl4_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1493 {
1494    Elm_Object_Item *glit = event_info;
1495    const Eina_List *list = NULL, *l = NULL;
1496    Elm_Object_Item *it = NULL;
1497 
1498    printf("contract request %p\n", glit);
1499 
1500    list = elm_genlist_item_subitems_get(glit);
1501    EINA_LIST_FOREACH(list, l, it)
1502      {
1503         printf("sub item: %p %s\n", it, elm_object_item_text_get(it));
1504      }
1505 
1506    elm_genlist_item_subitems_clear(glit);
1507 }
1508 
1509 static void
gl4_exp_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1510 gl4_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1511 {
1512    Elm_Object_Item *glit = event_info;
1513    printf("expand request %p\n", glit);
1514    elm_genlist_item_expanded_set(glit, EINA_TRUE);
1515 }
1516 
1517 static void
gl4_con_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1518 gl4_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1519 {
1520    Elm_Object_Item *glit = event_info;
1521    elm_genlist_item_expanded_set(glit, EINA_FALSE);
1522 }
1523 
1524 static void
gl4_selected(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1525 gl4_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1526 {
1527    Elm_Object_Item *glit = event_info;
1528    printf("selected %p\n", glit);
1529 }
1530 
1531 static void
gl4_activated(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1532 gl4_activated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1533 {
1534    Elm_Object_Item *glit = event_info;
1535    printf("activated %p\n", glit);
1536 }
1537 
1538 static void
gl4_unselected(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1539 gl4_unselected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1540 {
1541    Elm_Object_Item *glit = event_info;
1542    printf("unselected %p\n", glit);
1543 }
1544 
1545 static void
gl4_longpressed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1546 gl4_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1547 {
1548    Elm_Object_Item *glit = event_info;
1549    printf("longpressed %p\n", glit);
1550 }
1551 
1552 static void
gl4_pressed(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1553 gl4_pressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1554 {
1555    Elm_Object_Item *glit = event_info;
1556    printf("pressed %p\n", glit);
1557 }
1558 
1559 static void
gl4_released(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)1560 gl4_released(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
1561 {
1562    Elm_Object_Item *glit = event_info;
1563    printf("released %p\n", glit);
1564 }
1565 
1566 char *
gl4_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1567 gl4_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1568 {
1569    char buf[256];
1570    snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data);
1571    return strdup(buf);
1572 }
1573 
1574 Evas_Object *
gl4_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)1575 gl4_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
1576 {
1577    char buf[PATH_MAX];
1578    if (!strcmp(part, "elm.swallow.icon"))
1579      {
1580         Evas_Object *ic = elm_icon_add(obj);
1581         snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1582         elm_image_file_set(ic, buf, NULL);
1583         evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1584         evas_object_show(ic);
1585         return ic;
1586      }
1587    else if (!strcmp(part, "elm.swallow.end"))
1588      {
1589         Evas_Object *ck;
1590         ck = elm_check_add(obj);
1591         evas_object_propagate_events_set(ck, EINA_FALSE);
1592         evas_object_show(ck);
1593         return ck;
1594      }
1595    return NULL;
1596 }
1597 
1598 Eina_Bool
gl4_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1599 gl4_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1600 {
1601    return EINA_FALSE;
1602 }
1603 
1604 void
gl4_del(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED)1605 gl4_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
1606 {
1607    printf("item deleted.\n");
1608 }
1609 
1610 static void
_tree_effect_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1611 _tree_effect_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1612 {
1613    elm_genlist_tree_effect_enabled_set(data, elm_check_state_get(obj));
1614 }
1615 
1616 static void
_tree_homogeneous_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)1617 _tree_homogeneous_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
1618 {
1619    elm_genlist_homogeneous_set(data, elm_check_state_get(obj));
1620 }
1621 
1622 void
test_genlist6(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1623 test_genlist6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1624 {
1625    Evas_Object *win, *gl, *bx, *fr, *bx2, *ck1, *ck2;
1626 
1627    api_data *api = calloc(1, sizeof(api_data));
1628    win = elm_win_util_standard_add("genlist-tree", "Genlist Tree");
1629    elm_win_autodel_set(win, EINA_TRUE);
1630    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1631 
1632    bx = elm_box_add(win);
1633    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1634    elm_win_resize_object_add(win, bx);
1635    evas_object_show(bx);
1636 
1637    fr = elm_frame_add(win);
1638    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
1639    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0);
1640    elm_object_text_set(fr, "Genlist Tree Options");
1641    elm_box_pack_end(bx, fr);
1642    evas_object_show(fr);
1643 
1644    bx2 = elm_box_add(win);
1645    elm_box_horizontal_set(bx2, EINA_TRUE);
1646    elm_box_homogeneous_set(bx2, EINA_TRUE);
1647    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1648    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1649    elm_object_content_set(fr, bx2);
1650    evas_object_show(bx2);
1651 
1652    ck1 = elm_check_add(win);
1653    elm_object_text_set(ck1, "Tree Effect");
1654    evas_object_show(ck1);
1655    elm_box_pack_end(bx2, ck1);
1656 
1657    ck2 = elm_check_add(win);
1658    elm_object_text_set(ck2, "Homogeneous");
1659    evas_object_show(ck2);
1660    elm_box_pack_end(bx2, ck2);
1661 
1662    gl = elm_genlist_add(win);
1663    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1664    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1665    api->gl = gl;
1666    evas_object_show(gl);
1667    evas_object_smart_callback_add(gl, "edge,left", scroll_left, NULL);
1668    evas_object_smart_callback_add(gl, "edge,right", scroll_right, NULL);
1669    evas_object_smart_callback_add(gl, "edge,top", scroll_top, NULL);
1670    evas_object_smart_callback_add(gl, "edge,bottom", scroll_bottom, NULL);
1671 
1672    api->itc1 = elm_genlist_item_class_new();
1673    api->itc1->item_style = "default";
1674    api->itc1->func.text_get = gl4_text_get;
1675    api->itc1->func.content_get = gl4_content_get;
1676    api->itc1->func.state_get = gl4_state_get;
1677    api->itc1->func.del = gl4_del;
1678 
1679    api->itc2 = elm_genlist_item_class_new();
1680    api->itc2->item_style = "tree_effect";
1681    api->itc2->func.text_get = gl4_text_get;
1682    api->itc2->func.content_get = gl4_content_get;
1683    api->itc2->func.state_get = gl4_state_get;
1684    api->itc2->func.del = gl4_del;
1685 
1686    api->itc = elm_genlist_item_class_new();
1687    api->itc->item_style = "indent";
1688    api->itc->func.text_get = gl4_text_get;
1689    api->itc->func.content_get = gl4_content_get;
1690    api->itc->func.state_get = gl4_state_get;
1691    api->itc->func.del = gl4_del;
1692 
1693    elm_genlist_item_append(gl, api->itc2,
1694                            (void *)1/* item data */, NULL/* parent */,
1695                            ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
1696                            NULL/* func data */);
1697    elm_genlist_item_append(gl, api->itc2,
1698                            (void *)2/* item data */, NULL/* parent */,
1699                            ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
1700                            NULL/* func data */);
1701    elm_genlist_item_append(gl, api->itc,
1702                            (void *)3/* item data */, NULL/* parent */,
1703                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1704                            NULL/* func data */);
1705    elm_genlist_item_append(gl, api->itc1,
1706                            (void *)4/* item data */, NULL/* parent */,
1707                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1708                            NULL/* func data */);
1709 
1710    elm_genlist_item_class_free(api->itc1);
1711    elm_genlist_item_class_free(api->itc2);
1712    elm_genlist_item_class_free(api->itc);
1713 
1714    evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, api);
1715    evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, api);
1716    evas_object_smart_callback_add(gl, "expanded", gl4_exp, api);
1717    evas_object_smart_callback_add(gl, "contracted", gl4_con, api);
1718 
1719    evas_object_smart_callback_add(gl, "selected", gl4_selected, api);
1720    evas_object_smart_callback_add(gl, "unselected", gl4_unselected, api);
1721    evas_object_smart_callback_add(gl, "activated", gl4_activated, api);
1722    evas_object_smart_callback_add(gl, "longpressed", gl4_longpressed, api);
1723    evas_object_smart_callback_add(gl, "pressed", gl4_pressed, api);
1724    evas_object_smart_callback_add(gl, "released", gl4_released, api);
1725 
1726    evas_object_smart_callback_add(ck1, "changed", _tree_effect_changed_cb, gl);
1727    evas_object_smart_callback_add(ck2, "changed", _tree_homogeneous_changed_cb, gl);
1728 
1729    elm_box_pack_end(bx, gl);
1730 
1731    evas_object_resize(win, 320, 320);
1732    evas_object_show(win);
1733 }
1734 
1735 
1736 /***  Genlist 7  *************************************************************/
1737 struct genlist7_data
1738 {
1739    Evas_Object *win, *naviframe;
1740 };
1741 
1742 static void
gl_sel7(void * data,Evas_Object * obj,void * event_info)1743 gl_sel7(void *data, Evas_Object *obj, void *event_info)
1744 {
1745    if (!event_info) return;
1746    api_data *api = data;
1747    elm_genlist_item_item_class_update(event_info, api->itc2);
1748    printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, api->itc2->item_style);
1749 }
1750 
1751 static void
_gl7_back_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1752 _gl7_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1753 {
1754    struct genlist7_data *info = data;
1755    if (!info) return;
1756 
1757    elm_naviframe_item_pop(info->naviframe);
1758 }
1759 
1760 static void
_gl7_swipe_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)1761 _gl7_swipe_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
1762 {
1763    struct genlist7_data *info = data;
1764    Evas_Object *box, *entry, *button;
1765    char item_data[] = "Just a simple test";
1766 
1767    if ((!event_info) || (!data)) return;
1768 
1769    box = elm_box_add(info->win);
1770    elm_box_homogeneous_set(box, EINA_FALSE);
1771    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1772    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1773    evas_object_show(box);
1774 
1775    entry = elm_entry_add(info->win);
1776    elm_entry_scrollable_set(entry, EINA_TRUE);
1777    elm_entry_editable_set(entry, EINA_FALSE);
1778    elm_object_text_set(entry, item_data);
1779    evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1780    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1781    evas_object_show(entry);
1782 
1783    button = elm_button_add(info->win);
1784    elm_object_text_set(button, "back");
1785    evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0);
1786    evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0);
1787    evas_object_smart_callback_add(button, "clicked", _gl7_back_cb,
1788                                   info);
1789    evas_object_show(button);
1790 
1791    elm_box_pack_start(box, entry);
1792    elm_box_pack_end(box, button);
1793 
1794    elm_naviframe_item_simple_push(info->naviframe, box);
1795 }
1796 
1797 void
test_genlist7(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1798 test_genlist7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1799 {
1800    Evas_Object *win, *gl, *naviframe;
1801    static struct genlist7_data info;
1802    static Testitem tit[3];
1803 
1804    api_data *api = calloc(1, sizeof(api_data));
1805    win = elm_win_util_standard_add("genlist7", "Genlist 7");
1806    elm_win_autodel_set(win, EINA_TRUE);
1807    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1808    info.win = win;
1809 
1810    naviframe = elm_naviframe_add(win);
1811    elm_win_resize_object_add(win, naviframe);
1812    evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1813    evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
1814    evas_object_show(naviframe);
1815    info.naviframe = naviframe;
1816 
1817    gl = elm_genlist_add(win);
1818    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1819    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1820    evas_object_smart_callback_add(gl, "swipe", _gl7_swipe_cb, &info);
1821    api->gl = gl;
1822    evas_object_show(gl);
1823    elm_naviframe_item_simple_push(naviframe, gl);
1824 
1825    api->itc1 = elm_genlist_item_class_new();
1826    api->itc1->item_style = "default";
1827    api->itc1->func.text_get = gl2_text_get;
1828    api->itc1->func.content_get = gl2_content_get;
1829    api->itc1->func.state_get = gl2_state_get;
1830    api->itc1->func.del = NULL;
1831 
1832    api->itc2 = elm_genlist_item_class_new();
1833    api->itc2->item_style = "double_label";
1834    api->itc2->func.text_get = gl5_text_get;
1835    api->itc2->func.content_get = gl5_content_get;
1836    api->itc2->func.state_get = gl5_state_get;
1837    api->itc2->func.del = NULL;
1838 
1839    tit[0].mode = 0;
1840    tit[0].item = elm_genlist_item_append(gl, api->itc1,
1841                                          &(tit[0])/* item data */, NULL/* parent */,
1842                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1843                                          api/* func data */);
1844    tit[1].mode = 1;
1845    tit[1].item = elm_genlist_item_append(gl, api->itc1,
1846                                          &(tit[1])/* item data */, NULL/* parent */,
1847                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1848                                          api/* func data */);
1849    tit[2].mode = 2;
1850    tit[2].item = elm_genlist_item_append(gl, api->itc1,
1851                                          &(tit[2])/* item data */, NULL/* parent */,
1852                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1853                                          api/* func data */);
1854 
1855    evas_object_resize(win, 320, 320);
1856    evas_object_show(win);
1857 }
1858 
1859 
1860 /***  Genlist Group  *********************************************************/
gl8_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)1861 char *gl8_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
1862 {
1863    char buf[256];
1864    snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)", (int)((uintptr_t)data / 10), (int)(uintptr_t)data);
1865    return strdup(buf);
1866 }
1867 
1868 static void
_bt_show_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1869 _bt_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1870 {
1871    elm_genlist_item_show(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1872 }
1873 
1874 static void
_bt_bring_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1875 _bt_bring_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1876 {
1877    elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1878 }
1879 
1880 void
test_genlist8(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)1881 test_genlist8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
1882 {
1883    Evas_Object *win, *gl, *bt[8], *bx, *bx2, *bx3;
1884    Elm_Object_Item *gli = NULL, *git = NULL;
1885    int i, bt_num;
1886 
1887    api_data *api = calloc(1, sizeof(api_data));
1888    win = elm_win_util_standard_add("genlist-group", "Genlist Group");
1889    elm_win_autodel_set(win, EINA_TRUE);
1890    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
1891 
1892    bx = elm_box_add(win);
1893    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1894    elm_win_resize_object_add(win, bx);
1895    evas_object_show(bx);
1896 
1897    gl = elm_genlist_add(win);
1898    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
1899    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
1900    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
1901    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1902    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1903    elm_box_pack_end(bx, gl);
1904    api->gl = gl;
1905    evas_object_show(gl);
1906 
1907    // Use homogeneous mode for group index + homogeneous test.
1908    // Homogeneous is not mandatory for group index.
1909    elm_genlist_homogeneous_set(gl, EINA_TRUE);
1910 
1911    api->itc1 = elm_genlist_item_class_new();
1912    api->itc1->item_style = "default";
1913    api->itc1->func.text_get = gl_text_get;
1914    api->itc1->func.content_get = gl_content_get;
1915    api->itc1->func.state_get = gl_state_get;
1916    api->itc1->func.del = NULL;
1917 
1918    api->itc2 = elm_genlist_item_class_new();
1919    api->itc2->item_style = "group_index";
1920    api->itc2->func.text_get = gl8_text_get;
1921    api->itc2->func.content_get = NULL;
1922    api->itc2->func.state_get = NULL;
1923    api->itc2->func.del = NULL;
1924 
1925    bx2 = elm_box_add(win);
1926    elm_box_horizontal_set(bx2, EINA_TRUE);
1927    elm_box_homogeneous_set(bx2, EINA_TRUE);
1928    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1929    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1930 
1931    bt_num = 0;
1932    bt[bt_num] = elm_button_add(win);
1933    elm_object_text_set(bt[bt_num], "Show 0");
1934    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1935    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1936    evas_object_show(bt[bt_num]);
1937    elm_box_pack_end(bx2, bt[bt_num]);
1938 
1939    bt[++bt_num] = elm_button_add(win);
1940    elm_object_text_set(bt[bt_num], "Show 26");
1941    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1942    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1943    evas_object_show(bt[bt_num]);
1944    elm_box_pack_end(bx2, bt[bt_num]);
1945 
1946    bt[++bt_num] = elm_button_add(win);
1947    elm_object_text_set(bt[bt_num], "Show 101");
1948    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1949    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1950    evas_object_show(bt[bt_num]);
1951    elm_box_pack_end(bx2, bt[bt_num]);
1952 
1953    bt[++bt_num] = elm_button_add(win);
1954    elm_object_text_set(bt[bt_num], "Show 480");
1955    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1956    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1957    evas_object_show(bt[bt_num]);
1958    elm_box_pack_end(bx2, bt[bt_num]);
1959 
1960    elm_box_pack_end(bx, bx2);
1961    evas_object_show(bx2);
1962 
1963    bx3 = elm_box_add(win);
1964    elm_box_horizontal_set(bx3, EINA_TRUE);
1965    elm_box_homogeneous_set(bx3, EINA_TRUE);
1966    evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
1967    evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
1968 
1969    bt[++bt_num] = elm_button_add(win);
1970    elm_object_text_set(bt[bt_num], "Bring top 0");
1971    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1972    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1973    evas_object_show(bt[bt_num]);
1974    elm_box_pack_end(bx3, bt[bt_num]);
1975 
1976    bt[++bt_num] = elm_button_add(win);
1977    elm_object_text_set(bt[bt_num], "Bring top 31");
1978    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1979    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1980    evas_object_show(bt[bt_num]);
1981    elm_box_pack_end(bx3, bt[bt_num]);
1982 
1983    bt[++bt_num] = elm_button_add(win);
1984    elm_object_text_set(bt[bt_num], "Bring top 239");
1985    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1986    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1987    evas_object_show(bt[bt_num]);
1988    elm_box_pack_end(bx3, bt[bt_num]);
1989 
1990    bt[++bt_num] = elm_button_add(win);
1991    elm_object_text_set(bt[bt_num], "Bring top 477");
1992    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1993    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1994    evas_object_show(bt[bt_num]);
1995    elm_box_pack_end(bx3, bt[bt_num]);
1996 
1997    elm_box_pack_end(bx, bx3);
1998    evas_object_show(bx3);
1999 
2000    for (i = 0; i < 500; i++)
2001      {
2002         if (!(i % 10))
2003           {
2004              gli = git = elm_genlist_item_append(gl, api->itc2,
2005                                                  (void *)(uintptr_t)i/* item data */,
2006                                                  NULL/* parent */,
2007                                                  ELM_GENLIST_ITEM_GROUP,
2008                                                  gl_sel/* func */,
2009                                                  (void *)(uintptr_t)(i * 10)/* func data */);
2010              elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2011           }
2012         else if (git)
2013           {
2014              gli = elm_genlist_item_append(gl, api->itc1,
2015                                            (void *)(uintptr_t)i/* item data */,
2016                                            git/* parent */,
2017                                            ELM_GENLIST_ITEM_NONE,
2018                                            gl_sel/* func */,
2019                                            (void *)(uintptr_t)(i * 10)/* func data */);
2020           }
2021         switch (i)
2022           {
2023            case 0:
2024               evas_object_smart_callback_add(bt[0], "clicked", _bt_show_cb, gli);
2025               evas_object_smart_callback_add(bt[4], "clicked", _bt_bring_cb, gli);
2026               break;
2027            case 26:
2028               evas_object_smart_callback_add(bt[1], "clicked", _bt_show_cb, gli);
2029               break;
2030            case 31:
2031               evas_object_smart_callback_add(bt[5], "clicked", _bt_bring_cb, gli);
2032               break;
2033            case 101:
2034               evas_object_smart_callback_add(bt[2], "clicked", _bt_show_cb, gli);
2035               break;
2036            case 239:
2037               evas_object_smart_callback_add(bt[6], "clicked", _bt_bring_cb, gli);
2038               break;
2039            case 477:
2040               evas_object_smart_callback_add(bt[7], "clicked", _bt_bring_cb, gli);
2041               break;
2042            case 480:
2043               evas_object_smart_callback_add(bt[3], "clicked", _bt_show_cb, gli);
2044               break;
2045           }
2046      }
2047 
2048    elm_genlist_item_class_free(api->itc1);
2049    elm_genlist_item_class_free(api->itc2);
2050 
2051    evas_object_resize(win, 480, 800);
2052    evas_object_show(win);
2053 }
2054 
2055 
2056 /***  Genlist Group Tree  ****************************************************/
2057 static void
gl9_exp(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)2058 gl9_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2059 {
2060    api_data *api = data;
2061    Elm_Object_Item *glit = event_info;
2062    Evas_Object *gl = elm_object_item_widget_get(glit);
2063    int val = (int)(uintptr_t) elm_object_item_data_get(glit);
2064    val *= 10;
2065    elm_genlist_item_append(gl, api->itc1,
2066                            (void *)(uintptr_t) (val + 1)/* item data */,
2067                            glit/* parent */,
2068                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2069                            NULL/* func data */);
2070    elm_genlist_item_append(gl, api->itc1,
2071                            (void *)(uintptr_t) (val + 2)/* item data */,
2072                            glit/* parent */,
2073                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2074                            NULL/* func data */);
2075    elm_genlist_item_append(gl, api->itc1,
2076                            (void *)(uintptr_t) (val + 3)/* item data */,
2077                            glit/* parent */,
2078                            ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2079                            NULL/* func data */);
2080 }
2081 
2082 static void
gl9_con(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2083 gl9_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
2084 {
2085    Elm_Object_Item *glit = event_info;
2086    elm_genlist_item_subitems_clear(glit);
2087 }
2088 
2089 static void
gl9_exp_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2090 gl9_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
2091 {
2092    Elm_Object_Item *glit = event_info;
2093    elm_genlist_item_expanded_set(glit, EINA_TRUE);
2094 }
2095 
2096 static void
gl9_con_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2097 gl9_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
2098 {
2099    Elm_Object_Item *glit = event_info;
2100    elm_genlist_item_expanded_set(glit, EINA_FALSE);
2101 }
2102 
2103 static void
gl9_item_next(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2104 gl9_item_next(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2105 {
2106    api_data *api = data;
2107    Elm_Object_Item *it;
2108 
2109    it = elm_genlist_selected_item_get(api->gl);
2110    it = elm_genlist_item_next_get(it);
2111    elm_genlist_item_selected_set(it, EINA_TRUE);
2112    printf("Next item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2113 }
2114 
2115 static void
gl9_item_prev(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2116 gl9_item_prev(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2117 {
2118    api_data *api = data;
2119    Elm_Object_Item *it;
2120 
2121    it = elm_genlist_selected_item_get(api->gl);
2122    it = elm_genlist_item_prev_get(it);
2123    elm_genlist_item_selected_set(it, EINA_TRUE);
2124    printf("Prev item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2125 }
2126 
2127 static void
gl9_item_first(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2128 gl9_item_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2129 {
2130    api_data *api = data;
2131    Elm_Object_Item *it;
2132 
2133    it = elm_genlist_first_item_get(api->gl);
2134    elm_genlist_item_selected_set(it, EINA_TRUE);
2135    printf("First item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2136 }
2137 
2138 static void
gl9_item_last(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2139 gl9_item_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2140 {
2141    api_data *api = data;
2142    Elm_Object_Item *it;
2143 
2144    it = elm_genlist_last_item_get(api->gl);
2145    elm_genlist_item_selected_set(it, EINA_TRUE);
2146    printf("Last item: #%d\n", (int)(uintptr_t)elm_object_item_data_get(it));
2147 }
2148 
2149 void
test_genlist9(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2150 test_genlist9(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2151 {
2152    Evas_Object *win, *gl, *bx, *bx2, *bt;
2153    Elm_Object_Item *git;
2154 
2155    api_data *api = calloc(1, sizeof(api_data));
2156    win = elm_win_util_standard_add("genlist-group-tree", "Genlist Group Tree");
2157    elm_win_autodel_set(win, EINA_TRUE);
2158    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2159 
2160    bx = elm_box_add(win);
2161    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2162    elm_win_resize_object_add(win, bx);
2163    evas_object_show(bx);
2164 
2165    gl = elm_genlist_add(win);
2166    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
2167    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
2168    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
2169    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2170    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2171    elm_box_pack_end(bx, gl);
2172    api->gl = gl;
2173    evas_object_show(gl);
2174 
2175    api->itc1 = elm_genlist_item_class_new();
2176    api->itc1->item_style = "default";
2177    api->itc1->func.text_get = gl_text_get;
2178    api->itc1->func.content_get = gl_content_get;
2179    api->itc1->func.state_get = gl_state_get;
2180    api->itc1->func.del = NULL;
2181 
2182    api->itc2 = elm_genlist_item_class_new();
2183    api->itc2->item_style = "group_index";
2184    api->itc2->func.text_get = gl8_text_get;
2185    api->itc2->func.content_get = NULL;
2186    api->itc2->func.state_get = NULL;
2187    api->itc2->func.del = NULL;
2188 
2189    git = elm_genlist_item_append(gl, api->itc2,
2190                                  (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
2191                                  NULL/* func data */);
2192 
2193    elm_genlist_item_append(gl, api->itc1,
2194                            (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2195                            NULL/* func data */);
2196    elm_genlist_item_append(gl, api->itc1,
2197                            (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2198                            NULL/* func data */);
2199    elm_genlist_item_append(gl, api->itc1,
2200                            (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2201                            NULL/* func data */);
2202    git = elm_genlist_item_append(gl, api->itc2,
2203                                  (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
2204                                  NULL/* func data */);
2205 
2206    elm_genlist_item_append(gl, api->itc1,
2207                            (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2208                            NULL/* func data */);
2209    elm_genlist_item_append(gl, api->itc1,
2210                            (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
2211                            NULL/* func data */);
2212    elm_genlist_item_append(gl, api->itc1,
2213                            (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
2214                            NULL/* func data */);
2215    elm_genlist_item_class_free(api->itc1);
2216    elm_genlist_item_class_free(api->itc2);
2217 
2218    evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, api);
2219    evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, api);
2220    evas_object_smart_callback_add(gl, "expanded", gl9_exp, api);
2221    evas_object_smart_callback_add(gl, "contracted", gl9_con, api);
2222 
2223    bx2 = elm_box_add(win);
2224    elm_box_horizontal_set(bx2, EINA_TRUE);
2225    elm_box_pack_end(bx, bx2);
2226    evas_object_show(bx2);
2227 
2228    bt = elm_button_add(bx2);
2229    elm_object_text_set(bt, "First item");
2230    evas_object_smart_callback_add(bt, "clicked", gl9_item_first, api);
2231    elm_box_pack_end(bx2, bt);
2232    evas_object_show(bt);
2233 
2234    bt = elm_button_add(bx2);
2235    elm_object_text_set(bt, "Next item");
2236    evas_object_smart_callback_add(bt, "clicked", gl9_item_next, api);
2237    elm_box_pack_end(bx2, bt);
2238    evas_object_show(bt);
2239    bt = elm_button_add(bx2);
2240 
2241    bt = elm_button_add(bx2);
2242    elm_object_text_set(bt, "Prev item");
2243    evas_object_smart_callback_add(bt, "clicked", gl9_item_prev, api);
2244    elm_box_pack_end(bx2, bt);
2245    evas_object_show(bt);
2246 
2247    bt = elm_button_add(bx2);
2248    elm_object_text_set(bt, "Last item");
2249    evas_object_smart_callback_add(bt, "clicked", gl9_item_last, api);
2250    elm_box_pack_end(bx2, bt);
2251    evas_object_show(bt);
2252 
2253    evas_object_resize(win, 480, 800);
2254    evas_object_show(win);
2255 }
2256 
2257 
2258 /***  Genlist Decorate Item Mode  ********************************************/
2259 static char *mode_type[] = { "slide", "rotate" };
2260 
2261 char *
gl10_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part)2262 gl10_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
2263 {
2264    char buf[256];
2265    if (!strcmp(part, "elm.text.mode"))
2266      snprintf(buf, sizeof(buf), "Mode # %i", (int)(uintptr_t)data);
2267    else
2268      snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
2269    return strdup(buf);
2270 }
2271 
2272 Evas_Object *
gl10_content_get(void * data EINA_UNUSED,Evas_Object * obj,const char * part)2273 gl10_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
2274 {
2275    char buf[PATH_MAX];
2276    Evas_Object *ic = elm_icon_add(obj);
2277    if (!strcmp(part, "elm.swallow.end"))
2278      snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
2279    else
2280      snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
2281    elm_image_file_set(ic, buf, NULL);
2282    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
2283    return ic;
2284 }
2285 
2286 static void
_gl_sel10(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2287 _gl_sel10(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2288 {
2289    if (!data) return;
2290    int v = elm_radio_value_get(data);
2291    if (v == 1)
2292      elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE);
2293 }
2294 
2295 static void
_my_gl_mode_right(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)2296 _my_gl_mode_right(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2297 {
2298    if (!data) return;
2299    int v = elm_radio_value_get(data);
2300    if (v == 0)
2301      elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE);
2302 }
2303 
2304 static void
_my_gl_mode_left(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)2305 _my_gl_mode_left(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2306 {
2307    if (!data) return;
2308    int v = elm_radio_value_get(data);
2309    if (v == 0)
2310      elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_FALSE);
2311 }
2312 
2313 static void
_my_gl_mode_cancel(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)2314 _my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2315 {
2316    fprintf(stderr, "drag\n");
2317    if (!data) return;
2318    int v = elm_radio_value_get(data);
2319    Elm_Object_Item *glit = elm_genlist_decorated_item_get(obj);
2320    if (glit) elm_genlist_item_decorate_mode_set(glit, mode_type[v], EINA_FALSE);
2321 }
2322 
2323 void
test_genlist10(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2324 test_genlist10(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2325 {
2326    Evas_Object *win, *fr, *bx, *bx2, *rd, *rdg, *gl;
2327    int i;
2328 
2329    api_data *api = calloc(1, sizeof(api_data));
2330    win = elm_win_util_standard_add("genlist-decorate-item-mode", "Genlist Decorate Item Mode");
2331    elm_win_autodel_set(win, EINA_TRUE);
2332    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2333 
2334    bx = elm_box_add(win);
2335    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2336    elm_win_resize_object_add(win, bx);
2337    evas_object_show(bx);
2338 
2339    fr = elm_frame_add(win);
2340    elm_object_text_set(fr, "Decorate Item Mode Type");
2341    elm_box_pack_end(bx, fr);
2342    evas_object_show(fr);
2343 
2344    bx2 = elm_box_add(win);
2345    elm_object_content_set(fr, bx2);
2346    evas_object_show(bx2);
2347 
2348    rd = elm_radio_add(win);
2349    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2350    elm_radio_state_value_set(rd, 0);
2351    elm_object_text_set(rd, "Slide : Sweep genlist items to the right.");
2352    evas_object_show(rd);
2353    elm_box_pack_end(bx2, rd);
2354    rdg = rd;
2355 
2356    rd = elm_radio_add(win);
2357    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2358    elm_radio_state_value_set(rd, 1);
2359    elm_object_text_set(rd, "Rotate : Click each item.");
2360    elm_radio_group_add(rd, rdg);
2361    evas_object_show(rd);
2362    elm_box_pack_end(bx2, rd);
2363 
2364    gl = elm_genlist_add(win);
2365    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2366    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2367    evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg);
2368    evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
2369    evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
2370    evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
2371    api->gl = gl;
2372    evas_object_show(gl);
2373 
2374    api->itc1 = elm_genlist_item_class_new();
2375    api->itc1->item_style = "default";
2376    api->itc1->decorate_item_style = "mode";
2377    api->itc1->func.text_get = gl10_text_get;
2378    api->itc1->func.content_get = gl10_content_get;
2379    api->itc1->func.state_get = gl_state_get;
2380    api->itc1->func.del = NULL;
2381 
2382    for (i = 0; i < 50; i++)
2383      elm_genlist_item_append(gl,
2384                              api->itc1,
2385                              (void *)(uintptr_t)(1000 + i)/* item data */,
2386                              NULL/* parent */,
2387                              ELM_GENLIST_ITEM_NONE/* flags */,
2388                              _gl_sel10/* func */,
2389                              rdg/* func data */);
2390 
2391    elm_box_pack_end(bx, gl);
2392 
2393    elm_genlist_item_class_free(api->itc1);
2394    evas_object_resize(win, 520, 520);
2395    evas_object_show(win);
2396 }
2397 
2398 
2399 /***  Genlist Reorder Mode  **************************************************/
2400 static void
_reorder_tg_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)2401 _reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2402 {
2403    elm_genlist_reorder_mode_set(data, elm_check_state_get(obj));
2404 }
2405 
2406 /**
2407  * gl_moved is called after an item was reordered.
2408  * This is only called when reorder mode is enabled.
2409  *
2410  * @param obj          :  the genlist object.
2411  * @param event_info   :  the moved item.
2412  *
2413  * the item(event_info) had been moved
2414  *
2415  */
2416 static void
_gl_reorder_moved_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2417 _gl_reorder_moved_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2418                      void *event_info EINA_UNUSED)
2419 {
2420    printf("\"moved\" it: %p\n", event_info);
2421 }
2422 
2423 /**
2424  * _gl_reorder_moved_after_cb is called after an item was reordered.
2425  * This is only called when reorder mode is enabled.
2426  *
2427  * @param obj          :  the genlist object.
2428  * @param event_info   :  the moved item.
2429  *
2430  *  the item(event_info) had been moved after the given relative item(*rel_item) in list.
2431  *
2432  */
2433 static void
_gl_reorder_moved_after_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2434 _gl_reorder_moved_after_cb(void *data EINA_UNUSED,
2435                            Evas_Object *obj EINA_UNUSED, void *event_info)
2436 {
2437    // if needed, add application logic.
2438    Elm_Object_Item *it = elm_genlist_item_prev_get((Elm_Object_Item *)event_info);
2439    printf("it = %p, prev_it = %p\n", event_info, it);
2440 }
2441 
2442 /**
2443  * _gl_reorder_moved_before_cb is called after an item was reordered.
2444  * This is only called when reorder mode is enabled.
2445  *
2446  * @param obj          :  the genlist object.
2447  * @param event_info   :  the moved item.
2448  *
2449  *  the item(event_info) had been moved before the given relative item(*rel_item) in list.
2450  *
2451  */
2452 static void
_gl_reorder_moved_before_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2453 _gl_reorder_moved_before_cb(void *data EINA_UNUSED,
2454                             Evas_Object *obj EINA_UNUSED, void *event_info)
2455 {
2456    // if needed, add application logic.
2457    Elm_Object_Item *it = elm_genlist_item_next_get((Elm_Object_Item *)event_info);
2458    printf("it = %p, next_it = %p\n", event_info, it);
2459 }
2460 
2461 static void
_gl_reorder_item_focused_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2462 _gl_reorder_item_focused_cb(void *data EINA_UNUSED,
2463                             Evas_Object *obj EINA_UNUSED, void *event_info)
2464 {
2465    printf("\"item,focused\" it: %p\n", event_info);
2466 }
2467 
2468 static void
_gl_reorder_item_unfocused_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2469 _gl_reorder_item_unfocused_cb(void *data EINA_UNUSED,
2470                               Evas_Object *obj EINA_UNUSED, void *event_info)
2471 {
2472    printf("\"item,unfocused\" it: %p\n", event_info);
2473 }
2474 
2475 static void
_gl_reorder_item_selected_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2476 _gl_reorder_item_selected_cb(void *data EINA_UNUSED,
2477                              Evas_Object *obj EINA_UNUSED, void *event_info)
2478 {
2479    printf("\"selected\" it: %p\n", event_info);
2480 }
2481 
2482 static void
_gl_reorder_item_unselected_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)2483 _gl_reorder_item_unselected_cb(void *data EINA_UNUSED,
2484                                Evas_Object *obj EINA_UNUSED, void *event_info)
2485 {
2486    printf("\"unselected\" it: %p\n", event_info);
2487 }
2488 
2489 void
test_genlist_reorder(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2490 test_genlist_reorder(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
2491                      void *event_info EINA_UNUSED)
2492 {
2493    Evas_Object *win, *fr, *lb, *bx, *tg, *gl;
2494    int i;
2495 
2496    api_data *api = calloc(1, sizeof(api_data));
2497    win = elm_win_util_standard_add("genlist-reorder-mode", "Genlist Reorder Mode");
2498    elm_win_autodel_set(win, EINA_TRUE);
2499    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2500 
2501    bx = elm_box_add(win);
2502    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2503    elm_win_resize_object_add(win, bx);
2504    evas_object_show(bx);
2505 
2506    fr = elm_frame_add(win);
2507 
2508    elm_object_text_set(fr, "Reorder Mode");
2509    elm_box_pack_end(bx, fr);
2510    evas_object_show(fr);
2511 
2512    lb = elm_label_add(win);
2513    elm_object_text_set(lb,
2514                        "Enable reorder mode if you want to move item.<br/>"
2515                        "Then long press and drag item.");
2516    elm_object_content_set(fr, lb);
2517    evas_object_show(lb);
2518 
2519    gl = elm_genlist_add(win);
2520    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2521    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2522    api->gl = gl;
2523    evas_object_show(gl);
2524 
2525    tg = elm_check_add(win);
2526    elm_object_style_set(tg, "toggle");
2527    elm_object_text_set(tg, "Reorder Mode:");
2528    elm_check_state_set(tg, elm_config_mirrored_get());
2529    evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl);
2530    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
2531    elm_box_pack_end(bx, tg);
2532    evas_object_show(tg);
2533 
2534    api->itc1 = elm_genlist_item_class_new();
2535    api->itc1->item_style = "default";
2536    api->itc1->func.text_get = gl_text_get;
2537    api->itc1->func.content_get = gl_content_get;
2538    api->itc1->func.state_get = gl_state_get;
2539    api->itc1->func.del = NULL;
2540    evas_object_smart_callback_add(gl, "moved", _gl_reorder_moved_cb, NULL);
2541    evas_object_smart_callback_add(gl, "moved,after", _gl_reorder_moved_after_cb, NULL);
2542    evas_object_smart_callback_add(gl, "moved,before", _gl_reorder_moved_before_cb, NULL);
2543    evas_object_smart_callback_add(gl, "item,focused", _gl_reorder_item_focused_cb, NULL);
2544    evas_object_smart_callback_add(gl, "item,unfocused", _gl_reorder_item_unfocused_cb, NULL);
2545    evas_object_smart_callback_add(gl, "selected", _gl_reorder_item_selected_cb, NULL);
2546    evas_object_smart_callback_add(gl, "unselected", _gl_reorder_item_unselected_cb, NULL);
2547 
2548    for (i = 0; i < 50; i++)
2549      elm_genlist_item_append(gl,
2550                              api->itc1,
2551                              (void *)(uintptr_t)(1 + i)/* item data */,
2552                              NULL/* parent */,
2553                              ELM_GENLIST_ITEM_NONE/* flags */,
2554                              NULL/* func */,
2555                              NULL/* func data */);
2556 
2557    elm_genlist_item_class_free(api->itc1);
2558 
2559    elm_box_pack_end(bx, gl);
2560 
2561    evas_object_resize(win, 400, 500);
2562    evas_object_show(win);
2563 }
2564 
2565 
2566 /***  Genlist Textblock  *****************************************************/
gl12_text_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)2567 char *gl12_text_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
2568 {
2569    return strdup("Enlightenment is not just a window manager for Linux/X11 and others, but also a whole suite of libraries to help you create beautiful user interfaces with much less work than doing it the old fashioned way and fighting with traditional toolkits, not to mention a traditional window manager. It covers uses from small mobile devices like phones all the way to powerful multi-core desktops (which are the primary development environment).");
2570 }
2571 
2572 void
test_genlist12(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2573 test_genlist12(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2574 {
2575    Evas_Object *win, *bx, *gl;
2576    int i;
2577    api_data *api = calloc(1, sizeof(api_data));
2578 
2579    win = elm_win_util_standard_add("genlist-textblock", "Genlist Textblock");
2580    elm_win_autodel_set(win, EINA_TRUE);
2581    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2582 
2583    bx = elm_box_add(win);
2584    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2585    elm_win_resize_object_add(win, bx);
2586    evas_object_show(bx);
2587 
2588    gl = elm_genlist_add(win);
2589    elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
2590    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2591    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2592    elm_box_pack_end(bx, gl);
2593    api->gl = gl;
2594    evas_object_show(gl);
2595 
2596    api->itc1 = elm_genlist_item_class_new();
2597    api->itc1->item_style = "message";
2598    api->itc1->func.text_get = gl12_text_get;
2599    api->itc1->func.state_get = gl_state_get;
2600    api->itc1->func.del = NULL;
2601 
2602    for (i = 0; i < 1000; i++)
2603      {
2604         elm_genlist_item_append(gl, api->itc1,
2605                                 (void *)(uintptr_t)i/* item data */,
2606                                 NULL/* parent */,
2607                                 ELM_GENLIST_ITEM_NONE,
2608                                 gl_sel/* func */,
2609                                 (void *)(uintptr_t)(i * 10)/* func data */);
2610      }
2611    elm_genlist_item_class_free(api->itc1);
2612 
2613    evas_object_resize(win, 400, 500);
2614    evas_object_show(win);
2615 }
2616 
2617 
2618 /***  Genlist Tree, Insert Sorted  *******************************************/
2619 static int
gl13_cmp(const void * pa,const void * pb)2620 gl13_cmp(const void *pa, const void *pb)
2621 {
2622    const char *a = elm_object_item_data_get(pa);
2623    const char *b = elm_object_item_data_get(pb);
2624 
2625    if (!a) return -1;
2626    if (!b) return 1;
2627 
2628    return strcmp(a, b);
2629 }
2630 
2631 static void
_add_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2632 _add_cb(void *data,
2633         Evas_Object *obj EINA_UNUSED,
2634         void *event_info EINA_UNUSED)
2635 {
2636    Evas_Object *win = data;
2637    Evas_Object *gl = evas_object_data_get(win, "genlist");
2638    Evas_Object *entry = evas_object_data_get(win, "entry");
2639    api_data *api = evas_object_data_get(win, "api");
2640    const char *item_name = elm_entry_entry_get(entry);
2641    Elm_Object_Item *parent = elm_genlist_selected_item_get(gl);
2642 
2643    if ((!item_name) || (!strcmp(item_name, "")))
2644      {
2645         printf("ERROR: Unable to add item with empty name. Please type name.\n");
2646         return;
2647      }
2648 
2649    elm_genlist_item_sorted_insert
2650      (gl, api->itc2, eina_stringshare_add(item_name)/* item data */,
2651       parent/* parent */, ELM_GENLIST_ITEM_NONE,
2652       gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
2653 
2654    elm_entry_entry_set(entry, NULL);
2655 }
2656 
2657 static void
_del_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2658 _del_cb(void *data EINA_UNUSED,
2659         Evas_Object *obj EINA_UNUSED,
2660         void *event_info EINA_UNUSED)
2661 {
2662    Evas_Object *win = data;
2663    Evas_Object *gl = evas_object_data_get(win, "genlist");
2664    Elm_Object_Item *item = elm_genlist_selected_item_get(gl);
2665 
2666    if (!item)
2667      {
2668         printf("ERROR: Unable to remove item. Please select item.\n");
2669         return;
2670      }
2671    elm_object_item_del(item);
2672 }
2673 
2674 char *
gl6_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)2675 gl6_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
2676 {
2677    const char *str = data;
2678    return strdup(str);
2679 }
2680 
2681 void
gl6_del(void * data,Evas_Object * obj EINA_UNUSED)2682 gl6_del(void *data, Evas_Object *obj EINA_UNUSED)
2683 {
2684    Eina_Stringshare *str = data;
2685    eina_stringshare_del(str);
2686 }
2687 
2688 void
test_genlist13(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2689 test_genlist13(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2690 {
2691    Evas_Object *win, *bx, *bx1, *btn_add, *btn_del, *gl, *entry;
2692 
2693    api_data *api = calloc(1, sizeof(api_data));
2694    win = elm_win_util_standard_add("genlist-tree-insert-sorted", "Genlist Tree, Insert Sorted");
2695    elm_win_autodel_set(win, EINA_TRUE);
2696    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2697    evas_object_data_set(win, "api", api);
2698 
2699    bx = elm_box_add(win);
2700    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2701    elm_win_resize_object_add(win, bx);
2702    evas_object_show(bx);
2703 
2704    gl = elm_genlist_add(win);
2705    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2706    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2707    evas_object_show(gl);
2708    evas_object_data_set(win, "genlist", gl);
2709 
2710    api->itc2 = elm_genlist_item_class_new();
2711    api->itc2->item_style = "default";
2712    api->itc2->func.text_get = gl6_text_get;
2713    api->itc2->func.content_get = NULL;
2714    api->itc2->func.state_get = NULL;
2715    api->itc2->func.del = gl6_del;
2716 
2717    entry = elm_entry_add(win);
2718    elm_entry_editable_set(entry, EINA_TRUE);
2719    elm_entry_single_line_set(entry, EINA_TRUE);
2720    elm_entry_scrollable_set(entry, EINA_TRUE);
2721    elm_object_part_text_set(entry, "guide", "Type item's name here to add.");
2722    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
2723    evas_object_show(entry);
2724    evas_object_data_set(win, "entry", entry);
2725 
2726    bx1 = elm_box_add(win);
2727    elm_box_horizontal_set(bx1, EINA_TRUE);
2728    evas_object_show(bx1);
2729 
2730    btn_add = elm_button_add(bx1);
2731    elm_object_text_set(btn_add, "Add");
2732    evas_object_size_hint_weight_set(btn_add, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2733    evas_object_smart_callback_add(btn_add, "clicked", _add_cb, win);
2734    elm_box_pack_end(bx1, btn_add);
2735    evas_object_show(btn_add);
2736 
2737    btn_del = elm_button_add(bx1);
2738    elm_object_text_set(btn_del, "Delete");
2739    evas_object_size_hint_weight_set(btn_del, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2740    evas_object_smart_callback_add(btn_del, "clicked", _del_cb, win);
2741    elm_box_pack_end(bx1, btn_del);
2742    evas_object_show(btn_del);
2743 
2744    elm_box_pack_end(bx, gl);
2745    elm_box_pack_end(bx, entry);
2746    elm_box_pack_end(bx, bx1);
2747    evas_object_show(bx);
2748 
2749    evas_object_resize(win, 480, 480);
2750    evas_object_show(win);
2751 }
2752 
2753 /***  Genlist Tree, Insert Relative  *****************************************/
2754 static void
my_gl_insert_before_rel(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2755 my_gl_insert_before_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2756 {
2757    api_data *api = data;
2758    Evas_Object *gl = api->gl;
2759    static int i = 1000;
2760    Elm_Object_Item *gli_selected;
2761 
2762    if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
2763    api->itc1->item_style = "default";
2764    api->itc1->func.text_get = gl_text_get;
2765    api->itc1->func.content_get = NULL;
2766    api->itc1->func.state_get = NULL;
2767    api->itc1->func.del = NULL;
2768 
2769    gli_selected = elm_genlist_selected_item_get(gl);
2770    if (!gli_selected)
2771      {
2772         printf("no item selected\n");
2773         return;
2774      }
2775 
2776    elm_genlist_item_insert_before(gl, api->itc1,
2777                                   (void *)(uintptr_t)i/* item data */,
2778                                   elm_genlist_item_parent_get(gli_selected),
2779                                   gli_selected/* item before */,
2780                                   ELM_GENLIST_ITEM_NONE,
2781                                   NULL/* func */, NULL/* func data */);
2782    i++;
2783 }
2784 
2785 static void
my_gl_insert_after_rel(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2786 my_gl_insert_after_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2787 {
2788    api_data *api = data;
2789    Evas_Object *gl = api->gl;
2790    static int i = 0;
2791    Elm_Object_Item *gli_selected;
2792 
2793    if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
2794    api->itc1->item_style = "default";
2795    api->itc1->func.text_get = gl_text_get;
2796    api->itc1->func.content_get = NULL;
2797    api->itc1->func.state_get = NULL;
2798    api->itc1->func.del = NULL;
2799 
2800    gli_selected = elm_genlist_selected_item_get(gl);
2801    if (!gli_selected)
2802      {
2803         printf("no item selected\n");
2804         return;
2805      }
2806 
2807    elm_genlist_item_insert_after(gl, api->itc1,
2808                                   (void *)(uintptr_t)i/* item data */,
2809                                   elm_genlist_item_parent_get(gli_selected),
2810                                   gli_selected/* item after */,
2811                                   ELM_GENLIST_ITEM_NONE,
2812                                   NULL/* func */, NULL/* func data */);
2813    i++;
2814 }
2815 
2816 void
test_genlist14(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2817 test_genlist14(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2818 {
2819    Elm_Object_Item *pi[6];
2820    Evas_Object *win, *bx, *bx2, *bt, *gl;
2821    int i, base;
2822    /* index: 0,  1,  2,  3,  4,  5
2823     * items: 1, 15, 11,  2, 33, 21
2824     * final: 1,  2, 11, 15, 21, 33
2825     */
2826    const int idx[6] = {1, 15, 11, 2, 33, 21};
2827    const int relative[6] = {
2828       0, /* item  '1' -  not used */
2829       0, /* item '15' - insert after pi[0], item '1' */
2830      -1, /* item '11' - insert before pi[1], item '15' */
2831      -2, /* item  '2' - insert before pi[2], item '11' */
2832       1, /* item '33' - insert after pi[1], item '15' */
2833      -4  /* item '21' - insert before pi[4], item '33' */
2834    };
2835 
2836    api_data *api = calloc(1, sizeof(api_data));
2837    win = elm_win_util_standard_add("genlist-tree-insert-relative", "Genlist Tree, Insert Relative");
2838    elm_win_autodel_set(win, EINA_TRUE);
2839    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
2840 
2841    bx = elm_box_add(win);
2842    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2843    elm_win_resize_object_add(win, bx);
2844    evas_object_show(bx);
2845 
2846    gl = elm_genlist_add(win);
2847    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2848    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2849    api->gl = gl;
2850    evas_object_show(gl);
2851 
2852    api->itc2 = elm_genlist_item_class_new();
2853    api->itc2->item_style = "default";
2854    api->itc2->func.text_get = gl4_text_get;
2855    api->itc2->func.content_get = NULL;
2856    api->itc2->func.state_get = NULL;
2857    api->itc2->func.del = NULL;
2858 
2859    /* mixed order to test insert sorted */
2860 
2861    // BUG1: should be able to insert before=NULL, prepend
2862    // BUG2: should be able to insert after=NULL, append
2863 
2864    pi[0] = elm_genlist_item_append
2865      (gl, api->itc2, (void *)(uintptr_t)idx[0]/* item data */,
2866       NULL/* parent */,
2867       ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2868 
2869    for (i = 1; i < 3; i++)
2870      {
2871         if (relative[i] < 0)
2872           pi[i] = elm_genlist_item_insert_before
2873             (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
2874              NULL/* parent */, pi[-relative[i]],
2875              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2876         else
2877           pi[i] = elm_genlist_item_insert_after
2878             (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
2879              NULL/* parent */, pi[relative[i]],
2880              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2881      }
2882 
2883    for (i = 0; i < 3; i++)
2884      {
2885         Elm_Object_Item *sub_glit[6];
2886         int j;
2887 
2888         base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
2889 
2890         sub_glit[0] = elm_genlist_item_append
2891           (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
2892            ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2893 
2894         for (j = 1; j < 6; j++) {
2895            if (relative[j] < 0)
2896              sub_glit[j] = elm_genlist_item_insert_before
2897                (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2898                 pi[i]/* parent */, sub_glit[-relative[j]],
2899                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2900            else
2901              sub_glit[j] = elm_genlist_item_insert_after
2902                (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2903                 pi[i]/* parent */, sub_glit[relative[j]],
2904                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2905         }
2906      }
2907 
2908    for (i = 3; i < 6; i++)
2909      {
2910         if (relative[i] < 0)
2911           pi[i] = elm_genlist_item_insert_before
2912             (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
2913              NULL/* parent */, pi[-relative[i]],
2914              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2915         else
2916           pi[i] = elm_genlist_item_insert_after
2917             (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
2918              NULL/* parent */, pi[relative[i]],
2919              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2920      }
2921 
2922    for (i = 3; i < 6; i++)
2923      {
2924         Elm_Object_Item *sub_glit[6];
2925         int j;
2926 
2927         base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
2928 
2929         sub_glit[0] = elm_genlist_item_append
2930           (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
2931            ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2932 
2933         for (j = 1; j < 6; j++) {
2934            if (relative[j] < 0)
2935              sub_glit[j] = elm_genlist_item_insert_before
2936                (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2937                 pi[i]/* parent */, sub_glit[-relative[j]],
2938                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2939            else
2940              sub_glit[j] = elm_genlist_item_insert_after
2941                (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
2942                 pi[i]/* parent */, sub_glit[relative[j]],
2943                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
2944         }
2945      }
2946 
2947    elm_box_pack_end(bx, gl);
2948    evas_object_show(bx);
2949 
2950    bx2 = elm_box_add(win);
2951    elm_box_horizontal_set(bx2, EINA_TRUE);
2952    elm_box_homogeneous_set(bx2, EINA_TRUE);
2953    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
2954    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
2955 
2956    bt = elm_button_add(win);
2957    elm_object_text_set(bt, "+ before");
2958    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, api);
2959    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
2960    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
2961    elm_box_pack_end(bx2, bt);
2962    evas_object_show(bt);
2963 
2964    bt = elm_button_add(win);
2965    elm_object_text_set(bt, "+ after");
2966    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, api);
2967    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
2968    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
2969    elm_box_pack_end(bx2, bt);
2970    evas_object_show(bt);
2971 
2972    elm_box_pack_end(bx, bx2);
2973    evas_object_show(bx2);
2974 
2975    /* item_class_ref is needed for itc2. some items can be added in callbacks */
2976    elm_genlist_item_class_ref(api->itc2);
2977    elm_genlist_item_class_free(api->itc2);
2978 
2979    evas_object_resize(win, 320, 320);
2980    evas_object_show(win);
2981 }
2982 
2983 
2984 /***  Genlist Decorate All Mode  *********************************************/
2985 static void
_edit_icon_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)2986 _edit_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2987 {
2988    Elm_Object_Item *item = (Elm_Object_Item *)data;
2989    elm_object_item_del(item);
2990 }
2991 
2992 char *
gl15_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)2993 gl15_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
2994 {
2995    const Testitem *tit = data;
2996    char buf[256];
2997    snprintf(buf, sizeof(buf), "Item #%i", tit->mode);
2998    return strdup(buf);
2999 }
3000 
3001 Evas_Object *
gl15_content_get(void * data,Evas_Object * obj,const char * part)3002 gl15_content_get(void *data, Evas_Object *obj, const char *part)
3003 {
3004    Testitem *tit = data;
3005    char buf[PATH_MAX];
3006 
3007    // "edit" EDC layout is like below. each part is swallow part.
3008    // the existing item is swllowed to elm.swallow.edit.content part.
3009    // --------------------------------------------------------------------
3010    // | elm.edit.icon.1 | elm.swallow.decorate.content | elm.edit.icon,2 |
3011    // --------------------------------------------------------------------
3012 
3013    if (!strcmp(part, "elm.swallow.end"))
3014      {
3015         Evas_Object *ic = elm_icon_add(obj);
3016         snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
3017         elm_image_file_set(ic, buf, NULL);
3018         evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3019         return ic;
3020      }
3021    else if (!strcmp(part, "elm.edit.icon.1"))
3022      {
3023         Evas_Object *ck;
3024         ck = elm_check_add(obj);
3025         elm_check_state_pointer_set(ck, &tit->checked);
3026         evas_object_propagate_events_set(ck, EINA_FALSE);
3027         evas_object_show(ck);
3028         return ck;
3029      }
3030    else if (!strcmp(part, "elm.edit.icon.2"))
3031      {
3032         Evas_Object *icn = elm_icon_add(obj);
3033         snprintf(buf, sizeof(buf), "%s/images/icon_06.png", elm_app_data_dir_get());
3034         elm_image_file_set(icn, buf, NULL);
3035         evas_object_propagate_events_set(icn, EINA_FALSE);
3036         evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3037         evas_object_smart_callback_add(icn, "clicked", _edit_icon_clicked_cb, (void *)tit->item);
3038         return icn;
3039      }
3040    else return NULL;
3041 }
3042 
3043 static void
gl15_sel(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3044 gl15_sel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
3045 {
3046    Testitem *tit = data;
3047    if (elm_genlist_decorate_mode_get(obj))
3048      {
3049         if (!tit->checked) tit->checked = EINA_TRUE;
3050         else tit->checked = EINA_FALSE;
3051      }
3052    elm_genlist_item_update(tit->item);
3053 }
3054 
3055 static void
gl15_deco_all_mode(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3056 gl15_deco_all_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3057 {
3058    elm_genlist_decorate_mode_set(data, EINA_TRUE);
3059    elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
3060 }
3061 
3062 static void
gl15_normal_mode(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3063 gl15_normal_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3064 {
3065    elm_genlist_decorate_mode_set(data, EINA_FALSE);
3066    elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT);
3067 }
3068 
3069 void
gl15_del(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED)3070 gl15_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
3071 {
3072    Testitem *ti = data;
3073    printf("item deleted. (# %d)\n", ti->mode);
3074 }
3075 
3076 void
test_genlist15(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3077 test_genlist15(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3078 {
3079    Evas_Object *win, *bx, *bx2, *bt, *gl;
3080    int i;
3081    static Testitem tit[100];
3082 
3083    api_data *api = calloc(1, sizeof(api_data));
3084    win = elm_win_util_standard_add("genlist-decorate-all-mode", "Genlist Decorate All Mode");
3085    elm_win_autodel_set(win, EINA_TRUE);
3086    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3087 
3088    bx = elm_box_add(win);
3089    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3090    elm_win_resize_object_add(win, bx);
3091    evas_object_show(bx);
3092 
3093    gl = elm_genlist_add(win);
3094    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3095    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3096    api->gl = gl;
3097    evas_object_show(gl);
3098 
3099    api->itc1 = elm_genlist_item_class_new();
3100    api->itc1->item_style = "default";
3101    api->itc1->func.text_get = gl15_text_get;
3102    api->itc1->func.content_get = gl15_content_get;
3103    api->itc1->func.state_get = gl_state_get;
3104    api->itc1->func.del = gl15_del;
3105    api->itc1->decorate_all_item_style = "edit";
3106 
3107    for (i = 0; i < 100; i++)
3108      {
3109         tit[i].mode = i;
3110         tit[i].item = elm_genlist_item_append(gl, api->itc1,
3111                                               &(tit[i])/* item data */,
3112                                               NULL/* parent */,
3113                                               ELM_GENLIST_ITEM_NONE/* flags */,
3114                                               gl15_sel/* func */,
3115                                               (void *)(uintptr_t)&(tit[i])/* func data */);
3116      }
3117    elm_genlist_item_class_free(api->itc1);
3118    elm_box_pack_end(bx, gl);
3119    evas_object_show(bx);
3120 
3121    bx2 = elm_box_add(win);
3122    elm_box_horizontal_set(bx2, EINA_TRUE);
3123    elm_box_homogeneous_set(bx2, EINA_TRUE);
3124    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
3125    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
3126 
3127    bt = elm_button_add(win);
3128    elm_object_text_set(bt, "Decorate All mode");
3129    evas_object_smart_callback_add(bt, "clicked", gl15_deco_all_mode, gl);
3130    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
3131    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
3132    elm_box_pack_end(bx2, bt);
3133    evas_object_show(bt);
3134 
3135    bt = elm_button_add(win);
3136    elm_object_text_set(bt, "Normal mode");
3137    evas_object_smart_callback_add(bt, "clicked", gl15_normal_mode,gl);
3138    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
3139    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
3140    elm_box_pack_end(bx2, bt);
3141    evas_object_show(bt);
3142 
3143    elm_box_pack_end(bx, bx2);
3144    evas_object_show(bx2);
3145 
3146    evas_object_resize(win, 520, 520);
3147    evas_object_show(win);
3148 }
3149 
3150 
3151 /***  Genlist Flip Mode  *****************************************************/
3152 static void
_flip_icon_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3153 _flip_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3154 {
3155    const Testitem *tit = data;
3156 
3157    if (elm_genlist_item_flip_get(tit->item))
3158      elm_genlist_item_flip_set(tit->item, EINA_FALSE);
3159    else
3160      elm_genlist_item_flip_set(tit->item, EINA_TRUE);
3161 }
3162 
3163 char *
gl16_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)3164 gl16_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
3165 {
3166    const Testitem *tit = data;
3167    char buf[256];
3168    snprintf(buf, sizeof(buf), "Item #%i", tit->mode);
3169    return strdup(buf);
3170 }
3171 
3172 Evas_Object *
gl16_content_get(void * data,Evas_Object * obj,const char * part)3173 gl16_content_get(void *data, Evas_Object *obj, const char *part)
3174 {
3175    Testitem *tit = data;
3176    char buf[PATH_MAX];
3177 
3178    if (!strcmp(part, "elm.text.flip"))
3179      {
3180         Evas_Object *btn = elm_button_add(obj);
3181         elm_object_text_set(btn, "flipped content placement");
3182         evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
3183         evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
3184         evas_object_smart_callback_add(btn, "clicked", _flip_icon_clicked_cb, (void *)tit);
3185         evas_object_show(btn);
3186         return btn;
3187      }
3188    else if (!strcmp(part, "elm.edit.icon.1"))
3189      {
3190         Evas_Object *icn = elm_icon_add(obj);
3191         snprintf(buf, sizeof(buf), "%s/images/icon_04.png", elm_app_data_dir_get());
3192         elm_image_file_set(icn, buf, NULL);
3193         evas_object_propagate_events_set(icn, EINA_FALSE);
3194         evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3195         return icn;
3196      }
3197    else if (!strcmp(part, "elm.edit.icon.2"))
3198      {
3199         Evas_Object *icn = elm_icon_add(obj);
3200         snprintf(buf, sizeof(buf), "%s/images/icon_09.png", elm_app_data_dir_get());
3201         elm_image_file_set(icn, buf, NULL);
3202         evas_object_propagate_events_set(icn, EINA_FALSE);
3203         evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
3204         evas_object_smart_callback_add(icn, "clicked", _flip_icon_clicked_cb, (void *)tit);
3205         return icn;
3206      }
3207    else return NULL;
3208 }
3209 
3210 void
test_genlist16(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3211 test_genlist16(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3212 {
3213    Evas_Object *win, *bx, *gl;
3214    int i;
3215    static Testitem tit[100];
3216 
3217    api_data *api = calloc(1, sizeof(api_data));
3218    win = elm_win_util_standard_add("genlist-flip-mode", "Genlist Flip Mode");
3219    elm_win_autodel_set(win, EINA_TRUE);
3220    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3221 
3222    bx = elm_box_add(win);
3223    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3224    elm_win_resize_object_add(win, bx);
3225    evas_object_show(bx);
3226 
3227    gl = elm_genlist_add(win);
3228    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3229    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3230    api->gl = gl;
3231    evas_object_show(gl);
3232 
3233    /* note: flip mode can be used with/without edit mode */
3234    elm_genlist_decorate_mode_set(gl, EINA_TRUE);
3235    elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
3236 
3237    api->itc1 = elm_genlist_item_class_new();
3238    api->itc1->item_style = "default";
3239    api->itc1->func.text_get = gl16_text_get;
3240    api->itc1->func.content_get = gl16_content_get;
3241    api->itc1->func.state_get = gl_state_get;
3242    api->itc1->func.del = NULL;
3243    api->itc1->decorate_all_item_style = "edit";
3244 
3245    for (i = 0; i < 100; i++)
3246      {
3247         tit[i].mode = i;
3248         tit[i].item = elm_genlist_item_append(gl, api->itc1,
3249                                               &(tit[i])/* item data */,
3250                                               NULL/* parent */,
3251                                               ELM_GENLIST_ITEM_NONE/* flags */,
3252                                               gl_sel/* func */,
3253                                               (void *)(uintptr_t)&(tit[i])/* func data */);
3254      }
3255    elm_genlist_item_class_free(api->itc1);
3256    elm_box_pack_end(bx, gl);
3257    evas_object_show(bx);
3258 
3259    evas_object_resize(win, 520, 520);
3260    evas_object_show(win);
3261 }
3262 
3263 
3264 /***  Genlist Decorate Modes  ************************************************/
3265 char *
gl17_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part)3266 gl17_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
3267 {
3268    const Testitem *tit = data;
3269    char buf[256];
3270    if (!strcmp(part, "elm.text.mode"))
3271      snprintf(buf, sizeof(buf), "Mode # %i", tit->mode);
3272    else
3273      snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
3274    return strdup(buf);
3275 }
3276 
3277 Evas_Object *
_decorate_item_mode_frame_new(Evas_Object * win,Evas_Object ** rdg)3278 _decorate_item_mode_frame_new(Evas_Object *win, Evas_Object **rdg)
3279 {
3280    Evas_Object *fr, *bx, *rd;
3281 
3282    fr = elm_frame_add(win);
3283    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3284    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
3285    elm_object_text_set(fr, "Decorate Item Mode Type");
3286    evas_object_show(fr);
3287 
3288    bx = elm_box_add(win);
3289    elm_object_content_set(fr, bx);
3290    evas_object_show(bx);
3291 
3292    rd = elm_radio_add(win);
3293    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3294    elm_radio_state_value_set(rd, 0);
3295    elm_object_text_set(rd, "Slide : Sweep genlist items to the right.");
3296    evas_object_show(rd);
3297    elm_box_pack_end(bx, rd);
3298    *rdg = rd;
3299 
3300    rd = elm_radio_add(win);
3301    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3302    elm_radio_state_value_set(rd, 1);
3303    elm_object_text_set(rd, "Rotate : Click each item.");
3304    elm_radio_group_add(rd, *rdg);
3305    evas_object_show(rd);
3306    elm_box_pack_end(bx, rd);
3307 
3308    return fr;
3309 }
3310 
3311 void
_decorate_all_set_btn_clicked_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3312 _decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
3313 {
3314    if (!data) return;
3315 
3316    Evas_Object *gl;
3317    gl = evas_object_data_get(obj, "gl");
3318    if (!gl) return;
3319 
3320    if (evas_object_data_get(gl, "tree_effect"))
3321      elm_genlist_tree_effect_enabled_set(gl, EINA_FALSE);
3322    elm_genlist_decorate_mode_set(gl, EINA_TRUE);
3323 }
3324 
3325 void
_decorate_all_unset_btn_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3326 _decorate_all_unset_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3327 {
3328    if (evas_object_data_get(data, "tree_effect"))
3329      elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
3330    elm_genlist_decorate_mode_set(data, EINA_FALSE);
3331 }
3332 
3333 Evas_Object *
_decorate_all_mode_frame_new(Evas_Object * win,Evas_Object * rdg,Evas_Object * gl)3334 _decorate_all_mode_frame_new(Evas_Object *win, Evas_Object *rdg, Evas_Object *gl)
3335 {
3336    Evas_Object *fr, *bx, *btn;
3337 
3338    fr = elm_frame_add(win);
3339    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3340    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
3341    elm_object_text_set(fr, "Decorate All Mode Type");
3342    evas_object_show(fr);
3343 
3344    bx = elm_box_add(win);
3345    elm_object_content_set(fr, bx);
3346    evas_object_show(bx);
3347 
3348    btn = elm_button_add(win);
3349    evas_object_data_set(btn, "gl", gl);
3350    elm_object_text_set(btn, "Set Decorate All Mode");
3351    evas_object_smart_callback_add(btn, "clicked", _decorate_all_set_btn_clicked_cb, rdg);
3352    elm_box_pack_end(bx, btn);
3353    evas_object_show(btn);
3354 
3355    btn = elm_button_add(win);
3356    elm_object_text_set(btn, "Unset Decorate All Mode");
3357    evas_object_smart_callback_add(btn, "clicked", _decorate_all_unset_btn_clicked_cb, gl);
3358    elm_box_pack_end(bx, btn);
3359    evas_object_show(btn);
3360 
3361    return fr;
3362 }
3363 
3364 void
test_genlist17(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3365 test_genlist17(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3366 {
3367    Evas_Object *win, *fr1, *fr2, *bx, *bx2, *rdg = NULL, *gl;
3368    int i;
3369    static Testitem tit[50];
3370 
3371    api_data *api = calloc(1, sizeof(api_data));
3372    win = elm_win_util_standard_add("genlist-decorate-modes", "Genlist Decorate Modes");
3373    elm_win_autodel_set(win, EINA_TRUE);
3374    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3375 
3376    bx = elm_box_add(win);
3377    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3378    elm_win_resize_object_add(win, bx);
3379    evas_object_show(bx);
3380 
3381    bx2 = elm_box_add(win);
3382    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
3383    elm_box_horizontal_set(bx2, EINA_TRUE);
3384    elm_box_pack_end(bx, bx2);
3385    evas_object_show(bx2);
3386 
3387    fr1 = _decorate_item_mode_frame_new(win, &rdg);
3388    elm_box_pack_end(bx2, fr1);
3389 
3390    gl = elm_genlist_add(win);
3391    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3392    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3393    evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg);
3394    evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
3395    evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
3396    evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
3397    api->gl = gl;
3398    evas_object_show(gl);
3399 
3400    api->itc1 = elm_genlist_item_class_new();
3401    api->itc1->item_style = "default";
3402    api->itc1->decorate_item_style = "mode";
3403    api->itc1->func.text_get = gl15_text_get;
3404    api->itc1->func.content_get = gl15_content_get;
3405    api->itc1->func.state_get = gl_state_get;
3406    api->itc1->func.del = NULL;
3407    api->itc1->decorate_all_item_style = "edit";
3408 
3409    for (i = 0; i < 50; i++)
3410      {
3411         tit[i].checked = EINA_FALSE;
3412         tit[i].mode = i;
3413         tit[i].item = elm_genlist_item_append(gl,
3414                                               api->itc1,
3415                                               &(tit[i])/* item data */,
3416                                               NULL/* parent */,
3417                                               ELM_GENLIST_ITEM_NONE/* flags */,
3418                                               NULL/* select func */,
3419                                               NULL/* func data */);
3420      }
3421 
3422    elm_genlist_item_class_free(api->itc1);
3423    elm_box_pack_end(bx, gl);
3424 
3425    fr2 = _decorate_all_mode_frame_new(win, rdg, gl);
3426    elm_box_pack_end(bx2, fr2);
3427 
3428    evas_object_resize(win, 520, 520);
3429    evas_object_show(win);
3430 }
3431 
3432 
3433 /***  Genlist Tree and Decorate All Mode  ************************************/
3434 static void
_tree_effect_enable_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3435 _tree_effect_enable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3436 {
3437    elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
3438 }
3439 
3440 static void
_tree_effect_disable_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3441 _tree_effect_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3442 {
3443    elm_genlist_tree_effect_enabled_set(data, EINA_FALSE);
3444 }
3445 
3446 Evas_Object *
_tree_effect_frame_new(Evas_Object * win,Evas_Object ** rdg,Evas_Object * gl)3447 _tree_effect_frame_new(Evas_Object *win, Evas_Object **rdg, Evas_Object *gl)
3448 {
3449    Evas_Object *fr, *bx, *rd;
3450 
3451    fr = elm_frame_add(win);
3452    elm_object_text_set(fr, "Genlist Tree Effect");
3453    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3454    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
3455    evas_object_show(fr);
3456 
3457    bx = elm_box_add(win);
3458    elm_box_homogeneous_set(bx, EINA_TRUE);
3459    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3460    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
3461    elm_object_content_set(fr, bx);
3462    evas_object_show(bx);
3463 
3464    rd = elm_radio_add(win);
3465    elm_radio_state_value_set(rd, 0);
3466    elm_object_text_set(rd, "Enable");
3467    evas_object_smart_callback_add(rd, "changed", _tree_effect_enable_cb, gl);
3468    evas_object_show(rd);
3469    elm_box_pack_end(bx, rd);
3470    *rdg = rd;
3471 
3472    rd = elm_radio_add(win);
3473    elm_radio_state_value_set(rd, 1);
3474    elm_radio_group_add(rd, *rdg);
3475    elm_object_text_set(rd, "Disable");
3476    evas_object_smart_callback_add(rd, "changed", _tree_effect_disable_cb, gl);
3477    evas_object_show(rd);
3478    elm_box_pack_end(bx, rd);
3479 
3480 
3481    return fr;
3482 }
3483 
3484 static void
gl18_sel(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3485 gl18_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
3486 {
3487    Elm_Object_Item *glit = event_info;
3488    int depth = elm_genlist_item_expanded_depth_get(glit);
3489    printf("expanded depth for selected item is %d\n", depth);
3490 }
3491 
3492 static void
gl18_del(void * data,Evas_Object * obj EINA_UNUSED)3493 gl18_del(void *data, Evas_Object *obj EINA_UNUSED)
3494 {
3495    free(data);
3496 }
3497 
3498 static void
gl18_exp(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3499 gl18_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
3500 {
3501    api_data *api = data;
3502    Elm_Object_Item *glit = event_info;
3503    Evas_Object *gl = elm_object_item_widget_get(glit);
3504    Testitem *tit = elm_object_item_data_get(glit);
3505    int i, j, val;
3506 
3507    val = tit->mode * 10;
3508    for (i = 0; i < 100; i++)
3509      {
3510         tit = calloc(1, sizeof(Testitem));
3511         tit->mode = val + i;
3512         tit->item = elm_genlist_item_append(gl,
3513                                             api->itc2,
3514                                             tit/* item data */,
3515                                             glit/* parent */,
3516                                             ELM_GENLIST_ITEM_TREE,
3517                                             gl18_sel/* func */,
3518                                             NULL/* func data */);
3519      }
3520    for (j = 0; j < 3; j++)
3521      {
3522         tit = calloc(1, sizeof(Testitem));
3523         tit->mode = i;
3524         tit->item = elm_genlist_item_append(gl,
3525                                             api->itc1,
3526                                             tit/* item data */,
3527                                             glit/* parent */,
3528                                             ELM_GENLIST_ITEM_NONE,
3529                                             gl18_sel/* func */,
3530                                             NULL/* func data */);
3531         i++;
3532      }
3533 }
3534 
3535 static void
gl18_con(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3536 gl18_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
3537 {
3538    Elm_Object_Item *glit = event_info;
3539    elm_genlist_item_subitems_clear(glit);
3540 }
3541 
3542 static void
gl18_exp_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3543 gl18_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
3544              void *event_info)
3545 {
3546    Elm_Object_Item *glit = event_info;
3547    elm_genlist_item_expanded_set(glit, EINA_TRUE);
3548 }
3549 
3550 static void
gl18_con_req(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)3551 gl18_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
3552              void *event_info)
3553 {
3554    Elm_Object_Item *glit = event_info;
3555    elm_genlist_item_expanded_set(glit, EINA_FALSE);
3556 }
3557 
3558 void
test_genlist18(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3559 test_genlist18(void        *data EINA_UNUSED,
3560                Evas_Object *obj EINA_UNUSED,
3561                void        *event_info EINA_UNUSED)
3562 {
3563    Evas_Object *win, *gl, *bx, *fr1, *fr2, *bx2, *rdg;
3564    Testitem *tit = NULL;
3565    int i, j;
3566 
3567    api_data *api = calloc(1, sizeof(api_data));
3568    win = elm_win_util_standard_add("genlist-tree-decorate-all",
3569                                    "Genlist Tree and Decorate All Mode");
3570    elm_win_autodel_set(win, EINA_TRUE);
3571    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3572 
3573    bx = elm_box_add(win);
3574    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3575    elm_win_resize_object_add(win, bx);
3576    evas_object_show(bx);
3577 
3578    bx2 = elm_box_add(win);
3579    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
3580    elm_box_horizontal_set(bx2, EINA_TRUE);
3581    elm_box_pack_end(bx, bx2);
3582    evas_object_show(bx2);
3583 
3584    gl = elm_genlist_add(win);
3585    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3586    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3587    api->gl = gl;
3588    evas_object_show(gl);
3589 
3590    elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE);
3591    evas_object_data_set(gl, "tree_effect", "true");
3592 
3593    /* normal item */
3594    api->itc1 = elm_genlist_item_class_new();
3595    api->itc1->item_style = "tree_effect"; /* item/tree_effect */
3596    api->itc1->func.text_get = gl15_text_get;
3597    api->itc1->func.content_get = gl15_content_get;
3598    api->itc1->func.state_get = gl_state_get;
3599    api->itc1->func.del = gl18_del;
3600    api->itc1->decorate_all_item_style = "edit";
3601 
3602    /* expandable item */
3603    api->itc2 = elm_genlist_item_class_new();
3604    api->itc2->item_style = "tree_effect"; /* tree/tree_effect */
3605    api->itc2->func.text_get = gl15_text_get;
3606    api->itc2->func.content_get = gl15_content_get;
3607    api->itc2->func.state_get = gl_state_get;
3608    api->itc2->func.del = gl18_del;
3609    api->itc2->decorate_all_item_style = "edit";
3610 
3611    for (i = 0; i < 5; i++)
3612      {
3613         tit = calloc(1, sizeof(Testitem));
3614         tit->mode = i;
3615         tit->item = elm_genlist_item_append(gl,
3616                                             api->itc2,
3617                                             tit/* item data */,
3618                                             NULL/* parent */,
3619                                             ELM_GENLIST_ITEM_TREE,
3620                                             gl18_sel/* func */,
3621                                             NULL/* func data */);
3622      }
3623 
3624    for (j = 0; j < 3; j++)
3625      {
3626         tit = calloc(1, sizeof(Testitem));
3627         tit->mode = i;
3628         tit->item = elm_genlist_item_append(gl,
3629                                             api->itc1,
3630                                             tit/* item data */,
3631                                             NULL/* parent */,
3632                                             ELM_GENLIST_ITEM_NONE,
3633                                             gl18_sel/* func */,
3634                                             NULL/* func data */);
3635         i++;
3636      }
3637 
3638    elm_genlist_item_class_free(api->itc1);
3639    elm_genlist_item_class_free(api->itc2);
3640 
3641    evas_object_smart_callback_add(gl, "expand,request", gl18_exp_req, api);
3642    evas_object_smart_callback_add(gl, "contract,request", gl18_con_req, api);
3643    evas_object_smart_callback_add(gl, "expanded", gl18_exp, api);
3644    evas_object_smart_callback_add(gl, "contracted", gl18_con, api);
3645 
3646    elm_box_pack_end(bx, gl);
3647 
3648    fr1 = _tree_effect_frame_new(win, &rdg, gl);
3649    elm_box_pack_end(bx2, fr1);
3650 
3651    fr2 = _decorate_all_mode_frame_new(win, rdg, gl);
3652    elm_box_pack_end(bx2, fr2);
3653 
3654    evas_object_resize(win, 400, 800);
3655    evas_object_show(win);
3656 }
3657 
3658 
3659 /***  Genlist Full Widget  ***************************************************/
3660 void
test_genlist19(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3661 test_genlist19(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3662 {
3663    Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
3664    Evas_Object *over;
3665    Elm_Object_Item *gli;
3666    int i;
3667    api_data *api = calloc(1, sizeof(api_data));
3668 
3669    win = elm_win_util_standard_add("genlist-full", "Genlist Full Widget");
3670    elm_win_autodel_set(win, EINA_TRUE);
3671    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
3672 
3673    bxx = elm_box_add(win);
3674    elm_win_resize_object_add(win, bxx);
3675    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3676    evas_object_show(bxx);
3677 
3678    bx = elm_box_add(win);
3679    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3680    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
3681    api->box = bx;
3682    evas_object_show(bx);
3683 
3684    bt = elm_button_add(win);
3685    elm_object_text_set(bt, "Next API function");
3686    evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
3687    elm_box_pack_end(bxx, bt);
3688    elm_object_disabled_set(bt, api->state == API_STATE_LAST);
3689    evas_object_show(bt);
3690 
3691    elm_box_pack_end(bxx, bx);
3692 
3693    gl = elm_genlist_add(win);
3694    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
3695    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
3696    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
3697    // FIXME: This causes genlist to resize the horiz axis very slowly :(
3698    // Reenable this and resize the window horizontally, then try to resize it back
3699    //elm_genlist_mode_set(gl, ELM_LIST_LIMIT);
3700    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3701    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3702    elm_box_pack_end(bx, gl);
3703    api->gl = gl;
3704    evas_object_show(gl);
3705 
3706    over = evas_object_rectangle_add(evas_object_evas_get(win));
3707    evas_object_color_set(over, 0, 0, 0, 0);
3708    evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
3709    evas_object_repeat_events_set(over, EINA_TRUE);
3710    evas_object_show(over);
3711    evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3712    elm_win_resize_object_add(win, over);
3713 
3714    api->itc1 = elm_genlist_item_class_new();
3715    api->itc1->item_style = "full";
3716    api->itc1->func.text_get = NULL;
3717    api->itc1->func.content_get = gl_content_full_get;
3718    api->itc1->func.state_get = gl_state_get;
3719    api->itc1->func.del = NULL;
3720 
3721    bt_50 = elm_button_add(win);
3722    elm_object_text_set(bt_50, "Go to 50");
3723    evas_object_show(bt_50);
3724    elm_box_pack_end(bx, bt_50);
3725 
3726    bt_1500 = elm_button_add(win);
3727    elm_object_text_set(bt_1500, "Go to 1500");
3728    evas_object_show(bt_1500);
3729    elm_box_pack_end(bx, bt_1500);
3730 
3731    for (i = 0; i < 2000; i++)
3732      {
3733         gli = elm_genlist_item_append(gl, api->itc1,
3734                                       (void *)(uintptr_t)i/* item data */,
3735                                       NULL/* parent */,
3736                                       ELM_GENLIST_ITEM_NONE,
3737                                       gl_sel/* func */,
3738                                       (void *)(uintptr_t)(i * 10)/* func data */);
3739         if (i == 50)
3740           evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
3741         else if (i == 1500)
3742           evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
3743      }
3744    elm_genlist_item_class_free(api->itc1);
3745 
3746    evas_object_resize(win, 480, 800);
3747    evas_object_show(win);
3748 }
3749 
3750 
3751 /***  Genlist Item Styles  ***************************************************/
3752 const char *_genlist_styles[] = {
3753    "default", "full", "one_icon", "end_icon", "no_icon",
3754    "default_style", "double_label", "icon_top_text_bottom",
3755    "message", "media", "media-album", "media-preview",
3756    NULL
3757 };
3758 
3759 static void
_genlist_renew(Evas_Object * obj,const char * style)3760 _genlist_renew(Evas_Object *obj, const char *style)
3761 {
3762    Elm_Genlist_Item_Class *ic;
3763    Evas_Object *check;
3764    int i;
3765 
3766    if (!obj) return;
3767 
3768    elm_genlist_clear(obj);
3769 
3770    check = evas_object_data_get(obj, "check");
3771    if (elm_check_state_get(check))
3772      elm_genlist_mode_set(obj, ELM_LIST_COMPRESS);
3773    else
3774      elm_genlist_mode_set(obj, ELM_LIST_SCROLL);
3775 
3776    ic = elm_genlist_item_class_new();
3777    ic->item_style = style;
3778    ic->func.text_get = gl_text_get;
3779    ic->func.content_get = gl_content_get;
3780    ic->func.state_get = NULL;
3781    ic->func.del = NULL;
3782 
3783    for (i = 0; i < 50; i++)
3784      {
3785         elm_genlist_item_append(obj, ic, (void *)(uintptr_t)i, NULL,
3786                                 ELM_GENLIST_ITEM_NONE, NULL, NULL);
3787      }
3788    elm_genlist_item_class_free(ic);
3789 }
3790 
3791 static void
_item_style_sel_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info)3792 _item_style_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
3793 {
3794    Evas_Object *gl = evas_object_data_get(obj, "genlist");
3795    if (gl)
3796      _genlist_renew(gl, elm_object_item_text_get(event_info));
3797 }
3798 
3799 static Evas_Object *
_item_styles_list_create(Evas_Object * parent)3800 _item_styles_list_create(Evas_Object *parent)
3801 {
3802    Evas_Object *list;
3803    int i = 0;
3804 
3805    list = elm_list_add(parent);
3806    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3807    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
3808 
3809    while (_genlist_styles[i])
3810      {
3811         elm_list_item_append(list, _genlist_styles[i], NULL, NULL,
3812                              _item_style_sel_cb, _genlist_styles[i]);
3813         i++;
3814      }
3815 
3816    return list;
3817 }
3818 
3819 void
test_genlist_item_styles(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3820 test_genlist_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
3821                          void *event_info EINA_UNUSED)
3822 {
3823    Evas_Object *win, *box, *gl, *list, *table, *check;
3824 
3825    win = elm_win_util_standard_add("genlist-item-styles", "Genlist Item Styles");
3826    elm_win_autodel_set(win, EINA_TRUE);
3827 
3828    box = elm_box_add(win);
3829    elm_box_horizontal_set(box, EINA_TRUE);
3830    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3831    elm_win_resize_object_add(win, box);
3832    evas_object_show(box);
3833 
3834    list = _item_styles_list_create(box);
3835    evas_object_show(list);
3836 
3837    table = _elm_min_set(list, box, 200, 0);
3838    evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND);
3839    evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
3840    elm_box_pack_end(box, table);
3841    evas_object_show(table);
3842 
3843    gl = elm_genlist_add(box);
3844    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3845    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3846    elm_box_pack_end(box, gl);
3847    evas_object_show(gl);
3848 
3849    check = elm_check_add(win);
3850    elm_object_text_set(check, "Compress");
3851    elm_box_pack_end(box, check);
3852    evas_object_show(check);
3853    evas_object_data_set(gl, "check", check);
3854    _genlist_renew(gl, "default");
3855 
3856    evas_object_data_set(list, "genlist", gl);
3857 
3858    evas_object_resize(win, 600, 600);
3859    evas_object_show(win);
3860 }
3861 
3862 
3863 /***  Genlist Multi Select  **************************************************/
3864 typedef struct _Genlist_Multi_Data Genlist_Multi_Data;
3865 struct _Genlist_Multi_Data
3866 {
3867    Evas_Object *gl;
3868    Evas_Object *rd1;
3869    Evas_Object *rd2;
3870 };
3871 
3872 static void
_multi_select_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3873 _multi_select_changed_cb(void *data, Evas_Object *obj,
3874                          void *event_info EINA_UNUSED)
3875 {
3876    Eina_Bool multi = elm_check_state_get(obj);
3877    Genlist_Multi_Data *gd = data;
3878    if (!gd) return;
3879 
3880    elm_genlist_multi_select_set(gd->gl, multi);
3881    elm_object_disabled_set(gd->rd1, !multi);
3882    elm_object_disabled_set(gd->rd2, !multi);
3883 }
3884 
3885 static void
_multi_select_mode_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)3886 _multi_select_mode_changed_cb(void *data, Evas_Object *obj,
3887                               void *event_info EINA_UNUSED)
3888 {
3889    elm_genlist_multi_select_mode_set(data, elm_radio_value_get(obj));
3890 }
3891 
3892 static void
_multi_select_frame_create(Evas_Object * bx,Genlist_Multi_Data * gd)3893 _multi_select_frame_create(Evas_Object *bx, Genlist_Multi_Data *gd)
3894 {
3895    Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg;
3896    if (!gd) return;
3897 
3898    fr = elm_frame_add(bx);
3899    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
3900    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
3901    elm_object_text_set(fr, "Multi Select Option");
3902    elm_box_pack_end(bx, fr);
3903    evas_object_show(fr);
3904 
3905    bx2 = elm_box_add(fr);
3906    elm_object_content_set(fr, bx2);
3907    evas_object_show(bx2);
3908 
3909    tg = elm_check_add(bx2);
3910    elm_object_style_set(tg, "toggle");
3911    elm_object_text_set(tg, "Multi Select Mode");
3912    elm_box_pack_end(bx2, tg);
3913    evas_object_show(tg);
3914 
3915    bx3 = elm_box_add(bx2);
3916    elm_box_horizontal_set(bx3, EINA_TRUE);
3917    elm_box_pack_end(bx2, bx3);
3918    evas_object_show(bx3);
3919 
3920    gd->rd1 = rdg = rd = elm_radio_add(bx3);
3921    elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT);
3922    elm_object_text_set(rd, "Default Mode");
3923    elm_box_pack_end(bx3, rd);
3924    evas_object_show(rd);
3925    elm_object_disabled_set(rd, EINA_TRUE);
3926    evas_object_smart_callback_add(rd, "changed",
3927                                   _multi_select_mode_changed_cb, gd->gl);
3928 
3929    gd->rd2 = rd = elm_radio_add(bx3);
3930    elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL);
3931    elm_radio_group_add(rd, rdg);
3932    elm_object_text_set(rd, "With Control Mode");
3933    elm_box_pack_end(bx3, rd);
3934    evas_object_show(rd);
3935    elm_object_disabled_set(rd, EINA_TRUE);
3936    evas_object_smart_callback_add(rd, "changed",
3937                                   _multi_select_mode_changed_cb, gd->gl);
3938 
3939    evas_object_smart_callback_add(tg, "changed",
3940                                   _multi_select_changed_cb, gd);
3941 }
3942 
3943 static void
_multi_data_free_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3944 _multi_data_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3945 {
3946    free(data);
3947 }
3948 
3949 void
test_genlist_multi_select(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)3950 test_genlist_multi_select(void *data EINA_UNUSED,
3951                           Evas_Object *obj EINA_UNUSED,
3952                           void *event_info EINA_UNUSED)
3953 {
3954    Evas_Object *win, *gl, *bx;
3955    Genlist_Multi_Data *gd = calloc(1, sizeof(Genlist_Multi_Data));
3956    Elm_Genlist_Item_Class *itc = NULL;
3957    int i = 0;
3958 
3959    win = elm_win_util_standard_add("genlist-multi-select", "Genlist Multi Select");
3960    elm_win_autodel_set(win, EINA_TRUE);
3961    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _multi_data_free_cb, gd);
3962 
3963    bx = elm_box_add(win);
3964    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3965    elm_win_resize_object_add(win, bx);
3966    evas_object_show(bx);
3967 
3968    gd->gl = gl = elm_genlist_add(bx);
3969    _multi_select_frame_create(bx, gd);
3970 
3971    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3972    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3973    elm_box_pack_end(bx, gl);
3974    evas_object_show(gl);
3975 
3976    itc = elm_genlist_item_class_new();
3977    itc->item_style = "default";
3978    itc->func.text_get = gl_text_get;
3979    itc->func.content_get = gl_content_get;
3980    itc->func.state_get = gl_state_get;
3981    itc->func.del = NULL;
3982 
3983    for (i = 0; i < 100; i++)
3984      {
3985         elm_genlist_item_append(gl, itc,
3986                                 (void *)(uintptr_t)i/* item data */,
3987                                 NULL/* parent */,
3988                                 ELM_GENLIST_ITEM_NONE,
3989                                 gl_sel/* func */,
3990                                 (void *)(uintptr_t)(i * 10)/* func data */);
3991      }
3992    elm_genlist_item_class_free(itc);
3993 
3994    evas_object_resize(win, 320, 500);
3995    evas_object_show(win);
3996 }
3997 
3998 
3999 /***  Genlist Item Search By Text  *******************************************/
4000 typedef struct _gl20_Event_Data gl20_Event_Data;
4001 struct _gl20_Event_Data
4002 {
4003    Evas_Object *gl_obj;
4004    Evas_Object *tg_obj;
4005    Evas_Object *en_obj;
4006    Elm_Object_Item *last_item_found;
4007 };
4008 
4009 static const char *_gl20_items_text[] = {
4010          "Albany",          "Annapolis",
4011          "Atlanta",         "Augusta",
4012          "Austin",          "Baton Rouge",
4013          "Bismarck",        "Boise",
4014          "Boston",          "Carson City",
4015          "Charleston",      "Cheyenne",
4016          "Columbia",        "Columbus",
4017          "Concord",         "Denver",
4018          "Des Moines",      "Dover",
4019          "Frankfort",       "Harrisburg",
4020          "Hartford",        "Helena",
4021          "Honolulu",        "Indianapolis",
4022          "Jackson",         "Jefferson City",
4023          "Juneau",          "Lansing",
4024          "Lincoln",         "Little Rock",
4025          "Madison",         "Montgomery",
4026          "Montpelier",      "Nashville",
4027          "Oklahoma City",   "Olympia",
4028          "Phoenix",         "Pierre",
4029          "Providence",      "Raleigh",
4030          "Richmond",        "Sacramento",
4031          "Saint Paul",      "Salem",
4032          "Salt Lake City",  "Santa Fe",
4033          "Springfield",     "Tallahassee",
4034          "Topeka",          "Trenton" };
4035 
4036 static void
_gl20_del_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4037 _gl20_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
4038 {
4039    free(data);
4040 }
4041 
4042 static char *
_gl20_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4043 _gl20_text_get(void *data, Evas_Object *obj EINA_UNUSED,
4044                const char *part EINA_UNUSED)
4045 {
4046    char buf[32];
4047    int item_index = (int)(uintptr_t)data;
4048 
4049    if (item_index < 50)
4050      {
4051         snprintf(buf, sizeof(buf), "%s", _gl20_items_text[item_index]);
4052         return strdup(buf);
4053      }
4054    else if (item_index < 100)
4055      {
4056         snprintf(buf, sizeof(buf), "%X", (item_index - 50));
4057         return strdup(buf);
4058      }
4059    else if (item_index == 100)
4060      return strdup("Tree Item");
4061 
4062    return NULL;
4063 }
4064 
4065 static void
_gl20_search_item(gl20_Event_Data * event_data,Elm_Object_Item * it)4066 _gl20_search_item(gl20_Event_Data *event_data, Elm_Object_Item * it)
4067 {
4068    const char *str = elm_entry_entry_get(event_data->en_obj);
4069    if (!str || !strlen(str)) return;
4070 
4071    Elm_Glob_Match_Flags flag = 0;
4072    if (!elm_check_state_get(event_data->tg_obj)) flag = ELM_GLOB_MATCH_NOCASE;
4073 
4074    printf("Looking for \"%s\". ", str);
4075    event_data->last_item_found = elm_genlist_search_by_text_item_get
4076    (event_data->gl_obj, it, NULL, str, flag);
4077 
4078    if (event_data->last_item_found)
4079      {
4080         printf("Found.\n");
4081         elm_genlist_item_selected_set(event_data->last_item_found, EINA_TRUE);
4082         elm_genlist_item_bring_in(event_data->last_item_found,
4083            ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
4084         elm_object_focus_set(event_data->en_obj, EINA_TRUE);
4085      }
4086    else
4087      printf("Not Found.\n");
4088 }
4089 
4090 static void
_gl20_search_settings_changed_cb(void * data,Evas_Object * obj EINA_UNUSED,void * einfo EINA_UNUSED)4091 _gl20_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
4092                                  void *einfo EINA_UNUSED)
4093 {
4094    _gl20_search_item(data, NULL);
4095 }
4096 
4097 static Elm_Genlist_Item_Class *
_gl20_item_class_create(const char * item_style)4098 _gl20_item_class_create(const char *item_style)
4099 {
4100    Elm_Genlist_Item_Class * itc = elm_genlist_item_class_new();
4101    itc->item_style = item_style;
4102    itc->func.text_get = _gl20_text_get;
4103    itc->func.content_get = gl_content_get;
4104    itc->func.state_get = gl_state_get;
4105    itc->func.del = NULL;
4106    return itc;
4107 }
4108 
4109 static void
_gl20_expand_cb(void * data EINA_UNUSED,Evas_Object * o EINA_UNUSED,void * event_info)4110 _gl20_expand_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED,
4111                 void *event_info)
4112 {
4113    Elm_Object_Item *glit = event_info;
4114    Evas_Object *gl = elm_object_item_widget_get(glit);
4115    Elm_Genlist_Item_Class *itc = NULL;
4116    int i = 0;
4117 
4118    itc = _gl20_item_class_create("default");
4119 
4120    for (i = 50; i < 100; i++)
4121      {
4122         elm_genlist_item_append(gl, itc,
4123            (void *)(uintptr_t) i/* item data */,
4124            glit/* parent */,
4125            ELM_GENLIST_ITEM_NONE, NULL/* func */,
4126            NULL/* func data */);
4127      }
4128    elm_genlist_item_class_free(itc);
4129 }
4130 
_gl20_on_keydown(void * data,Evas * evas EINA_UNUSED,Evas_Object * o EINA_UNUSED,void * einfo)4131 static void _gl20_on_keydown(void *data, Evas *evas EINA_UNUSED,
4132                              Evas_Object *o EINA_UNUSED, void *einfo)
4133 {
4134    Evas_Event_Key_Down *ev = einfo;
4135    gl20_Event_Data * event_data = (gl20_Event_Data *)data;
4136 
4137    if (!strcmp(ev->key, "Return"))
4138      {
4139         printf("Looking for next item\n");
4140         _gl20_search_item(data, event_data->last_item_found);
4141      }
4142 }
4143 
4144 void
test_genlist20(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4145 test_genlist20(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4146                void *event_info EINA_UNUSED)
4147 {
4148    Evas_Object *win, *bx, *gl;
4149    Evas_Object *fr, *lb_frame;            // info frame
4150    Evas_Object *bx_entry, *lb_entry, *en; // search line
4151    Evas_Object *tg;                       // "case sensitive" toggle
4152    Elm_Genlist_Item_Class *itc = NULL;
4153    gl20_Event_Data* event_data = NULL;
4154    int i = 0;
4155 
4156    win = elm_win_util_standard_add("genlist-item-search-by-text",
4157             "Genlist Item Search By Text");
4158    elm_win_autodel_set(win, EINA_TRUE);
4159 
4160    bx = elm_box_add(win);
4161    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4162    elm_win_resize_object_add(win, bx);
4163    evas_object_show(bx);
4164 
4165    fr = elm_frame_add(bx);
4166    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4167    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4168    elm_object_text_set(fr, "Information");
4169    elm_box_pack_end(bx, fr);
4170    evas_object_show(fr);
4171 
4172    lb_frame = elm_label_add(fr);
4173    elm_object_text_set(lb_frame,
4174       "<align=left>This is an example of "
4175       "elm_genlist_search_by_text_item_get() usage.<br>"
4176       "Enter search string to the entry and press Enter to "
4177       "show next search result.<br>");
4178    elm_object_content_set(fr, lb_frame);
4179    evas_object_show(lb_frame);
4180 
4181    tg = elm_check_add(win);
4182    elm_object_style_set(tg, "toggle");
4183    elm_object_text_set(tg, " Case Sensitive Search");
4184    elm_check_state_set(tg, EINA_TRUE);
4185    elm_box_pack_end(bx, tg);
4186    evas_object_show(tg);
4187 
4188    bx_entry = elm_box_add(win);
4189    elm_box_horizontal_set(bx_entry, EINA_TRUE);
4190    evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0);
4191    evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0);
4192    elm_box_pack_end(bx, bx_entry);
4193    evas_object_show(bx_entry);
4194 
4195    lb_entry = elm_label_add(win);
4196    elm_object_text_set(lb_entry, " Search:");
4197    evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND);
4198    evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL);
4199    elm_box_pack_end(bx_entry, lb_entry);
4200    evas_object_show(lb_entry);
4201 
4202    en = elm_entry_add(win);
4203    elm_entry_single_line_set(en, EINA_TRUE);
4204    elm_entry_scrollable_set(en, EINA_TRUE);
4205    elm_object_part_text_set(en, "guide", "Type item's name here to search.");
4206    evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4207    evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
4208    elm_box_pack_end(bx_entry, en);
4209    evas_object_show(en);
4210    elm_object_focus_set(en, EINA_TRUE);
4211 
4212    gl = elm_genlist_add(bx);
4213 
4214    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4215    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
4216    elm_box_pack_end(bx, gl);
4217    evas_object_show(gl);
4218 
4219    event_data = calloc(1, sizeof(gl20_Event_Data));
4220    event_data->tg_obj = tg;
4221    event_data->en_obj = en;
4222    event_data->gl_obj = gl;
4223    event_data->last_item_found = NULL;
4224 
4225    evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN,
4226       _gl20_on_keydown, (void*)event_data);
4227    evas_object_event_callback_add(gl, EVAS_CALLBACK_FREE,
4228       _gl20_del_cb, (void*)event_data);
4229    evas_object_smart_callback_add(en, "changed,user",
4230       _gl20_search_settings_changed_cb, (void*)event_data);
4231    evas_object_smart_callback_add(tg, "changed",
4232       _gl20_search_settings_changed_cb, (void*)event_data);
4233    evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl);
4234    evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl);
4235    evas_object_smart_callback_add(gl, "contracted", gl4_con, gl);
4236    evas_object_smart_callback_add(gl, "expanded", _gl20_expand_cb, gl);
4237 
4238    itc = _gl20_item_class_create("tree_effect");
4239 
4240    elm_genlist_item_append(gl, itc,
4241       (void *)100/* item data */,
4242       NULL/* parent */,
4243       ELM_GENLIST_ITEM_TREE,
4244       NULL/* func */,
4245       NULL/* func data */);
4246 
4247    itc->item_style = "default";
4248 
4249    for (i = 0; i < 50; i++)
4250      {
4251         elm_genlist_item_append(gl, itc,
4252            (void *)(uintptr_t)i/* item data */,
4253            NULL/* parent */,
4254            ELM_GENLIST_ITEM_NONE,
4255            NULL/* func */,
4256            NULL/* func data */);
4257      }
4258 
4259    elm_genlist_item_class_free(itc);
4260 
4261    evas_object_resize(win, 320, 500);
4262    evas_object_show(win);
4263 }
4264 
4265 
4266 /***  Genlist Del  ***********************************************************/
4267 static void _gl_del_sel(void *data, Evas_Object *obj, void *event_info);
4268 
4269 static void
_gl_del_win_del_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4270 _gl_del_win_del_cb(void *data, Evas *e EINA_UNUSED,
4271                    Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
4272 {
4273    if (!data) return;
4274    elm_genlist_item_class_free(data);
4275 }
4276 
4277 static void
_gl_del_unrealized_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4278 _gl_del_unrealized_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4279                       void *event_info)
4280 {
4281    int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
4282    printf("unrealized item # %d\n", num);
4283 }
4284 
4285 static void
_gl_del_doubleclick_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4286 _gl_del_doubleclick_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4287                        void *event_info)
4288 {
4289    int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
4290    int num_category = num % 4;
4291 
4292    if (num_category == 3)
4293      elm_genlist_clear(obj);
4294 }
4295 static Evas_Object *
_gl_del_genlist_add(Evas_Object * bx)4296 _gl_del_genlist_add(Evas_Object *bx)
4297 {
4298    Evas_Object *gl = NULL;
4299 
4300    gl = elm_genlist_add(bx);
4301    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4302    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
4303    elm_box_pack_end(bx, gl);
4304    evas_object_show(gl);
4305    evas_object_smart_callback_add(gl, "unrealized",
4306                                   _gl_del_unrealized_cb, NULL);
4307    evas_object_smart_callback_add(gl, "clicked,double",
4308                                   _gl_del_doubleclick_cb, NULL);
4309 
4310    return gl;
4311 }
4312 
4313 static void
_gl_del_item_append(Evas_Object * gl,Elm_Genlist_Item_Class * itc)4314 _gl_del_item_append(Evas_Object *gl, Elm_Genlist_Item_Class *itc)
4315 {
4316    int i = 0;
4317    for (i = 0; i < 1000; i++)
4318      {
4319         elm_genlist_item_append(gl, itc,
4320                                 (void *)(uintptr_t)i/* item data */,
4321                                 NULL/* parent */,
4322                                 ELM_GENLIST_ITEM_NONE,
4323                                 _gl_del_sel/* func */,
4324                                 (void *)(uintptr_t)(i)/* func data */);
4325      }
4326 }
4327 
4328 char *
_gl_del_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4329 _gl_del_text_get(void *data, Evas_Object *obj EINA_UNUSED,
4330                  const char *part EINA_UNUSED)
4331 {
4332    char buf[256] = { 0 };
4333    int num = (int)(uintptr_t)data;
4334    int num_category = num % 10;
4335 
4336    if (num_category == 3)
4337      snprintf(buf, sizeof(buf),
4338               "Item #%.02i - 1. Item Del", num);
4339    else if (num_category == 5)
4340      snprintf(buf, sizeof(buf),
4341               "Item #%.02i - 2. Genlist Clear and Item Append", num);
4342    else if (num_category == 7)
4343      snprintf(buf, sizeof(buf),
4344               "Item #%.02i - 3. Genlist Del", num);
4345    else if (num_category == 9)
4346      snprintf(buf, sizeof(buf),
4347               "Item #%.02i - 4. Genlist Clear on double-click", num);
4348    else
4349      snprintf(buf, sizeof(buf),
4350               "Item #%.02i - Normal item", num);
4351 
4352    return strdup(buf);
4353 }
4354 
4355 static void
_gl_del_sel(void * data,Evas_Object * obj,void * event_info)4356 _gl_del_sel(void *data, Evas_Object *obj, void *event_info)
4357 {
4358    int num = (int)(uintptr_t)data;
4359    int num_category = num % 10;
4360    Elm_Object_Item *it = event_info;
4361    Elm_Genlist_Item_Class *itc =
4362       (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(it);
4363 
4364    if (num_category == 3)
4365      elm_object_item_del(it);
4366    else if (num_category == 5)
4367      {
4368         elm_genlist_clear(obj);
4369         _gl_del_item_append(obj, itc);
4370      }
4371    else if (num_category == 7)
4372      {
4373         evas_object_del(obj);
4374      }
4375 }
4376 
4377 static void
_gl_del_del_cb(void * data,Evas_Object * obj EINA_UNUSED)4378 _gl_del_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
4379 {
4380    printf("deleted item # %d\n", (int)(uintptr_t)data);
4381 }
4382 
4383 void
test_genlist_del(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4384 test_genlist_del(void *data EINA_UNUSED,
4385                  Evas_Object *obj EINA_UNUSED,
4386                  void *event_info EINA_UNUSED)
4387 {
4388    Evas_Object *win, *bx, *fr, *lb, *gl;
4389    Elm_Genlist_Item_Class *itc = NULL;
4390 
4391    win = elm_win_util_standard_add("genlist-del", "Genlist Del");
4392    elm_win_autodel_set(win, EINA_TRUE);
4393 
4394    bx = elm_box_add(win);
4395    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4396    elm_win_resize_object_add(win, bx);
4397    elm_box_align_set(bx, 0.5, 0.0);
4398    evas_object_show(bx);
4399 
4400    fr = elm_frame_add(bx);
4401    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4402    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4403    elm_object_text_set(fr, "Information");
4404    elm_box_pack_end(bx, fr);
4405    evas_object_show(fr);
4406 
4407    lb = elm_label_add(fr);
4408    elm_object_text_set(lb, "<align=left>This example tests the following cases"
4409                        " on item selection.<br/>"
4410                        "   1. genlist item deletion<br/>"
4411                        "   2. genlist clear and item append<br/>"
4412                        "   3. genlist del<br/>"
4413                        "   4. genlist clear on double-click</align>");
4414    elm_object_content_set(fr, lb);
4415    evas_object_show(lb);
4416 
4417    itc = elm_genlist_item_class_new();
4418    itc->item_style = "default";
4419    itc->func.text_get = _gl_del_text_get;
4420    itc->func.content_get = gl_content_get;
4421    itc->func.state_get = NULL;
4422    itc->func.del = _gl_del_del_cb;
4423    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
4424                                   _gl_del_win_del_cb, itc);
4425 
4426    gl = _gl_del_genlist_add(bx);
4427    _gl_del_item_append(gl, itc);
4428 
4429    evas_object_resize(win, 320, 500);
4430    evas_object_show(win);
4431 }
4432 
4433 
4434 /***  Genlist Focus  *********************************************************/
4435 static unsigned _gl_focus_objects = 3;
4436 static const char *_gl_focus_object_names[] = {"None", "Square", "Button", "Check", "Box"};
4437 
4438 // for the top genlist items
4439 static char *
gl_focus_top_items_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4440 gl_focus_top_items_text_get(void *data, Evas_Object *obj EINA_UNUSED,
4441                             const char *part EINA_UNUSED)
4442 {
4443    if (!data) return NULL;
4444 
4445    if (!strcmp(data, "do_nothing"))
4446      return strdup("Genlist Item");
4447    else if (!strcmp(data, "popup_sel"))
4448      return strdup("Create a popup on Select (popup parent is gl)");
4449    else if (!strcmp(data, "popup_mouse_down"))
4450      return strdup("Create a popup on Mouse Down (popup parent is gl)");
4451    else if (!strcmp(data, "popup_activate"))
4452      return strdup("Create a popup on Activate (popup parent is win)");
4453    else if (!strcmp(data, "clear_on_focus"))
4454      return strdup("Genlist Clear on Focus");
4455    else
4456      return NULL;
4457 }
4458 
4459 static char *
gl_focus_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)4460 gl_focus_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
4461 {
4462    char buf[256];
4463    unsigned char op = (uintptr_t)data % 100;
4464    unsigned char v1, v2;
4465 
4466    v1 = op / 10;
4467    if (v1 > 4) v1 = 4;
4468    v2 = op % 10;
4469    if (v2 > 4) v2 = 4;
4470    snprintf(buf, sizeof(buf), " %s / %s ",
4471             _gl_focus_object_names[v1], _gl_focus_object_names[v2]);
4472    return strdup(buf);
4473 }
4474 
4475 static Evas_Object *
gl_focus_content_get(void * data,Evas_Object * obj,const char * part)4476 gl_focus_content_get(void *data, Evas_Object *obj, const char *part)
4477 {
4478    Evas_Object *cnt = NULL;
4479 
4480    char op = (uintptr_t)data % 100;
4481    char type = (!strcmp(part,"elm.swallow.icon")) ? op / 10 : op % 10;
4482 
4483    switch(type)
4484      {
4485       case 1:
4486          cnt = elm_bg_add(obj);
4487          evas_object_color_set(cnt, 128, 18, 128, 255);
4488          break;
4489       case 2:
4490          cnt = elm_button_add(obj);
4491          break;
4492       case 3:
4493          cnt = elm_check_add(obj);
4494          break;
4495       case 4:
4496          cnt = elm_box_add(obj);
4497          evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL);
4498          elm_box_horizontal_set(cnt, EINA_TRUE);
4499          elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
4500          elm_box_pack_end(cnt, gl_focus_content_get((void *)3, obj, ""));
4501          elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
4502          break;
4503       default:
4504          break;
4505 
4506      }
4507    if (cnt)
4508      {
4509         evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
4510         evas_object_show(cnt);
4511      }
4512    return cnt;
4513 }
4514 
4515 static void
_gl_focus_sel_popup_close_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4516 _gl_focus_sel_popup_close_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4517                                  void *event_info EINA_UNUSED)
4518 {
4519    evas_object_del(data);
4520 }
4521 
4522 static void
_gl_focus_sel_popup_create(Evas_Object * parent)4523 _gl_focus_sel_popup_create(Evas_Object *parent)
4524 {
4525    Evas_Object *popup = NULL, *btn = NULL;
4526 
4527    popup = elm_popup_add(parent);
4528    elm_object_text_set(popup, "Popup for the genlist focus test with popup creation.");
4529 
4530    // popup buttons
4531    btn = elm_button_add(popup);
4532    elm_object_text_set(btn, "Close");
4533    elm_object_part_content_set(popup, "button1", btn);
4534    evas_object_smart_callback_add(btn, "clicked", _gl_focus_sel_popup_close_btn_cb, popup);
4535 
4536    // popup show should be called after adding all the contents and the buttons
4537    // of popup to set the focus into popup's contents correctly.
4538    evas_object_show(popup);
4539    elm_object_focus_set(btn, EINA_TRUE);
4540 }
4541 
4542 static void
_gl_focus_0_item_sel_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4543 _gl_focus_0_item_sel_cb(void *data EINA_UNUSED, Evas_Object *obj,
4544                         void *event_info EINA_UNUSED)
4545 {
4546    _gl_focus_sel_popup_create(obj);
4547 }
4548 
4549 static void
_gl_focus_item_loop_enable_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4550 _gl_focus_item_loop_enable_changed_cb(void *data, Evas_Object *obj,
4551                                       void *event_info EINA_UNUSED)
4552 {
4553    Evas_Object *gl = data;
4554    elm_object_scroll_item_loop_enabled_set(gl, elm_check_state_get(obj));
4555 }
4556 
4557 static void
_gl_focus_focus_on_selection_set(Evas_Object * gl,Evas_Object * chk,Eina_Bool focus)4558 _gl_focus_focus_on_selection_set(Evas_Object *gl,
4559                                  Evas_Object *chk, Eina_Bool focus)
4560 {
4561    elm_genlist_focus_on_selection_set(gl, focus);
4562    elm_check_state_set(chk, focus);
4563    printf("genlist_focus_on_selection = %s\n", (focus) ? "true" : "false");
4564 }
4565 
4566 static void
_gl_focus_focus_on_selection_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4567 _gl_focus_focus_on_selection_changed_cb(void *data, Evas_Object *obj,
4568                                         void *event_info EINA_UNUSED)
4569 {
4570    Eina_Bool nextstate = !elm_genlist_focus_on_selection_get(data);
4571    _gl_focus_focus_on_selection_set(data, obj, nextstate);
4572 }
4573 
4574 static void
_gl_focus_win_auto_focus_enable_changed(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4575 _gl_focus_win_auto_focus_enable_changed(void *data EINA_UNUSED,
4576                                         Evas_Object *obj,
4577                                         void *event_info EINA_UNUSED)
4578 {
4579    elm_config_window_auto_focus_enable_set(elm_check_state_get(obj));
4580 }
4581 
4582 static void
_gl_focus_win_auto_focus_animate_changed(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4583 _gl_focus_win_auto_focus_animate_changed(void *data EINA_UNUSED,
4584                                          Evas_Object *obj,
4585                                          void *event_info EINA_UNUSED)
4586 {
4587    elm_config_window_auto_focus_animate_set(elm_check_state_get(obj));
4588 }
4589 
4590 static void
_gl_focus_focus_highlight_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4591 _gl_focus_focus_highlight_changed_cb(void *data, Evas_Object *obj,
4592                                      void *event_info EINA_UNUSED)
4593 {
4594    elm_win_focus_highlight_enabled_set(data,
4595                                        elm_check_state_get(obj));
4596 }
4597 
4598 static void
_gl_focus_focus_animate_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4599 _gl_focus_focus_animate_changed_cb(void *data, Evas_Object *obj,
4600                                    void *event_info EINA_UNUSED)
4601 {
4602    elm_win_focus_highlight_animate_set(data,
4603                                        elm_check_state_get(obj));
4604 }
4605 
4606 static void
_gl_focus_move_policy_changed_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4607 _gl_focus_move_policy_changed_cb(void *data EINA_UNUSED,
4608                                  Evas_Object *obj,
4609                                  void *event_info EINA_UNUSED)
4610 {
4611    int val = elm_radio_value_get(obj);
4612 
4613    if (val == 0)
4614      elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
4615    else if (val == 1)
4616      elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
4617 }
4618 
4619 static void
_gl_focus_item_focus_cb(void * data,Evas_Object * obj,void * event_info)4620 _gl_focus_item_focus_cb(void *data, Evas_Object *obj, void *event_info)
4621 {
4622    printf("item,focused: %p\n", event_info);
4623 
4624    if (event_info == data)
4625      elm_genlist_clear(obj);
4626 }
4627 
4628 static void
_gl_focus_item_unfocus_cb(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4629 _gl_focus_item_unfocus_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
4630                           void *event_info)
4631 {
4632    printf("item,unfocused %p\n", event_info);
4633 }
4634 
4635 static void
_gl_focus_item_cb(void * data,Evas_Object * obj,void * event_info)4636 _gl_focus_item_cb(void *data, Evas_Object *obj, void *event_info)
4637 {
4638    Elm_Object_Item *it = event_info;
4639 
4640    printf("%s: %p\n", (char *)data, it);
4641 
4642    if (!strcmp((char *)data, "activated") &&
4643        !strcmp((char *)elm_object_item_data_get(it), "popup_activate"))
4644      {
4645          _gl_focus_sel_popup_create(elm_object_top_widget_get(obj));
4646      }
4647 }
4648 
4649 static void
_gl_focus_key_down_cb(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)4650 _gl_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
4651                       Evas_Object *obj EINA_UNUSED, void *event_info)
4652 {
4653    Evas_Event_Key_Down *ev = event_info;
4654    printf("\n=== Key Down : %s ===\n", ev->keyname);
4655 }
4656 
4657 static void
_gl_focus_mouse_down_cb(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info)4658 _gl_focus_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
4659                         Evas_Object *obj, void *event_info)
4660 {
4661    Evas_Event_Mouse_Down *ev = event_info;
4662    Elm_Object_Item *it = NULL;
4663    int postret = 0;
4664 
4665    it = elm_genlist_at_xy_item_get(obj, ev->canvas.x, ev->canvas.y, &postret);
4666    if (!it) return;
4667 
4668    if (elm_genlist_item_index_get(it) == 4)
4669      _gl_focus_sel_popup_create(obj);
4670 }
4671 
4672 static Ecore_Timer *timer = NULL;
4673 static void
_gl_focus_win_del_cb(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4674 _gl_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
4675                      Evas_Object *obj EINA_UNUSED,
4676                      void *event_info EINA_UNUSED)
4677 {
4678    ecore_timer_del(timer);
4679    timer = NULL;
4680 }
4681 
4682 static void
_gl_focus_item_select_on_focus_disable_changed_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4683 _gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
4684                                                   void *event_info EINA_UNUSED)
4685 {
4686    elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
4687 }
4688 
4689 static void
_gl_first_item_focus_on_first_focus_in_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4690 _gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
4691                                           void *event_info  EINA_UNUSED)
4692 {
4693    elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
4694 }
4695 
4696 static void
_gl_wheel_disabled_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)4697 _gl_wheel_disabled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
4698 {
4699    elm_scroller_wheel_disabled_set(data, elm_check_state_get(obj));
4700 }
4701 
4702 static Eina_Bool
_focus_timer_cb(void * data)4703 _focus_timer_cb(void *data)
4704 {
4705    elm_object_item_focus_set(data, EINA_TRUE);
4706    timer = NULL;
4707 
4708    return ECORE_CALLBACK_CANCEL;
4709 }
4710 
4711 static Eina_Bool
_select_timer_cb(void * data)4712 _select_timer_cb(void *data)
4713 {
4714    elm_genlist_item_selected_set(data, EINA_TRUE);
4715    timer = NULL;
4716 
4717    return ECORE_CALLBACK_CANCEL;
4718 }
4719 
4720 static void
_focus_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4721 _focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4722               void *event_info EINA_UNUSED)
4723 {
4724    ecore_timer_del(timer);
4725    timer = ecore_timer_add(1.5, _focus_timer_cb, data);
4726 }
4727 
4728 static void
_sel_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4729 _sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4730             void *event_info EINA_UNUSED)
4731 {
4732    ecore_timer_del(timer);
4733    timer = ecore_timer_add(1.5, _select_timer_cb, data);
4734 }
4735 
4736 static void
_dis_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4737 _dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4738             void *event_info EINA_UNUSED)
4739 {
4740    elm_object_item_disabled_set(data, EINA_TRUE);
4741 }
4742 
4743 static void
_add_more_items_btn_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4744 _add_more_items_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
4745                        void *event_info EINA_UNUSED)
4746 {
4747    Elm_Genlist_Item_Class *itc = NULL;
4748    int i = 0;
4749 
4750    itc = elm_genlist_item_class_new();
4751    itc->item_style = "default";
4752    itc->func.text_get = gl_text_get;
4753    itc->func.content_get = NULL;
4754    itc->func.state_get = NULL;
4755    itc->func.del = NULL;
4756 
4757 
4758    for (i = 0; i < 1000; i++)
4759      {
4760         elm_genlist_item_append(data, itc, (void *)(uintptr_t)i,
4761                                 NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
4762      }
4763 
4764    elm_genlist_item_class_free(itc);
4765 }
4766 
4767 static void
_focus_button_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)4768 _focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
4769                          void *event_info EINA_UNUSED)
4770 {
4771    printf("Button clicked: %s\n", (char *)data);
4772 }
4773 
4774 void
_focus_autoscroll_changed_cb(void * data EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)4775 _focus_autoscroll_changed_cb(void *data EINA_UNUSED,
4776                              Evas_Object *obj,
4777                              void *event_info EINA_UNUSED)
4778 {
4779    elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj));
4780 }
4781 
4782 /* this function is used in another tests such as list, gengrid, and toolbar. */
4783 Evas_Object *
_focus_autoscroll_mode_frame_create(Evas_Object * parent)4784 _focus_autoscroll_mode_frame_create(Evas_Object *parent)
4785 {
4786    Evas_Object *fr, *bx, *rdg, *rd;
4787 
4788    fr = elm_frame_add(parent);
4789    elm_object_text_set(fr, "Focus Autoscroll Mode");
4790    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4791    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
4792    evas_object_show(fr);
4793 
4794    bx = elm_box_add(fr);
4795    elm_object_content_set(fr, bx);
4796    evas_object_show(bx);
4797 
4798    rdg = rd = elm_radio_add(bx);
4799    elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW);
4800    elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW");
4801    elm_object_tooltip_text_set(rd, "Directly show the focused region<br/>"
4802                                "or item automatically inside a scroller.");
4803    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4804    evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
4805    elm_box_pack_end(bx, rd);
4806    evas_object_show(rd);
4807    evas_object_smart_callback_add(rd, "changed",
4808                                   _focus_autoscroll_changed_cb,
4809                                   NULL);
4810 
4811    rd = elm_radio_add(bx);
4812    elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE);
4813    elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE");
4814    elm_object_tooltip_text_set(rd, "Do not show the focused region or<br/>"
4815                                "item automatically inside a scroller.");
4816    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4817    evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
4818    elm_box_pack_end(bx, rd);
4819    elm_radio_group_add(rd, rdg);
4820    evas_object_show(rd);
4821    evas_object_smart_callback_add(rd, "changed",
4822                                   _focus_autoscroll_changed_cb,
4823                                   NULL);
4824 
4825 
4826    rd = elm_radio_add(bx);
4827    elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN);
4828    elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN");
4829    elm_object_tooltip_text_set(rd, "Bring in the focused region or item<br/>"
4830                                "automatically which might invole the scrolling.");
4831    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4832    evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
4833    elm_box_pack_end(bx, rd);
4834    elm_radio_group_add(rd, rdg);
4835    evas_object_show(rd);
4836    evas_object_smart_callback_add(rd, "changed",
4837                                   _focus_autoscroll_changed_cb,
4838                                   NULL);
4839 
4840    elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get());
4841 
4842    return fr;
4843 }
4844 
4845 static void
_test_genlist_focus_option_panel_create(Evas_Object * win,Evas_Object * bx,Evas_Object * gl,Elm_Object_Item * it_0,Elm_Object_Item * it_2)4846 _test_genlist_focus_option_panel_create(Evas_Object *win, Evas_Object *bx,
4847                                         Evas_Object *gl, Elm_Object_Item *it_0,
4848                                         Elm_Object_Item *it_2)
4849 {
4850    Evas_Object *fr = NULL, *bx_opt = NULL, *chk = NULL;
4851    Evas_Object *bx_mv = NULL, *rd = NULL, *rdg = NULL;
4852    Evas_Object *btn_box  = NULL, *btn = NULL;
4853 
4854    fr = elm_frame_add(bx);
4855    elm_object_text_set(fr, "Options");
4856    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4857    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4858    elm_box_pack_end(bx, fr);
4859    evas_object_show(fr);
4860 
4861    bx_opt = elm_box_add(fr);
4862    elm_box_layout_set(bx_opt, evas_object_box_layout_flow_horizontal, NULL, NULL);
4863    evas_object_size_hint_weight_set(bx_opt, EVAS_HINT_EXPAND, 0.0);
4864    evas_object_size_hint_align_set(bx_opt, EVAS_HINT_FILL, 0.0);
4865    elm_box_align_set(bx_opt, 0.0, 0.5);
4866    elm_object_content_set(fr, bx_opt);
4867    evas_object_show(bx_opt);
4868 
4869    chk = elm_check_add(bx_opt);
4870    elm_object_text_set(chk, "Window Auto Focus Enable");
4871    elm_check_state_set(chk, EINA_TRUE);
4872    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4873    evas_object_smart_callback_add(chk, "changed",
4874                                   _gl_focus_win_auto_focus_enable_changed,
4875                                   NULL);
4876    elm_box_pack_end(bx_opt, chk);
4877    evas_object_show(chk);
4878 
4879    chk = elm_check_add(bx_opt);
4880    elm_object_text_set(chk, "Window Auto Focus Animate");
4881    elm_check_state_set(chk, EINA_TRUE);
4882    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4883    evas_object_smart_callback_add(chk, "changed",
4884                                   _gl_focus_win_auto_focus_animate_changed,
4885                                   NULL);
4886    elm_box_pack_end(bx_opt, chk);
4887    evas_object_show(chk);
4888 
4889    chk = elm_check_add(bx_opt);
4890    elm_object_text_set(chk, "Focus Highlight");
4891    elm_check_state_set(chk, EINA_FALSE);
4892    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4893    evas_object_smart_callback_add(chk, "changed",
4894                                   _gl_focus_focus_highlight_changed_cb,
4895                                   win);
4896    elm_box_pack_end(bx_opt, chk);
4897    evas_object_show(chk);
4898 
4899    chk = elm_check_add(bx_opt);
4900    elm_object_text_set(chk, "Focus Animation");
4901    elm_check_state_set(chk, EINA_FALSE);
4902    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4903    evas_object_smart_callback_add(chk, "changed",
4904                                   _gl_focus_focus_animate_changed_cb,
4905                                   win);
4906    elm_box_pack_end(bx_opt, chk);
4907    evas_object_show(chk);
4908 
4909    chk = elm_check_add(bx_opt);
4910    elm_object_text_set(chk, "Focus on selection");
4911    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4912    evas_object_smart_callback_add(chk, "changed",
4913                                   _gl_focus_focus_on_selection_changed_cb, gl);
4914    elm_box_pack_end(bx_opt, chk);
4915    evas_object_show(chk);
4916 
4917    chk = elm_check_add(bx_opt);
4918    elm_object_text_set(chk, "Item Looping Enable");
4919    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4920    evas_object_smart_callback_add(chk, "changed",
4921                                   _gl_focus_item_loop_enable_changed_cb, gl);
4922    elm_box_pack_end(bx_opt, chk);
4923    evas_object_show(chk);
4924 
4925    chk = elm_check_add(bx_opt);
4926    elm_object_text_set(chk, "Item Select on Focus disable");
4927    elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get());
4928    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4929    evas_object_smart_callback_add(chk, "changed",
4930                                   _gl_focus_item_select_on_focus_disable_changed_cb,
4931                                   NULL);
4932    elm_box_pack_end(bx_opt, chk);
4933    evas_object_show(chk);
4934 
4935    chk = elm_check_add(bx_opt);
4936    elm_object_text_set(chk, "First item focus on first focus in");
4937    elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
4938    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4939    evas_object_smart_callback_add(chk, "changed",
4940                                   _gl_first_item_focus_on_first_focus_in_cb,
4941                                   NULL);
4942    elm_box_pack_end(bx_opt, chk);
4943    evas_object_show(chk);
4944 
4945    chk = elm_check_add(bx_opt);
4946    elm_object_text_set(chk, "Wheel Disabled");
4947    elm_check_state_set(chk, elm_scroller_wheel_disabled_get(gl));
4948    evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
4949    evas_object_smart_callback_add(chk, "changed", _gl_wheel_disabled_cb, gl);
4950    elm_box_pack_end(bx_opt, chk);
4951    evas_object_show(chk);
4952 
4953    // Focus Autoscroll Mode
4954    fr = _focus_autoscroll_mode_frame_create(bx);
4955    elm_box_pack_end(bx, fr);
4956 
4957    // Focus Movement Policy
4958    fr = elm_frame_add(bx);
4959    elm_object_text_set(fr, "Focus Movement Policy");
4960    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4961    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4962    elm_box_pack_end(bx, fr);
4963    evas_object_show(fr);
4964 
4965    bx_mv = elm_box_add(fr);
4966    elm_box_horizontal_set(bx_mv, EINA_TRUE);
4967    elm_object_content_set(fr, bx_mv);
4968    evas_object_show(bx_mv);
4969 
4970    rdg = rd = elm_radio_add(bx_mv);
4971    elm_object_text_set(rd, "Focus Move by Click");
4972    elm_radio_state_value_set(rd, 0);
4973    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4974    evas_object_smart_callback_add(rd, "changed",
4975                                   _gl_focus_move_policy_changed_cb,
4976                                   NULL);
4977    elm_box_pack_end(bx_mv, rd);
4978    evas_object_show(rd);
4979 
4980    rd = elm_radio_add(bx_mv);
4981    elm_object_text_set(rd, "Focus Move by Mouse-In");
4982    elm_radio_group_add(rd, rdg);
4983    elm_radio_state_value_set(rd, 1);
4984    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
4985    evas_object_smart_callback_add(rd, "changed",
4986                                   _gl_focus_move_policy_changed_cb,
4987                                   NULL);
4988    elm_box_pack_end(bx_mv, rd);
4989    evas_object_show(rd);
4990 
4991    // Options
4992    fr = elm_frame_add(bx);
4993    elm_object_text_set(fr, "Options");
4994    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
4995    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
4996    elm_box_pack_end(bx, fr);
4997    evas_object_show(fr);
4998 
4999    btn_box = elm_box_add(fr);
5000    elm_object_content_set(fr, btn_box);
5001    evas_object_show(btn_box);
5002 
5003    btn = elm_button_add(btn_box);
5004    elm_object_text_set(btn, "Focus 2nd Item after 1.5 seconds.");
5005    evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5006    evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5007    elm_box_pack_end(btn_box, btn);
5008    evas_object_show(btn);
5009    evas_object_smart_callback_add(btn, "clicked", _focus_btn_cb, it_2);
5010 
5011    btn = elm_button_add(btn_box);
5012    elm_object_text_set(btn, "Select 2nd Item after 1.5 seconds.");
5013    evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5014    evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5015    elm_box_pack_end(btn_box, btn);
5016    evas_object_show(btn);
5017    evas_object_smart_callback_add(btn, "clicked", _sel_btn_cb, it_2);
5018 
5019    btn = elm_button_add(btn_box);
5020    elm_object_text_set(btn, "Disable 1st Item.");
5021    evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5022    evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5023    elm_box_pack_end(btn_box, btn);
5024    evas_object_show(btn);
5025    evas_object_smart_callback_add(btn, "clicked", _dis_btn_cb, it_0);
5026 
5027 
5028    btn = elm_button_add(btn_box);
5029    elm_object_text_set(btn, "Add more Genlist items");
5030    evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
5031    evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
5032    elm_box_pack_end(btn_box, btn);
5033    evas_object_show(btn);
5034    evas_object_smart_callback_add(btn, "clicked", _add_more_items_btn_cb, gl);
5035 }
5036 
5037 void
test_genlist_focus(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5038 test_genlist_focus(void *data EINA_UNUSED,
5039                    Evas_Object *obj EINA_UNUSED,
5040                    void *event_info EINA_UNUSED)
5041 {
5042    Evas_Object *win, *bx, *bx2, *gl, *btn;
5043    unsigned lhand, rhand;
5044    Elm_Object_Item *it = NULL, *it_1 = NULL, *it_2 = NULL;
5045    Elm_Genlist_Item_Class *itc = NULL, *itc1 = NULL, *itc2 = NULL;
5046 
5047    api_data *api = calloc(1, sizeof(api_data));
5048    win = elm_win_util_standard_add("genlist-focus", "Genlist Focus");
5049    elm_win_autodel_set(win, EINA_TRUE);
5050    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
5051    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
5052                                   _gl_focus_win_del_cb, NULL);
5053 
5054    elm_config_window_auto_focus_enable_set(EINA_TRUE);
5055    elm_config_window_auto_focus_animate_set(EINA_TRUE);
5056    elm_win_focus_highlight_enabled_set(win, EINA_FALSE);
5057    elm_win_focus_highlight_animate_set(win, EINA_FALSE);
5058 
5059    bx = elm_box_add(win);
5060    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5061    elm_win_resize_object_add(win, bx);
5062    evas_object_show(bx);
5063 
5064    btn = elm_button_add(bx);
5065    elm_object_text_set(btn, "Up");
5066    elm_box_pack_end(bx, btn);
5067    evas_object_smart_callback_add(btn, "clicked",
5068                                   _focus_button_clicked_cb, "Up");
5069    evas_object_show(btn);
5070 
5071    bx2 = elm_box_add(bx);
5072    elm_box_horizontal_set(bx2, EINA_TRUE);
5073    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5074    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
5075    elm_box_pack_end(bx, bx2);
5076    evas_object_show(bx2);
5077 
5078    btn = elm_button_add(bx2);
5079    elm_object_text_set(btn, "Left");
5080    elm_box_pack_end(bx2, btn);
5081    evas_object_smart_callback_add(btn, "clicked",
5082                                   _focus_button_clicked_cb, "Left");
5083    evas_object_show(btn);
5084 
5085    gl = elm_genlist_add(bx);
5086    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5087    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5088    elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
5089    elm_box_pack_end(bx2, gl);
5090    api->gl = gl;
5091    evas_object_show(gl);
5092    evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected");
5093    evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected");
5094    evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated");
5095    evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted");
5096    evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted");
5097    evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL);
5098    evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _gl_focus_mouse_down_cb, NULL);
5099 
5100    btn = elm_button_add(bx2);
5101    elm_object_text_set(btn, "Right");
5102    elm_box_pack_end(bx2, btn);
5103    evas_object_smart_callback_add(btn, "clicked",
5104                                   _focus_button_clicked_cb, "Right");
5105    evas_object_show(btn);
5106 
5107    btn = elm_button_add(bx);
5108    elm_object_text_set(btn, "Down");
5109    elm_box_pack_end(bx, btn);
5110    evas_object_smart_callback_add(btn, "clicked",
5111                                   _focus_button_clicked_cb, "Down");
5112    evas_object_show(btn);
5113 
5114    itc = elm_genlist_item_class_new();
5115    itc->item_style = "default";
5116    itc->func.text_get = gl_focus_top_items_text_get;
5117    itc->func.content_get = NULL;
5118    itc->func.state_get = NULL;
5119    itc->func.del = NULL;
5120 
5121    itc1 = elm_genlist_item_class_new();
5122    itc1->item_style = "default";
5123    itc1->func.text_get = gl_focus_text_get;
5124    itc1->func.content_get = gl_focus_content_get;
5125    itc1->func.state_get = NULL;
5126    itc1->func.del = NULL;
5127 
5128    itc2 = elm_genlist_item_class_new();
5129    itc2->item_style = "tree_effect";
5130    itc2->func.text_get = gl_focus_text_get;
5131    itc2->func.content_get = gl_focus_content_get;
5132    itc2->func.state_get = NULL;
5133    itc2->func.del = NULL;
5134 
5135    it_1 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
5136                                   NULL, NULL);
5137    it_2 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
5138                                   NULL, NULL);
5139    elm_genlist_item_append(gl, itc, "popup_sel", NULL, ELM_GENLIST_ITEM_NONE,
5140                            _gl_focus_0_item_sel_cb, NULL);
5141    elm_genlist_item_append(gl, itc, "popup_mouse_down", NULL, ELM_GENLIST_ITEM_NONE,
5142                            NULL, NULL);
5143    elm_genlist_item_append(gl, itc, "popup_activate", NULL, ELM_GENLIST_ITEM_NONE,
5144                            NULL, NULL);
5145 
5146    it = elm_genlist_item_append(gl, itc, "clear_on_focus", NULL, ELM_GENLIST_ITEM_NONE,
5147                                 NULL, NULL);
5148    evas_object_smart_callback_add(gl, "item,focused", _gl_focus_item_focus_cb, it);
5149    evas_object_smart_callback_add(gl, "item,unfocused", _gl_focus_item_unfocus_cb, NULL);
5150 
5151    for (lhand = 0; lhand < _gl_focus_objects; lhand++)
5152      {
5153         for (rhand = 0; rhand < _gl_focus_objects; rhand++)
5154           {
5155              unsigned digit1 = lhand * 10 + rhand;
5156              elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit1,
5157                                      NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5158 
5159              unsigned digit2 = (_gl_focus_objects - lhand -1) * 10 +
5160                 (_gl_focus_objects - rhand -1);
5161              it = elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit2,
5162                                           NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5163              if (rhand == 4)
5164                elm_object_item_disabled_set(it, EINA_TRUE);
5165 
5166              if (rhand == (_gl_focus_objects - 1))
5167                elm_genlist_item_append(gl, itc2, (void*)(uintptr_t)digit1,
5168                      NULL, ELM_GENLIST_ITEM_TREE, NULL, NULL);
5169           }
5170      }
5171 
5172    elm_genlist_item_class_free(itc);
5173    elm_genlist_item_class_free(itc1);
5174    elm_genlist_item_class_free(itc2);
5175 
5176    // Options
5177    _test_genlist_focus_option_panel_create(win, bx, gl, it_1, it_2);
5178 
5179    evas_object_resize(win, 420, 600);
5180    evas_object_show(win);
5181 }
5182 
5183 
5184 /***  Genlist Filteer  *******************************************************/
5185 char *genlist_demo_names[] = {
5186         "Aaliyah", "Aamir", "Aaralyn", "Aaron", "Abagail",
5187         "Babitha", "Bahuratna", "Bandana", "Bulbul", "Cade", "Caldwell",
5188         "Chandan", "Caster", "Dagan ", "Daulat", "Dag", "Earl", "Ebenzer",
5189         "Ellison", "Elizabeth", "Filbert", "Fitzpatrick", "Florian", "Fulton",
5190         "Frazer", "Gabriel", "Gage", "Galen", "Garland", "Gauhar", "Hadden",
5191         "Hafiz", "Hakon", "Haleem", "Hank", "Hanuman", "Jabali ", "Jaimini",
5192         "Jayadev", "Jake", "Jayatsena", "Jonathan", "Kamaal", "Jeirk",
5193         "Jasper", "Jack", "Mac", "Macy", "Marlon", "Milson",
5194         NULL
5195 };
5196 
5197 static char *
glf_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)5198 glf_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
5199 {
5200    char buf[256];
5201    snprintf(buf, sizeof(buf), "%s", genlist_demo_names[((int)(uintptr_t)data)%50]);
5202    return strdup(buf);
5203 }
5204 
5205 Eina_Bool
gl_filter_get(void * data,Evas_Object * obj EINA_UNUSED,void * key)5206 gl_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key)
5207 {
5208    if (!strlen((char *)key)) return EINA_TRUE;
5209 
5210    if (strcasestr(genlist_demo_names[((int)(uintptr_t)data)%50], (char *)key))
5211      return EINA_TRUE;
5212    // Default case should return false (item fails filter hence will be hidden)
5213    return EINA_FALSE;
5214 }
5215 
5216 static void
_gl_filter_finished_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5217 _gl_filter_finished_cb(void *data,
5218                        Evas_Object *obj EINA_UNUSED,
5219                        void *event_info EINA_UNUSED)
5220 {
5221    printf("Filter finished, filtered items count is %d\n", elm_genlist_filtered_items_count((Evas_Object *)data));
5222 }
5223 
5224 void
_entry_change_cb(void * data,Evas_Object * obj,void * event EINA_UNUSED)5225 _entry_change_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED)
5226 {
5227    api_data *api = (api_data *)data;
5228    char buf[100];
5229    unsigned int count = 0;
5230    Elm_Object_Item *item;
5231 
5232    if (api->filter_data) free(api->filter_data);
5233 
5234    sprintf(buf, "%s", elm_object_text_get(obj));
5235    api->filter_data = strdup(buf);
5236    elm_genlist_filter_set(api->gl, (void *)(api->filter_data));
5237    if (!strlen(buf))
5238      {
5239         printf("Input data string empty; returning\n");
5240         return;
5241      }
5242 
5243    item = elm_genlist_first_item_get(api->gl);
5244    if (!item)
5245      {
5246         printf("No matches for the key %s\n", buf);
5247         return;
5248      }
5249    while (item)
5250      {
5251         ++count;
5252         item = elm_genlist_item_next_get(item);
5253      }
5254    printf("Number of matches for %s is %d\n", buf, count);
5255 }
5256 
5257 void
test_genlist_filter(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5258 test_genlist_filter(void *data EINA_UNUSED,
5259                     Evas_Object *obj EINA_UNUSED,
5260                     void *event_info EINA_UNUSED)
5261 {
5262    Evas_Object *win, *bx, *bx2, *entry, *gl;
5263    Elm_Genlist_Item_Class *itc = NULL;
5264    int i;
5265 
5266    api_data *api = calloc(1, sizeof(api_data));
5267    win = elm_win_util_standard_add("genlist-filter", "Genlist filter");
5268    elm_win_autodel_set(win, EINA_TRUE);
5269    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
5270    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
5271                                 _gl_focus_win_del_cb, NULL);
5272 
5273    elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
5274    elm_win_focus_highlight_animate_set(win, EINA_TRUE);
5275 
5276    bx = elm_box_add(win);
5277    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5278    elm_win_resize_object_add(win, bx);
5279    evas_object_show(bx);
5280 
5281    entry = elm_entry_add(bx);
5282    elm_entry_single_line_set(entry, EINA_TRUE);
5283    evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
5284    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.0);
5285    elm_object_part_text_set(entry, "guide", "Search.");
5286    elm_box_pack_end(bx, entry);
5287    evas_object_show(entry);
5288 
5289    bx2 = elm_box_add(bx);
5290    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5291    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
5292    elm_box_pack_end(bx, bx2);
5293    evas_object_show(bx2);
5294 
5295    gl = elm_genlist_add(bx);
5296    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5297    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5298    elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
5299    elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
5300    elm_genlist_homogeneous_set(gl, EINA_TRUE);
5301    elm_box_pack_end(bx2, gl);
5302    api->gl = gl;
5303    evas_object_show(gl);
5304    evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected");
5305    evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected");
5306    evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated");
5307    evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted");
5308    evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted");
5309    evas_object_smart_callback_add(gl, "filter,done", _gl_filter_finished_cb, gl);
5310    evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL);
5311 
5312    itc = elm_genlist_item_class_new();
5313    itc->item_style = "default";
5314    itc->func.text_get = glf_text_get;
5315    itc->func.content_get = NULL;
5316    itc->func.filter_get = gl_filter_get;
5317    itc->func.state_get = NULL;
5318    itc->func.del = NULL;
5319 
5320    for (i = 0; i < 500; i++)
5321      elm_genlist_item_append(gl, itc,
5322                              (void *)(intptr_t)i, NULL,
5323                              ELM_GENLIST_ITEM_NONE,
5324                              NULL, NULL);
5325 
5326    evas_object_resize(win, 420, 600);
5327    evas_object_show(win);
5328    elm_object_focus_set(entry, EINA_TRUE);
5329    evas_object_smart_callback_add(entry, "changed,user", _entry_change_cb, api);
5330 }
5331 
5332 
5333 /***  Genlist Show/BringIN  **************************************************/
5334 static void
_rd_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5335 _rd_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
5336 {
5337    api_data *ad = data;
5338    ad->scrollto = elm_radio_state_value_get(obj);
5339 }
5340 
5341 static Evas_Object *
_scrollto_mode_frame_new(Evas_Object * win,void * data)5342 _scrollto_mode_frame_new(Evas_Object *win, void *data)
5343 {
5344    Evas_Object *fr, *bx, *rd, *rdg;
5345    api_data *sd = data;
5346 
5347    fr = elm_frame_add(win);
5348    elm_object_text_set(fr, "Scrollto Mode");
5349    evas_object_show(fr);
5350 
5351    bx = elm_box_add(win);
5352    elm_object_content_set(fr, bx);
5353    evas_object_show(bx);
5354 
5355    rd = elm_radio_add(win);
5356    elm_radio_state_value_set(rd, 0);
5357    elm_object_text_set(rd, "SCROLLTO_NONE");
5358    evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5359    evas_object_show(rd);
5360    elm_box_pack_end(bx, rd);
5361    rdg = rd;
5362 
5363    rd = elm_radio_add(win);
5364    elm_radio_state_value_set(rd, 1);
5365    elm_object_text_set(rd, "SCROLLTO_IN");
5366    elm_radio_group_add(rd, rdg);
5367    evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5368    evas_object_show(rd);
5369    elm_box_pack_end(bx, rd);
5370 
5371    rd = elm_radio_add(win);
5372    elm_radio_state_value_set(rd, 2);
5373    elm_object_text_set(rd, "SCROLLTO_TOP");
5374    elm_radio_group_add(rd, rdg);
5375    evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5376    evas_object_show(rd);
5377    elm_box_pack_end(bx, rd);
5378 
5379    rd = elm_radio_add(win);
5380    elm_radio_state_value_set(rd, 4);
5381    elm_object_text_set(rd, "SCROLLTO_MIDDLE");
5382    elm_radio_group_add(rd, rdg);
5383    evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5384    evas_object_show(rd);
5385    elm_box_pack_end(bx, rd);
5386 
5387    rd = elm_radio_add(win);
5388    elm_radio_state_value_set(rd, 8);
5389    elm_object_text_set(rd, "SCROLLTO_BOTTOM");
5390    elm_radio_group_add(rd, rdg);
5391    evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd);
5392    evas_object_show(rd);
5393    elm_box_pack_end(bx, rd);
5394 
5395    return fr;
5396 }
5397 
5398 void
_scrollto_item_show(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5399 _scrollto_item_show(void *data,
5400                     Evas_Object *obj EINA_UNUSED,
5401                     void *event_info EINA_UNUSED)
5402 {
5403    api_data *api = data;
5404    Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl);
5405    elm_genlist_item_show(it, api->scrollto);
5406 }
5407 
5408 void
_scrollto_item_bring(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5409 _scrollto_item_bring(void *data,
5410                      Evas_Object *obj EINA_UNUSED,
5411                      void *event_info EINA_UNUSED)
5412 {
5413    api_data *api = data;
5414    Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl);
5415    elm_genlist_item_bring_in(it, api->scrollto);
5416 }
5417 
5418 void
test_genlist_show_bring(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5419 test_genlist_show_bring(void *data EINA_UNUSED,
5420                         Evas_Object *obj EINA_UNUSED,
5421                         void *event_info EINA_UNUSED)
5422 {
5423    Evas_Object *win, *gl, *bt_show, *bt_bring, *bx, *bxx, *fr;
5424    Elm_Object_Item *gli;
5425    int i, max;
5426    api_data *api = calloc(1, sizeof(api_data));
5427 
5428    win = elm_win_util_standard_add("genlist", "Genlist Item Show/Bring");
5429    elm_win_autodel_set(win, EINA_TRUE);
5430    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5431 
5432    bxx = elm_box_add(win);
5433    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5434    elm_win_resize_object_add(win, bxx);
5435    evas_object_show(bxx);
5436 
5437    bx = elm_box_add(win);
5438    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5439    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
5440    evas_object_show(bx);
5441    elm_box_pack_end(bxx, bx);
5442 
5443    gl = elm_genlist_add(win);
5444    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5445    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5446    elm_box_pack_end(bx, gl);
5447    evas_object_show(gl);
5448    api->gl = gl;
5449 
5450    api->itc1 = elm_genlist_item_class_new();
5451    api->itc1->item_style = "default";
5452    api->itc1->func.text_get = gl_text_get1;
5453    api->itc1->func.content_get = gl_content_get;
5454    api->itc1->func.state_get = NULL;
5455    api->itc1->func.del = NULL;
5456 
5457    bt_show = elm_button_add(win);
5458    elm_object_text_set(bt_show, "Show");
5459    evas_object_smart_callback_add(bt_show, "clicked", _scrollto_item_show, api);
5460    evas_object_show(bt_show);
5461    elm_box_pack_end(bx, bt_show);
5462 
5463    bt_bring = elm_button_add(win);
5464    elm_object_text_set(bt_bring, "Bring");
5465    evas_object_smart_callback_add(bt_bring, "clicked", _scrollto_item_bring, api);
5466    evas_object_show(bt_bring);
5467    elm_box_pack_end(bx, bt_bring);
5468 
5469    fr = _scrollto_mode_frame_new(win, api);
5470    elm_box_pack_end(bx, fr);
5471 
5472    max = 2000;
5473    for (i = 0; i < max; i++)
5474        elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5475 
5476    elm_genlist_item_class_free(api->itc1);
5477    gli = elm_genlist_nth_item_get(gl, 1340);
5478    elm_genlist_item_selected_set(gli, EINA_TRUE);
5479    elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
5480 
5481    evas_object_resize(win, 480, 400);
5482    explode_win_enable(win);
5483    evas_object_show(win);
5484 }
5485 
5486 static Eina_Bool
_late_item_prepender(void * data)5487 _late_item_prepender(void *data)
5488 {
5489    api_data *api = (api_data*)data;
5490    int i;
5491    Elm_Object_Item *it = elm_genlist_nth_item_get(api->gl, api->show_item);
5492    for (i = 0; i <= 100; i++)
5493       elm_genlist_item_prepend(api->gl, api->itc1, (void*)(uintptr_t)i, it, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5494    elm_genlist_item_class_free(api->itc1);
5495    return ECORE_CALLBACK_CANCEL;
5496 }
5497 
5498 static void
test_genlist_show_item(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5499 test_genlist_show_item(void *data,
5500                             Evas_Object *obj EINA_UNUSED,
5501                             void *event_info EINA_UNUSED)
5502 {
5503    Evas_Object *win, *gl;
5504    Elm_Object_Item *gli = NULL;
5505    int i, max;
5506    api_data *api = calloc(1, sizeof(api_data));
5507    api_data *g_data = (api_data*)data;
5508 
5509    win = elm_win_util_standard_add("genlist", "Genlist Show Last Item");
5510    elm_win_autodel_set(win, EINA_TRUE);
5511    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5512 
5513    gl = elm_genlist_add(win);
5514    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5515    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5516    evas_object_show(gl);
5517    if (g_data)
5518      elm_genlist_mode_set(gl, g_data->mode);
5519    else
5520      elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
5521    api->gl = gl;
5522    elm_win_resize_object_add(win, gl);
5523 
5524    api->itc1 = elm_genlist_item_class_new();
5525    api->itc1->item_style = "default";
5526    api->itc1->func.text_get = gl_text_get1;
5527    api->itc1->func.content_get = gl_content_get;
5528    api->itc1->func.state_get = NULL;
5529    api->itc1->func.del = NULL;
5530 
5531    if (g_data)
5532      {
5533         g_data->gl = gl;
5534         g_data->itc1 = api->itc1;
5535 
5536         max = g_data->max_items;
5537         for (i = 0; i <= max; i++)
5538           elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5539 
5540         gli = elm_genlist_nth_item_get(gl, g_data->show_item);
5541         if (!gli) gli = elm_genlist_last_item_get(gl);
5542         elm_genlist_item_show(gli, g_data->type);
5543         //prepends item while queue processing is happening
5544         ecore_timer_add(0.1, _late_item_prepender, g_data);
5545      }
5546 
5547    evas_object_resize(win, 480, 400);
5548    explode_win_enable(win);
5549    evas_object_show(win);
5550 }
5551 
5552 static void
test_genlist_show_tree(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5553 test_genlist_show_tree(void *data,
5554                        Evas_Object *obj EINA_UNUSED,
5555                        void *event_info EINA_UNUSED)
5556 {
5557    Evas_Object *win, *gl;
5558    Elm_Object_Item *gli = NULL, *show = NULL;
5559    int i, max;
5560    api_data *api = calloc(1, sizeof(api_data));
5561    api_data *g_data = (api_data*)data;
5562 
5563    win = elm_win_util_standard_add("genlist", "Genlist Show Tree");
5564    elm_win_autodel_set(win, EINA_TRUE);
5565    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5566 
5567    gl = elm_genlist_add(win);
5568    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5569    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5570    evas_object_show(gl);
5571    api->gl = gl;
5572    elm_win_resize_object_add(win, gl);
5573    if (g_data)
5574      elm_genlist_mode_set(gl, g_data->mode);
5575    else
5576      elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
5577 
5578    api->itc1 = elm_genlist_item_class_new();
5579    api->itc1->item_style = "default";
5580    api->itc1->func.text_get = gl_text_get1;
5581    api->itc1->func.content_get = gl_content_get;
5582    api->itc1->func.state_get = NULL;
5583    api->itc1->func.del = NULL;
5584 
5585    if (g_data)
5586      max = g_data->max_items;
5587    else max = 2000;
5588    for (i = 0; i <= max; i++)
5589      {
5590        if (i % (max / 20) == 0)
5591           gli = elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, gli, ELM_GENLIST_ITEM_TREE, NULL, NULL);
5592        else
5593           elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, gli, ELM_GENLIST_ITEM_NONE, NULL, NULL);
5594      }
5595 
5596    if (g_data)
5597      show = elm_genlist_nth_item_get(gl, g_data->show_item);
5598    else show = gli;
5599    elm_genlist_item_class_free(api->itc1);
5600    elm_genlist_item_show(show, g_data->type);
5601 
5602    evas_object_resize(win, 480, 400);
5603    explode_win_enable(win);
5604    evas_object_show(win);
5605 }
5606 
5607 static void
_entry_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5608 _entry_changed_cb(void *data,
5609                   Evas_Object *obj,
5610                   void *event_info EINA_UNUSED)
5611 {
5612    int *val = (int*) data;
5613    *val = atoi(elm_entry_entry_get(obj));
5614 }
5615 
5616 static void
_radio_changed_type_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5617 _radio_changed_type_cb(void *data,
5618                   Evas_Object *obj,
5619                   void *event_info EINA_UNUSED)
5620 {
5621    int val = elm_radio_state_value_get(obj);
5622    api_data *api = (api_data*)data;
5623    api->type = val;
5624 }
5625 
5626 static void
_radio_changed_mode_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5627 _radio_changed_mode_cb(void *data,
5628                   Evas_Object *obj,
5629                   void *event_info EINA_UNUSED)
5630 {
5631    int val = elm_radio_state_value_get(obj);
5632    api_data *api = (api_data*)data;
5633    api->mode = val;
5634 }
5635 
5636 void
test_genlist_item_show(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5637 test_genlist_item_show(void *data EINA_UNUSED,
5638                        Evas_Object *obj EINA_UNUSED,
5639                        void *event_info EINA_UNUSED)
5640 {
5641 
5642    Evas_Object *win, *bt_show, *bt_bring, *bx, *max_items, *show_item, *bxx, *rd1, *rd2, *rd3;
5643    static Elm_Entry_Filter_Accept_Set digits_filter_data;
5644    api_data *api = calloc(1, sizeof(api_data));
5645 
5646    win = elm_win_util_standard_add("genlist", "Genlist Item Show");
5647    elm_win_autodel_set(win, EINA_TRUE);
5648    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api);
5649 
5650    bx = elm_box_add(win);
5651    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5652    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
5653    evas_object_show(bx);
5654    elm_win_resize_object_add(win, bx);
5655 
5656    digits_filter_data.accepted = "0123456789";
5657    digits_filter_data.rejected = NULL;
5658 
5659    max_items = elm_entry_add(win);
5660    elm_entry_single_line_set(max_items, EINA_TRUE);
5661    elm_entry_scrollable_set(max_items, EINA_TRUE);
5662    evas_object_size_hint_weight_set(max_items, EVAS_HINT_EXPAND, 0.0);
5663    evas_object_size_hint_align_set(max_items, EVAS_HINT_FILL, 0.5);
5664    elm_object_part_text_set(max_items, "guide", "Enter the maximum number of items needed");
5665    evas_object_smart_callback_add(max_items, "changed", _entry_changed_cb, (void*)(&(api->max_items)));
5666    elm_entry_markup_filter_append(max_items, elm_entry_filter_accept_set, &digits_filter_data);
5667    evas_object_show(max_items);
5668    elm_box_pack_end(bx, max_items);
5669 
5670    show_item = elm_entry_add(win);
5671    elm_entry_single_line_set(show_item, EINA_TRUE);
5672    elm_entry_scrollable_set(show_item, EINA_TRUE);
5673    evas_object_size_hint_weight_set(show_item, EVAS_HINT_EXPAND, 0.0);
5674    evas_object_size_hint_align_set(show_item, EVAS_HINT_FILL, 0.5);
5675    elm_object_part_text_set(show_item, "guide", "Enter the number of item to be shown");
5676    evas_object_smart_callback_add(show_item, "changed", _entry_changed_cb, (void*)(&(api->show_item)));
5677    elm_entry_markup_filter_append(show_item, elm_entry_filter_accept_set, &digits_filter_data);
5678    evas_object_show(show_item);
5679    elm_box_pack_end(bx, show_item);
5680 
5681    bxx = elm_box_add(win);
5682    elm_box_horizontal_set(bxx, EINA_TRUE);
5683    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, 0.0);
5684    evas_object_size_hint_align_set(bxx, EVAS_HINT_FILL, 0.5);
5685 
5686    rd1 = elm_radio_add(win);
5687    elm_object_text_set(rd1, "Top");
5688    elm_radio_state_value_set(rd1, ELM_GENLIST_ITEM_SCROLLTO_TOP);
5689    evas_object_smart_callback_add(rd1, "changed", _radio_changed_type_cb, api);
5690    evas_object_show(rd1);
5691    elm_box_pack_end(bxx, rd1);
5692 
5693    rd2 = elm_radio_add(win);
5694    elm_object_text_set(rd2, "Middle");
5695    evas_object_smart_callback_add(rd2, "changed", _radio_changed_type_cb, api);
5696    elm_radio_state_value_set(rd2, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
5697    elm_radio_group_add(rd2, rd1);
5698    evas_object_show(rd2);
5699    elm_box_pack_end(bxx, rd2);
5700 
5701    rd3 = elm_radio_add(win);
5702    elm_object_text_set(rd3, "Bottom");
5703    evas_object_smart_callback_add(rd3, "changed", _radio_changed_type_cb, api);
5704    elm_radio_state_value_set(rd3, ELM_GENLIST_ITEM_SCROLLTO_BOTTOM);
5705    elm_radio_group_add(rd3, rd1);
5706    evas_object_show(rd3);
5707    elm_box_pack_end(bxx, rd3);
5708    evas_object_show(bxx);
5709    elm_box_pack_end(bx, bxx);
5710    elm_radio_value_set(rd1, ELM_GENLIST_ITEM_SCROLLTO_TOP);
5711    api->type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
5712 
5713    bxx = elm_box_add(win);
5714    elm_box_horizontal_set(bxx, EINA_TRUE);
5715    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, 0.0);
5716    evas_object_size_hint_align_set(bxx, EVAS_HINT_FILL, 0.5);
5717 
5718    rd1 = elm_radio_add(win);
5719    elm_object_text_set(rd1, "ELM_LIST_SCROLL");
5720    elm_radio_state_value_set(rd1, ELM_LIST_SCROLL);
5721    evas_object_smart_callback_add(rd1, "changed", _radio_changed_mode_cb, api);
5722    evas_object_show(rd1);
5723    elm_box_pack_end(bxx, rd1);
5724 
5725    rd2 = elm_radio_add(win);
5726    elm_object_text_set(rd2, "ELM_LIST_LIMIT");
5727    evas_object_smart_callback_add(rd2, "changed", _radio_changed_mode_cb, api);
5728    elm_radio_state_value_set(rd2, ELM_LIST_LIMIT);
5729    elm_radio_group_add(rd2, rd1);
5730    evas_object_show(rd2);
5731    elm_box_pack_end(bxx, rd2);
5732 
5733    rd3 = elm_radio_add(win);
5734    elm_object_text_set(rd3, "ELM_LIST_COMPRESS");
5735    evas_object_smart_callback_add(rd3, "changed", _radio_changed_mode_cb, api);
5736    elm_radio_state_value_set(rd3, ELM_LIST_COMPRESS);
5737    elm_radio_group_add(rd3, rd1);
5738    evas_object_show(rd3);
5739    elm_box_pack_end(bxx, rd3);
5740    evas_object_show(bxx);
5741    elm_box_pack_end(bx, bxx);
5742    elm_radio_value_set(rd1, ELM_LIST_SCROLL);
5743    api->mode = ELM_LIST_SCROLL;
5744 
5745    bt_show = elm_button_add(win);
5746    elm_object_text_set(bt_show, "Plain Genlist");
5747    evas_object_smart_callback_add(bt_show, "clicked", test_genlist_show_item, api);
5748    evas_object_show(bt_show);
5749    elm_box_pack_end(bx, bt_show);
5750 
5751    bt_bring = elm_button_add(win);
5752    elm_object_text_set(bt_bring, "Genlist Tree");
5753    evas_object_smart_callback_add(bt_bring, "clicked", test_genlist_show_tree, api);
5754    evas_object_show(bt_bring);
5755    elm_box_pack_end(bx, bt_bring);
5756 
5757    evas_object_resize(win, 480, 400);
5758    explode_win_enable(win);
5759    evas_object_show(win);
5760 }
5761 
5762 
5763 /***  Genlist Cache  *********************************************************/
5764 static char *
gl_cache_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)5765 gl_cache_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
5766 {
5767    char buf[256];
5768    int num = (int)(uintptr_t)data;
5769 
5770    if ((num % 2) == 0)
5771       snprintf(buf, sizeof(buf),
5772                "<align=left> ← only icon  (Item # %d)</align>", num);
5773    else
5774       snprintf(buf, sizeof(buf),
5775                "<align=right>(Item # %d)  only end → </align>", num);
5776 
5777    return strdup(buf);
5778 }
5779 
5780 static Evas_Object *
gl_cache_content_get(void * data,Evas_Object * obj,const char * part)5781 gl_cache_content_get(void *data, Evas_Object *obj, const char *part)
5782 {
5783    char buf[PATH_MAX];
5784    Evas_Object *ic;
5785    Eina_Bool even = (((int)(uintptr_t)data % 2) == 0);
5786 
5787    if (even && !strcmp(part, "elm.swallow.icon"))
5788      snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
5789    else if (!even && !strcmp(part, "elm.swallow.end"))
5790      snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
5791    else
5792       return NULL;
5793 
5794    ic = elm_icon_add(obj);
5795    elm_image_file_set(ic, buf, NULL);
5796    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
5797    return ic;
5798 }
5799 
5800 void
test_genlist_cache(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5801 test_genlist_cache(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
5802                    void *event_info EINA_UNUSED)
5803 {
5804    Evas_Object *win, *bx, *fr, *lb, *gl;
5805    Elm_Genlist_Item_Class *itc;
5806    int i;
5807 
5808    win = elm_win_util_standard_add("genlist-cache", "Genlist Cache");
5809    elm_win_autodel_set(win, EINA_TRUE);
5810 
5811    bx = elm_box_add(win);
5812    evas_object_size_hint_expand_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5813    elm_win_resize_object_add(win, bx);
5814    evas_object_show(bx);
5815 
5816    fr = elm_frame_add(bx);
5817    elm_object_text_set(fr, "Information");
5818    elm_box_pack_end(bx, fr);
5819    evas_object_show(fr);
5820 
5821    lb = elm_label_add(fr);
5822    elm_object_text_set(lb, "Even items should have only the icon (left),<br>"
5823                        "while odd items should have only the end icon (right)");
5824    elm_object_content_set(fr, lb);
5825    evas_object_show(lb);
5826 
5827    gl = elm_genlist_add(bx);
5828    evas_object_size_hint_expand_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5829    evas_object_size_hint_fill_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5830    elm_box_pack_end(bx, gl);
5831    evas_object_show(gl);
5832 
5833    itc = elm_genlist_item_class_new();
5834    itc->item_style = "default_style";
5835    itc->func.text_get = gl_cache_text_get;
5836    itc->func.content_get = gl_cache_content_get;
5837 
5838    for (i = 1; i <= 200; i++)
5839        elm_genlist_item_append(gl, itc, (void*)(uintptr_t)i, NULL,
5840                                ELM_GENLIST_ITEM_NONE, NULL, NULL);
5841 
5842    elm_genlist_item_class_free(itc);
5843 
5844    evas_object_resize(win, 480, 400);
5845    explode_win_enable(win);
5846    evas_object_show(win);
5847 }
5848 
5849 
5850 /***  Genlist Reusable Contents  *********************************************/
5851 static char *
gl_re2_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)5852 gl_re2_text_get(void *data, Evas_Object *obj EINA_UNUSED,
5853                       const char *part EINA_UNUSED)
5854 {
5855    int num = (int)(uintptr_t)data;
5856    char buf[32];
5857 
5858    snprintf(buf, sizeof(buf), "Item # %d", num);
5859    return strdup(buf);
5860 }
5861 
5862 static Evas_Object *
gl_re2_content_get(void * data,Evas_Object * obj,const char * part)5863 gl_re2_content_get(void *data, Evas_Object *obj, const char *part)
5864 {
5865    int num = (int)(uintptr_t)data;
5866    Evas_Object *content = NULL;
5867    char buf[64];
5868 
5869    if (!strcmp(part, "elm.swallow.icon"))
5870      {
5871         printf("Creating NEW content (icon) for item # %d\n", num);
5872         content = elm_label_add(obj);
5873         evas_object_color_set(content, 255, 0, 0, 255); // NOTE: never do this in real app
5874         snprintf(buf, sizeof(buf), "Content for item # %d", num);
5875         elm_object_text_set(content, buf);
5876      }
5877    if (!strcmp(part, "elm.swallow.end"))
5878      {
5879         printf("Creating NEW content (end) for item # %d\n", num);
5880         content = elm_button_add(obj);
5881         evas_object_color_set(content, 0, 255, 0, 255); // NOTE: never do this in real app
5882         snprintf(buf, sizeof(buf), "Content for item # %d", num);
5883         elm_object_text_set(content, buf);
5884         if ((num % 5) == 0) elm_object_disabled_set(content, EINA_TRUE);
5885      }
5886 
5887    return content;
5888 }
5889 
5890 static Evas_Object *
gl_re2_reusable_content_get(void * data,Evas_Object * obj,const char * part,Evas_Object * old)5891 gl_re2_reusable_content_get(void *data, Evas_Object *obj,
5892                             const char *part, Evas_Object *old)
5893 {
5894    Eina_Bool enabled = (Eina_Bool)(uintptr_t)evas_object_data_get(obj, "reusable_enabled");
5895    int num = (int)(uintptr_t)data;
5896    char buf[64];
5897 
5898    // Returning NULL from this callback means that content_get should be used instead.
5899    // In this case if old object is not NULL, it will be deleted by genlist.
5900    if (!enabled || !old)
5901      return NULL;
5902 
5903    // Genlist preserves whole state of the old content.
5904    // But we don't know for which item it was used before. We know only that
5905    // the old item had same item_class, same tree mode and that content was created for "part".
5906    // This means that we should apply all item-specific properties to the old object.
5907    if (!strcmp(part, "elm.swallow.icon"))
5908      {
5909         printf("REUSING content (icon) for item # %d\n", num);
5910         // No need to change color, because all contents for "elm.swallow.icon"
5911         // have same red color
5912         snprintf(buf, sizeof(buf), "Reused content for item # %d", num);
5913         // But we need to set correct text, because it's different for different items
5914         elm_object_text_set(old, buf);
5915         // Object is ready for use.
5916         return old;
5917      }
5918 
5919    if (!strcmp(part, "elm.swallow.end"))
5920      {
5921         printf("REUSING content (end) for item # %d\n", num);
5922         // Also not changing color, it's already correct.
5923         snprintf(buf, sizeof(buf), "Reused content for item # %d", num);
5924         // Updating text.
5925         elm_object_text_set(old, buf);
5926         // Changing disabled state of content:
5927         if ((num % 5) == 0)
5928           // disabling every 5th item's content in the same way as in content_get
5929           elm_object_disabled_set(old, EINA_TRUE);
5930         else
5931           // but also explicitly enabling other contents, because the old object
5932           // could be disabled if it was used in one of the 5th items previously
5933           elm_object_disabled_set(old, EINA_FALSE);
5934         // Object is ready for use.
5935         return old;
5936      }
5937 
5938    return NULL;
5939 }
5940 
5941 static void
gl_re2_check_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)5942 gl_re2_check_changed_cb(void *data, Evas_Object *obj,
5943                         void *event_info EINA_UNUSED)
5944 {
5945    Eina_Bool enabled = elm_check_state_get(obj);
5946    Evas_Object *gl = data;
5947 
5948    evas_object_data_set(gl, "reusable_enabled", (void*)(uintptr_t)enabled);
5949    elm_genlist_realized_items_update(gl);
5950 }
5951 
5952 void
test_genlist_reusable(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)5953 test_genlist_reusable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
5954                       void *event_info EINA_UNUSED)
5955 {
5956    Evas_Object *win, *bx, *fr, *lb, *gl, *ck;
5957    Elm_Genlist_Item_Class *itc;
5958    int i;
5959 
5960    // window
5961    win = elm_win_util_standard_add("genlist-reusable", "Genlist Reusable Contents");
5962    elm_win_autodel_set(win, EINA_TRUE);
5963 
5964    bx = elm_box_add(win);
5965    evas_object_size_hint_expand_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5966    elm_win_resize_object_add(win, bx);
5967    evas_object_show(bx);
5968 
5969    fr = elm_frame_add(bx);
5970    evas_object_size_hint_expand_set(fr, EVAS_HINT_EXPAND, 0);
5971    evas_object_size_hint_fill_set(fr, EVAS_HINT_FILL, 0);
5972    elm_object_text_set(fr, "Information");
5973    elm_box_pack_end(bx, fr);
5974    evas_object_show(fr);
5975 
5976    lb = elm_label_add(fr);
5977    elm_object_text_set(lb, "Labels in left content (icon) must be red.<br>"
5978                            "Labels in right content (end) must be green.<br>"
5979                            "The 3 numbers in one row should always match.");
5980    elm_object_content_set(fr, lb);
5981    evas_object_show(lb);
5982 
5983    // genlist
5984    gl = elm_genlist_add(bx);
5985    elm_genlist_homogeneous_set(gl, EINA_TRUE);
5986    evas_object_size_hint_expand_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
5987    evas_object_size_hint_fill_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
5988    elm_box_pack_end(bx, gl);
5989    evas_object_show(gl);
5990    evas_object_data_set(gl, "reusable_enabled", (void*)EINA_TRUE);
5991 
5992    itc = elm_genlist_item_class_new();
5993    itc->item_style = "default";
5994    itc->func.text_get = gl_re2_text_get;
5995    itc->func.content_get = gl_re2_content_get;
5996    itc->func.reusable_content_get = gl_re2_reusable_content_get;
5997 
5998    for (i = 1; i <= 2000; i++)
5999        elm_genlist_item_append(gl, itc, (void*)(uintptr_t)i, NULL,
6000                                ELM_GENLIST_ITEM_NONE, NULL, NULL);
6001 
6002    elm_genlist_item_class_free(itc);
6003 
6004    // buttons
6005    ck = elm_check_add(bx);
6006    elm_object_text_set(ck, "Enable reusable contents");
6007    elm_check_state_set(ck, EINA_TRUE);
6008    evas_object_smart_callback_add(ck, "changed", gl_re2_check_changed_cb, gl);
6009    elm_box_pack_end(bx, ck);
6010    evas_object_show(ck);
6011 
6012    // show everything
6013    evas_object_resize(win, 400, 400);
6014    explode_win_enable(win);
6015    evas_object_show(win);
6016 }
6017