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