[access] move mouse postion if an object has a highlight by highlight_cycle(); not...
[framework/uifw/elementary.git] / src / examples / entry_example.c
1 /*
2  * gcc -o entry_example entry_example.c `pkg-config --cflags --libs elementary`
3  */
4 #include <Elementary.h>
5
6 typedef struct
7 {
8    Evas_Object *win;
9    Evas_Object *edit_buffer;
10 } App_Data;
11
12 typedef struct
13 {
14    Evas_Object *inwin;
15    Evas_Object *naviframe;
16    Evas_Object *grid;
17    Evas_Object *settings;
18
19    int size;
20    int vsize;
21    int width, height;
22
23    const char *emo;
24
25    App_Data *ad;
26 } App_Inwin_Data;
27
28 static void
29 _edit_buffer_insert(Evas_Object *e, const char *text)
30 {
31    elm_entry_entry_insert(e, text);
32    elm_object_focus_set(e, EINA_TRUE);
33 }
34
35 static void
36 _it_sel_cb(void *data, Evas_Object *obj, void *event)
37 {
38    App_Inwin_Data *aid = data;
39    Elm_Object_Item *gg_it = event;
40
41    aid->emo = elm_object_item_data_get(gg_it);
42
43    elm_naviframe_item_simple_promote(aid->naviframe, aid->settings);
44 }
45
46 static char *
47 _emo_label_get(void *data, Evas_Object *obj, const char *part)
48 {
49    return strdup(data);
50 }
51
52 static Evas_Object *
53 _emo_content_get(void *data, Evas_Object *obj, const char *part)
54 {
55    Evas_Object *o;
56
57    if (strcmp(part, "elm.swallow.icon"))
58      return NULL;
59    o = elm_layout_add(obj);
60    elm_layout_theme_set(o, "entry/emoticon", data, "default");
61    return o;
62 }
63
64 static void
65 _emo_del(void *data, Evas_Object *obj)
66 {
67    free(data);
68 }
69
70 static Evas_Object *
71 _page_grid_add(Evas_Object *parent, App_Inwin_Data *aid)
72 {
73    Evas_Object *grid;
74    char *theme, *emo;
75    Eina_List *emos, *it;
76    static Elm_Gengrid_Item_Class *it_class;
77    it_class = elm_gengrid_item_class_new();
78    it_class->item_style = "default";
79    it_class->func.text_get = _emo_label_get;
80    it_class->func.content_get = _emo_content_get;
81    it_class->func.del = _emo_del;
82
83    theme = elm_theme_list_item_path_get("default", NULL);
84    if (!theme) return NULL;
85    emos = edje_file_collection_list(theme);
86    free(theme);
87    if (!emos) return NULL;
88
89    grid = elm_gengrid_add(parent);
90    elm_gengrid_item_size_set(grid, 64, 80);
91    evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
92    evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
93
94    EINA_LIST_FOREACH(emos, it, emo)
95      {
96         char name[512];
97
98         if (strncmp(emo, "elm/entry/emoticon/", 19))
99           continue;
100         sscanf(emo, "elm/entry/emoticon/%[^/]/default", name);
101         elm_gengrid_item_append(grid, it_class, strdup(name), _it_sel_cb, aid);
102      }
103    edje_file_collection_list_free(emos);
104    elm_gengrid_item_class_free(it_class);
105
106    return grid;
107 }
108
109 static void
110 _btn_insert_cb(void *data, Evas_Object *obj, void *event)
111 {
112    App_Inwin_Data *aid = data;
113    const char *size[] = {
114         "size",
115         "absize",
116         "relsize"
117    };
118    const char *vsize[] = {
119         "full",
120         "ascent"
121    };
122    char buf[512];
123
124    snprintf(buf, sizeof(buf), "<item %s=%dx%d vsize=%s href=emoticon/%s>"
125             "</item>", size[aid->size], aid->width, aid->height,
126             vsize[aid->vsize], aid->emo);
127    _edit_buffer_insert(aid->ad->edit_buffer, buf);
128
129    evas_object_del(aid->inwin);
130 }
131
132 static void
133 _width_changed_cb(void *data, Evas_Object *obj, void *event)
134 {
135    App_Inwin_Data *aid = data;
136
137    aid->width = atoi(elm_object_text_get(obj));
138 }
139
140 static void
141 _height_changed_cb(void *data, Evas_Object *obj, void *event)
142 {
143    App_Inwin_Data *aid = data;
144
145    aid->height = atoi(elm_object_text_get(obj));
146 }
147
148 static Evas_Object *
149 _page_settings_add(Evas_Object *parent, App_Inwin_Data *aid)
150 {
151    Evas_Object *box, *sizeopts, *box2, *sizebox, *vsizebox,
152                *rsize, *rabsize, *rrelsize, *rvfull, *rvascent,
153                *fwidth, *ewidth, *fheight, *eheight,
154                *binsert;
155    char buf[100];
156    static Elm_Entry_Filter_Accept_Set accept_set = {
157         .accepted = "0123456789",
158         .rejected = NULL
159    };
160    static Elm_Entry_Filter_Limit_Size limit_size = {
161         .max_char_count = 5,
162         .max_byte_count = 0
163    };
164
165    box = elm_box_add(parent);
166    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
167    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
168
169    sizeopts = elm_frame_add(parent);
170    elm_object_text_set(sizeopts, "Size");
171    evas_object_size_hint_weight_set(sizeopts, EVAS_HINT_EXPAND, 0.0);
172    evas_object_size_hint_align_set(sizeopts, EVAS_HINT_FILL, EVAS_HINT_FILL);
173    elm_box_pack_end(box, sizeopts);
174    evas_object_show(sizeopts);
175
176    box2 = elm_box_add(parent);
177    evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
178    evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
179    elm_object_content_set(sizeopts, box2);
180    evas_object_show(box2);
181
182    sizebox = elm_box_add(parent);
183    elm_box_horizontal_set(sizebox, EINA_TRUE);
184    evas_object_size_hint_weight_set(sizebox, EVAS_HINT_EXPAND,
185                                     EVAS_HINT_EXPAND);
186    evas_object_size_hint_align_set(sizebox, EVAS_HINT_FILL, EVAS_HINT_FILL);
187    elm_box_pack_end(box2, sizebox);
188    evas_object_show(sizebox);
189
190    rsize = elm_radio_add(parent);
191    elm_object_text_set(rsize, "Scale adjusted (size)");
192    elm_radio_state_value_set(rsize, 0);
193    elm_radio_value_pointer_set(rsize, &aid->size);
194    elm_box_pack_end(sizebox, rsize);
195    evas_object_show(rsize);
196
197    rabsize = elm_radio_add(parent);
198    elm_object_text_set(rabsize, "Absolute size (absize)");
199    elm_radio_state_value_set(rabsize, 1);
200    elm_radio_value_pointer_set(rabsize, &aid->size);
201    elm_radio_group_add(rabsize, rsize);
202    elm_box_pack_end(sizebox, rabsize);
203    evas_object_show(rabsize);
204
205    rrelsize = elm_radio_add(parent);
206    elm_object_text_set(rrelsize, "Relative to line (relsize)");
207    elm_radio_state_value_set(rrelsize, 2);
208    elm_radio_value_pointer_set(rrelsize, &aid->size);
209    elm_radio_group_add(rrelsize, rsize);
210    elm_box_pack_end(sizebox, rrelsize);
211    evas_object_show(rrelsize);
212
213    vsizebox = elm_box_add(parent);
214    elm_box_horizontal_set(vsizebox, EINA_TRUE);
215    evas_object_size_hint_weight_set(vsizebox, EVAS_HINT_EXPAND,
216                                     EVAS_HINT_EXPAND);
217    evas_object_size_hint_align_set(vsizebox, EVAS_HINT_FILL, EVAS_HINT_FILL);
218    elm_box_pack_end(box2, vsizebox);
219    evas_object_show(vsizebox);
220
221    rvfull = elm_radio_add(parent);
222    elm_object_text_set(rvfull, "Full height (vsize=full)");
223    elm_radio_state_value_set(rvfull, 0);
224    elm_radio_value_pointer_set(rvfull, &aid->vsize);
225    elm_box_pack_end(vsizebox, rvfull);
226    evas_object_show(rvfull);
227
228    rvascent = elm_radio_add(parent);
229    elm_object_text_set(rvascent, "Ascent only (vsize=ascent)");
230    elm_radio_state_value_set(rvascent, 1);
231    elm_radio_value_pointer_set(rvascent, &aid->vsize);
232    elm_radio_group_add(rvascent, rvfull);
233    elm_box_pack_end(vsizebox, rvascent);
234    evas_object_show(rvascent);
235
236    fwidth = elm_frame_add(parent);
237    elm_object_text_set(fwidth, "Width");
238    evas_object_size_hint_weight_set(fwidth, EVAS_HINT_EXPAND, 0.0);
239    evas_object_size_hint_align_set(fwidth, EVAS_HINT_FILL, EVAS_HINT_FILL);
240    elm_box_pack_end(box2, fwidth);
241    evas_object_show(fwidth);
242
243    snprintf(buf, sizeof(buf), "%d", aid->width);
244    ewidth = elm_entry_add(parent);
245    elm_entry_single_line_set(ewidth, EINA_TRUE);
246    elm_entry_markup_filter_append(ewidth, elm_entry_filter_accept_set,
247                                 &accept_set);
248    elm_entry_markup_filter_append(ewidth, elm_entry_filter_limit_size,
249                                 &limit_size);
250    elm_object_text_set(ewidth, buf);
251    evas_object_size_hint_weight_set(ewidth, EVAS_HINT_EXPAND, 0.0);
252    evas_object_size_hint_align_set(ewidth, EVAS_HINT_FILL, EVAS_HINT_FILL);
253    elm_object_content_set(fwidth, ewidth);
254    evas_object_show(ewidth);
255
256    evas_object_smart_callback_add(ewidth, "changed", _width_changed_cb, aid);
257
258    fheight = elm_frame_add(parent);
259    elm_object_text_set(fheight, "Height");
260    evas_object_size_hint_weight_set(fheight, EVAS_HINT_EXPAND, 0.0);
261    evas_object_size_hint_align_set(fheight, EVAS_HINT_FILL, EVAS_HINT_FILL);
262    elm_box_pack_end(box2, fheight);
263    evas_object_show(fheight);
264
265    snprintf(buf, sizeof(buf), "%d", aid->height);
266    eheight = elm_entry_add(parent);
267    elm_entry_single_line_set(eheight, EINA_TRUE);
268    elm_entry_markup_filter_append(eheight, elm_entry_filter_accept_set,
269                                 &accept_set);
270    elm_entry_markup_filter_append(eheight, elm_entry_filter_limit_size,
271                                 &limit_size);
272    elm_object_text_set(eheight, buf);
273    evas_object_size_hint_weight_set(eheight, EVAS_HINT_EXPAND, 0.0);
274    evas_object_size_hint_align_set(eheight, EVAS_HINT_FILL, EVAS_HINT_FILL);
275    elm_object_content_set(fheight, eheight);
276    evas_object_show(eheight);
277
278    evas_object_smart_callback_add(eheight, "changed", _height_changed_cb, aid);
279
280    binsert = elm_button_add(parent);
281    elm_object_text_set(binsert, "Insert");
282    elm_box_pack_end(box, binsert);
283    evas_object_show(binsert);
284
285    evas_object_smart_callback_add(binsert, "clicked", _btn_insert_cb, aid);
286
287    return box;
288 }
289
290 static void
291 _insert_cancel_cb(void *data, Evas_Object *obj, void *event)
292 {
293    App_Inwin_Data *aid = data;
294
295    evas_object_del(aid->inwin);
296 }
297
298 static void
299 _inwin_del_cb(void *data, Evas *e, Evas_Object *obj, void *event)
300 {
301    free(data);
302 }
303
304 static void
305 _image_insert_cb(void *data, Evas_Object *obj, void *event)
306 {
307    App_Data *ad = data;
308    App_Inwin_Data *aid;
309    Evas_Object *inwin, *box, *box2, *naviframe, *o;
310
311    aid = calloc(1, sizeof(App_Inwin_Data));
312    if (!aid) return;
313
314    aid->ad = ad;
315    aid->size = 1;
316    aid->vsize = 1;
317    aid->width = 64;
318    aid->height = 64;
319
320    inwin = elm_win_inwin_add(ad->win);
321    evas_object_size_hint_weight_set(inwin, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
322    evas_object_size_hint_align_set(inwin, EVAS_HINT_FILL, EVAS_HINT_FILL);
323    evas_object_show(inwin);
324
325    evas_object_event_callback_add(inwin, EVAS_CALLBACK_DEL, _inwin_del_cb,
326                                   aid);
327
328    box = elm_box_add(ad->win);
329    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
330    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
331    elm_win_inwin_content_set(inwin, box);
332    evas_object_show(box);
333
334    naviframe = elm_naviframe_add(ad->win);
335    evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
336    evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
337    elm_box_pack_end(box, naviframe);
338    evas_object_show(naviframe);
339
340    o = _page_grid_add(ad->win, aid);
341    elm_naviframe_item_simple_push(naviframe, o);
342    aid->grid = o;
343
344    o = _page_settings_add(ad->win, aid);
345    elm_naviframe_item_simple_push(naviframe, o);
346    aid->settings = o;
347
348    elm_naviframe_item_simple_promote(naviframe, aid->grid);
349
350    box2 = elm_box_add(ad->win);
351    elm_box_horizontal_set(box2, EINA_TRUE);
352    evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0.0);
353    evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
354    elm_box_pack_end(box, box2);
355    evas_object_show(box2);
356
357    o = elm_button_add(ad->win);
358    elm_object_text_set(o, "Cancel");
359    evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
360    evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
361    elm_box_pack_end(box2, o);
362    evas_object_show(o);
363
364    evas_object_smart_callback_add(o, "clicked", _insert_cancel_cb, aid);
365
366    aid->inwin = inwin;
367    aid->naviframe = naviframe;
368 }
369
370 static void
371 _format_change_cb(void *data, Evas_Object *obj, void *event)
372 {
373    App_Data *ad = data;
374    char fmt_open[5], fmt_close[6];
375    const char *sel;
376    int cursor;
377    char *s;
378    const char *ptr, *what;
379    Eina_Strbuf *buf = NULL;
380
381    sel = elm_object_text_get(obj);
382    snprintf(fmt_open, sizeof(fmt_open), "<%s>", sel);
383    snprintf(fmt_close, sizeof(fmt_close), "</%s>", sel);
384
385    buf = eina_strbuf_new();
386
387    cursor = elm_entry_cursor_pos_get(ad->edit_buffer);
388    elm_entry_cursor_begin_set(ad->edit_buffer);
389    elm_entry_cursor_selection_begin(ad->edit_buffer);
390    elm_entry_cursor_pos_set(ad->edit_buffer, cursor);
391    elm_entry_cursor_selection_end(ad->edit_buffer);
392    sel = elm_entry_selection_get(ad->edit_buffer);
393    if (!sel || !sel[0])
394      {
395         eina_strbuf_append(buf, fmt_open);
396         goto all_done;
397      }
398    what = fmt_open;
399    ptr = sel;
400    while ((s = strstr(ptr, what)))
401      {
402         ptr = s + strlen(what);
403         if (what == fmt_open) what = fmt_close;
404         else what = fmt_open;
405      }
406    eina_strbuf_append(buf, what);
407    if (what == fmt_close)
408      {
409         elm_entry_cursor_selection_begin(ad->edit_buffer);
410         elm_entry_cursor_end_set(ad->edit_buffer);
411         elm_entry_cursor_selection_end(ad->edit_buffer);
412         sel = elm_entry_selection_get(ad->edit_buffer);
413         if (sel)
414           {
415              Eina_Strbuf *buf2 = eina_strbuf_new();
416              eina_strbuf_append(buf2, sel);
417              eina_strbuf_replace_first(buf2, fmt_close, "");
418              elm_entry_entry_insert(ad->edit_buffer,
419                                     eina_strbuf_string_get(buf2));
420              eina_strbuf_free(buf2);
421           }
422      }
423    elm_entry_select_none(ad->edit_buffer);
424    elm_entry_cursor_pos_set(ad->edit_buffer, cursor);
425
426 all_done:
427    _edit_buffer_insert(ad->edit_buffer, eina_strbuf_string_get(buf));
428    eina_strbuf_free(buf);
429 }
430
431 static void
432 _autosave_change_cb(void *data, Evas_Object *obj, void *event)
433 {
434    App_Data *ad = data;
435    Eina_Bool state = elm_check_state_get(obj);
436
437    elm_entry_autosave_set(ad->edit_buffer, state);
438    if (state) elm_entry_file_save(ad->edit_buffer);
439 }
440
441 static void
442 _edit_dblclick_cb(void *data, Evas_Object *obj, void *event)
443 {
444    int current_cursor;
445
446    current_cursor = elm_entry_cursor_pos_get(obj);
447
448    while (elm_entry_cursor_prev(obj))
449      {
450         const char *content;
451         if (elm_entry_cursor_is_visible_format_get(obj))
452           break;
453         content = elm_entry_cursor_content_get(obj);
454         if (content && (content[0] == ' '))
455           break;
456      }
457
458    if (current_cursor == elm_entry_cursor_pos_get(obj))
459      return;
460
461    elm_entry_cursor_next(obj);
462    elm_entry_cursor_selection_begin(obj);
463    elm_entry_cursor_pos_set(obj, current_cursor);
464    while (elm_entry_cursor_next(obj))
465      {
466         const char *content;
467         if (elm_entry_cursor_is_visible_format_get(obj))
468           break;
469         content = elm_entry_cursor_content_get(obj);
470         if (content && (content[0] == ' '))
471           break;
472      }
473    elm_entry_cursor_selection_end(obj);
474 }
475
476 static void
477 _edit_tplclick_cb(void *data, Evas_Object *obj, void *event)
478 {
479    elm_entry_cursor_line_begin_set(obj);
480    elm_entry_cursor_selection_begin(obj);
481    elm_entry_cursor_line_end_set(obj);
482    elm_entry_cursor_selection_end(obj);
483 }
484
485 static void
486 _win_del_cb(void *data, Evas_Object *obj, void *event)
487 {
488    evas_object_del(obj);
489    elm_exit();
490 }
491
492 EAPI_MAIN int
493 elm_main(int argc, char *argv[])
494 {
495    Evas_Object *win, *bg, *box, *tb, *en, *o, *icon;
496    App_Data app;
497
498    memset(&app, 0, sizeof(app));
499
500    win = elm_win_add(NULL, "entry-example", ELM_WIN_BASIC);
501    elm_win_title_set(win, "Emacs Lite");
502    evas_object_show(win);
503
504    bg = elm_bg_add(win);
505    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
506    elm_win_resize_object_add(win, bg);
507    evas_object_show(bg);
508
509    box = elm_box_add(win);
510    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
511    elm_win_resize_object_add(win, box);
512    evas_object_show(box);
513
514    tb = elm_box_add(win);
515    elm_box_horizontal_set(tb, EINA_TRUE);
516    evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0);
517    evas_object_size_hint_weight_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
518    elm_box_pack_end(box, tb);
519    evas_object_show(tb);
520
521    o = elm_check_add(win);
522    elm_check_state_set(o, EINA_FALSE);
523    elm_object_text_set(o, "Autosave");
524    elm_box_pack_end(tb, o);
525    evas_object_show(o);
526
527    evas_object_smart_callback_add(o, "changed", _autosave_change_cb, &app);
528
529    o = elm_button_add(win);
530    elm_object_text_set(o, "b");
531    elm_box_pack_end(tb, o);
532    evas_object_show(o);
533
534    evas_object_smart_callback_add(o, "clicked", _format_change_cb, &app);
535
536    o = elm_button_add(win);
537    elm_object_text_set(o, "em");
538    elm_box_pack_end(tb, o);
539    evas_object_show(o);
540
541    evas_object_smart_callback_add(o, "clicked", _format_change_cb, &app);
542
543    o = elm_button_add(win);
544    elm_box_pack_end(tb, o);
545    evas_object_show(o);
546
547    icon = elm_layout_add(win);
548    elm_layout_theme_set(icon, "entry", "emoticon/haha", "default");
549    elm_object_part_content_set(o, "icon", icon);
550
551    evas_object_smart_callback_add(o, "clicked", _image_insert_cb, &app);
552
553    en = elm_entry_add(win);
554    elm_entry_autosave_set(en, EINA_FALSE);
555    elm_entry_file_set(en, "/tmp/da_test.txt", ELM_TEXT_FORMAT_MARKUP_UTF8);
556    evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
557    evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
558    elm_box_pack_end(box, en);
559    evas_object_show(en);
560
561    app.win = win;
562    app.edit_buffer = en;
563
564    evas_object_smart_callback_add(en, "clicked,double", _edit_dblclick_cb,
565                                   NULL);
566    evas_object_smart_callback_add(en, "clicked,triple", _edit_tplclick_cb,
567                                   NULL);
568
569    evas_object_smart_callback_add(win, "delete,request", _win_del_cb, &app);
570
571    elm_object_focus_set(app.edit_buffer, EINA_TRUE);
572
573    evas_object_resize(win, 300, 780);
574
575    elm_run();
576    elm_shutdown();
577
578    return 0;
579 }
580 ELM_MAIN()