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