elementary: updated sources to fix warnings.
[framework/uifw/elementary.git] / src / bin / test_index.c
1 #include <Elementary.h>
2 #include "test.h"
3 #ifdef HAVE_CONFIG_H
4 # include "elementary_config.h"
5 #endif
6 #ifndef ELM_LIB_QUICKLAUNCH
7 struct _Idx_Data_Type
8 {
9    Evas_Object *id;  /* Pointer to Index */
10    Elm_Object_Item *item; /* Item we use for search */
11 };
12 typedef struct _Idx_Data_Type Idx_Data_Type;
13
14 struct _api_data
15 {
16    unsigned int state;  /* What state we are testing       */
17    Idx_Data_Type dt;
18 };
19 typedef struct _api_data api_data;
20
21 enum _api_state
22 {
23    INDEX_LEVEL_SET,
24    INDEX_ACTIVE_SET,
25    INDEX_APPEND_RELATIVE,
26    INDEX_PREPEND,
27    INDEX_ITEM_DEL,
28    INDEX_ITEM_FIND,
29    INDEX_CLEAR,
30    API_STATE_LAST
31 };
32 typedef enum _api_state api_state;
33
34 static void
35 set_api_state(api_data *api)
36 {
37    Idx_Data_Type *d = &api->dt;
38    switch(api->state)
39      { /* Put all api-changes under switch */
40       case INDEX_LEVEL_SET: /* 0 */
41          elm_index_active_set(d->id, EINA_TRUE);
42          elm_index_item_level_set(d->id, (elm_index_item_level_get(d->id) ? 0 : 1));
43          break;
44
45       case INDEX_ACTIVE_SET: /* 1 */
46          elm_index_active_set(d->id, EINA_FALSE);
47          break;
48
49       case INDEX_APPEND_RELATIVE: /* 2 */
50              elm_index_item_append_relative(d->id, "W", d->item, elm_index_item_find(d->id, d->item));
51          break;
52
53       case INDEX_PREPEND: /* 3 */
54              elm_index_item_prepend(d->id, "D", d->item);
55          break;
56
57       case INDEX_ITEM_DEL: /* 4 */
58          elm_object_item_del(elm_index_item_find(d->id, d->item));
59          break;
60
61       case INDEX_ITEM_FIND: /* 5 */
62            {
63               Elm_Object_Item *i = elm_index_item_find(d->id, d->item);
64               if(i)
65                 {
66                    printf("Item Find - Found Item.\n");
67                    elm_object_item_del(i);
68                 }
69            }
70          break;
71
72       case INDEX_CLEAR: /* 6 */
73          elm_index_item_clear(d->id);
74          break;
75
76       case API_STATE_LAST:
77          break;
78
79       default:
80          return;
81      }
82 }
83
84 static void
85 _api_bt_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
86 {  /* Will add here a SWITCH command containing code to modify test-object */
87    /* in accordance a->state value. */
88    api_data *a = data;
89    char str[128];
90
91    printf("clicked event on API Button: api_state=<%d>\n", a->state);
92    set_api_state(a);
93    a->state++;
94    sprintf(str, "Next API function (%u)", a->state);
95    elm_object_text_set(obj, str);
96    elm_object_disabled_set(obj, a->state == API_STATE_LAST);
97 }
98
99 static Elm_Genlist_Item_Class itci;
100 char *gli_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
101 {
102    char buf[256];
103    int j = (long)data;
104    snprintf(buf, sizeof(buf), "%c%c",
105             'A' + ((j >> 4) & 0xf),
106             'a' + ((j     ) & 0xf)
107             );
108    return strdup(buf);
109 }
110
111 void
112 _index_delay_changed_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
113 {
114    // called on a change but delayed in case multiple changes happen in a
115    // short timespan
116    elm_genlist_item_top_bring_in(elm_object_item_data_get(event_info));
117 }
118
119 void
120 _index_changed_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
121 {
122    // this is calld on every change, no matter how often
123    // elm_genlist_item_bring_in(event_info);
124 }
125
126 void
127 _index_selected_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
128 {
129    // called on final select
130    elm_genlist_item_top_bring_in(elm_object_item_data_get(event_info));
131 }
132
133 static void
134 _cleanup_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
135 {
136    free(data);
137 }
138
139 void
140 test_index(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
141 {
142    Evas_Object *win, *bg, *bxx, *gl, *id, *bt;
143    Elm_Object_Item *glit;
144    int i, j;
145    api_data *api = calloc(1, sizeof(api_data));
146
147    win = elm_win_add(NULL, "index", ELM_WIN_BASIC);
148    elm_win_title_set(win, "Index");
149    elm_win_autodel_set(win, EINA_TRUE);
150    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
151
152    bg = elm_bg_add(win);
153    elm_win_resize_object_add(win, bg);
154    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
155    evas_object_show(bg);
156
157    bxx = elm_box_add(win);
158    elm_win_resize_object_add(win, bxx);
159    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
160    evas_object_show(bxx);
161
162    gl = elm_genlist_add(win);
163    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
164    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
165    evas_object_show(gl);
166
167    api->dt.id = id = elm_index_add(win);
168    evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
169    evas_object_size_hint_align_set(id, EVAS_HINT_FILL, EVAS_HINT_FILL);
170    elm_win_resize_object_add(win, id);
171
172    bt = elm_button_add(win);
173    elm_object_text_set(bt, "Next API function");
174    evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api);
175    elm_box_pack_end(bxx, bt);
176    elm_object_disabled_set(bt, api->state == API_STATE_LAST);
177    evas_object_show(bt);
178
179    elm_box_pack_end(bxx, gl);
180
181    evas_object_show(id);
182
183    itci.item_style     = "default";
184    itci.func.text_get = gli_text_get;
185    itci.func.content_get  = NULL;
186    itci.func.state_get = NULL;
187    itci.func.del       = NULL;
188
189    j = 0;
190    for (i = 0; i < 100; i++)
191      {
192         glit = elm_genlist_item_append(gl, &itci,
193                                        (void *)(long)j/* item data */,
194                                        NULL/* parent */,
195                                        ELM_GENLIST_ITEM_NONE,
196                                        NULL/* func */, NULL/* func data */);
197         if (!(j & 0xf))
198           {
199              char buf[32];
200
201              snprintf(buf, sizeof(buf), "%c", 'A' + ((j >> 4) & 0xf));
202              elm_index_item_append(id, buf, glit);
203
204              if (*buf == 'G')  /* Just init dt->item later used in API test */
205                api->dt.item = glit;
206           }
207         j += 2;
208      }
209    evas_object_smart_callback_add(id, "delay,changed", _index_delay_changed_cb, NULL);
210    evas_object_smart_callback_add(id, "changed", _index_changed_cb, NULL);
211    evas_object_smart_callback_add(id, "selected", _index_selected_cb, NULL);
212    elm_index_item_go(id, 0);
213
214    evas_object_resize(win, 320, 480);
215    evas_object_show(win);
216 }
217
218 /***********/
219
220 typedef struct _Test_Index2_Elements
221 {
222    Evas_Object *entry, *lst, *id;
223 } Test_Index2_Elements;
224
225 void
226 test_index2_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
227 {
228    /* FIXME it won't be called if elm_test main window is closed */
229    free(data);
230 }
231
232 int
233 test_index2_cmp(const void *data1, const void *data2)
234 {
235    const char *label1, *label2;
236    const Elm_Object_Item *li_it1 = data1;
237    const Elm_Object_Item *li_it2 = data2;
238
239    label1 = elm_object_item_text_get(li_it1);
240    label2 = elm_object_item_text_get(li_it2);
241
242    return strcasecmp(label1, label2);
243 }
244
245 int
246 test_index2_icmp(const void *data1, const void *data2)
247 {
248    const char *label1, *label2;
249    const Elm_Object_Item *index_it1 = data1;
250    const Elm_Object_Item *index_it2 = data2;
251
252    label1 = elm_index_item_letter_get(index_it1);
253    label2 = elm_index_item_letter_get(index_it2);
254
255    return strcasecmp(label1, label2);
256 }
257
258 void
259 test_index2_it_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
260 {
261    Test_Index2_Elements *gui = data;
262    Elm_Object_Item *list_it;
263    const char *label;
264    char letter[2];
265
266    label = elm_object_text_get(gui->entry);
267    snprintf(letter, sizeof(letter), "%c", label[0]);
268    list_it = elm_list_item_sorted_insert(gui->lst, label, NULL, NULL, NULL,
269                                          NULL, test_index2_cmp);
270    elm_index_item_sorted_insert(gui->id, letter, list_it, test_index2_icmp,
271                                 test_index2_cmp);
272    elm_list_go(gui->lst);
273    /* FIXME it's not showing the recently added item */
274    elm_list_item_show(list_it);
275 }
276
277 void
278 test_index2_it_del(void *data, Evas_Object *obj, void *event_info __UNUSED__)
279 {
280    Test_Index2_Elements *gui = data;
281    const char *label, *label_next;
282    Elm_Object_Item *list_it, *list_it_next;
283    Elm_Object_Item *iit;
284
285    list_it = elm_list_selected_item_get(obj);
286    list_it_next = elm_list_item_next(list_it);
287
288    if (!list_it_next)
289      {
290         iit = elm_index_item_find(gui->id, list_it);
291         if (iit) elm_object_item_del(iit);
292         elm_object_item_del(list_it);
293         return;
294      }
295
296    label = elm_object_item_text_get(list_it);
297    label_next = elm_object_item_text_get(list_it_next);
298
299    iit = elm_index_item_find(gui->id, list_it);
300    if (label[0] == label_next[0])
301      elm_object_item_data_set(iit, list_it_next);
302    else
303      elm_object_item_del(iit);
304
305    elm_object_item_del(list_it);
306 }
307
308 void
309 test_index2_id_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
310 {
311    elm_list_item_show(elm_object_item_data_get(event_info));
312 }
313
314 void
315 test_index2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
316 {
317    Evas_Object *win, *bg, *box, *bt;
318    Test_Index2_Elements *gui;
319
320    gui = malloc(sizeof(*gui));
321
322    win = elm_win_add(NULL, "sorted-index-list", ELM_WIN_BASIC);
323    elm_win_title_set(win, "Sorted Index and List");
324    evas_object_smart_callback_add(win, "delete,request", test_index2_del, gui);
325    elm_win_autodel_set(win, EINA_TRUE);
326
327    bg = elm_bg_add(win);
328    elm_win_resize_object_add(win, bg);
329    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
330    evas_object_show(bg);
331
332    box = elm_box_add(win);
333    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
334    elm_win_resize_object_add(win, box);
335    evas_object_show(box);
336
337    gui->id = elm_index_add(win);
338    evas_object_size_hint_weight_set(gui->id, EVAS_HINT_EXPAND,
339          EVAS_HINT_EXPAND);
340    elm_win_resize_object_add(win, gui->id);
341    evas_object_smart_callback_add(gui->id, "delay,changed",
342          test_index2_id_changed, NULL);
343    evas_object_show(gui->id);
344
345    gui->entry = elm_entry_add(win);
346    elm_entry_scrollable_set(gui->entry, EINA_TRUE);
347    elm_object_text_set(gui->entry, "Label");
348    elm_entry_single_line_set(gui->entry, EINA_TRUE);
349    evas_object_size_hint_weight_set(gui->entry, EVAS_HINT_EXPAND, 0);
350    evas_object_size_hint_fill_set(gui->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
351    elm_box_pack_end(box, gui->entry);
352    evas_object_show(gui->entry);
353
354    bt = elm_button_add(win);
355    elm_object_text_set(bt, "Add");
356    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
357    evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
358    elm_box_pack_end(box, bt);
359    evas_object_smart_callback_add(bt, "clicked", test_index2_it_add, gui);
360    evas_object_show(bt);
361
362    gui->lst = elm_list_add(win);
363    elm_box_pack_end(box, gui->lst);
364    evas_object_size_hint_weight_set(gui->lst, EVAS_HINT_EXPAND,
365          EVAS_HINT_EXPAND);
366    evas_object_size_hint_fill_set(gui->lst, EVAS_HINT_FILL, EVAS_HINT_FILL);
367    evas_object_smart_callback_add(gui->lst, "selected", test_index2_it_del,
368          gui);
369    elm_list_go(gui->lst);
370    evas_object_show(gui->lst);
371
372    evas_object_resize(win, 320, 480);
373    evas_object_show(win);
374 }
375 #endif