elementary/genlist - sorry, this line should be applied yet.
[framework/uifw/elementary.git] / src / bin / test_genlist.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 /* Hint:
8  * In this example some calls to elm_genlist_item_append() are used which give the
9  * value of an int as 'item data' and 'func data' after casting into (void*). For
10  * sure this works only on architectures where sizeof(int)==sizeof(void*).
11  * For real world usage you should hold a data structure or value in your
12  * application and then give only a pointer to this data as data pointer.
13  */
14
15 typedef struct _Testitem
16 {
17    Elm_Object_Item *item;
18    int mode;
19    int onoff;
20 } Testitem;
21
22
23 static Elm_Genlist_Item_Class itc1;
24 char *gl_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
25 {
26    char buf[256];
27    snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data);
28    return strdup(buf);
29 }
30
31 Evas_Object *gl_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
32 {
33    char buf[PATH_MAX];
34    Evas_Object *ic = elm_icon_add(obj);
35    if (!strcmp(part, "elm.swallow.end"))
36      snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
37    else
38      snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
39    elm_icon_file_set(ic, buf, NULL);
40    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
41    return ic;
42 }
43 Eina_Bool gl_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
44 {
45    return EINA_FALSE;
46 }
47 void gl_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
48 {
49 }
50
51 static void
52 gl_sel(void *data, Evas_Object *obj, void *event_info)
53 {
54    printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n", data, obj, event_info);
55 }
56
57 static void
58 _move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
59 {
60    Evas_Object *gl = data;
61    Evas_Event_Mouse_Move *ev = event_info;
62    int where = 0;
63    Elm_Object_Item *gli;
64    gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where);
65    if (gli)
66      printf("over %p, where %i\n", elm_object_item_data_get(gli), where);
67    else
68      printf("over none, where %i\n", where);
69 }
70
71 static void
72 _bt50_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
73 {
74    elm_genlist_item_bring_in(data);
75 }
76
77 static void
78 _bt1500_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
79 {
80    elm_genlist_item_middle_bring_in(data);
81 }
82
83 static void
84 _gl_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
85 {
86    printf("selected: %p\n", event_info);
87 }
88
89 static void
90 _gl_double_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
91 {
92    printf("double clicked: %p\n", event_info);
93 }
94
95 static void
96 _gl_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
97 {
98    printf("longpress %p\n", event_info);
99 }
100
101 void
102 test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
103 {
104    Evas_Object *win, *bg, *gl, *bt_50, *bt_1500, *bx;
105    Evas_Object *over;
106    Elm_Object_Item *gli;
107    int i;
108
109    win = elm_win_add(NULL, "genlist", ELM_WIN_BASIC);
110    elm_win_title_set(win, "Genlist");
111    elm_win_autodel_set(win, EINA_TRUE);
112
113    bg = elm_bg_add(win);
114    elm_win_resize_object_add(win, bg);
115    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
116    evas_object_show(bg);
117
118    bx = elm_box_add(win);
119    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
120    elm_win_resize_object_add(win, bx);
121    evas_object_show(bx);
122
123    gl = elm_genlist_add(win);
124    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
125    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
126    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
127    // FIXME: This causes genlist to resize the horiz axis very slowly :(
128    // Reenable this and resize the window horizontally, then try to resize it back
129    //elm_genlist_horizontal_mode_set(gl, ELM_LIST_LIMIT);
130    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
131    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
132    elm_box_pack_end(bx, gl);
133    evas_object_show(gl);
134
135    over = evas_object_rectangle_add(evas_object_evas_get(win));
136    evas_object_color_set(over, 0, 0, 0, 0);
137    evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
138    evas_object_repeat_events_set(over, 1);
139    evas_object_show(over);
140    evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
141    elm_win_resize_object_add(win, over);
142
143    itc1.item_style     = "default";
144    itc1.func.text_get = gl_text_get;
145    itc1.func.content_get  = gl_content_get;
146    itc1.func.state_get = gl_state_get;
147    itc1.func.del       = gl_del;
148
149    bt_50 = elm_button_add(win);
150    elm_object_text_set(bt_50, "Go to 50");
151    evas_object_show(bt_50);
152    elm_box_pack_end(bx, bt_50);
153
154    bt_1500 = elm_button_add(win);
155    elm_object_text_set(bt_1500, "Go to 1500");
156    evas_object_show(bt_1500);
157    elm_box_pack_end(bx, bt_1500);
158
159    for (i = 0; i < 2000; i++)
160      {
161         gli = elm_genlist_item_append(gl, &itc1,
162                                       (void *)(long)i/* item data */,
163                                       NULL/* parent */,
164                                       ELM_GENLIST_ITEM_NONE,
165                                       gl_sel/* func */,
166                                       (void *)(long)(i * 10)/* func data */);
167         if (i == 50)
168           evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
169         else if (i == 1500)
170           evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
171      }
172    evas_object_resize(win, 480, 800);
173    evas_object_show(win);
174 }
175
176 /*************/
177
178 static void
179 my_gl_clear(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
180 {
181    Evas_Object *gl = data;
182    elm_genlist_clear(gl);
183 }
184
185 static void
186 my_gl_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
187 {
188    Evas_Object *gl = data;
189    static int i = 0;
190
191    itc1.item_style     = "default";
192    itc1.func.text_get = gl_text_get;
193    itc1.func.content_get  = gl_content_get;
194    itc1.func.state_get = gl_state_get;
195    itc1.func.del       = gl_del;
196
197    elm_genlist_item_append(gl, &itc1,
198                            (void *)(long)i/* item data */,
199                            NULL/* parent */,
200                            ELM_GENLIST_ITEM_NONE,
201                            gl_sel/* func */,
202                            (void *)(long)(i * 10)/* func data */);
203    i++;
204 }
205
206 static void
207 my_gl_insert_before(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
208 {
209    Evas_Object *gl = data;
210    static int i = 0;
211    Elm_Object_Item *gli_selected;
212
213    itc1.item_style     = "default";
214    itc1.func.text_get = gl_text_get;
215    itc1.func.content_get  = gl_content_get;
216    itc1.func.state_get = gl_state_get;
217    itc1.func.del       = gl_del;
218
219    gli_selected = elm_genlist_selected_item_get(gl);
220    if (!gli_selected)
221      {
222         printf("no item selected\n");
223         return ;
224      }
225
226    elm_genlist_item_insert_before(gl, &itc1,
227                                   (void *)(long)i/* item data */,
228                                   NULL/* parent */,
229                                   gli_selected /* item before */,
230                                   ELM_GENLIST_ITEM_NONE,
231                                   gl_sel/* func */,
232                                   (void *)(long)(i * 10)/* func data */);
233    i++;
234 }
235
236 static void
237 my_gl_insert_after(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
238 {
239    Evas_Object *gl = data;
240    static int i = 0;
241    Elm_Object_Item *gli_selected;
242
243    itc1.item_style     = "default";
244    itc1.func.text_get = gl_text_get;
245    itc1.func.content_get  = gl_content_get;
246    itc1.func.state_get = gl_state_get;
247    itc1.func.del       = gl_del;
248
249    gli_selected = elm_genlist_selected_item_get(gl);
250    if (!gli_selected)
251      {
252         printf("no item selected\n");
253         return ;
254      }
255
256    elm_genlist_item_insert_after(gl, &itc1,
257                                  (void *)(long)i/* item data */,
258                                  NULL/* parent */,
259                                  gli_selected /* item after */,
260                                  ELM_GENLIST_ITEM_NONE,
261                                  gl_sel/* func */,
262                                  (void *)(long)(i * 10)/* func data */);
263    i++;
264 }
265
266 static void
267 my_gl_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
268 {
269    Evas_Object *gl = data;
270    Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
271    if (!gli)
272      {
273         printf("no item selected\n");
274         return;
275      }
276    elm_genlist_item_del(gli);
277 }
278
279 static void
280 my_gl_disable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
281 {
282    Evas_Object *gl = data;
283    Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
284    if (!gli)
285      {
286         printf("no item selected\n");
287         return;
288      }
289    elm_genlist_item_disabled_set(gli, 1);
290    elm_genlist_item_selected_set(gli, 0);
291    elm_genlist_item_update(gli);
292 }
293
294 static void
295 my_gl_update_all(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
296 {
297    Evas_Object *gl = data;
298    int i = 0;
299    Elm_Object_Item *it = elm_genlist_first_item_get(gl);
300    while (it)
301      {
302         elm_genlist_item_update(it);
303         printf("%i\n", i);
304         i++;
305         it = elm_genlist_item_next_get(it);
306      }
307 }
308
309 static void
310 my_gl_first(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
311 {
312    Evas_Object *gl = data;
313    Elm_Object_Item *gli = elm_genlist_first_item_get(gl);
314    if (!gli) return;
315    elm_genlist_item_show(gli);
316    elm_genlist_item_selected_set(gli, 1);
317 }
318
319 static void
320 my_gl_last(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
321 {
322    Evas_Object *gl = data;
323    Elm_Object_Item *gli = elm_genlist_last_item_get(gl);
324    if (!gli) return;
325    elm_genlist_item_show(gli);
326    elm_genlist_item_selected_set(gli, 1);
327 }
328
329 static Eina_Bool
330 my_gl_flush_delay(void *data __UNUSED__)
331 {
332    elm_all_flush();
333    return ECORE_CALLBACK_CANCEL;
334 }
335
336 static void
337 my_gl_flush(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
338 {
339    ecore_timer_add(1.2, my_gl_flush_delay, NULL);
340 }
341
342 void
343 test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
344 {
345    Evas_Object *win, *bg, *gl, *bx, *bx2, *bx3, *bt;
346    Elm_Object_Item *gli[10];
347    char buf[PATH_MAX];
348
349    win = elm_win_add(NULL, "genlist2", ELM_WIN_BASIC);
350    elm_win_title_set(win, "Genlist 2");
351    elm_win_autodel_set(win, EINA_TRUE);
352
353    bg = elm_bg_add(win);
354    snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
355    elm_bg_file_set(bg, buf, NULL);
356    elm_win_resize_object_add(win, bg);
357    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
358    evas_object_show(bg);
359
360    bx = elm_box_add(win);
361    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
362    elm_win_resize_object_add(win, bx);
363    evas_object_show(bx);
364
365    gl = elm_genlist_add(win);
366    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
367    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
368    evas_object_show(gl);
369
370    itc1.item_style     = "default";
371    itc1.func.text_get = gl_text_get;
372    itc1.func.content_get  = gl_content_get;
373    itc1.func.state_get = gl_state_get;
374    itc1.func.del       = gl_del;
375
376    gli[0] = elm_genlist_item_append(gl, &itc1,
377                                     (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
378                                     (void *)1001/* func data */);
379    gli[1] = elm_genlist_item_append(gl, &itc1,
380                                     (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
381                                     (void *)1002/* func data */);
382    gli[2] = elm_genlist_item_append(gl, &itc1,
383                                     (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
384                                     (void *)1003/* func data */);
385    gli[3] = elm_genlist_item_prepend(gl, &itc1,
386                                      (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
387                                      (void *)1004/* func data */);
388    gli[4] = elm_genlist_item_prepend(gl, &itc1,
389                                      (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
390                                      (void *)1005/* func data */);
391    gli[5] = elm_genlist_item_insert_before(gl, &itc1,
392                                            (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
393                                            gl_sel/* func */, (void *)1006/* func data */);
394    gli[6] = elm_genlist_item_insert_after(gl, &itc1,
395                                           (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE,
396                                           gl_sel/* func */, (void *)1007/* func data */);
397
398    elm_box_pack_end(bx, gl);
399
400    bx2 = elm_box_add(win);
401    elm_box_horizontal_set(bx2, EINA_TRUE);
402    elm_box_homogeneous_set(bx2, EINA_TRUE);
403    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
404    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
405
406    bt = elm_button_add(win);
407    elm_object_text_set(bt, "/\\");
408    evas_object_smart_callback_add(bt, "clicked", my_gl_first, gl);
409    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
410    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
411    elm_box_pack_end(bx2, bt);
412    evas_object_show(bt);
413
414    bt = elm_button_add(win);
415    elm_object_text_set(bt, "\\/");
416    evas_object_smart_callback_add(bt, "clicked", my_gl_last, gl);
417    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
418    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
419    elm_box_pack_end(bx2, bt);
420    evas_object_show(bt);
421
422    bt = elm_button_add(win);
423    elm_object_text_set(bt, "#");
424    evas_object_smart_callback_add(bt, "clicked", my_gl_disable, gl);
425    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
426    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
427    elm_box_pack_end(bx2, bt);
428    evas_object_show(bt);
429
430    bt = elm_button_add(win);
431    elm_object_text_set(bt, "U");
432    evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, gl);
433    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
434    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
435    elm_box_pack_end(bx2, bt);
436    evas_object_show(bt);
437
438    elm_box_pack_end(bx, bx2);
439    evas_object_show(bx2);
440
441    bx2 = elm_box_add(win);
442    elm_box_horizontal_set(bx2, EINA_TRUE);
443    elm_box_homogeneous_set(bx2, EINA_TRUE);
444    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
445    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
446
447    bt = elm_button_add(win);
448    elm_object_text_set(bt, "X");
449    evas_object_smart_callback_add(bt, "clicked", my_gl_clear, gl);
450    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
451    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
452    elm_box_pack_end(bx2, bt);
453    evas_object_show(bt);
454
455    bt = elm_button_add(win);
456    elm_object_text_set(bt, "+");
457    evas_object_smart_callback_add(bt, "clicked", my_gl_add, gl);
458    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
459    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
460    elm_box_pack_end(bx2, bt);
461    evas_object_show(bt);
462
463    bt = elm_button_add(win);
464    elm_object_text_set(bt, "-");
465    evas_object_smart_callback_add(bt, "clicked", my_gl_del, gl);
466    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
467    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
468    elm_box_pack_end(bx2, bt);
469    evas_object_show(bt);
470
471    elm_box_pack_end(bx, bx2);
472    evas_object_show(bx2);
473
474    bx3 = elm_box_add(win);
475    elm_box_horizontal_set(bx3, EINA_TRUE);
476    elm_box_homogeneous_set(bx3, EINA_TRUE);
477    evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
478    evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
479
480    bt = elm_button_add(win);
481    elm_object_text_set(bt, "+ before");
482    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, gl);
483    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
484    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
485    elm_box_pack_end(bx3, bt);
486    evas_object_show(bt);
487
488    bt = elm_button_add(win);
489    elm_object_text_set(bt, "+ after");
490    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, gl);
491    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
492    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
493    elm_box_pack_end(bx3, bt);
494    evas_object_show(bt);
495
496    bt = elm_button_add(win);
497    elm_object_text_set(bt, "Flush");
498    evas_object_smart_callback_add(bt, "clicked", my_gl_flush, gl);
499    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
500    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
501    elm_box_pack_end(bx3, bt);
502    evas_object_show(bt);
503
504    elm_box_pack_end(bx, bx3);
505    evas_object_show(bx3);
506
507
508    evas_object_resize(win, 320, 320);
509    evas_object_show(win);
510 }
511
512 /*************/
513
514 static Elm_Genlist_Item_Class itc2;
515 char *gl2_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
516 {
517    const Testitem *tit = data;
518    char buf[256];
519    snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
520    return strdup(buf);
521 }
522 Evas_Object *gl2_content_get(void *data, Evas_Object *obj, const char *part)
523 {
524    const Testitem *tit = data;
525    char buf[PATH_MAX];
526    Evas_Object *ic = elm_icon_add(obj);
527    if (!strcmp(part, "elm.swallow.icon"))
528      {
529         if (!(tit->mode & 0x3))
530           snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
531         else if ((tit->mode & 0x3) == 1)
532           snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get());
533         else if ((tit->mode & 0x3) == 2)
534           snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get());
535         else if ((tit->mode & 0x3) == 3)
536           snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get());
537         elm_icon_file_set(ic, buf, NULL);
538      }
539    else if (!strcmp(part, "elm.swallow.end"))
540      {
541         if (!(tit->mode & 0x3))
542           snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get());
543         else if ((tit->mode & 0x3) == 1)
544           snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get());
545         else if ((tit->mode & 0x3) == 2)
546           snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get());
547         else if ((tit->mode & 0x3) == 3)
548           snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get());
549         elm_icon_file_set(ic, buf, NULL);
550      }
551    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
552    return ic;
553 }
554 Eina_Bool gl2_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
555 {
556    return EINA_FALSE;
557 }
558 void gl2_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
559 {
560 }
561
562 static void
563 my_gl_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
564 {
565    Testitem *tit = data;
566    tit->mode++;
567    elm_genlist_item_update(tit->item);
568 }
569
570 static void
571 my_gl_labels_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
572 {
573    Testitem *tit = data;
574    tit->mode++;
575    elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_LABEL);
576 }
577
578 static void
579 my_gl_contents_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
580 {
581    Testitem *tit = data;
582    tit->mode++;
583    elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT);
584 }
585
586 void
587 test_genlist3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
588 {
589    Evas_Object *win, *bg, *gl, *bx, *bx2, *bt;
590    static Testitem tit[3];
591
592    win = elm_win_add(NULL, "genlist3", ELM_WIN_BASIC);
593    elm_win_title_set(win, "Genlist 3");
594    elm_win_autodel_set(win, EINA_TRUE);
595
596    bg = elm_bg_add(win);
597    elm_win_resize_object_add(win, bg);
598    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
599    evas_object_show(bg);
600
601    bx = elm_box_add(win);
602    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
603    elm_win_resize_object_add(win, bx);
604    evas_object_show(bx);
605
606    gl = elm_genlist_add(win);
607    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
608    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
609    evas_object_show(gl);
610
611    itc2.item_style     = "default";
612    itc2.func.text_get = gl2_text_get;
613    itc2.func.content_get  = gl2_content_get;
614    itc2.func.state_get = gl2_state_get;
615    itc2.func.del       = gl2_del;
616
617    tit[0].mode = 0;
618    tit[0].item = elm_genlist_item_append(gl, &itc2,
619                                          &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
620                                          NULL/* func data */);
621    tit[1].mode = 1;
622    tit[1].item = elm_genlist_item_append(gl, &itc2,
623                                          &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
624                                          NULL/* func data */);
625    tit[2].mode = 2;
626    tit[2].item = elm_genlist_item_append(gl, &itc2,
627                                          &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
628                                          NULL/* func data */);
629
630    elm_box_pack_end(bx, gl);
631    evas_object_show(bx);
632
633    bx2 = elm_box_add(win);
634    elm_box_horizontal_set(bx2, EINA_TRUE);
635    elm_box_homogeneous_set(bx2, EINA_TRUE);
636    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
637    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
638
639    bt = elm_button_add(win);
640    elm_object_text_set(bt, "[1]");
641    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
642    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
643    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
644    elm_box_pack_end(bx2, bt);
645    evas_object_show(bt);
646
647    bt = elm_button_add(win);
648    elm_object_text_set(bt, "labels");
649    evas_object_smart_callback_add(bt, "clicked", my_gl_labels_update, &(tit[1]));
650    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
651    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
652    elm_box_pack_end(bx2, bt);
653    evas_object_show(bt);
654
655    bt = elm_button_add(win);
656    elm_object_text_set(bt, "contents");
657    evas_object_smart_callback_add(bt, "clicked", my_gl_contents_update, &(tit[2]));
658    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
659    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
660    elm_box_pack_end(bx2, bt);
661    evas_object_show(bt);
662
663    elm_box_pack_end(bx, bx2);
664    evas_object_show(bx2);
665
666    evas_object_resize(win, 320, 320);
667    evas_object_show(win);
668 }
669
670 /*************/
671
672 static void
673 my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__)
674 {
675    Testitem *tit = data;
676    tit->onoff = elm_check_state_get(obj);
677    printf("item %p onoff = %i\n", tit, tit->onoff);
678 }
679
680 static Elm_Genlist_Item_Class itc3;
681 char *gl3_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
682 {
683    const Testitem *tit = data;
684    char buf[256];
685    snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
686    return strdup(buf);
687 }
688 Evas_Object *gl3_content_get(void *data, Evas_Object *obj, const char *part)
689 {
690    const Testitem *tit = data;
691    if (!strcmp(part, "elm.swallow.icon"))
692      {
693         Evas_Object *lb;
694
695         lb = elm_label_add(obj);
696         elm_label_line_wrap_set(lb, ELM_WRAP_CHAR);
697         elm_label_wrap_width_set(lb, 201);
698         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");
699         return lb;
700      }
701    else if (!strcmp(part, "elm.swallow.end"))
702      {
703         Evas_Object *ck;
704         ck = elm_check_add(obj);
705         evas_object_propagate_events_set(ck, EINA_FALSE);
706         elm_check_state_set(ck, tit->onoff);
707         evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed, data);
708         return ck;
709      }
710    return NULL;
711 }
712 Eina_Bool gl3_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
713 {
714    return EINA_FALSE;
715 }
716 void gl3_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
717 {
718 }
719
720 void
721 test_genlist4(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
722 {
723    Evas_Object *win, *bg, *gl, *bx, *bx2, *bt;
724    static Testitem tit[3];
725
726    win = elm_win_add(NULL, "genlist4", ELM_WIN_BASIC);
727    elm_win_title_set(win, "Genlist 4");
728    elm_win_autodel_set(win, EINA_TRUE);
729
730    bg = elm_bg_add(win);
731    elm_win_resize_object_add(win, bg);
732    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
733    evas_object_show(bg);
734
735    bx = elm_box_add(win);
736    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
737    elm_win_resize_object_add(win, bx);
738    evas_object_show(bx);
739
740    gl = elm_genlist_add(win);
741    elm_genlist_height_for_width_mode_set(gl, EINA_TRUE);
742    elm_genlist_multi_select_set(gl, 1);
743    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
744    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
745    evas_object_show(gl);
746
747    itc3.item_style     = "default";
748    itc3.func.text_get = gl3_text_get;
749    itc3.func.content_get  = gl3_content_get;
750    itc3.func.state_get = gl3_state_get;
751    itc3.func.del       = gl3_del;
752
753    tit[0].mode = 0;
754    tit[0].item = elm_genlist_item_append(gl, &itc3,
755                                          &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
756                                          NULL/* func data */);
757    tit[1].mode = 1;
758    tit[1].item = elm_genlist_item_append(gl, &itc3,
759                                          &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
760                                          NULL/* func data */);
761    tit[2].mode = 2;
762    tit[2].item = elm_genlist_item_append(gl, &itc3,
763                                          &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
764                                          NULL/* func data */);
765
766    elm_box_pack_end(bx, gl);
767    evas_object_show(bx);
768
769    bx2 = elm_box_add(win);
770    elm_box_horizontal_set(bx2, EINA_TRUE);
771    elm_box_homogeneous_set(bx2, EINA_TRUE);
772    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
773    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
774
775    bt = elm_button_add(win);
776    elm_object_text_set(bt, "[1]");
777    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
778    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
779    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
780    elm_box_pack_end(bx2, bt);
781    evas_object_show(bt);
782
783    bt = elm_button_add(win);
784    elm_object_text_set(bt, "[2]");
785    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
786    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
787    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
788    elm_box_pack_end(bx2, bt);
789    evas_object_show(bt);
790
791    bt = elm_button_add(win);
792    elm_object_text_set(bt, "[3]");
793    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
794    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
795    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
796    elm_box_pack_end(bx2, bt);
797    evas_object_show(bt);
798
799    elm_box_pack_end(bx, bx2);
800    evas_object_show(bx2);
801
802    evas_object_resize(win, 320, 320);
803    evas_object_show(win);
804 }
805
806
807 /*************/
808 static void
809 my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info __UNUSED__)
810 {
811    Testitem *tit = data;
812    tit->onoff = elm_check_state_get(obj);
813    printf("item %p onoff = %i\n", tit, tit->onoff);
814 }
815
816 static Elm_Genlist_Item_Class itc5;
817 char *gl5_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
818 {
819    const Testitem *tit = data;
820    char buf[256];
821    if (!strcmp(part, "elm.text"))
822      {
823         snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
824      }
825    else if (!strcmp(part, "elm.text.sub"))
826      {
827         snprintf(buf, sizeof(buf), "%i bottles on the wall", tit->mode);
828      }
829    return strdup(buf);
830 }
831 Evas_Object *gl5_content_get(void *data, Evas_Object *obj, const char *part)
832 {
833    const Testitem *tit = data;
834    char buf[PATH_MAX];
835    if (!strcmp(part, "elm.swallow.icon"))
836      {
837         Evas_Object *bx = elm_box_add(obj);
838         Evas_Object *ic;
839         elm_box_horizontal_set(bx, EINA_TRUE);
840         ic = elm_icon_add(obj);
841         snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
842         elm_icon_file_set(ic, buf, NULL);
843         elm_icon_scale_set(ic, 0, 0);
844         evas_object_show(ic);
845         elm_box_pack_end(bx, ic);
846         ic = elm_icon_add(obj);
847         elm_icon_file_set(ic, buf, NULL);
848         elm_icon_scale_set(ic, 0, 0);
849         evas_object_show(ic);
850         elm_box_pack_end(bx, ic);
851         elm_box_horizontal_set(bx, EINA_TRUE);
852         evas_object_show(bx);
853         return bx;
854      }
855    else if (!strcmp(part, "elm.swallow.end"))
856      {
857         Evas_Object *ck;
858         ck = elm_check_add(obj);
859         evas_object_propagate_events_set(ck, EINA_FALSE);
860         elm_check_state_set(ck, tit->onoff);
861         evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed2, data);
862         evas_object_show(ck);
863         return ck;
864      }
865    return NULL;
866 }
867 Eina_Bool gl5_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
868 {
869    return EINA_FALSE;
870 }
871 void gl5_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
872 {
873 }
874
875 static void
876 item_drag_up(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
877 {
878    printf("drag up\n");
879 }
880
881 static void
882 item_drag_down(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
883 {
884    printf("drag down\n");
885 }
886
887 static void
888 item_drag_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
889 {
890    printf("drag left\n");
891 }
892
893 static void
894 item_drag_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
895 {
896    printf("drag right\n");
897 }
898
899 static void
900 scroll_top(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
901 {
902    printf("Top edge!\n");
903 }
904
905 static void
906 scroll_bottom(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
907 {
908    printf("Bottom edge!\n");
909 }
910
911 static void
912 scroll_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
913 {
914    printf("Left edge!\n");
915 }
916
917 static void
918 scroll_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
919 {
920    printf("Right edge!\n");
921 }
922
923 static void
924 item_drag(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
925 {
926    printf("drag\n");
927 }
928
929 static void
930 item_drag_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
931 {
932    printf("drag stop\n");
933 }
934
935 static void
936 item_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
937 {
938    printf("longpress\n");
939 }
940
941 void
942 test_genlist5(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
943 {
944    Evas_Object *win, *bg, *gl, *bx, *bx2, *bt;
945    static Testitem tit[3];
946
947    win = elm_win_add(NULL, "genlist5", ELM_WIN_BASIC);
948    elm_win_title_set(win, "Genlist 5");
949    elm_win_autodel_set(win, EINA_TRUE);
950
951    bg = elm_bg_add(win);
952    elm_win_resize_object_add(win, bg);
953    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
954    evas_object_show(bg);
955
956    bx = elm_box_add(win);
957    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
958    elm_win_resize_object_add(win, bx);
959    evas_object_show(bx);
960
961    gl = elm_genlist_add(win);
962    elm_genlist_always_select_mode_set(gl, 1);
963    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
964    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
965    evas_object_show(gl);
966    itc5.item_style     = "double_label";
967    itc5.func.text_get = gl5_text_get;
968    itc5.func.content_get  = gl5_content_get;
969    itc5.func.state_get = gl5_state_get;
970    itc5.func.del       = gl5_del;
971
972    tit[0].mode = 0;
973    tit[0].item = elm_genlist_item_append(gl, &itc5,
974                                          &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
975                                          NULL/* func data */);
976    tit[1].mode = 1;
977    tit[1].item = elm_genlist_item_append(gl, &itc5,
978                                          &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
979                                          NULL/* func data */);
980    tit[2].mode = 2;
981    tit[2].item = elm_genlist_item_append(gl, &itc5,
982                                          &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
983                                          NULL/* func data */);
984
985    elm_box_pack_end(bx, gl);
986    evas_object_show(bx);
987
988    evas_object_smart_callback_add(gl, "drag,start,up", item_drag_up, NULL);
989    evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL);
990    evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL);
991    evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL);
992    evas_object_smart_callback_add(gl, "scroll,edge,top", scroll_top, NULL);
993    evas_object_smart_callback_add(gl, "scroll,edge,bottom", scroll_bottom, NULL);
994    evas_object_smart_callback_add(gl, "scroll,edge,left", scroll_left, NULL);
995    evas_object_smart_callback_add(gl, "scroll,edge,right", scroll_right, NULL);
996    evas_object_smart_callback_add(gl, "drag", item_drag, NULL);
997    evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL);
998    evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL);
999
1000    bx2 = elm_box_add(win);
1001    elm_box_horizontal_set(bx2, EINA_TRUE);
1002    elm_box_homogeneous_set(bx2, EINA_TRUE);
1003    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1004    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1005
1006    bt = elm_button_add(win);
1007    elm_object_text_set(bt, "[1]");
1008    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1009    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1010    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1011    elm_box_pack_end(bx2, bt);
1012    evas_object_show(bt);
1013
1014    bt = elm_button_add(win);
1015    elm_object_text_set(bt, "[2]");
1016    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
1017    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1018    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1019    elm_box_pack_end(bx2, bt);
1020    evas_object_show(bt);
1021
1022    bt = elm_button_add(win);
1023    elm_object_text_set(bt, "[3]");
1024    evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
1025    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1026    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1027    elm_box_pack_end(bx2, bt);
1028    evas_object_show(bt);
1029
1030    elm_box_pack_end(bx, bx2);
1031    evas_object_show(bx2);
1032
1033    evas_object_resize(win, 320, 320);
1034    evas_object_show(win);
1035 }
1036
1037 /*************/
1038
1039 static Elm_Genlist_Item_Class itc4;
1040
1041 static void
1042 gl4_sel(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1043 {
1044    Elm_Object_Item *glit = event_info;
1045    int depth = elm_genlist_item_expanded_depth_get(glit);
1046    printf("expanded depth for selected item is %d\n", depth);
1047
1048 }
1049 static void
1050 gl4_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1051 {
1052    Elm_Object_Item *glit = event_info;
1053    Evas_Object *gl = elm_genlist_item_genlist_get(glit);
1054    ssize_t val = (ssize_t) elm_object_item_data_get(glit);
1055    val *= 10;
1056    elm_genlist_item_append(gl, &itc4,
1057                            (void *)(val + 1)/* item data */,
1058                            glit/* parent */, ELM_GENLIST_ITEM_NONE,
1059                            gl4_sel/* func */,
1060                            NULL/* func data */);
1061    elm_genlist_item_append(gl, &itc4,
1062                            (void *)(val + 2)/* item data */,
1063                            glit/* parent */, ELM_GENLIST_ITEM_NONE,
1064                            gl4_sel/* func */,
1065                            NULL/* func data */);
1066    elm_genlist_item_append(gl, &itc4,
1067                            (void *)(val + 3)/* item data */,
1068                            glit/* parent */,
1069                            ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1070                            NULL/* func data */);
1071 }
1072 static void
1073 gl4_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1074 {
1075    Elm_Object_Item *glit = event_info;
1076    elm_genlist_item_subitems_clear(glit);
1077 }
1078
1079 static void
1080 gl4_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1081 {
1082    Elm_Object_Item *glit = event_info;
1083    elm_genlist_item_expanded_set(glit, EINA_TRUE);
1084 }
1085 static void
1086 gl4_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1087 {
1088    Elm_Object_Item *glit = event_info;
1089    elm_genlist_item_expanded_set(glit, EINA_FALSE);
1090 }
1091
1092 char *gl4_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
1093 {
1094    char buf[256];
1095    snprintf(buf, sizeof(buf), "Item mode %i", (int)(long)data);
1096    return strdup(buf);
1097 }
1098 Evas_Object *gl4_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
1099 {
1100    char buf[PATH_MAX];
1101    if (!strcmp(part, "elm.swallow.icon"))
1102      {
1103         Evas_Object *ic = elm_icon_add(obj);
1104         snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1105         elm_icon_file_set(ic, buf, NULL);
1106         evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1107         evas_object_show(ic);
1108         return ic;
1109      }
1110    else if (!strcmp(part, "elm.swallow.end"))
1111      {
1112         Evas_Object *ck;
1113         ck = elm_check_add(obj);
1114         evas_object_propagate_events_set(ck, EINA_FALSE);
1115         evas_object_show(ck);
1116         return ck;
1117      }
1118    return NULL;
1119 }
1120 Eina_Bool gl4_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
1121 {
1122    return EINA_FALSE;
1123 }
1124 void gl4_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
1125 {
1126 }
1127
1128 void
1129 test_genlist6(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1130 {
1131    Evas_Object *win, *bg, *gl, *bx, *bx2, *bt;
1132
1133    win = elm_win_add(NULL, "genlist-tree", ELM_WIN_BASIC);
1134    elm_win_title_set(win, "Genlist Tree");
1135    elm_win_autodel_set(win, EINA_TRUE);
1136
1137    bg = elm_bg_add(win);
1138    elm_win_resize_object_add(win, bg);
1139    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1140    evas_object_show(bg);
1141
1142    bx = elm_box_add(win);
1143    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1144    elm_win_resize_object_add(win, bx);
1145    evas_object_show(bx);
1146
1147    gl = elm_genlist_add(win);
1148    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1149    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1150    evas_object_show(gl);
1151
1152    itc4.item_style     = "default";
1153    itc4.func.text_get = gl4_text_get;
1154    itc4.func.content_get  = gl4_content_get;
1155    itc4.func.state_get = gl4_state_get;
1156    itc4.func.del       = gl4_del;
1157
1158    elm_genlist_item_append(gl, &itc4,
1159                            (void *)1/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1160                            NULL/* func data */);
1161    elm_genlist_item_append(gl, &itc4,
1162                            (void *)2/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1163                            NULL/* func data */);
1164    elm_genlist_item_append(gl, &itc4,
1165                            (void *)3/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1166                            NULL/* func data */);
1167
1168    evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl);
1169    evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl);
1170    evas_object_smart_callback_add(gl, "expanded", gl4_exp, gl);
1171    evas_object_smart_callback_add(gl, "contracted", gl4_con, gl);
1172
1173    elm_box_pack_end(bx, gl);
1174    evas_object_show(bx);
1175
1176    bx2 = elm_box_add(win);
1177    elm_box_horizontal_set(bx2, EINA_TRUE);
1178    elm_box_homogeneous_set(bx2, EINA_TRUE);
1179    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1180    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1181
1182    bt = elm_button_add(win);
1183    elm_object_text_set(bt, "[1]");
1184    //   evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0]));
1185    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1186    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1187    elm_box_pack_end(bx2, bt);
1188    evas_object_show(bt);
1189
1190    bt = elm_button_add(win);
1191    elm_object_text_set(bt, "[2]");
1192    //   evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1]));
1193    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1194    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1195    elm_box_pack_end(bx2, bt);
1196    evas_object_show(bt);
1197
1198    bt = elm_button_add(win);
1199    elm_object_text_set(bt, "[3]");
1200    //   evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2]));
1201    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1202    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1203    elm_box_pack_end(bx2, bt);
1204    evas_object_show(bt);
1205
1206    elm_box_pack_end(bx, bx2);
1207    evas_object_show(bx2);
1208
1209    evas_object_resize(win, 320, 320);
1210    evas_object_show(win);
1211 }
1212
1213 /*************/
1214
1215 struct genlist7_data
1216 {
1217    Evas_Object *win, *pager;
1218 };
1219
1220 static Elm_Genlist_Item_Class itc7;
1221 static void
1222 gl_sel7(void *data, Evas_Object *obj, void *event_info)
1223 {
1224    if (!event_info) return;
1225    elm_genlist_item_item_class_update(event_info, &itc7);
1226    printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, itc7.item_style);
1227 }
1228
1229 static void
1230 test_genlist7_back_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1231 {
1232    struct genlist7_data *info = data;
1233    if (!info) return;
1234
1235    elm_pager_content_pop(info->pager);
1236 }
1237
1238 static void
1239 test_genlist7_swipe(void *data, Evas_Object *obj __UNUSED__, void *event_info)
1240 {
1241    struct genlist7_data *info = data;
1242    Evas_Object *box, *entry, *button;
1243    char item_data[] = "Just a simple test";
1244
1245    if ((!event_info) || (!data)) return;
1246
1247    box = elm_box_add(info->win);
1248    elm_box_homogeneous_set(box, EINA_FALSE);
1249    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1250    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1251    evas_object_show(box);
1252
1253    entry = elm_entry_add(info->win);
1254    elm_entry_scrollable_set(entry, EINA_TRUE);
1255    elm_entry_editable_set(entry, EINA_FALSE);
1256    elm_object_text_set(entry, item_data);
1257    evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1258    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1259    evas_object_show(entry);
1260
1261    button = elm_button_add(info->win);
1262    elm_object_text_set(button, "back");
1263    evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0);
1264    evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0);
1265    evas_object_smart_callback_add(button, "clicked", test_genlist7_back_cb,
1266                                   info);
1267    evas_object_show(button);
1268
1269    elm_box_pack_start(box, entry);
1270    elm_box_pack_end(box, button);
1271
1272    elm_pager_content_push(info->pager, box);
1273 }
1274
1275 void
1276 test_genlist7(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1277 {
1278    Evas_Object *win, *bg, *gl, *pager;
1279    static struct genlist7_data info;
1280    static Testitem tit[3];
1281
1282    win = elm_win_add(NULL, "genlist7", ELM_WIN_BASIC);
1283    elm_win_title_set(win, "Genlist 7");
1284    elm_win_autodel_set(win, EINA_TRUE);
1285    info.win = win;
1286
1287    bg = elm_bg_add(win);
1288    elm_win_resize_object_add(win, bg);
1289    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1290    evas_object_show(bg);
1291
1292    pager = elm_pager_add(win);
1293    elm_win_resize_object_add(win, pager);
1294    evas_object_size_hint_weight_set(pager, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1295    evas_object_size_hint_align_set(pager, EVAS_HINT_FILL, EVAS_HINT_FILL);
1296    evas_object_show(pager);
1297    info.pager = pager;
1298
1299    gl = elm_genlist_add(win);
1300    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1301    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1302    evas_object_smart_callback_add(gl, "swipe", test_genlist7_swipe, &info);
1303    evas_object_show(gl);
1304    elm_pager_content_push(pager, gl);
1305
1306    itc2.item_style     = "default";
1307    itc2.func.text_get = gl2_text_get;
1308    itc2.func.content_get  = gl2_content_get;
1309    itc2.func.state_get = gl2_state_get;
1310    itc2.func.del       = gl2_del;
1311
1312    itc7.item_style     = "double_label";
1313    itc7.func.text_get = gl5_text_get;
1314    itc7.func.content_get  = gl5_content_get;
1315    itc7.func.state_get = gl5_state_get;
1316    itc7.func.del       = gl5_del;
1317
1318    tit[0].mode = 0;
1319    tit[0].item = elm_genlist_item_append(gl, &itc2,
1320                                          &(tit[0])/* item data */, NULL/* parent */,
1321                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1322                                          NULL/* func data */);
1323    tit[1].mode = 1;
1324    tit[1].item = elm_genlist_item_append(gl, &itc2,
1325                                          &(tit[1])/* item data */, NULL/* parent */,
1326                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1327                                          NULL/* func data */);
1328    tit[2].mode = 2;
1329    tit[2].item = elm_genlist_item_append(gl, &itc2,
1330                                          &(tit[2])/* item data */, NULL/* parent */,
1331                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
1332                                          NULL/* func data */);
1333
1334    evas_object_resize(win, 320, 320);
1335    evas_object_show(win);
1336 }
1337
1338 /*************/
1339
1340 static Elm_Genlist_Item_Class itc_group;
1341 char *gl8_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
1342 {
1343    char buf[256];
1344    snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)",  (int)((long)data / 10), (int)(long)data);
1345    return strdup(buf);
1346 }
1347
1348 static void
1349 _bt_show_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1350 {
1351    elm_genlist_item_top_show(data);
1352    //elm_genlist_item_show(data);
1353    //elm_genlist_item_middle_show(data);
1354 }
1355 static void
1356 _bt_bring_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1357 {
1358    elm_genlist_item_top_bring_in(data);
1359    //elm_genlist_item_bring_in(data);
1360    //elm_genlist_item_middle_bring_in(data);
1361 }
1362
1363 void
1364 test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1365 {
1366    Evas_Object *win, *bg, *gl, *bt[8], *bx, *bx2, *bx3;
1367    Elm_Object_Item *gli = NULL, *git = NULL;
1368    int i, bt_num;
1369
1370    win = elm_win_add(NULL, "genlist-group", ELM_WIN_BASIC);
1371    elm_win_title_set(win, "Genlist Group");
1372    elm_win_autodel_set(win, EINA_TRUE);
1373
1374    bg = elm_bg_add(win);
1375    elm_win_resize_object_add(win, bg);
1376    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1377    evas_object_show(bg);
1378
1379    bx = elm_box_add(win);
1380    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1381    elm_win_resize_object_add(win, bx);
1382    evas_object_show(bx);
1383
1384    gl = elm_genlist_add(win);
1385    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
1386    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
1387    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
1388    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1389    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1390    elm_box_pack_end(bx, gl);
1391    evas_object_show(gl);
1392
1393    itc1.item_style     = "default";
1394    itc1.func.text_get = gl_text_get;
1395    itc1.func.content_get  = gl_content_get;
1396    itc1.func.state_get = gl_state_get;
1397    itc1.func.del       = gl_del;
1398
1399    itc_group.item_style     = "group_index";
1400    itc_group.func.text_get = gl8_text_get;
1401    itc_group.func.content_get  = NULL;
1402    itc_group.func.state_get = NULL;
1403    itc_group.func.del       = gl_del;
1404
1405    bx2 = elm_box_add(win);
1406    elm_box_horizontal_set(bx2, EINA_TRUE);
1407    elm_box_homogeneous_set(bx2, EINA_TRUE);
1408    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
1409    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1410
1411    bt_num = 0;
1412    bt[bt_num] = elm_button_add(win);
1413    elm_object_text_set(bt[bt_num], "Show 0");
1414    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1415    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1416    evas_object_show(bt[bt_num]);
1417    elm_box_pack_end(bx2, bt[bt_num]);
1418
1419    bt[++bt_num] = elm_button_add(win);
1420    elm_object_text_set(bt[bt_num], "Show 26");
1421    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1422    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1423    evas_object_show(bt[bt_num]);
1424    elm_box_pack_end(bx2, bt[bt_num]);
1425
1426    bt[++bt_num] = elm_button_add(win);
1427    elm_object_text_set(bt[bt_num], "Show 101");
1428    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1429    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1430    evas_object_show(bt[bt_num]);
1431    elm_box_pack_end(bx2, bt[bt_num]);
1432
1433    bt[++bt_num] = elm_button_add(win);
1434    elm_object_text_set(bt[bt_num], "Show 480");
1435    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1436    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1437    evas_object_show(bt[bt_num]);
1438    elm_box_pack_end(bx2, bt[bt_num]);
1439
1440    elm_box_pack_end(bx, bx2);
1441    evas_object_show(bx2);
1442
1443    bx3 = elm_box_add(win);
1444    elm_box_horizontal_set(bx3, EINA_TRUE);
1445    elm_box_homogeneous_set(bx3, EINA_TRUE);
1446    evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0);
1447    evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL);
1448
1449    bt[++bt_num] = elm_button_add(win);
1450    elm_object_text_set(bt[bt_num], "Bring top 0");
1451    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1452    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1453    evas_object_show(bt[bt_num]);
1454    elm_box_pack_end(bx3, bt[bt_num]);
1455
1456    bt[++bt_num] = elm_button_add(win);
1457    elm_object_text_set(bt[bt_num], "Bring top 31");
1458    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1459    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1460    evas_object_show(bt[bt_num]);
1461    elm_box_pack_end(bx3, bt[bt_num]);
1462
1463    bt[++bt_num] = elm_button_add(win);
1464    elm_object_text_set(bt[bt_num], "Bring top 239");
1465    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1466    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1467    evas_object_show(bt[bt_num]);
1468    elm_box_pack_end(bx3, bt[bt_num]);
1469
1470    bt[++bt_num] = elm_button_add(win);
1471    elm_object_text_set(bt[bt_num], "Bring top 477");
1472    evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL);
1473    evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0);
1474    evas_object_show(bt[bt_num]);
1475    elm_box_pack_end(bx3, bt[bt_num]);
1476
1477    elm_box_pack_end(bx, bx3);
1478    evas_object_show(bx3);
1479
1480    for (i = 0; i < 500; i++)
1481      {
1482         if (!(i % 10))
1483           {
1484              gli = git = elm_genlist_item_append(gl, &itc_group,
1485                                                  (void *)(long)i/* item data */,
1486                                                  NULL/* parent */,
1487                                                  ELM_GENLIST_ITEM_GROUP,
1488                                                  gl_sel/* func */,
1489                                                  (void *)(long)(i * 10)/* func data */);
1490              elm_genlist_item_display_only_set(git, EINA_TRUE);
1491           }
1492         else if (git)
1493           {
1494              gli = elm_genlist_item_append(gl, &itc1,
1495                                            (void *)(long)i/* item data */,
1496                                            git/* parent */,
1497                                            ELM_GENLIST_ITEM_NONE,
1498                                            gl_sel/* func */,
1499                                            (void *)(long)(i * 10)/* func data */);
1500           }
1501         switch (i)
1502           {
1503            case 0:
1504               evas_object_smart_callback_add(bt[0], "clicked", _bt_show_cb, gli);
1505               evas_object_smart_callback_add(bt[4], "clicked", _bt_bring_cb, gli);
1506               break;
1507            case 26:
1508               evas_object_smart_callback_add(bt[1], "clicked", _bt_show_cb, gli);
1509               break;
1510            case 31:
1511               evas_object_smart_callback_add(bt[5], "clicked", _bt_bring_cb, gli);
1512               break;
1513            case 101:
1514               evas_object_smart_callback_add(bt[2], "clicked", _bt_show_cb, gli);
1515               break;
1516            case 239:
1517               evas_object_smart_callback_add(bt[6], "clicked", _bt_bring_cb, gli);
1518               break;
1519            case 477:
1520               evas_object_smart_callback_add(bt[7], "clicked", _bt_bring_cb, gli);
1521               break;
1522            case 480:
1523               evas_object_smart_callback_add(bt[3], "clicked", _bt_show_cb, gli);
1524               break;
1525           }
1526      }
1527
1528    evas_object_resize(win, 480, 800);
1529    evas_object_show(win);
1530 }
1531
1532 /*************/
1533
1534 static void
1535 gl9_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1536 {
1537    Elm_Object_Item *glit = event_info;
1538    Evas_Object *gl = elm_genlist_item_genlist_get(glit);
1539    ssize_t val = (ssize_t) elm_object_item_data_get(glit);
1540    val *= 10;
1541    elm_genlist_item_append(gl, &itc1,
1542                            (void *)(val + 1)/* item data */,
1543                            glit/* parent */,
1544                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1545                            NULL/* func data */);
1546    elm_genlist_item_append(gl, &itc1,
1547                            (void *)(val + 2)/* item data */,
1548                            glit/* parent */,
1549                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1550                            NULL/* func data */);
1551    elm_genlist_item_append(gl, &itc1,
1552                            (void *)(val + 3)/* item data */,
1553                            glit/* parent */,
1554                            ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1555                            NULL/* func data */);
1556 }
1557 static void
1558 gl9_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1559 {
1560    Elm_Object_Item *glit = event_info;
1561    elm_genlist_item_subitems_clear(glit);
1562 }
1563
1564 static void
1565 gl9_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1566 {
1567    Elm_Object_Item *glit = event_info;
1568    elm_genlist_item_expanded_set(glit, EINA_TRUE);
1569 }
1570 static void
1571 gl9_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1572 {
1573    Elm_Object_Item *glit = event_info;
1574    elm_genlist_item_expanded_set(glit, EINA_FALSE);
1575 }
1576
1577 void
1578 test_genlist9(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1579 {
1580    Evas_Object *win, *bg, *gl, *bx;
1581    Elm_Object_Item *git;
1582
1583    win = elm_win_add(NULL, "genlist-group-tree", ELM_WIN_BASIC);
1584    elm_win_title_set(win, "Genlist Group Tree");
1585    elm_win_autodel_set(win, EINA_TRUE);
1586
1587    bg = elm_bg_add(win);
1588    elm_win_resize_object_add(win, bg);
1589    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1590    evas_object_show(bg);
1591
1592    bx = elm_box_add(win);
1593    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1594    elm_win_resize_object_add(win, bx);
1595    evas_object_show(bx);
1596
1597    gl = elm_genlist_add(win);
1598    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
1599    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
1600    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
1601    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1602    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1603    elm_box_pack_end(bx, gl);
1604    evas_object_show(gl);
1605
1606    itc1.item_style     = "default";
1607    itc1.func.text_get = gl_text_get;
1608    itc1.func.content_get  = gl_content_get;
1609    itc1.func.state_get = gl_state_get;
1610    itc1.func.del       = gl_del;
1611
1612    itc_group.item_style     = "group_index";
1613    itc_group.func.text_get = gl8_text_get;
1614    itc_group.func.content_get  = NULL;
1615    itc_group.func.state_get = NULL;
1616    itc_group.func.del       = gl_del;
1617
1618    git = elm_genlist_item_append(gl, &itc_group,
1619                                  (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
1620                                  NULL/* func data */);
1621    elm_genlist_item_display_only_set(git, EINA_TRUE);
1622    elm_genlist_item_append(gl, &itc1,
1623                            (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1624                            NULL/* func data */);
1625    elm_genlist_item_append(gl, &itc1,
1626                            (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1627                            NULL/* func data */);
1628    elm_genlist_item_append(gl, &itc1,
1629                            (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1630                            NULL/* func data */);
1631    git = elm_genlist_item_append(gl, &itc_group,
1632                                  (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
1633                                  NULL/* func data */);
1634    elm_genlist_item_display_only_set(git, EINA_TRUE);
1635    elm_genlist_item_append(gl, &itc1,
1636                            (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1637                            NULL/* func data */);
1638    elm_genlist_item_append(gl, &itc1,
1639                            (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
1640                            NULL/* func data */);
1641    elm_genlist_item_append(gl, &itc1,
1642                            (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */,
1643                            NULL/* func data */);
1644
1645    evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, gl);
1646    evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, gl);
1647    evas_object_smart_callback_add(gl, "expanded", gl9_exp, gl);
1648    evas_object_smart_callback_add(gl, "contracted", gl9_con, gl);
1649
1650    evas_object_resize(win, 480, 800);
1651    evas_object_show(win);
1652 }
1653
1654 /*************/
1655
1656 static Elm_Genlist_Item_Class itc10;
1657 static char *mode_type[] = { "slide", "rotate" };
1658 char *gl10_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
1659 {
1660    char buf[256];
1661    if (!strcmp(part, "elm.text.mode"))
1662      snprintf(buf, sizeof(buf), "Mode # %i", (int)(long)data);
1663    else
1664      snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data);
1665    return strdup(buf);
1666 }
1667
1668 Evas_Object *gl10_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
1669 {
1670    char buf[PATH_MAX];
1671    Evas_Object *ic = elm_icon_add(obj);
1672    if (!strcmp(part, "elm.swallow.end"))
1673      snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get());
1674    else
1675      snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
1676    elm_icon_file_set(ic, buf, NULL);
1677    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1678    return ic;
1679 }
1680 static void
1681 _gl_sel10(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1682 {
1683    if (!data) return;
1684    int v = elm_radio_value_get(data);
1685    if (v == 1)
1686      elm_genlist_item_mode_set(event_info, mode_type[v], EINA_TRUE);
1687 }
1688
1689 static void
1690 _my_gl_mode_right(void *data, Evas_Object *obj __UNUSED__, void *event_info)
1691 {
1692    if (!data) return;
1693    int v = elm_radio_value_get(data);
1694    if (v == 0)
1695      elm_genlist_item_mode_set(event_info, mode_type[v], EINA_TRUE);
1696 }
1697
1698 static void
1699 _my_gl_mode_left(void *data, Evas_Object *obj __UNUSED__, void *event_info)
1700 {
1701    if (!data) return;
1702    int v = elm_radio_value_get(data);
1703    if (v == 0)
1704      elm_genlist_item_mode_set(event_info, mode_type[v], EINA_FALSE);
1705 }
1706
1707 static void
1708 _my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1709 {
1710    fprintf(stderr, "drag\n");
1711    if (!data) return;
1712    int v = elm_radio_value_get(data);
1713    Elm_Object_Item *glit = (Elm_Object_Item *) elm_genlist_mode_item_get(obj);
1714    if (glit) elm_genlist_item_mode_set(glit, mode_type[v], EINA_FALSE);
1715 }
1716
1717 void
1718 test_genlist10(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1719 {
1720    Evas_Object *win, *bg, *fr, *lb, *bx, *bx2, *bx3, *rd, *rdg, *gl;
1721    int i;
1722
1723    win = elm_win_add(NULL, "genlist10", ELM_WIN_BASIC);
1724    elm_win_title_set(win, "Genlist Mode");
1725    elm_win_autodel_set(win, EINA_TRUE);
1726
1727    bg = elm_bg_add(win);
1728    elm_win_resize_object_add(win, bg);
1729    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1730    evas_object_show(bg);
1731
1732    bx = elm_box_add(win);
1733    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1734    elm_win_resize_object_add(win, bx);
1735    evas_object_show(bx);
1736
1737    fr = elm_frame_add(win);
1738    elm_object_text_set(fr, "Mode Type");
1739    elm_box_pack_end(bx, fr);
1740    evas_object_show(fr);
1741
1742    bx2 = elm_box_add(win);
1743    elm_object_content_set(fr, bx2);
1744    evas_object_show(bx2);
1745
1746    lb = elm_label_add(win);
1747    elm_object_text_set(lb,
1748                        "Sweep genlist items to the right.<br/>"
1749                        "Test this by changing Mode Type to Slide or Rotate.");
1750    elm_box_pack_end(bx2, lb);
1751    evas_object_show(lb);
1752
1753    bx3 = elm_box_add(win);
1754    elm_box_horizontal_set(bx3, EINA_TRUE);
1755    elm_box_pack_end(bx2, bx3);
1756    evas_object_show(bx3);
1757
1758    rd = elm_radio_add(win);
1759    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1760    elm_radio_state_value_set(rd, 0);
1761    elm_object_text_set(rd, "Slide  ");
1762    evas_object_show(rd);
1763    elm_box_pack_end(bx3, rd);
1764    rdg = rd;
1765
1766    rd = elm_radio_add(win);
1767    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1768    elm_radio_state_value_set(rd, 1);
1769    elm_object_text_set(rd, "Rotate");
1770    elm_radio_group_add(rd, rdg);
1771    evas_object_show(rd);
1772    elm_box_pack_end(bx3, rd);
1773
1774    gl = elm_genlist_add(win);
1775    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1776    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1777    evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg);
1778    evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
1779    evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
1780    evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
1781    evas_object_show(gl);
1782
1783    itc10.item_style     = "default";
1784    itc10.func.text_get = gl10_text_get;
1785    itc10.func.content_get  = gl10_content_get;
1786    itc10.func.state_get = gl_state_get;
1787    itc10.func.del       = gl_del;
1788    elm_genlist_mode_item_style_set(gl, "mode");
1789
1790    for (i = 0; i < 50; i++)
1791      elm_genlist_item_append(gl,
1792                              &itc10,
1793                              (void *)(1000 + i)/* item data */,
1794                              NULL/* parent */,
1795                              ELM_GENLIST_ITEM_NONE/* flags */,
1796                              _gl_sel10/* func */,
1797                              rdg/* func data */);
1798
1799    elm_box_pack_end(bx, gl);
1800
1801    evas_object_resize(win, 520, 520);
1802    evas_object_show(win);
1803 }
1804
1805 /*************/
1806
1807 static void
1808 _reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1809 {
1810    elm_genlist_reorder_mode_set(data, elm_check_state_get(obj));
1811 }
1812
1813 /**
1814  * gl_moved is called after an item was reordered.
1815  * This is only called when reorder mode is enabled.
1816  *
1817  * @param data         :  the genlist object passed as data.
1818  * @param obj          :  the genlist object.
1819  * @param item         :  the moved item.
1820  *
1821  * If the move_after is true,
1822  *  the item(*item) had been moved after the given relative item(*rel_item) in list.
1823  * If the move_after is false,
1824  *  the item(*item) had been moved before the given relative item(*rel_item) in list.
1825  *
1826  */
1827 static void gl_moved(Evas_Object *data __UNUSED__, Evas_Object *obj __UNUSED__, Elm_Object_Item *item __UNUSED__)
1828 {
1829    // if needed, add application logic.
1830 }
1831
1832 void
1833 test_genlist11(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1834 {
1835    Evas_Object *win, *bg, *fr, *lb, *bx, *tg, *gl;
1836    int i;
1837
1838    win = elm_win_add(NULL, "genlist-reorder-mode", ELM_WIN_BASIC);
1839    elm_win_title_set(win, "Genlist Reorder Mode");
1840    elm_win_autodel_set(win, EINA_TRUE);
1841
1842    bg = elm_bg_add(win);
1843    elm_win_resize_object_add(win, bg);
1844    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1845    evas_object_show(bg);
1846
1847    bx = elm_box_add(win);
1848    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1849    elm_win_resize_object_add(win, bx);
1850    evas_object_show(bx);
1851
1852    fr = elm_frame_add(win);
1853
1854    elm_object_text_set(fr, "Reorder Mode");
1855    elm_box_pack_end(bx, fr);
1856    evas_object_show(fr);
1857
1858    lb = elm_label_add(win);
1859    elm_object_text_set(lb,
1860                        "Enable reorder mode if you want to move item.<br/>"
1861                        "Then long press and drag item.");
1862    elm_object_content_set(fr, lb);
1863    evas_object_show(lb);
1864
1865    gl = elm_genlist_add(win);
1866    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1867    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1868    evas_object_show(gl);
1869
1870    tg = elm_check_add(win);
1871    elm_object_style_set(tg, "toggle");
1872    elm_object_text_set(tg, "Reorder Mode:");
1873    elm_check_state_set(tg, elm_mirrored_get());
1874    evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl);
1875    elm_box_pack_end(bx, tg);
1876    evas_object_show(tg);
1877
1878    itc1.item_style     = "default";
1879    itc1.func.text_get = gl_text_get;
1880    itc1.func.content_get  = gl_content_get;
1881    itc1.func.state_get = gl_state_get;
1882    itc1.func.del       = gl_del;
1883    evas_object_smart_callback_add(gl, "moved", (Evas_Smart_Cb)gl_moved, gl);
1884
1885    for (i = 0; i < 50; i++)
1886      elm_genlist_item_append(gl,
1887                              &itc1,
1888                              (void *)(1 + i)/* item data */,
1889                              NULL/* parent */,
1890                              ELM_GENLIST_ITEM_NONE/* flags */,
1891                              NULL/* func */,
1892                              NULL/* func data */);
1893
1894    elm_box_pack_end(bx, gl);
1895
1896    evas_object_resize(win, 400, 500);
1897    evas_object_show(win);
1898 }
1899
1900 char *gl12_text_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
1901 {
1902    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).");
1903 }
1904
1905 void
1906 test_genlist12(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1907 {
1908    Evas_Object *win, *bg, *bx, *gl;
1909    int i;
1910
1911    win = elm_win_add(NULL, "genlist-textblock", ELM_WIN_BASIC);
1912    elm_win_title_set(win, "Genlist Textblock");
1913    elm_win_autodel_set(win, EINA_TRUE);
1914
1915    bg = elm_bg_add(win);
1916    elm_win_resize_object_add(win, bg);
1917    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1918    evas_object_show(bg);
1919
1920    bx = elm_box_add(win);
1921    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1922    elm_win_resize_object_add(win, bx);
1923    evas_object_show(bx);
1924
1925    gl = elm_genlist_add(win);
1926    elm_genlist_height_for_width_mode_set(gl, EINA_TRUE);
1927    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1928    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1929    elm_box_pack_end(bx, gl);
1930    evas_object_show(gl);
1931
1932    itc1.item_style     = "message";
1933    itc1.func.text_get = gl12_text_get;
1934    itc1.func.content_get  = gl_content_get;
1935    itc1.func.state_get = gl_state_get;
1936    itc1.func.del       = gl_del;
1937
1938    for (i = 0; i < 1000; i++)
1939      {
1940         elm_genlist_item_append(gl, &itc1,
1941                                 (void *)(long)i/* item data */,
1942                                 NULL/* parent */,
1943                                 ELM_GENLIST_ITEM_NONE,
1944                                 gl_sel/* func */,
1945                                 (void *)(long)(i * 10)/* func data */);
1946      }
1947
1948    evas_object_resize(win, 400, 500);
1949    evas_object_show(win);
1950 }
1951
1952 static int
1953 gl13_cmp(const void *pa, const void *pb)
1954 {
1955    const Elm_Object_Item *ia = pa, *ib = pb;
1956    int a = (ssize_t) elm_object_item_data_get(ia);
1957    int b = (ssize_t) elm_object_item_data_get(ib);
1958    return a - b;
1959 }
1960
1961 void
1962 test_genlist13(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1963 {
1964    Elm_Object_Item *pi[6];
1965    Evas_Object *win, *bg, *bx, *gl;
1966    int i, base, idx[3] = {1, 10, 15};
1967
1968    win = elm_win_add(NULL, "genlist-tree-insert-sorted", ELM_WIN_BASIC);
1969    elm_win_title_set(win, "Genlist Tree, Insert Sorted");
1970    elm_win_autodel_set(win, EINA_TRUE);
1971
1972    bg = elm_bg_add(win);
1973    elm_win_resize_object_add(win, bg);
1974    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1975    evas_object_show(bg);
1976
1977    bx = elm_box_add(win);
1978    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1979    elm_win_resize_object_add(win, bx);
1980    evas_object_show(bx);
1981
1982    gl = elm_genlist_add(win);
1983    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1984    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1985    evas_object_show(gl);
1986
1987    itc4.item_style = "default";
1988    itc4.func.text_get = gl4_text_get;
1989    itc4.func.content_get = NULL;
1990    itc4.func.state_get = NULL;
1991    itc4.func.del = NULL;
1992
1993    /* mixed order to test insert sorted */
1994
1995    for (i = 0; i < 3; i++)
1996      {
1997         pi[i] = elm_genlist_item_direct_sorted_insert
1998           (gl, &itc4, (void *)idx[i]/* item data */, NULL/* parent */,
1999            ELM_GENLIST_ITEM_SUBITEMS, gl13_cmp/* cmp */,
2000            NULL/* func */, NULL/* func data */);
2001      }
2002
2003    for (i = 0, base = 100; i < 3; i++, base += 100)
2004      {
2005         int j;
2006         for (j = 0; j < 3; j++)
2007           {
2008              elm_genlist_item_direct_sorted_insert
2009                (gl, &itc4, (void *)(idx[j] + base)/* item data */,
2010                 pi[i]/* parent */, ELM_GENLIST_ITEM_NONE,
2011                 gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
2012           }
2013      }
2014
2015    for (i = 0; i < 3; i++)
2016      {
2017         pi[i + 3] = elm_genlist_item_direct_sorted_insert
2018           (gl, &itc4, (void *)(idx[i] * 2)/* item data */, NULL/* parent */,
2019            ELM_GENLIST_ITEM_SUBITEMS, gl13_cmp/* cmp */, NULL/* func */,
2020            NULL/* func data */);
2021      }
2022
2023
2024    for (i = 0, base = 10000; i < 3; i++, base += 10000)
2025      {
2026         int j;
2027         for (j = 0; j < 3; j++)
2028           {
2029              elm_genlist_item_direct_sorted_insert
2030                (gl, &itc4, (void *)(idx[j] + base)/* item data */,
2031                 pi[i + 3]/* parent */, ELM_GENLIST_ITEM_NONE,
2032                 gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
2033           }
2034      }
2035
2036    elm_box_pack_end(bx, gl);
2037    evas_object_show(bx);
2038
2039    evas_object_resize(win, 320, 320);
2040    evas_object_show(win);
2041 }
2042
2043 static void
2044 my_gl_insert_before_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2045 {
2046    Evas_Object *gl = data;
2047    static int i = 1000;
2048    Elm_Object_Item *gli_selected;
2049
2050    itc1.item_style = "default";
2051    itc1.func.text_get = gl_text_get;
2052    itc1.func.content_get = NULL;
2053    itc1.func.state_get = NULL;
2054    itc1.func.del = NULL;
2055
2056    gli_selected = elm_genlist_selected_item_get(gl);
2057    if (!gli_selected)
2058      {
2059         printf("no item selected\n");
2060         return;
2061      }
2062
2063    elm_genlist_item_insert_before(gl, &itc1,
2064                                   (void *)(long)i/* item data */,
2065                                   elm_genlist_item_parent_get(gli_selected),
2066                                   gli_selected/* item before */,
2067                                   ELM_GENLIST_ITEM_NONE,
2068                                   NULL/* func */, NULL/* func data */);
2069    i++;
2070 }
2071
2072 static void
2073 my_gl_insert_after_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2074 {
2075    Evas_Object *gl = data;
2076    static int i = 0;
2077    Elm_Object_Item *gli_selected;
2078
2079    itc1.item_style = "default";
2080    itc1.func.text_get = gl_text_get;
2081    itc1.func.content_get = NULL;
2082    itc1.func.state_get = NULL;
2083    itc1.func.del = NULL;
2084
2085    gli_selected = elm_genlist_selected_item_get(gl);
2086    if (!gli_selected)
2087      {
2088         printf("no item selected\n");
2089         return;
2090      }
2091
2092    elm_genlist_item_insert_after(gl, &itc1,
2093                                   (void *)(long)i/* item data */,
2094                                   elm_genlist_item_parent_get(gli_selected),
2095                                   gli_selected/* item after */,
2096                                   ELM_GENLIST_ITEM_NONE,
2097                                   NULL/* func */, NULL/* func data */);
2098    i++;
2099 }
2100
2101 void
2102 test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2103 {
2104    Elm_Object_Item *pi[6];
2105    Evas_Object *win, *bg, *bx, *bx2, *bt, *gl;
2106    int i;
2107    ssize_t base;
2108    /* index: 0,  1,  2,  3,  4,  5
2109     * items: 1, 15, 11,  2, 33, 21
2110     * final: 1,  2, 11, 15, 21, 33
2111     */
2112    const ssize_t idx[6] = {1, 15, 11, 2, 33, 21};
2113    const int relative[6] = {
2114       0, /* item  '1' -  not used */
2115       0, /* item '15' - insert after pi[0], item '1' */
2116      -1, /* item '11' - insert before pi[1], item '15' */
2117      -2, /* item  '2' - insert before pi[2], item '11' */
2118       1, /* item '33' - insert after pi[1], item '15' */
2119      -4  /* item '21' - insert before pi[4], item '33' */
2120    };
2121
2122    win = elm_win_add(NULL, "genlist-tree-insert-relative", ELM_WIN_BASIC);
2123    elm_win_title_set(win, "Genlist Tree, Insert Relative");
2124    elm_win_autodel_set(win, EINA_TRUE);
2125
2126    bg = elm_bg_add(win);
2127    elm_win_resize_object_add(win, bg);
2128    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2129    evas_object_show(bg);
2130
2131    bx = elm_box_add(win);
2132    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2133    elm_win_resize_object_add(win, bx);
2134    evas_object_show(bx);
2135
2136    gl = elm_genlist_add(win);
2137    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
2138    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2139    evas_object_show(gl);
2140
2141    itc4.item_style = "default";
2142    itc4.func.text_get = gl4_text_get;
2143    itc4.func.content_get = NULL;
2144    itc4.func.state_get = NULL;
2145    itc4.func.del = NULL;
2146
2147    /* mixed order to test insert sorted */
2148
2149    // BUG1: should be able to insert before=NULL, prepend
2150    // BUG2: should be able to insert after=NULL, append
2151
2152    pi[0] = elm_genlist_item_append
2153      (gl, &itc4, (void *)idx[0]/* item data */,
2154       NULL/* parent */,
2155       ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2156
2157    for (i = 1; i < 3; i++)
2158      {
2159         if (relative[i] < 0)
2160           pi[i] = elm_genlist_item_insert_before
2161             (gl, &itc4, (void *)idx[i]/* item data */,
2162              NULL/* parent */, pi[-relative[i]],
2163              ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2164         else
2165           pi[i] = elm_genlist_item_insert_after
2166             (gl, &itc4, (void *)idx[i]/* item data */,
2167              NULL/* parent */, pi[relative[i]],
2168              ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2169      }
2170
2171    for (i = 0; i < 3; i++)
2172      {
2173         Elm_Object_Item *sub_glit[6];
2174         int j;
2175
2176         base = 1000 * (ssize_t) elm_object_item_data_get(pi[i]);
2177
2178         sub_glit[0] = elm_genlist_item_append
2179           (gl, &itc4, (void *)(idx[0] + base)/* item data */, pi[i]/* parent */,
2180            ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2181
2182         for (j = 1; j < 6; j++) {
2183            if (relative[j] < 0)
2184              sub_glit[j] = elm_genlist_item_insert_before
2185                (gl, &itc4, (void *)(idx[j] + base)/* item data */,
2186                 pi[i]/* parent */, sub_glit[-relative[j]],
2187                 ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2188            else
2189              sub_glit[j] = elm_genlist_item_insert_after
2190                (gl, &itc4, (void *)(idx[j] + base)/* item data */,
2191                 pi[i]/* parent */, sub_glit[relative[j]],
2192                 ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2193         }
2194      }
2195
2196    for (i = 3; i < 6; i++)
2197      {
2198         if (relative[i] < 0)
2199           pi[i] = elm_genlist_item_insert_before
2200             (gl, &itc4, (void *)idx[i]/* item data */,
2201              NULL/* parent */, pi[-relative[i]],
2202              ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2203         else
2204           pi[i] = elm_genlist_item_insert_after
2205             (gl, &itc4, (void *)idx[i]/* item data */,
2206              NULL/* parent */, pi[relative[i]],
2207              ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2208      }
2209
2210    for (i = 3; i < 6; i++)
2211      {
2212         Elm_Object_Item *sub_glit[6];
2213         int j;
2214
2215         base = 1000 * (ssize_t) elm_object_item_data_get(pi[i]);
2216
2217         sub_glit[0] = elm_genlist_item_append
2218           (gl, &itc4, (void *)(idx[0] + base)/* item data */, pi[i]/* parent */,
2219            ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2220
2221         for (j = 1; j < 6; j++) {
2222            if (relative[j] < 0)
2223              sub_glit[j] = elm_genlist_item_insert_before
2224                (gl, &itc4, (void *)(idx[j] + base)/* item data */,
2225                 pi[i]/* parent */, sub_glit[-relative[j]],
2226                 ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2227            else
2228              sub_glit[j] = elm_genlist_item_insert_after
2229                (gl, &itc4, (void *)(idx[j] + base)/* item data */,
2230                 pi[i]/* parent */, sub_glit[relative[j]],
2231                 ELM_GENLIST_ITEM_SUBITEMS, NULL/* func */, NULL/* func data */);
2232         }
2233      }
2234
2235    elm_box_pack_end(bx, gl);
2236    evas_object_show(bx);
2237
2238    bx2 = elm_box_add(win);
2239    elm_box_horizontal_set(bx2, EINA_TRUE);
2240    elm_box_homogeneous_set(bx2, EINA_TRUE);
2241    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0);
2242    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
2243
2244    bt = elm_button_add(win);
2245    elm_object_text_set(bt, "+ before");
2246    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, gl);
2247    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
2248    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
2249    elm_box_pack_end(bx2, bt);
2250    evas_object_show(bt);
2251
2252    bt = elm_button_add(win);
2253    elm_object_text_set(bt, "+ after");
2254    evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, gl);
2255    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
2256    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
2257    elm_box_pack_end(bx2, bt);
2258    evas_object_show(bt);
2259
2260    elm_box_pack_end(bx, bx2);
2261    evas_object_show(bx2);
2262
2263    evas_object_resize(win, 320, 320);
2264    evas_object_show(win);
2265 }
2266 #endif