[access] support elm_access_action(); with ELM_ACCESS_ACTION_UNHIGHLIGHT
[framework/uifw/elementary.git] / src / edje_externals / elm_web.c
1 #include "private.h"
2
3 typedef struct _Elm_Params_Web
4 {
5    Elm_Params base;
6    const char *uri;
7    double zoom;
8    Elm_Web_Zoom_Mode zoom_mode;
9    Eina_Bool inwin_mode;
10    Eina_Bool zoom_set:1;
11    Eina_Bool inwin_mode_set:1;
12 } Elm_Params_Web;
13
14 static const char *zoom_choices[] = {"manual", "auto fit", "auto fill", NULL};
15
16 static Elm_Web_Zoom_Mode
17 _zoom_mode_get(const char *zoom)
18 {
19    unsigned int i;
20
21    for (i = 0; i < ELM_WEB_ZOOM_MODE_LAST; i++)
22      if (!strcmp(zoom, zoom_choices[i])) return i;
23
24    return ELM_WEB_ZOOM_MODE_LAST;
25 }
26
27 static void
28 external_web_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
29 {
30    const Elm_Params_Web *p;
31
32    if (to_params) p = to_params;
33    else if (from_params) p = from_params;
34    else return;
35
36    if (p->uri)
37      elm_web_uri_set(obj, p->uri);
38    if (p->zoom_mode < ELM_WEB_ZOOM_MODE_LAST)
39      elm_web_zoom_mode_set(obj, p->zoom_mode);
40    if (p->zoom_set)
41      elm_web_zoom_set(obj, p->zoom);
42    if (p->inwin_mode_set)
43      elm_web_inwin_mode_set(obj, p->inwin_mode);
44 }
45
46 static Eina_Bool
47 external_web_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
48 {
49    if (!strcmp(param->name, "uri"))
50      {
51         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
52           {
53              elm_web_uri_set(obj, param->s);
54              return EINA_TRUE;
55           }
56      }
57    else if (!strcmp(param->name, "zoom level"))
58      {
59         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
60           {
61              elm_web_zoom_set(obj, param->d);
62              return EINA_TRUE;
63           }
64      }
65    else if (!strcmp(param->name, "zoom mode"))
66      {
67         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
68           {
69              Elm_Web_Zoom_Mode mode = _zoom_mode_get(param->s);
70              if (mode == ELM_WEB_ZOOM_MODE_LAST)
71                return EINA_FALSE;
72              elm_web_zoom_mode_set(obj, mode);
73              return EINA_TRUE;
74           }
75      }
76    else if (!strcmp(param->name, "inwin mode"))
77      {
78         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
79           {
80              elm_web_inwin_mode_set(obj, !!param->i);
81              return EINA_TRUE;
82           }
83      }
84
85    ERR("unknown parameter '%s' of type '%s'",
86        param->name, edje_external_param_type_str(param->type));
87
88    return EINA_FALSE;
89 }
90
91 static Eina_Bool
92 external_web_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
93 {
94    if (!strcmp(param->name, "uri"))
95      {
96         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING)
97           {
98              param->s = elm_web_uri_get(obj);
99              return EINA_TRUE;
100           }
101      }
102    else if (!strcmp(param->name, "zoom level"))
103      {
104         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
105           {
106              param->d = elm_web_zoom_get(obj);
107              return EINA_TRUE;
108           }
109      }
110    else if (!strcmp(param->name, "zoom mode"))
111      {
112         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
113           {
114              Elm_Web_Zoom_Mode mode = elm_web_zoom_mode_get(obj);
115              if (mode == ELM_WEB_ZOOM_MODE_LAST)
116                return EINA_FALSE;
117              param->s = zoom_choices[mode];
118              return EINA_TRUE;
119           }
120      }
121    else if (!strcmp(param->name, "inwin mode"))
122      {
123         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
124           {
125              param->i = elm_web_inwin_mode_get(obj);
126              return EINA_TRUE;
127           }
128      }
129
130    ERR("unknown parameter '%s' of type '%s'",
131        param->name, edje_external_param_type_str(param->type));
132
133    return EINA_FALSE;
134 }
135
136 static void *
137 external_web_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
138 {
139    Elm_Params_Web *mem;
140    Edje_External_Param *param;
141    const Eina_List *l;
142
143    mem = calloc(1, sizeof(Elm_Params_Web));
144    if (!mem) return NULL;
145
146    mem->zoom_mode = ELM_WEB_ZOOM_MODE_LAST;
147
148    EINA_LIST_FOREACH(params, l, param)
149      {
150         if (!strcmp(param->name, "zoom level"))
151           {
152              mem->zoom = param->d;
153              mem->zoom_set = EINA_TRUE;
154           }
155         else if (!strcmp(param->name, "zoom mode"))
156           mem->zoom_mode = _zoom_mode_get(param->s);
157         else if (!strcmp(param->name, "uri"))
158           mem->uri = eina_stringshare_add(param->s);
159         else if (!strcmp(param->name, "inwin mode"))
160           {
161              mem->inwin_mode = !!param->i;
162              mem->inwin_mode_set = EINA_TRUE;
163           }
164      }
165
166    return mem;
167 }
168
169 static void
170 external_web_params_free(void *params)
171 {
172    Elm_Params_Web *mem = params;
173
174    if (mem->uri)
175      eina_stringshare_del(mem->uri);
176    free(mem);
177 }
178
179 static Evas_Object *
180 external_web_content_get(void *data __UNUSED__, const Evas_Object *obj __UNUSED__, const char *content __UNUSED__)
181 {
182    return NULL;
183 }
184
185 static Edje_External_Param_Info external_web_params[] =
186 {
187    EDJE_EXTERNAL_PARAM_INFO_STRING("uri"),
188    EDJE_EXTERNAL_PARAM_INFO_DOUBLE_DEFAULT("zoom level", 1.0),
189    EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("zoom mode", "manual", zoom_choices),
190    EDJE_EXTERNAL_PARAM_INFO_BOOL_DEFAULT("inwin mode", EINA_FALSE),
191    EDJE_EXTERNAL_PARAM_INFO_SENTINEL
192 };
193
194 static Evas_Object *
195 external_web_add(void *data __UNUSED__, Evas *evas __UNUSED__, Evas_Object *edje, const Eina_List *params __UNUSED__, const char *part_name)
196 {
197    Evas_Object *parent, *obj;
198    external_elm_init();
199    parent = elm_widget_parent_widget_get(edje);
200    if (!parent) parent = edje;
201    elm_need_web(); /* extra command needed */
202    obj = elm_web_add(parent);
203    external_signals_proxy(obj, edje, part_name);
204    return obj;
205 }
206
207 DEFINE_EXTERNAL_ICON_ADD(web, "web")
208 DEFINE_EXTERNAL_TYPE(web, "Web")