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