People from Earth: Welcome Elm_Web
[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_entry_entry_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_notify_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_notify_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__, const char *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 _js_popup_hooks_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
231 {
232    Web_Test *wt = data;
233
234    wt->js_hooks = !wt->js_hooks;
235    if (wt->js_hooks)
236      {
237         elm_web_dialog_alert_hook_set(wt->web, _alert_hook, NULL);
238         elm_web_dialog_confirm_hook_set(wt->web, _confirm_hook, NULL);
239         elm_web_dialog_prompt_hook_set(wt->web, _prompt_hook, NULL);
240         elm_web_dialog_file_selector_hook_set(wt->web, _file_selector_hook,
241                                               NULL);
242      }
243    else
244      {
245         elm_web_dialog_alert_hook_set(wt->web, NULL, NULL);
246         elm_web_dialog_confirm_hook_set(wt->web, NULL, NULL);
247         elm_web_dialog_prompt_hook_set(wt->web, NULL, NULL);
248         elm_web_dialog_file_selector_hook_set(wt->web, NULL, NULL);
249      }
250 }
251
252 static void
253 _main_web_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
254 {
255    Web_Test *wt = data;
256    Evas_Object *sub_win;
257
258    EINA_LIST_FREE(wt->sub_wins, sub_win)
259       evas_object_del(sub_win);
260
261    free(wt);
262 }
263
264 void
265 test_web(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
266 {
267    Evas_Object *win, *bg, *bx, *bx2, *bt, *web, *url;
268    Web_Test *wt;
269
270    elm_need_web();
271
272    wt = calloc(1, sizeof(*wt));
273
274    win = elm_win_add(NULL, "web", ELM_WIN_BASIC);
275    elm_win_title_set(win, "Web");
276    elm_win_autodel_set(win, EINA_TRUE);
277
278    bg = elm_bg_add(win);
279    elm_win_resize_object_add(win, bg);
280    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
281    evas_object_show(bg);
282
283    bx = elm_box_add(win);
284    elm_win_resize_object_add(win, bx);
285    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
286    evas_object_show(bx);
287
288    bx2 = elm_box_add(win);
289    elm_box_horizontal_set(bx2, EINA_TRUE);
290    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
291    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
292    elm_box_pack_end(bx, bx2);
293    evas_object_show(bx2);
294
295    web = elm_web_add(win);
296    evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
297    evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
298    elm_box_pack_end(bx, web);
299    evas_object_show(web);
300
301    bt = elm_button_add(win);
302    elm_object_text_set(bt, "<");
303    elm_box_pack_end(bx2, bt);
304    evas_object_show(bt);
305
306    evas_object_smart_callback_add(bt, "clicked", _btn_back_cb, web);
307    wt->btn_back = bt;
308
309    bt = elm_button_add(win);
310    elm_object_text_set(bt, "R");
311    elm_box_pack_end(bx2, bt);
312    evas_object_show(bt);
313
314    evas_object_smart_callback_add(bt, "clicked", _btn_reload_cb, web);
315
316    bt = elm_button_add(win);
317    elm_object_text_set(bt, ">");
318    elm_box_pack_end(bx2, bt);
319    evas_object_show(bt);
320
321    evas_object_smart_callback_add(bt, "clicked", _btn_fwd_cb, web);
322    wt->btn_fwd = bt;
323
324    url = elm_entry_add(win);
325    elm_entry_single_line_set(url, EINA_TRUE);
326    elm_entry_scrollable_set(url, EINA_TRUE);
327    evas_object_size_hint_weight_set(url, EVAS_HINT_EXPAND, 0);
328    evas_object_size_hint_align_set(url, EVAS_HINT_FILL, EVAS_HINT_FILL);
329    elm_box_pack_end(bx2, url);
330    evas_object_show(url);
331
332    evas_object_smart_callback_add(url, "activated", _url_change_cb, web);
333    wt->url_entry = url;
334
335    bx2 = elm_box_add(win);
336    elm_box_horizontal_set(bx2, EINA_TRUE);
337    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
338    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
339    elm_box_pack_end(bx, bx2);
340    evas_object_show(bx2);
341
342    bt = elm_button_add(win);
343    elm_object_text_set(bt, "Inwin Mode");
344    elm_box_pack_end(bx2, bt);
345    evas_object_show(bt);
346
347    evas_object_smart_callback_add(bt, "clicked", _toggle_inwin_mode_cb, web);
348
349    bt = elm_button_add(win);
350    elm_object_text_set(bt, "Custom Hooks");
351    elm_box_pack_end(bx2, bt);
352    evas_object_show(bt);
353
354    evas_object_smart_callback_add(bt, "clicked", _js_popup_hooks_set, wt);
355
356    evas_object_smart_callback_add(web, "title,changed", _title_changed_cb, win);
357    evas_object_smart_callback_add(web, "uri,changed", _uri_changed_cb, wt);
358
359    evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt);
360
361    wt->web = web;
362
363    elm_web_uri_set(web, "http://www.enlightenment.org");
364
365    elm_web_window_create_hook_set(web, _new_window_hook, wt);
366
367    evas_object_resize(win, 320, 480);
368    evas_object_show(win);
369 }
370 #endif