d13c17399c28518abe663bc37d37559b7b51174e
[framework/uifw/elementary.git] / src / bin / test_index.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6 static Elm_Genlist_Item_Class itci;
7 char *gli_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
8 {
9    char buf[256];
10    int j = (long)data;
11    snprintf(buf, sizeof(buf), "%c%c",
12             'A' + ((j >> 4) & 0xf),
13             'a' + ((j     ) & 0xf)
14             );
15    return strdup(buf);
16 }
17
18 void
19 index_changed2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
20 {
21    // called on a change but delayed in case multiple changes happen in a
22    // short timespan
23    elm_genlist_item_top_bring_in(elm_object_item_data_get(event_info));
24 }
25
26 void
27 index_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
28 {
29    // this is calld on every change, no matter how often
30    // elm_genlist_item_bring_in(event_info);
31 }
32
33 void
34 index_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
35 {
36    // called on final select
37    elm_genlist_item_top_bring_in(elm_object_item_data_get(event_info));
38 }
39
40 void
41 test_index(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
42 {
43    Evas_Object *win, *bg, *gl, *id;
44    Elm_Object_Item *glit;
45    int i, j;
46
47    win = elm_win_add(NULL, "index", ELM_WIN_BASIC);
48    elm_win_title_set(win, "Index");
49    elm_win_autodel_set(win, EINA_TRUE);
50
51    bg = elm_bg_add(win);
52    elm_win_resize_object_add(win, bg);
53    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
54    evas_object_show(bg);
55
56    gl = elm_genlist_add(win);
57    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
58    elm_win_resize_object_add(win, gl);
59    evas_object_show(gl);
60
61    id = elm_index_add(win);
62    evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
63    elm_win_resize_object_add(win, id);
64
65    evas_object_show(id);
66
67    itci.item_style     = "default";
68    itci.func.text_get = gli_text_get;
69    itci.func.content_get  = NULL;
70    itci.func.state_get = NULL;
71    itci.func.del       = NULL;
72
73    j = 0;
74    for (i = 0; i < 100; i++)
75      {
76         glit = elm_genlist_item_append(gl, &itci,
77                                        (void *)(long)j/* item data */,
78                                        NULL/* parent */,
79                                        ELM_GENLIST_ITEM_NONE,
80                                        NULL/* func */, NULL/* func data */);
81         if (!(j & 0xf))
82           {
83              char buf[32];
84
85              snprintf(buf, sizeof(buf), "%c", 'A' + ((j >> 4) & 0xf));
86              elm_index_item_append(id, buf, glit);
87           }
88         j += 2;
89      }
90    evas_object_smart_callback_add(id, "delay,changed", index_changed2, NULL);
91    evas_object_smart_callback_add(id, "changed", index_changed, NULL);
92    evas_object_smart_callback_add(id, "selected", index_selected, NULL);
93    elm_index_item_go(id, 0);
94
95    evas_object_resize(win, 320, 480);
96    evas_object_show(win);
97 }
98
99 /***********/
100
101 typedef struct _Test_Index2_Elements
102 {
103    Evas_Object *entry, *lst, *id;
104 } Test_Index2_Elements;
105
106 void
107 test_index2_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
108 {
109    /* FIXME it won't be called if elm_test main window is closed */
110    free(data);
111 }
112
113 int
114 test_index2_cmp(const void *data1, const void *data2)
115 {
116    const char *label1, *label2;
117    const Elm_Object_Item *li_it1 = data1;
118    const Elm_Object_Item *li_it2 = data2;
119
120    label1 = elm_object_item_text_get(li_it1);
121    label2 = elm_object_item_text_get(li_it2);
122
123    return strcasecmp(label1, label2);
124 }
125
126 int
127 test_index2_icmp(const void *data1, const void *data2)
128 {
129    const char *label1, *label2;
130    const Elm_Object_Item *index_it1 = data1;
131    const Elm_Object_Item *index_it2 = data2;
132
133    label1 = elm_index_item_letter_get(index_it1);
134    label2 = elm_index_item_letter_get(index_it2);
135
136    return strcasecmp(label1, label2);
137 }
138
139 void
140 test_index2_it_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
141 {
142    Test_Index2_Elements *gui = data;
143    Elm_Object_Item *list_it;
144    const char *label;
145    char letter[2];
146
147    label = elm_object_text_get(gui->entry);
148    snprintf(letter, sizeof(letter), "%c", label[0]);
149    list_it = elm_list_item_sorted_insert(gui->lst, label, NULL, NULL, NULL,
150                                          NULL, test_index2_cmp);
151    elm_index_item_sorted_insert(gui->id, letter, list_it, test_index2_icmp,
152                                 test_index2_cmp);
153    elm_list_go(gui->lst);
154    /* FIXME it's not showing the recently added item */
155    elm_list_item_show(list_it);
156 }
157
158 void
159 test_index2_it_del(void *data, Evas_Object *obj, void *event_info __UNUSED__)
160 {
161    Test_Index2_Elements *gui = data;
162    const char *label, *label_next;
163    Elm_Object_Item *list_it, *list_it_next;
164    Elm_Object_Item *iit;
165
166    list_it = elm_list_selected_item_get(obj);
167    list_it_next = elm_list_item_next(list_it);
168
169    if (!list_it_next)
170      {
171         iit = elm_index_item_find(gui->id, list_it);
172         if (iit) elm_object_item_del(iit);
173         elm_list_item_del(list_it);
174         return;
175      }
176
177    label = elm_object_item_text_get(list_it);
178    label_next = elm_object_item_text_get(list_it_next);
179
180    iit = elm_index_item_find(gui->id, list_it);
181    if (label[0] == label_next[0])
182      elm_object_item_data_set(iit, list_it_next);
183    else
184      elm_object_item_del(iit);
185
186    elm_list_item_del(list_it);
187 }
188
189 void
190 test_index2_id_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
191 {
192    elm_list_item_show(elm_object_item_data_get(event_info));
193 }
194
195 void
196 test_index2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
197 {
198    Evas_Object *win, *bg, *box, *bt;
199    Test_Index2_Elements *gui;
200
201    gui = malloc(sizeof(*gui));
202
203    win = elm_win_add(NULL, "sorted-index-list", ELM_WIN_BASIC);
204    elm_win_title_set(win, "Sorted Index and List");
205    evas_object_smart_callback_add(win, "delete,request", test_index2_del, gui);
206    elm_win_autodel_set(win, EINA_TRUE);
207
208    bg = elm_bg_add(win);
209    elm_win_resize_object_add(win, bg);
210    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
211    evas_object_show(bg);
212
213    box = elm_box_add(win);
214    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
215    elm_win_resize_object_add(win, box);
216    evas_object_show(box);
217
218    gui->id = elm_index_add(win);
219    evas_object_size_hint_weight_set(gui->id, EVAS_HINT_EXPAND,
220          EVAS_HINT_EXPAND);
221    elm_win_resize_object_add(win, gui->id);
222    evas_object_smart_callback_add(gui->id, "delay,changed",
223          test_index2_id_changed, NULL);
224    evas_object_show(gui->id);
225
226    gui->entry = elm_entry_add(win);
227    elm_entry_scrollable_set(gui->entry, EINA_TRUE);
228    elm_object_text_set(gui->entry, "Label");
229    elm_entry_single_line_set(gui->entry, EINA_TRUE);
230    evas_object_size_hint_weight_set(gui->entry, EVAS_HINT_EXPAND, 0);
231    evas_object_size_hint_fill_set(gui->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
232    elm_box_pack_end(box, gui->entry);
233    evas_object_show(gui->entry);
234
235    bt = elm_button_add(win);
236    elm_object_text_set(bt, "Add");
237    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
238    evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
239    elm_box_pack_end(box, bt);
240    evas_object_smart_callback_add(bt, "clicked", test_index2_it_add, gui);
241    evas_object_show(bt);
242
243    gui->lst = elm_list_add(win);
244    elm_box_pack_end(box, gui->lst);
245    evas_object_size_hint_weight_set(gui->lst, EVAS_HINT_EXPAND,
246          EVAS_HINT_EXPAND);
247    evas_object_size_hint_fill_set(gui->lst, EVAS_HINT_FILL, EVAS_HINT_FILL);
248    evas_object_smart_callback_add(gui->lst, "selected", test_index2_it_del,
249          gui);
250    elm_list_go(gui->lst);
251    evas_object_show(gui->lst);
252
253    evas_object_resize(win, 320, 480);
254    evas_object_show(win);
255 }
256 #endif