1 #ifndef ELM_WIDGET_MAP_H
2 #define ELM_WIDGET_MAP_H
3 
4 #include "Elementary.h"
5 
6 /* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR
7  * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT
8  * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK
9  * IT AT RUNTIME.
10  */
11 
12 /**
13  * @addtogroup Widget
14  * @{
15  *
16  * @section elm-map-class The Elementary Map Class
17  *
18  * Elementary, besides having the @ref Map widget, exposes its
19  * foundation -- the Elementary Map Class -- in order to create
20  * other widgets which are a map with some more logic on top.
21  */
22 
23 /**
24  * Base widget smart data extended with map instance data.
25  */
26 typedef struct _Elm_Map_Data     Elm_Map_Data;
27 
28 typedef struct _Elm_Map_Name_List      Elm_Map_Name_List;
29 typedef Eina_Stringshare *(*Elm_Map_Module_Source_Name_Func)(void);
30 typedef int   (*Elm_Map_Module_Tile_Zoom_Min_Func)(void);
31 typedef int   (*Elm_Map_Module_Tile_Zoom_Max_Func)(void);
32 typedef char *(*Elm_Map_Module_Tile_Url_Func)(const Evas_Object *,
33                                               int,
34                                               int,
35                                               int);
36 typedef Eina_Bool (*Elm_Map_Module_Tile_Geo_to_Coord_Func)(const Evas_Object *,
37                                                            int,
38                                                            double,
39                                                            double,
40                                                            int,
41                                                            int *,
42                                                            int *);
43 typedef Eina_Bool (*Elm_Map_Module_Tile_Coord_to_Geo_Func)(const Evas_Object *,
44                                                            int,
45                                                            int,
46                                                            int,
47                                                            int,
48                                                            double *,
49                                                            double *);
50 typedef double (*Elm_Map_Module_Tile_Scale_Func)(const Evas_Object *,
51                                                  double,
52                                                  double,
53                                                  int);
54 typedef Evas_Object *(*Elm_Map_Module_Tile_Copyright_Func)(Evas_Object *);
55 typedef char *(*Elm_Map_Module_Route_Url_Func)(const Evas_Object *,
56                                                const char *,
57                                                int,
58                                                double,
59                                                double,
60                                                double,
61                                                double);
62 typedef void (*Elm_Map_Module_Route_Parse_Func)(Elm_Map_Route *);
63 typedef char *(*Elm_Map_Module_Name_Url_Func)(const Evas_Object *,
64                                               int,
65                                               const char *,
66                                               double,
67                                               double);
68 typedef void (*Elm_Map_Module_Name_Parse_Func)(Elm_Map_Name *n);
69 typedef void (*Elm_Map_Module_Name_List_Parse_Func)(Elm_Map_Name_List *nl);
70 
71 typedef struct _Source_Tile            Source_Tile;
72 // FIXME: Currently tile size must be 256*256
73 // and the map size is pow(2.0, z) * (tile size)
74 struct _Source_Tile
75 {
76    Eina_Stringshare                     *name;
77    int                                   zoom_min;
78    int                                   zoom_max;
79    Elm_Map_Module_Tile_Url_Func          url_cb;
80    Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord;
81    Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo;
82    Elm_Map_Module_Tile_Scale_Func        scale_cb;
83    Elm_Map_Module_Tile_Copyright_Func    copyright_cb;
84 };
85 
86 typedef struct _Source_Route           Source_Route;
87 struct _Source_Route
88 {
89    Eina_Stringshare             *name;
90    Elm_Map_Module_Route_Url_Func url_cb;
91    Elm_Map_Module_Route_Parse_Func route_parse_cb;
92 };
93 
94 typedef struct _Source_Name            Source_Name;
95 struct _Source_Name
96 {
97    Eina_Stringshare            *name;
98    Elm_Map_Module_Name_Url_Func url_cb;
99    Elm_Map_Module_Name_Parse_Func name_parse_cb;
100    Elm_Map_Module_Name_List_Parse_Func name_list_parse_cb;
101 };
102 
103 typedef struct _Path                   Path;
104 typedef struct _Color                  Color;
105 typedef struct _Region                 Region;
106 typedef struct _Grid                   Grid;
107 typedef struct _Grid_Item              Grid_Item;
108 typedef struct _Overlay_Default        Overlay_Default;
109 typedef struct _Overlay_Class          Overlay_Class;
110 typedef struct _Overlay_Group          Overlay_Group;
111 typedef struct _Overlay_Bubble         Overlay_Bubble;
112 typedef struct _Overlay_Route          Overlay_Route;
113 typedef struct _Overlay_Line           Overlay_Line;
114 typedef struct _Overlay_Polygon        Overlay_Polygon;
115 typedef struct _Overlay_Circle         Overlay_Circle;
116 typedef struct _Overlay_Scale          Overlay_Scale;
117 typedef struct _Path_Node              Path_Node;
118 typedef struct _Path_Waypoint          Path_Waypoint;
119 typedef struct _Route_Dump             Route_Dump;
120 typedef struct _Name_Dump              Name_Dump;
121 typedef struct _Calc_Job               Calc_Job;
122 
123 enum _Route_Xml_Attribute
124 {
125    ROUTE_XML_NONE,
126    ROUTE_XML_DISTANCE,
127    ROUTE_XML_DESCRIPTION,
128    ROUTE_XML_COORDINATES,
129    ROUTE_XML_LAST
130 } Route_Xml_Attibute;
131 
132 enum _Name_Xml_Attribute
133 {
134    NAME_XML_NONE,
135    NAME_XML_NAME,
136    NAME_XML_LON,
137    NAME_XML_LAT,
138    NAME_XML_LAST
139 } Name_Xml_Attibute;
140 
141 enum _Track_Xml_Attribute
142 {
143    TRACK_XML_NONE,
144    TRACK_XML_COORDINATES,
145    TRACK_XML_LAST
146 } Track_Xml_Attibute;
147 
148 struct _Path
149 {
150    Evas_Coord x, y;
151 };
152 
153 struct _Region
154 {
155    double lon, lat;
156 };
157 
158 struct _Color
159 {
160    int r, g, b, a;
161 };
162 
163 struct _Overlay_Group
164 {
165    Elm_Map_Data *wsd;
166    double              lon, lat;
167    Elm_Map_Overlay    *overlay; // virtual group type overlay
168    Elm_Map_Overlay    *klass; // class overlay for this virtual group
169    Overlay_Default    *ovl;  // rendered overlay
170    Eina_List          *members;
171    Eina_Bool           in : 1;
172    Eina_Bool           boss : 1;
173 };
174 
175 struct _Overlay_Default
176 {
177    Elm_Map_Data *wsd;
178    Evas_Coord          w, h;
179 
180    double              lon, lat;
181    Evas_Coord          x, y;
182 
183    // Display priority is content > icon > clas_obj > clas_icon > layout
184    Evas_Object        *content;
185    Evas_Object        *icon;
186 
187    Color               c;
188    // if clas_content or icon exists, do not inherit from class
189    Evas_Object        *clas_content; // Duplicated from class content
190    Evas_Object        *clas_icon; // Duplicated from class icon
191    Evas_Object        *layout;
192 };
193 
194 struct _Overlay_Class
195 {
196    Elm_Map_Data *wsd;
197    Eina_List          *members;
198    int                 zoom_max;
199    Evas_Object        *content;
200    Evas_Object        *icon;
201 };
202 
203 struct _Overlay_Bubble
204 {
205    Elm_Map_Data *wsd;
206    Evas_Object        *pobj;
207    Evas_Object        *obj, *sc, *bx;
208    double              lon, lat;
209    Evas_Coord          x, y, w, h;
210 };
211 
212 struct _Overlay_Route
213 {
214    Elm_Map_Data *wsd;
215 
216    Evas_Object        *obj;
217    Eina_List          *paths;
218    Eina_List          *nodes;
219 };
220 
221 struct _Overlay_Line
222 {
223    Elm_Map_Data *wsd;
224    double              flon, flat, tlon, tlat;
225    Evas_Object        *obj;
226 };
227 
228 struct _Overlay_Polygon
229 {
230    Elm_Map_Data *wsd;
231    Eina_List          *regions; // list of Regions
232    Evas_Object        *obj;
233 };
234 
235 struct _Overlay_Circle
236 {
237    Elm_Map_Data *wsd;
238    double              lon, lat;
239    double              radius; // Initial pixel in initial view
240    double              ratio; // initial-radius/map-size
241    Evas_Object        *obj;
242 };
243 
244 struct _Overlay_Scale
245 {
246    Elm_Map_Data *wsd;
247    Evas_Coord          x, y;
248    Evas_Coord          w, h;
249    Evas_Object        *obj;
250 };
251 
252 struct _Elm_Map_Overlay
253 {
254    Elm_Map_Data    *wsd;
255 
256    Evas_Coord             zoom_min;
257    Color                  c;
258    void                  *data; // user set data
259 
260    Elm_Map_Overlay_Type   type;
261    void                  *ovl; // Overlay Data for each type
262 
263    Elm_Map_Overlay_Get_Cb cb;
264    void                  *cb_data;
265 
266    Elm_Map_Overlay_Del_Cb del_cb;
267    void                  *del_cb_data;
268 
269    // These are not used if overlay type is class or group
270    Overlay_Group         *grp;
271 
272    Eina_Bool              visible : 1;
273    Eina_Bool              paused : 1;
274    Eina_Bool              hide : 1;
275 };
276 
277 struct _Elm_Map_Route
278 {
279    Elm_Map_Data      *wsd;
280 
281    char                    *fname;
282    Elm_Map_Route_Type       type;
283    Elm_Map_Route_Method     method;
284    double                   flon, flat, tlon, tlat;
285    Elm_Map_Route_Cb         cb;
286    void                    *data;
287    Ecore_File_Download_Job *job;
288 
289    Eina_List               *nodes;
290    Eina_List               *waypoint;
291    struct
292    {
293       int         node_count;
294       int         waypoint_count;
295       const char *nodes;
296       const char *waypoints;
297       double      distance; /* unit : km */
298    } info;
299 
300    Path_Node               *n;
301    Path_Waypoint           *w;
302 };
303 
304 struct _Path_Node
305 {
306    Elm_Map_Data *wsd;
307 
308    int                 idx;
309    struct
310    {
311       double lon, lat;
312       char  *address;
313    } pos;
314 };
315 
316 struct _Path_Waypoint
317 {
318    Elm_Map_Data *wsd;
319 
320    const char         *point;
321 };
322 
323 struct _Elm_Map_Name
324 {
325    Elm_Map_Data      *wsd;
326 
327    int                      method;
328    char                    *address;
329    double                   lon, lat;
330 
331    char                    *fname;
332    Ecore_File_Download_Job *job;
333    Elm_Map_Name_Cb          cb;
334    void                    *data;
335 };
336 
337 struct _Elm_Map_Name_List
338 {
339    Elm_Map_Data      *wsd;
340 
341    Eina_List               *names;
342    double                   lon, lat;
343 
344    char                    *fname;
345    Ecore_File_Download_Job *job;
346    Elm_Map_Name_List_Cb     cb;
347    void                    *data;
348 };
349 
350 struct _Route_Dump
351 {
352    int    id;
353    char  *fname;
354    double distance;
355    char  *description;
356    char  *coordinates;
357 };
358 
359 struct _Name_Dump
360 {
361    int    id;
362    char  *address;
363    double lon;
364    double lat;
365 };
366 
367 struct _Grid_Item
368 {
369    Grid                    *g;
370 
371    Elm_Map_Data      *wsd;
372    Evas_Object             *img;
373    const char              *file;
374    const char              *url;
375    int                      x, y; // Tile coordinate
376 
377    Ecore_File_Download_Job *job;
378 
379    Eina_Bool                file_have : 1;
380 };
381 
382 struct _Grid
383 {
384    Elm_Map_Data *wsd;
385    int                 zoom;  /* zoom level tiles want for optimal
386                                * display (1, 2, 4, 8) */
387    int                 tw, th; // size of grid in tiles
388    Eina_Matrixsparse  *grid;
389 };
390 
391 struct _Calc_Job
392 {
393    double zoom;
394    void (*zoom_mode_set)(Elm_Map_Data *sd, double zoom);
395 
396    Eina_Bool bring_in : 1;
397    double lon, lat;
398    void (*region_show_bring_in)(Elm_Map_Data *sd, double lon,
399                                 double lat, Eina_Bool bring_in);
400 
401    Eina_List *overlays;
402    void (*overlays_show)(Elm_Map_Data *sd, Eina_List *overlays);
403 };
404 
405 struct _Elm_Map_Data
406 {
407    Evas_Object                          *hit_rect;
408    Evas_Object                          *pan_obj;
409    Evas_Object                          *g_layer;
410    Evas_Object                          *obj; // The object itself
411 
412    /* Tiles are below this and overlays are on top */
413    Evas_Object                          *sep_maps_overlays;
414    Evas_Map                             *map;
415 
416    Eina_Array                           *src_mods;
417 
418    Source_Tile                          *src_tile;
419    Eina_List                            *src_tiles;
420    const char                          **src_tile_names;
421 
422    Source_Route                         *src_route;
423    Eina_List                            *src_routes;
424    const char                          **src_route_names;
425 
426    Source_Name                          *src_name;
427    Eina_List                            *src_names;
428    const char                          **src_name_names;
429 
430    Eina_List                            *grids;
431 
432    int                                   zoom_min, zoom_max;
433    int                                   tsize;
434    int                                   id;
435    int                                   zoom;
436 
437    double                                zoom_detail;
438    struct
439    {
440       int w, h;    // Current pixel width, heigth of a grid
441       int tile;    // Current pixel size of a grid item
442    } size;
443 
444    Efl_Ui_Zoom_Mode                     mode;
445 
446    struct
447    {
448       double zoom;
449       double zoom_diff;
450       double lon, lat;
451       double lon_diff, lat_diff;
452       int    zoom_cnt;
453       int    region_cnt;
454    } ani;
455 
456    Ecore_Timer                          *zoom_timer;
457    Ecore_Timer                          *loaded_timer;
458 
459    int                                   try_num;
460    int                                   finish_num;
461    int                                   download_num;
462 
463    Eina_List                            *download_list;
464    Ecore_Idler                          *download_idler;
465    Eina_Hash                            *ua;
466    const char                           *user_agent;
467 
468    Evas_Coord                            pan_x, pan_y;
469 
470    Ecore_Timer                          *scr_timer;
471    Ecore_Timer                          *long_timer;
472    Evas_Event_Mouse_Down                 ev;
473 
474    double                                pinch_zoom;
475    struct
476    {
477       Evas_Coord cx, cy;
478       double     a, d;
479    } rotate;
480 
481    Eina_List                            *routes;
482    Eina_List                            *track;
483    Eina_List                            *names;
484 
485    Eina_List                            *overlays;
486    Eina_List                            *group_overlays;
487    Eina_List                            *all_overlays;
488 
489    Eina_Bool                             wheel_disabled : 1;
490    Eina_Bool                             on_hold : 1;
491    Eina_Bool                             paused : 1;
492    Eina_Bool                             zoom_animator : 1;
493 
494    Calc_Job                               calc_job;
495    Evas_Object                          *copyright;
496 };
497 
498 typedef struct _Elm_Map_Pan_Data Elm_Map_Pan_Data;
499 struct _Elm_Map_Pan_Data
500 {
501    Evas_Object            *wobj;
502    Elm_Map_Data *wsd;
503 };
504 
505 /**
506  * @}
507  */
508 
509 #define ELM_MAP_DATA_GET(o, sd) \
510   Elm_Map_Data * sd = efl_data_scope_get(o, ELM_MAP_CLASS)
511 
512 #define ELM_MAP_PAN_DATA_GET(o, sd) \
513   Elm_Map_Pan_Data * sd = efl_data_scope_get(o, ELM_MAP_PAN_CLASS)
514 
515 #define ELM_MAP_DATA_GET_OR_RETURN(o, ptr)      \
516   ELM_MAP_DATA_GET(o, ptr);                     \
517   if (EINA_UNLIKELY(!ptr))                      \
518     {                                           \
519        ERR("No widget data for object %p (%s)", \
520            o, evas_object_type_get(o));         \
521        return;                                  \
522     }
523 
524 #define ELM_MAP_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
525   ELM_MAP_DATA_GET(o, ptr);                         \
526   if (EINA_UNLIKELY(!ptr))                          \
527     {                                               \
528        ERR("No widget data for object %p (%s)",     \
529            o, evas_object_type_get(o));             \
530        return val;                                  \
531     }
532 
533 #define ELM_MAP_CHECK(obj)                              \
534   if (EINA_UNLIKELY(!efl_isa((obj), ELM_MAP_CLASS))) \
535     return
536 
537 #endif
538