elementary/map - map supports language,changed
[framework/uifw/elementary.git] / src / lib / elm_web2.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3 #include "elm_widget_web.h"
4
5 #if defined(HAVE_ELEMENTARY_WEB) && defined(USE_WEBKIT2)
6 #include <EWebKit2.h>
7
8 EAPI const char ELM_WEB_SMART_NAME[] = "elm_web";
9
10 static Ewk_View_Smart_Class _ewk_view_parent_sc =
11   EWK_VIEW_SMART_CLASS_INIT_NULL;
12
13 static const Evas_Smart_Cb_Description _elm_web_smart_callbacks[] = {
14    { "url,changed", "s" },
15    { NULL, NULL }
16 };
17
18 EVAS_SMART_SUBCLASS_NEW
19   (ELM_WEB_SMART_NAME, _elm_web, Elm_Web_Smart_Class, Elm_Widget_Smart_Class,
20   elm_widget_smart_class_get, _elm_web_smart_callbacks);
21
22 static void
23 _view_smart_add(Evas_Object *obj)
24 {
25    View_Smart_Data *sd;
26
27    sd = calloc(1, sizeof(View_Smart_Data));
28    evas_object_smart_data_set(obj, sd);
29
30    _ewk_view_parent_sc.sc.add(obj);
31 }
32
33 static void
34 _view_smart_del(Evas_Object *obj)
35 {
36    _ewk_view_parent_sc.sc.del(obj);
37 }
38
39 /**
40  * Creates a new view object given the parent.
41  *
42  * @param parent object to use as parent.
43  *
44  * @return newly added Evas_Object or @c NULL on errors.
45  */
46 Evas_Object *
47 _view_add(Evas_Object *parent)
48 {
49    Evas *canvas = evas_object_evas_get(parent);
50    static Evas_Smart *smart = NULL;
51    Evas_Object *view;
52
53    if (!smart)
54      {
55         static Ewk_View_Smart_Class api =
56           EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
57
58         ewk_view_smart_class_set(&api);
59         ewk_view_smart_class_set(&_ewk_view_parent_sc);
60
61         // TODO: check every api method and provide overrides with hooks!
62         // TODO: hooks should provide extension points
63         // TODO: extension should have some kind of "default implementation",
64         // TODO: that can be replaced or controlled by hooks.
65         // TODO: ie: run_javascript_alert() should present an elm_win
66         // TODO: by default, but user could override it to show as inwin.
67         api.sc.add = _view_smart_add;
68         api.sc.del = _view_smart_del;
69
70         smart = evas_smart_class_new(&api.sc);
71         if (!smart)
72           {
73              CRITICAL("Could not create smart class");
74              return NULL;
75           }
76      }
77
78    view = ewk_view_smart_add(canvas, smart, ewk_context_default_get());
79    if (!view)
80      {
81         ERR("Could not create smart object object for view");
82         return NULL;
83      }
84
85    return view;
86 }
87
88 static int _elm_need_web = 0;
89
90 EAPI Eina_Bool
91 elm_need_web(void)
92 {
93    if (_elm_need_web++) return EINA_TRUE;
94    ewk_init();
95    return EINA_TRUE;
96 }
97
98 static void
99 _elm_web_smart_add(Evas_Object *obj)
100 {
101    EVAS_SMART_DATA_ALLOC(obj, Elm_Web_Smart_Data);
102
103    ELM_WIDGET_DATA(priv)->resize_obj = _view_add(obj);
104
105    _elm_web_parent_sc->base.add(obj);
106
107    elm_widget_can_focus_set(obj, EINA_TRUE);
108 }
109
110 static void
111 _elm_web_smart_del(Evas_Object *obj)
112 {
113    _elm_web_parent_sc->base.del(obj); /* handles freeing sd */
114 }
115
116 static void
117 _elm_web_smart_set_user(Elm_Web_Smart_Class *sc)
118 {
119    ELM_WIDGET_CLASS(sc)->base.add = _elm_web_smart_add;
120    ELM_WIDGET_CLASS(sc)->base.del = _elm_web_smart_del;
121 }
122
123 EAPI const Elm_Web_Smart_Class *
124 elm_web_smart_class_get(void)
125 {
126    static Elm_Web_Smart_Class _sc =
127      ELM_WEB_SMART_CLASS_INIT_NAME_VERSION(ELM_WEB_SMART_NAME);
128    static const Elm_Web_Smart_Class *class = NULL;
129    Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
130
131    if (class) return class;
132
133    _elm_web_smart_set(&_sc);
134    esc->callbacks = _elm_web_smart_callbacks;
135    class = &_sc;
136
137    return class;
138 }
139
140 EAPI Evas_Object *
141 elm_web_add(Evas_Object *parent)
142 {
143    Evas_Object *obj;
144
145    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
146
147    obj = elm_widget_add(_elm_web_smart_class_new(), parent);
148    if (!obj) return NULL;
149
150    if (!elm_widget_sub_object_add(parent, obj))
151      ERR("could not add %p as sub object of %p", obj, parent);
152
153    return obj;
154 }
155
156 EAPI Evas_Object *
157 elm_web_webkit_view_get(const Evas_Object *obj)
158 {
159    ELM_WEB_CHECK(obj) NULL;
160
161    ELM_WEB_DATA_GET(obj, sd);
162
163    return ELM_WIDGET_DATA(sd)->resize_obj;
164 }
165
166 EAPI void
167 elm_web_window_create_hook_set(Evas_Object *obj,
168                                Elm_Web_Window_Open func,
169                                void *data)
170 {
171    ELM_WEB_CHECK(obj);
172
173    (void)func;
174    (void)data;
175 }
176
177 EAPI void
178 elm_web_dialog_alert_hook_set(Evas_Object *obj,
179                               Elm_Web_Dialog_Alert func,
180                               void *data)
181 {
182    ELM_WEB_CHECK(obj);
183
184    (void)func;
185    (void)data;
186 }
187
188 EAPI void
189 elm_web_dialog_confirm_hook_set(Evas_Object *obj,
190                                 Elm_Web_Dialog_Confirm func,
191                                 void *data)
192 {
193    ELM_WEB_CHECK(obj);
194
195    (void)func;
196    (void)data;
197 }
198
199 EAPI void
200 elm_web_dialog_prompt_hook_set(Evas_Object *obj,
201                                Elm_Web_Dialog_Prompt func,
202                                void *data)
203 {
204    ELM_WEB_CHECK(obj);
205
206    (void)func;
207    (void)data;
208 }
209
210 EAPI void
211 elm_web_dialog_file_selector_hook_set(Evas_Object *obj,
212                                       Elm_Web_Dialog_File_Selector func,
213                                       void *data)
214 {
215    ELM_WEB_CHECK(obj);
216
217    (void)func;
218    (void)data;
219 }
220
221 EAPI void
222 elm_web_console_message_hook_set(Evas_Object *obj,
223                                  Elm_Web_Console_Message func,
224                                  void *data)
225 {
226    ELM_WEB_CHECK(obj);
227
228    (void)func;
229    (void)data;
230 }
231
232 EAPI void
233 elm_web_useragent_set(Evas_Object *obj,
234                       const char *user_agent)
235 {
236    ELM_WEB_CHECK(obj);
237
238    // FIXME : need to implement
239    (void)user_agent;
240 }
241
242 EAPI const char *
243 elm_web_useragent_get(const Evas_Object *obj)
244 {
245    ELM_WEB_CHECK(obj) NULL;
246
247    // FIXME : need to implement
248    return NULL;
249 }
250
251 EAPI Eina_Bool
252 elm_web_uri_set(Evas_Object *obj,
253                 const char *uri)
254 {
255    ELM_WEB_CHECK(obj) EINA_FALSE;
256
257    ELM_WEB_DATA_GET(obj, sd);
258
259    return ewk_view_url_set(ELM_WIDGET_DATA(sd)->resize_obj, uri);
260 }
261
262 EAPI const char *
263 elm_web_uri_get(const Evas_Object *obj)
264 {
265    ELM_WEB_CHECK(obj) NULL;
266
267    ELM_WEB_DATA_GET(obj, sd);
268
269    return ewk_view_url_get(ELM_WIDGET_DATA(sd)->resize_obj);
270 }
271
272 EAPI const char *
273 elm_web_title_get(const Evas_Object *obj)
274 {
275    ELM_WEB_CHECK(obj) NULL;
276
277    ELM_WEB_DATA_GET(obj, sd);
278
279    return ewk_view_title_get(ELM_WIDGET_DATA(sd)->resize_obj);
280 }
281
282 EAPI void
283 elm_web_bg_color_set(Evas_Object *obj,
284                      int r,
285                      int g,
286                      int b,
287                      int a)
288 {
289    ELM_WEB_CHECK(obj);
290
291    (void)r;
292    (void)g;
293    (void)b;
294    (void)a;
295 }
296
297 EAPI void
298 elm_web_bg_color_get(const Evas_Object *obj,
299                      int *r,
300                      int *g,
301                      int *b,
302                      int *a)
303 {
304    ELM_WEB_CHECK(obj);
305
306    if (r) *r = 0;
307    if (g) *g = 0;
308    if (b) *b = 0;
309    if (a) *a = 0;
310 }
311
312 EAPI const char *
313 elm_web_selection_get(const Evas_Object *obj)
314 {
315    ELM_WEB_CHECK(obj) NULL;
316
317    return NULL;
318 }
319
320 EAPI void
321 elm_web_popup_selected_set(Evas_Object *obj,
322                            int idx)
323 {
324    ELM_WEB_CHECK(obj);
325
326    (void)idx;
327 }
328
329 EAPI Eina_Bool
330 elm_web_popup_destroy(Evas_Object *obj)
331 {
332    ELM_WEB_CHECK(obj) EINA_FALSE;
333
334    return EINA_FALSE;
335 }
336
337 EAPI Eina_Bool
338 elm_web_text_search(const Evas_Object *obj,
339                     const char *string,
340                     Eina_Bool case_sensitive,
341                     Eina_Bool forward,
342                     Eina_Bool wrap)
343 {
344    ELM_WEB_CHECK(obj) EINA_FALSE;
345
346    (void)string;
347    (void)case_sensitive;
348    (void)forward;
349    (void)wrap;
350    return EINA_FALSE;
351 }
352
353 EAPI unsigned int
354 elm_web_text_matches_mark(Evas_Object *obj,
355                           const char *string,
356                           Eina_Bool case_sensitive,
357                           Eina_Bool highlight,
358                           unsigned int limit)
359 {
360    ELM_WEB_CHECK(obj) 0;
361
362    (void)string;
363    (void)case_sensitive;
364    (void)highlight;
365    (void)limit;
366    return 0;
367 }
368
369 EAPI Eina_Bool
370 elm_web_text_matches_unmark_all(Evas_Object *obj)
371 {
372    ELM_WEB_CHECK(obj) EINA_FALSE;
373
374    return EINA_FALSE;
375 }
376
377 EAPI Eina_Bool
378 elm_web_text_matches_highlight_set(Evas_Object *obj,
379                                    Eina_Bool highlight)
380 {
381    ELM_WEB_CHECK(obj) EINA_FALSE;
382
383    (void)highlight;
384    return EINA_FALSE;
385 }
386
387 EAPI Eina_Bool
388 elm_web_text_matches_highlight_get(const Evas_Object *obj)
389 {
390    ELM_WEB_CHECK(obj) EINA_FALSE;
391
392    return EINA_FALSE;
393 }
394
395 EAPI double
396 elm_web_load_progress_get(const Evas_Object *obj)
397 {
398    ELM_WEB_CHECK(obj) - 1.0;
399
400    return EINA_FALSE;
401 }
402
403 EAPI Eina_Bool
404 elm_web_stop(Evas_Object *obj)
405 {
406    ELM_WEB_CHECK(obj) EINA_FALSE;
407
408    return EINA_FALSE;
409 }
410
411 EAPI Eina_Bool
412 elm_web_reload(Evas_Object *obj)
413 {
414    ELM_WEB_CHECK(obj) EINA_FALSE;
415
416    return EINA_FALSE;
417 }
418
419 EAPI Eina_Bool
420 elm_web_reload_full(Evas_Object *obj)
421 {
422    ELM_WEB_CHECK(obj) EINA_FALSE;
423
424    return EINA_FALSE;
425 }
426
427 EAPI Eina_Bool
428 elm_web_back(Evas_Object *obj)
429 {
430    ELM_WEB_CHECK(obj) EINA_FALSE;
431
432    return EINA_FALSE;
433 }
434
435 EAPI Eina_Bool
436 elm_web_forward(Evas_Object *obj)
437 {
438    ELM_WEB_CHECK(obj) EINA_FALSE;
439
440    return EINA_FALSE;
441 }
442
443 EAPI Eina_Bool
444 elm_web_navigate(Evas_Object *obj,
445                  int steps)
446 {
447    ELM_WEB_CHECK(obj) EINA_FALSE;
448
449    return EINA_FALSE;
450    (void)steps;
451 }
452
453 EAPI Eina_Bool
454 elm_web_back_possible_get(Evas_Object *obj)
455 {
456    ELM_WEB_CHECK(obj) EINA_FALSE;
457
458    return EINA_FALSE;
459 }
460
461 EAPI Eina_Bool
462 elm_web_forward_possible_get(Evas_Object *obj)
463 {
464    ELM_WEB_CHECK(obj) EINA_FALSE;
465
466    return EINA_FALSE;
467 }
468
469 EAPI Eina_Bool
470 elm_web_navigate_possible_get(Evas_Object *obj,
471                               int steps)
472 {
473    ELM_WEB_CHECK(obj) EINA_FALSE;
474
475    (void)steps;
476    return EINA_FALSE;
477 }
478
479 EAPI Eina_Bool
480 elm_web_history_enabled_get(const Evas_Object *obj)
481 {
482    ELM_WEB_CHECK(obj) EINA_FALSE;
483
484    return EINA_FALSE;
485 }
486
487 EAPI void
488 elm_web_history_enabled_set(Evas_Object *obj,
489                             Eina_Bool enable)
490 {
491    ELM_WEB_CHECK(obj);
492
493    (void)enable;
494 }
495
496 EAPI void
497 elm_web_zoom_set(Evas_Object *obj,
498                  double zoom)
499 {
500    ELM_WEB_CHECK(obj);
501
502    (void)zoom;
503 }
504
505 EAPI double
506 elm_web_zoom_get(const Evas_Object *obj)
507 {
508    ELM_WEB_CHECK(obj) - 1.0;
509
510    return -1.0;
511 }
512
513 EAPI void
514 elm_web_zoom_mode_set(Evas_Object *obj,
515                       Elm_Web_Zoom_Mode mode)
516 {
517    ELM_WEB_CHECK(obj);
518
519    (void)mode;
520 }
521
522 EAPI Elm_Web_Zoom_Mode
523 elm_web_zoom_mode_get(const Evas_Object *obj)
524 {
525    ELM_WEB_CHECK(obj) ELM_WEB_ZOOM_MODE_LAST;
526
527    return ELM_WEB_ZOOM_MODE_LAST;
528 }
529
530 EAPI void
531 elm_web_region_show(Evas_Object *obj,
532                     int x,
533                     int y,
534                     int w __UNUSED__,
535                     int h __UNUSED__)
536 {
537    ELM_WEB_CHECK(obj);
538
539    (void)x;
540    (void)y;
541 }
542
543 EAPI void
544 elm_web_region_bring_in(Evas_Object *obj,
545                         int x,
546                         int y,
547                         int w __UNUSED__,
548                         int h __UNUSED__)
549 {
550    ELM_WEB_CHECK(obj);
551
552    (void)x;
553    (void)y;
554 }
555
556 EAPI void
557 elm_web_inwin_mode_set(Evas_Object *obj,
558                        Eina_Bool value)
559 {
560    ELM_WEB_CHECK(obj);
561
562    (void)value;
563 }
564
565 EAPI Eina_Bool
566 elm_web_inwin_mode_get(const Evas_Object *obj)
567 {
568    ELM_WEB_CHECK(obj) EINA_FALSE;
569
570    return EINA_FALSE;
571 }
572
573 EAPI void
574 elm_web_window_features_ref(Elm_Web_Window_Features *wf)
575 {
576    // FIXME : need to implement
577    (void)wf;
578 }
579
580 EAPI void
581 elm_web_window_features_unref(Elm_Web_Window_Features *wf)
582 {
583    // FIXME : need to implement
584    (void)wf;
585 }
586
587 EAPI Eina_Bool
588 elm_web_window_features_property_get(const Elm_Web_Window_Features *wf,
589                                      Elm_Web_Window_Feature_Flag flag)
590 {
591    // FIXME : need to implement
592    (void)wf;
593    (void)flag;
594    return EINA_FALSE;
595 }
596
597 EAPI void
598 elm_web_window_features_region_get(const Elm_Web_Window_Features *wf,
599                                    Evas_Coord *x,
600                                    Evas_Coord *y,
601                                    Evas_Coord *w,
602                                    Evas_Coord *h)
603 {
604    // FIXME : need to implement
605    (void)wf;
606    (void)x;
607    (void)y;
608    (void)w;
609    (void)h;
610    return;
611 }
612 #endif