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