Some day I will learn to rebase without fucking up
[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 _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 _main_web_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
262 {
263    Web_Test *wt = data;
264    Evas_Object *sub_win;
265
266    EINA_LIST_FREE(wt->sub_wins, sub_win)
267       evas_object_del(sub_win);
268
269    free(wt);
270 }
271
272 void
273 test_web(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
274 {
275    Evas_Object *win, *bg, *bx, *bx2, *bt, *web, *url;
276    Web_Test *wt;
277
278    elm_need_web();
279
280    wt = calloc(1, sizeof(*wt));
281
282    win = elm_win_add(NULL, "web", ELM_WIN_BASIC);
283    elm_win_title_set(win, "Web");
284    elm_win_autodel_set(win, EINA_TRUE);
285
286    bg = elm_bg_add(win);
287    elm_win_resize_object_add(win, bg);
288    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
289    evas_object_show(bg);
290
291    bx = elm_box_add(win);
292    elm_win_resize_object_add(win, bx);
293    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
294    evas_object_show(bx);
295
296    bx2 = elm_box_add(win);
297    elm_box_horizontal_set(bx2, EINA_TRUE);
298    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
299    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
300    elm_box_pack_end(bx, bx2);
301    evas_object_show(bx2);
302
303    web = elm_web_add(win);
304    evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
305    evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
306    elm_box_pack_end(bx, web);
307    evas_object_show(web);
308
309    bt = elm_button_add(win);
310    elm_object_text_set(bt, "<");
311    elm_box_pack_end(bx2, bt);
312    evas_object_show(bt);
313
314    evas_object_smart_callback_add(bt, "clicked", _btn_back_cb, web);
315    wt->btn_back = bt;
316
317    bt = elm_button_add(win);
318    elm_object_text_set(bt, "R");
319    elm_box_pack_end(bx2, bt);
320    evas_object_show(bt);
321
322    evas_object_smart_callback_add(bt, "clicked", _btn_reload_cb, web);
323
324    bt = elm_button_add(win);
325    elm_object_text_set(bt, ">");
326    elm_box_pack_end(bx2, bt);
327    evas_object_show(bt);
328
329    evas_object_smart_callback_add(bt, "clicked", _btn_fwd_cb, web);
330    wt->btn_fwd = bt;
331
332    url = elm_entry_add(win);
333    elm_entry_single_line_set(url, EINA_TRUE);
334    elm_entry_scrollable_set(url, EINA_TRUE);
335    evas_object_size_hint_weight_set(url, EVAS_HINT_EXPAND, 0);
336    evas_object_size_hint_align_set(url, EVAS_HINT_FILL, EVAS_HINT_FILL);
337    elm_box_pack_end(bx2, url);
338    evas_object_show(url);
339
340    evas_object_smart_callback_add(url, "activated", _url_change_cb, web);
341    wt->url_entry = url;
342
343    bx2 = elm_box_add(win);
344    elm_box_horizontal_set(bx2, EINA_TRUE);
345    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
346    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
347    elm_box_pack_end(bx, bx2);
348    evas_object_show(bx2);
349
350    bt = elm_button_add(win);
351    elm_object_text_set(bt, "Inwin Mode");
352    elm_box_pack_end(bx2, bt);
353    evas_object_show(bt);
354
355    evas_object_smart_callback_add(bt, "clicked", _toggle_inwin_mode_cb, web);
356
357    bt = elm_button_add(win);
358    elm_object_text_set(bt, "Custom Hooks");
359    elm_box_pack_end(bx2, bt);
360    evas_object_show(bt);
361
362    evas_object_smart_callback_add(bt, "clicked", _js_popup_hooks_set, wt);
363
364    evas_object_smart_callback_add(web, "title,changed", _title_changed_cb, win);
365    evas_object_smart_callback_add(web, "uri,changed", _uri_changed_cb, wt);
366
367    evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt);
368
369    wt->web = web;
370
371    elm_web_uri_set(web, "http://www.enlightenment.org");
372
373    elm_web_window_create_hook_set(web, _new_window_hook, wt);
374
375    evas_object_resize(win, 320, 480);
376    evas_object_show(win);
377 }
378 #endif