stop using deprecated calls.
[framework/uifw/elementary.git] / src / bin / test_web.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 typedef struct
8 {
9    Evas_Object *web;
10    Evas_Object *btn_back;
11    Evas_Object *btn_fwd;
12    Evas_Object *url_entry;
13    Eina_List *sub_wins;
14    Eina_Bool js_hooks : 1;
15 } Web_Test;
16
17 static void
18 _btn_back_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
19 {
20    Evas_Object *web = data;
21
22    elm_web_back(web);
23 }
24
25 static void
26 _btn_fwd_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
27 {
28    Evas_Object *web = data;
29
30    elm_web_forward(web);
31 }
32
33 static void
34 _btn_reload_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
35 {
36    Evas_Object *web = data;
37
38    elm_web_reload(web);
39 }
40
41 static void
42 _url_change_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
43 {
44    Evas_Object *web = data;
45    const char *uri = elm_object_text_get(obj);
46
47    elm_web_uri_set(web, uri);
48 }
49
50 static void
51 _toggle_inwin_mode_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
52 {
53    elm_web_inwin_mode_set(data, !elm_web_inwin_mode_get(data));
54 }
55
56 static void
57 _title_changed_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
58 {
59    char buf[512];
60    snprintf(buf, sizeof(buf), "Web - %s", (const char *)event_info);
61    elm_win_title_set(data, buf);
62 }
63
64 static void
65 _uri_changed_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
66 {
67    Web_Test *wt = data;
68
69    elm_object_text_set(wt->url_entry, event_info);
70
71    elm_object_disabled_set(wt->btn_back, !elm_web_back_possible(wt->web));
72    elm_object_disabled_set(wt->btn_fwd, !elm_web_forward_possible(wt->web));
73 }
74
75 static void
76 _new_win_del_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
77 {
78    Web_Test *wt = data;
79    wt->sub_wins = eina_list_remove(wt->sub_wins, obj);
80 }
81
82 static void
83 _web_win_close_request_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
84 {
85    evas_object_del(data);
86 }
87
88 static Evas_Object *
89 _new_window_hook(void *data, Evas_Object *obj __UNUSED__, Eina_Bool js __UNUSED__, const Elm_Web_Window_Features *wf __UNUSED__)
90 {
91    Web_Test *wt = data;
92    Evas_Object *new_win, *new_web, *bg;
93
94    new_win = elm_win_add(NULL, "elm-web-test-popup", ELM_WIN_BASIC);
95    elm_win_autodel_set(new_win, EINA_TRUE);
96    evas_object_resize(new_win, 300, 300);
97    evas_object_show(new_win);
98
99    bg = elm_bg_add(new_win);
100    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
101    elm_win_resize_object_add(new_win, bg);
102    evas_object_show(bg);
103
104    new_web = elm_web_add(new_win);
105    evas_object_size_hint_weight_set(new_web, EVAS_HINT_EXPAND,
106                                     EVAS_HINT_EXPAND);
107    elm_win_resize_object_add(new_win, new_web);
108    evas_object_show(new_web);
109
110    evas_object_smart_callback_add(new_win, "delete,request", _new_win_del_cb,
111                                   wt);
112    evas_object_smart_callback_add(new_web, "windows,close,request",
113                                   _web_win_close_request_cb, new_win);
114    wt->sub_wins = eina_list_append(wt->sub_wins, new_win);
115
116    return new_web;
117 }
118
119 static void
120 _alert_del(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
121 {
122    evas_object_del(obj);
123 }
124
125 static Evas_Object *
126 _alert_hook(void *data __UNUSED__, Evas_Object *obj, const char *message)
127 {
128    Evas_Object *popup, *label;
129
130    popup = elm_notify_add(obj);
131    elm_notify_orient_set(popup, ELM_NOTIFY_ORIENT_CENTER);
132    // Using the timeout doesn't seem to go well with the second main loop
133    //elm_notify_timeout_set(popup, 2.0);
134    elm_notify_repeat_events_set(popup, EINA_FALSE);
135    evas_object_show(popup);
136
137    evas_object_smart_callback_add(popup, "block,clicked", _alert_del, NULL);
138
139    label = elm_label_add(obj);
140    elm_object_text_set(label, message);
141    elm_object_content_set(popup, label);
142    evas_object_show(label);
143
144    return popup;
145 }
146
147 static void
148 _confirm_ok_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
149 {
150    Eina_Bool *response = data;
151    *response = EINA_TRUE;
152 }
153
154 static void
155 _confirm_cancel_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
156 {
157    Eina_Bool *response = data;
158    *response = EINA_FALSE;
159 }
160
161 static void
162 _confirm_dismiss_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
163 {
164    evas_object_del(data);
165 }
166
167 static Evas_Object *
168 _confirm_hook(void *data __UNUSED__, Evas_Object *obj, const char *message, Eina_Bool *response)
169 {
170    Evas_Object *popup, *box, *box2, *label, *btn_ok, *btn_cancel;
171
172    popup = elm_notify_add(obj);
173    elm_notify_orient_set(popup, ELM_NOTIFY_ORIENT_CENTER);
174    elm_notify_repeat_events_set(popup, EINA_FALSE);
175    evas_object_show(popup);
176
177    box = elm_box_add(obj);
178    elm_object_content_set(popup, box);
179    evas_object_show(box);
180
181    label = elm_label_add(obj);
182    elm_object_text_set(label, message);
183    elm_box_pack_end(box, label);
184    evas_object_show(label);
185
186    box2 = elm_box_add(obj);
187    elm_box_horizontal_set(box2, EINA_TRUE);
188    elm_box_pack_end(box, box2);
189    evas_object_show(box2);
190
191    btn_ok = elm_button_add(obj);
192    elm_object_text_set(btn_ok, "Ok");
193    elm_box_pack_end(box2, btn_ok);
194    evas_object_show(btn_ok);
195
196    btn_cancel = elm_button_add(obj);
197    elm_object_text_set(btn_cancel, "Cancel");
198    elm_box_pack_end(box2, btn_cancel);
199    evas_object_show(btn_cancel);
200
201    evas_object_smart_callback_add(btn_ok, "clicked", _confirm_dismiss_cb,
202                                   popup);
203    evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_dismiss_cb,
204                                   popup);
205    evas_object_smart_callback_add(btn_ok, "clicked", _confirm_ok_cb, response);
206    evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_cancel_cb,
207                                   response);
208
209    return popup;
210 }
211
212 static Evas_Object *
213 _prompt_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *message __UNUSED__, const char *default_value, char **value, Eina_Bool *response)
214 {
215    *response = EINA_TRUE;
216    *value = default_value ? strdup(default_value) : "No default!";
217    return NULL;
218 }
219
220 static Evas_Object *
221 _file_selector_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Eina_Bool allow_multiple __UNUSED__, Eina_List *accept_types __UNUSED__, Eina_List **selected_files, Eina_Bool *response)
222 {
223    *selected_files = eina_list_append(NULL,
224                                       strdup("/path/to/non_existing_file"));
225    *response = EINA_TRUE;
226    return NULL;
227 }
228
229 static void
230 _console_message_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *message, unsigned int line_number, const char *source_id)
231 {
232    printf("CONSOLE: %s:%d:%s\n", source_id, line_number, message);
233 }
234
235 static void
236 _js_popup_hooks_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
237 {
238    Web_Test *wt = data;
239
240    wt->js_hooks = !wt->js_hooks;
241    if (wt->js_hooks)
242      {
243         elm_web_dialog_alert_hook_set(wt->web, _alert_hook, NULL);
244         elm_web_dialog_confirm_hook_set(wt->web, _confirm_hook, NULL);
245         elm_web_dialog_prompt_hook_set(wt->web, _prompt_hook, NULL);
246         elm_web_dialog_file_selector_hook_set(wt->web, _file_selector_hook,
247                                               NULL);
248         elm_web_console_message_hook_set(wt->web, _console_message_hook, NULL);
249      }
250    else
251      {
252         elm_web_dialog_alert_hook_set(wt->web, NULL, NULL);
253         elm_web_dialog_confirm_hook_set(wt->web, NULL, NULL);
254         elm_web_dialog_prompt_hook_set(wt->web, NULL, NULL);
255         elm_web_dialog_file_selector_hook_set(wt->web, NULL, NULL);
256         elm_web_console_message_hook_set(wt->web, NULL, NULL);
257      }
258 }
259
260 static void
261 _zoom_out_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
262 {
263    Web_Test *wt = data;
264    double zoom;
265
266    zoom = elm_web_zoom_get(wt->web);
267    if (zoom > 1)
268      zoom -= .5;
269    else
270      zoom /= 2;
271    if (zoom < .05)
272      zoom = .05;
273    elm_web_zoom_set(wt->web, zoom);
274 }
275
276 static void
277 _zoom_in_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
278 {
279    Web_Test *wt = data;
280    double zoom;
281
282    zoom = elm_web_zoom_get(wt->web);
283
284    if (zoom < 1)
285      zoom *= 2;
286    else
287      zoom += .5;
288    if (zoom > 4)
289      zoom = 4;
290    elm_web_zoom_set(wt->web, zoom);
291 }
292
293 static void
294 _zoom_mode_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
295 {
296    Web_Test *wt = data;
297    Elm_Object_Item *hoversel_it = event_info;
298    const char *lbl = elm_object_item_text_get(hoversel_it);
299
300    if (!strcmp(lbl, "Manual"))
301      elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_MANUAL);
302    else if (!strcmp(lbl, "Fit"))
303      elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FIT);
304    else
305      elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FILL);
306 }
307
308 static void
309 _show_region_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
310 {
311    Web_Test *wt = data;
312    elm_web_region_show(wt->web, 300, 300, 1, 1);
313 }
314
315 static void
316 _bring_in_region_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
317 {
318    Web_Test *wt = data;
319    elm_web_region_bring_in(wt->web, 50, 0, 1, 1);
320 }
321
322 static void
323 _main_web_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
324 {
325    Web_Test *wt = data;
326    Evas_Object *sub_win;
327
328    EINA_LIST_FREE(wt->sub_wins, sub_win)
329       evas_object_del(sub_win);
330
331    free(wt);
332 }
333
334 void
335 test_web(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
336 {
337    Evas_Object *win, *bg, *bx, *bx2, *bt, *web, *url;
338    Web_Test *wt;
339
340    elm_need_web();
341
342    wt = calloc(1, sizeof(*wt));
343
344    win = elm_win_add(NULL, "web", ELM_WIN_BASIC);
345    elm_win_title_set(win, "Web");
346    elm_win_autodel_set(win, EINA_TRUE);
347
348    bg = elm_bg_add(win);
349    elm_win_resize_object_add(win, bg);
350    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
351    evas_object_show(bg);
352
353    bx = elm_box_add(win);
354    elm_win_resize_object_add(win, bx);
355    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
356    evas_object_show(bx);
357
358    bx2 = elm_box_add(win);
359    elm_box_horizontal_set(bx2, EINA_TRUE);
360    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
361    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
362    elm_box_pack_end(bx, bx2);
363    evas_object_show(bx2);
364
365    web = elm_web_add(win);
366    evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
367    evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
368    elm_box_pack_end(bx, web);
369    evas_object_show(web);
370
371    bt = elm_button_add(win);
372    elm_object_text_set(bt, "<");
373    elm_box_pack_end(bx2, bt);
374    evas_object_show(bt);
375
376    evas_object_smart_callback_add(bt, "clicked", _btn_back_cb, web);
377    wt->btn_back = bt;
378
379    bt = elm_button_add(win);
380    elm_object_text_set(bt, "R");
381    elm_box_pack_end(bx2, bt);
382    evas_object_show(bt);
383
384    evas_object_smart_callback_add(bt, "clicked", _btn_reload_cb, web);
385
386    bt = elm_button_add(win);
387    elm_object_text_set(bt, ">");
388    elm_box_pack_end(bx2, bt);
389    evas_object_show(bt);
390
391    evas_object_smart_callback_add(bt, "clicked", _btn_fwd_cb, web);
392    wt->btn_fwd = bt;
393
394    url = elm_entry_add(win);
395    elm_entry_single_line_set(url, EINA_TRUE);
396    elm_entry_scrollable_set(url, EINA_TRUE);
397    evas_object_size_hint_weight_set(url, EVAS_HINT_EXPAND, 0);
398    evas_object_size_hint_align_set(url, EVAS_HINT_FILL, EVAS_HINT_FILL);
399    elm_box_pack_end(bx2, url);
400    evas_object_show(url);
401
402    evas_object_smart_callback_add(url, "activated", _url_change_cb, web);
403    wt->url_entry = url;
404
405    bx2 = elm_box_add(win);
406    elm_box_horizontal_set(bx2, EINA_TRUE);
407    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
408    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
409    elm_box_pack_end(bx, bx2);
410    evas_object_show(bx2);
411
412    bt = elm_button_add(win);
413    elm_object_text_set(bt, "Inwin Mode");
414    elm_box_pack_end(bx2, bt);
415    evas_object_show(bt);
416
417    evas_object_smart_callback_add(bt, "clicked", _toggle_inwin_mode_cb, web);
418
419    bt = elm_button_add(win);
420    elm_object_text_set(bt, "Custom Hooks");
421    elm_box_pack_end(bx2, bt);
422    evas_object_show(bt);
423
424    evas_object_smart_callback_add(bt, "clicked", _js_popup_hooks_set, wt);
425
426    bt = elm_button_add(win);
427    elm_object_text_set(bt, "-");
428    elm_box_pack_end(bx2, bt);
429    evas_object_show(bt);
430
431    evas_object_smart_callback_add(bt, "clicked", _zoom_out_cb, wt);
432
433    bt = elm_button_add(win);
434    elm_object_text_set(bt, "+");
435    elm_box_pack_end(bx2, bt);
436    evas_object_show(bt);
437
438    evas_object_smart_callback_add(bt, "clicked", _zoom_in_cb, wt);
439
440    bt = elm_hoversel_add(win);
441    elm_object_text_set(bt, "Zoom Mode");
442    elm_box_pack_end(bx2, bt);
443    evas_object_show(bt);
444
445    elm_hoversel_item_add(bt, "Manual", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
446    elm_hoversel_item_add(bt, "Fit", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
447    elm_hoversel_item_add(bt, "Fill", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
448
449    bx2 = elm_box_add(win);
450    elm_box_horizontal_set(bx2, EINA_TRUE);
451    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
452    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
453    elm_box_pack_end(bx, bx2);
454    evas_object_show(bx2);
455
456    bt = elm_button_add(win);
457    elm_object_text_set(bt, "Show 300, 300");
458    elm_box_pack_end(bx2, bt);
459    evas_object_show(bt);
460
461    evas_object_smart_callback_add(bt, "clicked", _show_region_cb, wt);
462
463    bt = elm_button_add(win);
464    elm_object_text_set(bt, "Bring in 50, 0");
465    elm_box_pack_end(bx2, bt);
466    evas_object_show(bt);
467
468    evas_object_smart_callback_add(bt, "clicked", _bring_in_region_cb, wt);
469
470    evas_object_smart_callback_add(web, "title,changed", _title_changed_cb, win);
471    evas_object_smart_callback_add(web, "uri,changed", _uri_changed_cb, wt);
472
473    evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt);
474
475    wt->web = web;
476
477    elm_web_uri_set(web, "http://www.enlightenment.org");
478
479    elm_web_window_create_hook_set(web, _new_window_hook, wt);
480
481    evas_object_resize(win, 320, 480);
482    evas_object_show(win);
483 }
484 #endif