Initialize Tizen 2.3
[framework/uifw/elementary.git] / mobile / src / examples / genlist_example_04.c
1 //Compile with:
2 //gcc -g genlist_example_04.c -o genlist_example_04 `pkg-config --cflags --libs elementary`
3
4 #include <Elementary.h>
5
6 #define N_ITEMS 300
7
8 static Elm_Genlist_Item_Class *_itc = NULL;
9 static Elm_Genlist_Item_Class *_itc_group = NULL;
10 static int nitems = 0;
11
12 static char *
13 _item_label_get(void *data, Evas_Object *obj, const char *part)
14 {
15    time_t t = (time_t)ecore_time_unix_get();
16    char buf[256];
17    int i = (int)(long)data;
18
19    if (!strcmp(part, "elm.text"))
20      snprintf(buf, sizeof(buf), "Item # %i", i);
21    else
22      {
23         int n;
24         snprintf(buf, sizeof(buf), "realized at %s", ctime(&t));
25         n = strlen(buf);
26         buf[n - 1] = '\0';
27      }
28
29    return strdup(buf);
30 }
31
32 static Evas_Object *
33 _item_content_get(void *data, Evas_Object *obj, const char *part)
34 {
35    Evas_Object *ic = elm_icon_add(obj);
36
37    if (!strcmp(part, "elm.swallow.icon"))
38      elm_icon_standard_set(ic, "clock");
39
40    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
41    return ic;
42 }
43
44 static void
45 _item_sel_cb(void *data, Evas_Object *obj, void *event_info)
46 {
47    printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n",
48           data, obj, event_info);
49 }
50
51 static char *
52 _group_label_get(void *data, Evas_Object *obj, const char *part)
53 {
54    char buf[256];
55    int i = (int)(long)data;
56
57    snprintf(buf, sizeof(buf), "Group %d (item #%d)", i / 7, i);
58
59    return strdup(buf);
60 }
61
62 static Evas_Object *
63 _group_content_get(void *data, Evas_Object *obj, const char *part)
64 {
65    Evas_Object *ic = elm_icon_add(obj);
66
67    if (!strcmp(part, "elm.swallow.icon"))
68      elm_icon_standard_set(ic, "home");
69
70    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
71    return ic;
72 }
73
74 static void
75 _append_cb(void *data, Evas_Object *o, void *event_info)
76 {
77    Evas_Object *list = data;
78
79    elm_genlist_item_append(list, _itc,
80                            (void *)(long)nitems++, NULL,
81                            ELM_GENLIST_ITEM_NONE,
82                            _item_sel_cb, NULL);
83
84 }
85
86 static void
87 _prepend_cb(void *data, Evas_Object *o, void *event_info)
88 {
89    Evas_Object *list = data;
90
91    elm_genlist_item_prepend(list, _itc,
92                             (void *)(long)nitems++, NULL,
93                             ELM_GENLIST_ITEM_NONE,
94                             _item_sel_cb, NULL);
95
96 }
97
98 static void
99 _insert_before_cb(void *data, Evas_Object *o, void *event_info)
100 {
101    Evas_Object *list = data;
102    Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
103
104    if (!glit) return;
105
106    elm_genlist_item_insert_before(list, _itc,
107                                   (void *)(long)nitems++, NULL,
108                                   glit, ELM_GENLIST_ITEM_NONE,
109                                   _item_sel_cb, NULL);
110
111 }
112
113 static void
114 _insert_after_cb(void *data, Evas_Object *o, void *event_info)
115 {
116    Evas_Object *list = data;
117    Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
118
119    if (!glit) return;
120
121    elm_genlist_item_insert_after(list, _itc,
122                                  (void *)(long)nitems++, NULL,
123                                  glit, ELM_GENLIST_ITEM_NONE,
124                                  _item_sel_cb, NULL);
125
126 }
127
128 static void
129 _next_cb(void *data, Evas_Object *o, void *event_info)
130 {
131    Evas_Object *list = data;
132    Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
133
134    if (glit) glit = elm_genlist_item_next_get(glit);
135    if (!glit) glit = elm_genlist_first_item_get(list);
136
137    elm_genlist_item_selected_set(glit, EINA_TRUE);
138    elm_genlist_item_show(glit, ELM_GENLIST_ITEM_SCROLLTO_IN);
139 }
140
141 static void
142 _prev_cb(void *data, Evas_Object *o, void *event_info)
143 {
144    Evas_Object *list = data;
145    Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
146
147    if (glit) glit = elm_genlist_item_prev_get(glit);
148    if (!glit) glit = elm_genlist_last_item_get(list);
149
150    elm_genlist_item_selected_set(glit, EINA_TRUE);
151    elm_genlist_item_show(glit, ELM_GENLIST_ITEM_SCROLLTO_IN);
152 }
153
154 static void
155 _bring_in_cb(void *data, Evas_Object *o, void *event_info)
156 {
157    Elm_Object_Item *glit = data;
158    if (!glit) return;
159
160    elm_genlist_item_bring_in(glit, ELM_GENLIST_ITEM_SCROLLTO_IN);
161 }
162
163 static void
164 _show_cb(void *data, Evas_Object *o, void *event_info)
165 {
166    Elm_Object_Item *glit = data;
167    if (!glit) return;
168
169    elm_genlist_item_show(glit, ELM_GENLIST_ITEM_SCROLLTO_IN);
170 }
171
172 static void
173 _middle_in_cb(void *data, Evas_Object *o, void *event_info)
174 {
175    Elm_Object_Item *glit = data;
176    if (!glit) return;
177
178    elm_genlist_item_bring_in(glit, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
179 }
180
181 static void
182 _middle_show_cb(void *data, Evas_Object *o, void *event_info)
183 {
184    Elm_Object_Item *glit = data;
185    if (!glit) return;
186
187    elm_genlist_item_show(glit, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
188 }
189
190 static void
191 _top_in_cb(void *data, Evas_Object *o, void *event_info)
192 {
193    Elm_Object_Item *glit = data;
194    if (!glit) return;
195
196    elm_genlist_item_bring_in(glit, ELM_GENLIST_ITEM_SCROLLTO_TOP);
197 }
198
199 static void
200 _top_show_cb(void *data, Evas_Object *o, void *event_info)
201 {
202    Elm_Object_Item *glit = data;
203    if (!glit) return;
204
205    elm_genlist_item_show(glit, ELM_GENLIST_ITEM_SCROLLTO_TOP);
206 }
207
208 static void
209 _realize_cb(void *data, Evas_Object *o, void *event_info)
210 {
211    Evas_Object *list = data;
212    Elm_Object_Item *glit = elm_genlist_selected_item_get(list);
213    if (!glit) return;
214
215    elm_genlist_item_update(glit);
216 }
217
218 static Evas_Object *
219 _button_add(Evas_Object *list, Evas_Object *box, const char *label, Evas_Smart_Cb cb)
220 {
221    Evas_Object *bt;
222
223    bt = elm_button_add(elm_object_parent_widget_get(list));
224    elm_object_text_set(bt, label);
225    elm_box_pack_end(box, bt);
226    evas_object_show(bt);
227
228    if (cb)
229      evas_object_smart_callback_add(bt, "clicked", cb, list);
230
231    return bt;
232 }
233
234 EAPI_MAIN int
235 elm_main(int argc, char **argv)
236 {
237    Evas_Object *win, *bg, *box, *fbox;
238    Evas_Object *list;
239    Evas_Object *bt_bring_in, *bt_show;
240    Evas_Object *bt_middle_in, *bt_middle_show;
241    Evas_Object *bt_top_in, *bt_top_show;
242    int i;
243
244    win = elm_win_add(NULL, "icon", ELM_WIN_BASIC);
245    elm_win_title_set(win, "Icon");
246    elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
247    elm_win_autodel_set(win, EINA_TRUE);
248
249    bg = elm_bg_add(win);
250    elm_bg_color_set(bg, 255,255 ,255);
251    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
252    elm_win_resize_object_add(win, bg);
253    evas_object_show(bg);
254
255    box = elm_box_add(win);
256    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
257    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
258    elm_win_resize_object_add(win, box);
259    evas_object_show(box);
260
261    if (!_itc)
262      {
263         _itc = elm_genlist_item_class_new();
264         _itc->item_style = "default";
265         _itc->func.text_get = _item_label_get;
266         _itc->func.content_get = _item_content_get;
267         _itc->func.state_get = NULL;
268         _itc->func.del = NULL;
269      }
270
271    if (!_itc_group)
272      {
273         _itc_group = elm_genlist_item_class_new();
274         _itc_group->item_style = "group_index";
275         _itc_group->func.text_get = _group_label_get;
276         _itc_group->func.content_get = _group_content_get;
277         _itc_group->func.state_get = NULL;
278         _itc_group->func.del = NULL;
279      }
280    list = elm_genlist_add(win);
281
282    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
283    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
284    elm_box_pack_end(box, list);
285    evas_object_show(list);
286
287    fbox = elm_box_add(win);
288    elm_box_layout_set(fbox, evas_object_box_layout_flow_horizontal,
289                       NULL, NULL);
290    evas_object_size_hint_weight_set(fbox, EVAS_HINT_EXPAND, 0);
291    evas_object_size_hint_align_set(fbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
292    elm_box_pack_end(box, fbox);
293    evas_object_show(fbox);
294
295    _button_add(list, fbox, "prepend", _prepend_cb);
296    _button_add(list, fbox, "append", _append_cb);
297    _button_add(list, fbox, "insert before", _insert_before_cb);
298    _button_add(list, fbox, "insert after", _insert_after_cb);
299    _button_add(list, fbox, "prev", _prev_cb);
300    _button_add(list, fbox, "next", _next_cb);
301    _button_add(list, fbox, "realize", _realize_cb);
302    bt_bring_in = _button_add(list, fbox, "bring #50", NULL);
303    bt_show = _button_add(list, fbox, "show #50", NULL);
304    bt_middle_in = _button_add(list, fbox, "bring to middle #200", NULL);
305    bt_middle_show = _button_add(list, fbox, "show in middle #200", NULL);
306    bt_top_in = _button_add(list, fbox, "bring to top #250", NULL);
307    bt_top_show = _button_add(list, fbox, "show in top #250", NULL);
308
309    for (i = 0; i < N_ITEMS; i++)
310      {
311         Elm_Object_Item *gli, *glg;
312
313         if (i % 7 == 0)
314           {
315              glg = gli = elm_genlist_item_append(list, _itc_group,
316                                                  (void *)(long)nitems++, NULL,
317                                                  ELM_GENLIST_ITEM_GROUP,
318                                                  _item_sel_cb, NULL);
319              elm_genlist_item_select_mode_set(gli, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
320           }
321         else
322           {
323              gli = elm_genlist_item_append(list, _itc,
324                                            (void *)(long)nitems++, glg,
325                                            ELM_GENLIST_ITEM_NONE,
326                                            _item_sel_cb, NULL);
327           }
328
329         switch (i)
330           {
331            case 3:
332               elm_object_item_disabled_set(gli, EINA_TRUE);
333               break;
334            case 50:
335               evas_object_smart_callback_add(
336                  bt_bring_in, "clicked", _bring_in_cb, gli);
337               evas_object_smart_callback_add(
338                  bt_show, "clicked", _show_cb, gli);
339               break;
340            case 200:
341               evas_object_smart_callback_add(
342                  bt_middle_in, "clicked", _middle_in_cb, gli);
343               evas_object_smart_callback_add(
344                  bt_middle_show, "clicked", _middle_show_cb, gli);
345               break;
346            case 250:
347               evas_object_smart_callback_add(
348                  bt_top_in, "clicked", _top_in_cb, gli);
349               evas_object_smart_callback_add(
350                  bt_top_show, "clicked", _top_show_cb, gli);
351           }
352      }
353
354    evas_object_resize(win, 420, 320);
355    evas_object_show(win);
356
357    elm_run();
358    elm_shutdown();
359
360    return 0;
361 }
362 ELM_MAIN()