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