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