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