tizen 2.4 release
[framework/uifw/elementary.git] / src / edje_externals / elm_map.c
1 #include <assert.h>
2 #include "private.h"
3
4 typedef struct _Elm_Params_Map
5 {
6    Elm_Params base;
7    const char *map_source;
8    const char *zoom_mode;
9    double zoom;
10    Eina_Bool zoom_set:1;
11 } Elm_Params_Map;
12
13 static const char *zoom_choices[] = { "manual", "auto fit", "auto fill", NULL };
14
15 static const char *source_choices[] =
16 {
17    "Mapnik", "Osmarender", "CycleMap", "Maplint"
18 };
19
20 static Elm_Map_Zoom_Mode
21 _zoom_mode_get(const char *map_src)
22 {
23    unsigned int i;
24
25    assert(sizeof(zoom_choices)/sizeof(zoom_choices[0]) ==
26           ELM_MAP_ZOOM_MODE_LAST + 1);
27
28    for (i = 0; i < ELM_MAP_ZOOM_MODE_LAST; i++)
29      if (!strcmp(map_src, zoom_choices[i])) return i;
30
31    return ELM_MAP_ZOOM_MODE_LAST;
32 }
33
34 static void
35 external_map_state_set(void *data EINA_UNUSED, Evas_Object *obj,
36                        const void *from_params, const void *to_params,
37                        float pos EINA_UNUSED)
38 {
39    const Elm_Params_Map *p;
40
41    if (to_params) p = to_params;
42    else if (from_params) p = from_params;
43    else return;
44
45    if (p->map_source)
46      {
47         elm_map_source_set(obj, ELM_MAP_SOURCE_TYPE_TILE, p->map_source);
48      }
49    if (p->zoom_mode)
50      {
51         Elm_Map_Zoom_Mode set = _zoom_mode_get(p->zoom_mode);
52         if (set == ELM_MAP_ZOOM_MODE_LAST) return;
53         elm_map_zoom_mode_set(obj, set);
54      }
55    if (p->zoom_set) elm_map_zoom_set(obj, p->zoom);
56 }
57
58 static Eina_Bool
59 external_map_param_set(void *data EINA_UNUSED, Evas_Object *obj,
60                        const Edje_External_Param *param)
61 {
62    if (!strcmp(param->name, "map source"))
63      {
64         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
65           {
66              elm_map_source_set(obj, ELM_MAP_SOURCE_TYPE_TILE, param->s);
67              return EINA_TRUE;
68           }
69      }
70    else if (!strcmp(param->name, "zoom mode"))
71      {
72         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
73           {
74              Elm_Map_Zoom_Mode set = _zoom_mode_get(param->s);
75              if (set == ELM_MAP_ZOOM_MODE_LAST) return EINA_FALSE;
76              elm_map_zoom_mode_set(obj, set);
77              return EINA_TRUE;
78           }
79      }
80    else if (!strcmp(param->name, "zoom level"))
81      {
82         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
83           {
84              elm_map_zoom_set(obj, param->d);
85              return EINA_TRUE;
86           }
87      }
88
89    ERR("unknown parameter '%s' of type '%s'",
90        param->name, edje_external_param_type_str(param->type));
91
92    return EINA_FALSE;
93 }
94
95 static Eina_Bool
96 external_map_param_get(void *data EINA_UNUSED, const Evas_Object *obj,
97                        Edje_External_Param *param)
98 {
99    if (!strcmp(param->name, "map source"))
100      {
101         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
102           {
103              const char *set = elm_map_source_get(obj, ELM_MAP_SOURCE_TYPE_TILE);
104              param->s = set;
105              return EINA_TRUE;
106           }
107      }
108    else if (!strcmp(param->name, "zoom mode"))
109      {
110         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
111           {
112              Elm_Map_Zoom_Mode set = elm_map_zoom_mode_get(obj);
113              if (set == ELM_MAP_ZOOM_MODE_LAST) return EINA_FALSE;
114              param->s = zoom_choices[set];
115              return EINA_TRUE;
116           }
117      }
118    else if (!strcmp(param->name, "zoom level"))
119      {
120         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
121           {
122              param->d = elm_map_zoom_get(obj);
123              return EINA_TRUE;
124           }
125      }
126
127    ERR("unknown parameter '%s' of type '%s'",
128        param->name, edje_external_param_type_str(param->type));
129
130    return EINA_FALSE;
131 }
132
133 static void *
134 external_map_params_parse(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
135                           const Eina_List *params)
136 {
137    Elm_Params_Map *mem;
138    Edje_External_Param *param;
139    const Eina_List *l;
140
141    mem = calloc(1, sizeof(Elm_Params_Map));
142    if (!mem)
143      return NULL;
144
145    EINA_LIST_FOREACH(params, l, param)
146      {
147         if (!strcmp(param->name, "map source"))
148           mem->map_source = eina_stringshare_add(param->s);
149         if (!strcmp(param->name, "zoom mode"))
150           mem->zoom_mode = eina_stringshare_add(param->s);
151         else if (!strcmp(param->name, "zoom level"))
152           {
153              mem->zoom = param->d;
154              mem->zoom_set = EINA_TRUE;
155           }
156      }
157
158    return mem;
159 }
160
161 static Evas_Object *external_map_content_get(void *data EINA_UNUSED,
162                                              const Evas_Object *obj EINA_UNUSED,
163                                              const char *content EINA_UNUSED)
164 {
165    ERR("No content.");
166    return NULL;
167 }
168
169 static void
170 external_map_params_free(void *params)
171 {
172    Elm_Params_Map *mem = params;
173
174    if (mem->map_source)
175      eina_stringshare_del(mem->map_source);
176    if (mem->zoom_mode)
177      eina_stringshare_del(mem->zoom_mode);
178    free(mem);
179 }
180
181 static Edje_External_Param_Info external_map_params[] =
182 {
183    DEFINE_EXTERNAL_COMMON_PARAMS,
184    EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("map source", "Mapnik", source_choices),
185    EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("zoom mode", "manual", zoom_choices),
186    EDJE_EXTERNAL_PARAM_INFO_DOUBLE("zoom level"),
187    EDJE_EXTERNAL_PARAM_INFO_SENTINEL
188 };
189
190 DEFINE_EXTERNAL_ICON_ADD(map, "map");
191 DEFINE_EXTERNAL_TYPE_SIMPLE(map, "Map");