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