From: Bluezery <ohpowel@gmail.com>
[framework/uifw/elementary.git] / src / bin / test_map.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 #define SOURCE_MAX 10
8 #define MARKER_MAX 1000
9 #define NAME_ENTRY_TEXT "Enter freeform address"
10
11 typedef struct Overlay_Data
12 {
13    const char *file;
14 } Overlay_Data;
15
16 typedef struct Map_Source
17 {
18    Evas_Object *map;
19    Elm_Map_Source_Type type;
20    char *source_name;
21 } Map_Source;
22
23 Overlay_Data data1 = {PACKAGE_DATA_DIR"/images/logo.png"};
24 Overlay_Data data2 = {PACKAGE_DATA_DIR"/images/logo_small.png"};
25 Overlay_Data data3 = {PACKAGE_DATA_DIR"/images/panel_01.jpg"};
26 Overlay_Data data4 = {PACKAGE_DATA_DIR"/images/plant_01.jpg"};
27 Overlay_Data data5 = {PACKAGE_DATA_DIR"/images/rock_01.jpg"};
28 Overlay_Data data6 = {PACKAGE_DATA_DIR"/images/rock_02.jpg"};
29 Overlay_Data data7 = {PACKAGE_DATA_DIR"/images/sky_01.jpg"};
30 Overlay_Data data8 = {PACKAGE_DATA_DIR"/images/sky_02.jpg"};
31 Overlay_Data data9 = {PACKAGE_DATA_DIR"/images/sky_03.jpg"};
32 Overlay_Data data10 = {PACKAGE_DATA_DIR"/images/sky_03.jpg"};
33 Overlay_Data data11= {PACKAGE_DATA_DIR"/images/wood_01.jpg"};
34 Overlay_Data parking= {PACKAGE_DATA_DIR"/images/parking.png"};
35 Overlay_Data icon_data = {PACKAGE_DATA_DIR"/images/icon_14.png"};
36
37 static Elm_Map_Overlay *route_start, *route_end, *route_clas;
38 static Elm_Map_Overlay *bubble_img;
39 static Elm_Map_Overlay *bubble_parking;
40 static Elm_Map_Overlay *route_ovl;
41
42 static Evas_Object *menu, *fs_win;
43 static Elm_Map_Route *route;
44 static Elm_Map_Name *name;
45 static Evas_Object *track;
46 static Evas_Coord down_x, down_y;
47 static Evas_Coord old_x, old_y, old_d;
48 static Map_Source ts[SOURCE_MAX];
49 static Map_Source rs[SOURCE_MAX];
50 static Map_Source ns[SOURCE_MAX];
51
52 static void
53 #ifdef ELM_EMAP
54 my_map_gpx_fileselector_done(void *data, Evas_Object *obj __UNUSED__, void *event_info)
55 #else
56 my_map_gpx_fileselector_done(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
57 #endif
58 {
59    const char *selected = event_info;
60
61    if (selected)
62      {
63         printf("Selected file: %s\n", selected);
64 #ifdef ELM_EMAP
65         EMap_Route *emap = emap_route_gpx_new(selected);
66         track = elm_map_track_add(data, emap);
67 #else
68         printf("libEMap is required !\n");
69 #endif
70      }
71    evas_object_del(fs_win);
72 }
73
74 static Evas_Object *
75 _route_icon_get(Evas_Object *obj)
76 {
77    Evas_Object *icon = elm_icon_add(obj);
78    elm_icon_file_set(icon, PACKAGE_DATA_DIR"/images/bubble.png", NULL);
79    evas_object_show(icon);
80
81    return icon;
82 }
83
84 static void
85 _bubble_parking_follow(Evas_Object *map)
86 {
87    double lon, lat;
88    Evas_Coord x, y;
89
90    if (bubble_parking)
91      {
92         Elm_Map_Overlay *ovl = elm_map_overlay_data_get(bubble_parking);
93         elm_map_overlay_region_get(ovl, &lon, &lat);
94         elm_map_region_to_canvas_convert(map, lon, lat, &x, &y);
95         elm_map_canvas_to_region_convert(map, x+40, y+50, &lon, &lat);
96         elm_map_overlay_region_set(bubble_parking, lon, lat);
97      }
98 }
99
100 static void
101 _map_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
102 {
103    printf("clicked\n");
104 }
105
106 static void
107 _map_clicked_double(void *data __UNUSED__, Evas_Object *obj, void *event_info)
108 {
109    printf("clicked,double\n");
110    double lon, lat;
111    Evas_Event_Mouse_Down *down = event_info;
112    if (!down) return;
113    if (elm_map_zoom_get(obj) < 5) return;
114
115    elm_map_canvas_to_region_convert(obj, down->canvas.x, down->canvas.y, &lon, &lat);
116    printf("x:%d, y:%d, lon:%lf, lat:%lf\n", down->canvas.x, down->canvas.y, lon, lat);
117
118    if (!route_clas)
119      {
120         route_clas = elm_map_overlay_class_add(obj);
121         elm_map_overlay_icon_set(route_clas, _route_icon_get(obj));
122         elm_map_overlay_displayed_zoom_min_set(route_clas, 5);
123      }
124
125    if (route_start && route_end)
126      {
127         elm_map_overlay_del(route_start);
128         elm_map_overlay_del(route_end);
129         elm_map_route_del(route);
130         route_start = NULL;
131         route_end = NULL;
132         route = NULL;
133      }
134
135    if (!route_start) route_start = elm_map_overlay_add(obj, lon, lat);
136    else route_end = elm_map_overlay_add(obj, lon, lat);
137
138    if (route_start && route_end)
139      {
140         double start_lon, start_lat, end_lon, end_lat;
141         elm_map_overlay_class_append(route_clas, route_start);
142         elm_map_overlay_class_append(route_clas, route_end);
143         elm_map_overlay_region_get(route_start, &start_lon, &start_lat);
144         elm_map_overlay_region_get(route_end, &end_lon, &end_lat);
145         route = elm_map_route_add(obj, ELM_MAP_ROUTE_TYPE_MOTOCAR,
146                                      ELM_MAP_ROUTE_METHOD_FASTEST,
147                                      start_lon, start_lat, end_lon, end_lat,
148                                      NULL, NULL);
149      }
150 }
151
152 static void
153 _map_press(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
154 {
155    printf("press\n");
156 }
157
158 static void
159 _map_longpressed(void *data __UNUSED__, Evas_Object *obj, void *event_info)
160 {
161    if (!event_info) return;
162    double lon, lat;
163    Evas_Event_Mouse_Down *down = (Evas_Event_Mouse_Down *)event_info;
164    elm_map_canvas_to_region_convert(obj, down->canvas.x, down->canvas.y, &lon, &lat);
165    printf("longpressed, x:%d, y:%d, lon:%lf, lat:%lf\n", down->canvas.x, down->canvas.y, lon, lat);
166
167    if (elm_map_zoom_get(obj) < 8) return;
168    if (name) elm_map_name_del(name);
169    name = elm_map_name_add(obj, NULL, lon, lat, NULL, NULL);
170 }
171
172 static void
173 _map_scroll(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
174 {
175    double lon, lat;
176    elm_map_region_get(obj, &lon, &lat);
177    printf("scroll, longitude: %f latitude: %f\n", lon, lat);
178    _bubble_parking_follow(obj);
179 }
180
181 static void
182 _map_drag_start(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
183 {
184    printf("scroll,drag,start\n");
185    evas_object_smart_callback_del(data, "longpressed", _map_longpressed);
186 }
187
188 static void
189 _map_drag_stop(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
190 {
191    printf("scroll,drag,stop\n");
192    evas_object_smart_callback_add(data, "longpressed", _map_longpressed, data);
193 }
194
195 static void
196 _map_anim_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
197 {
198    printf("scroll,anim,start\n");
199 }
200
201 static void
202 _map_anim_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
203 {
204    printf("scroll,anim,stop\n");
205 }
206
207 static void
208 _map_zoom_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
209 {
210    printf("zoom,start\n");
211 }
212
213 static void
214 _map_zoom_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
215 {
216    printf("zoom,stop\n");
217    _bubble_parking_follow(obj);
218 }
219
220 static void
221 _map_zoom_change(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
222 {
223    printf("zoom,change\n");
224 }
225
226 static void
227 _map_tile_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
228 {
229    printf("tile,load\n");
230 }
231
232 static void
233 _map_tile_loaded(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
234 {
235    int try_num, finish_num;
236    elm_map_tile_load_status_get(data, &try_num, &finish_num);
237    printf("tile,loaded: %d / %d\n", finish_num, try_num);
238 }
239
240 static void
241 _map_tile_loaded_fail(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
242 {
243    int try_num, finish_num;
244    elm_map_tile_load_status_get(data, &try_num, &finish_num);
245    printf("tile,loaded,fail: %d / %d\n", finish_num, try_num);
246 }
247
248 static void
249 _map_route_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
250 {
251    printf("route,load\n");
252 }
253
254 static void
255 _map_route_loaded(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
256 {
257    printf("route,loaded\n");
258    double d;
259    const char *w, *n;
260
261    d = elm_map_route_distance_get(route);
262    printf("route distance = %lf km\n", d);
263
264    w = elm_map_route_waypoint_get(route);
265    if (w) printf("[waypoints]\n%s\n", w);
266
267    n = elm_map_route_node_get(route);
268    if (n) printf("[nodes]\n%s\n", n);
269
270    if (route_ovl) elm_map_overlay_del(route_ovl);
271    route_ovl = elm_map_overlay_route_add(obj, route);
272 }
273
274 static void
275 _map_route_loaded_fail(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
276 {
277    printf("route,loaded,fail\n");
278 }
279
280 static void
281 _map_name_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
282 {
283    printf("name,load\n");
284 }
285
286 static void
287 _map_name_loaded(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
288 {
289    printf("name,loaded\n");
290    if (!name) return;
291    double lon, lat;
292    const char *addr = elm_map_name_address_get(name);
293    elm_map_name_region_get(name, &lon, &lat);
294    if (addr)
295      {
296         printf("name of [lon = %lf, lat = %lf] is %s\n", lon, lat, addr);
297         if ((lon != 0.0) && (lat !=0.0))
298           {
299              Eina_Bool b = elm_map_paused_get(data);
300              elm_map_paused_set(data, EINA_TRUE);
301              elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
302              elm_map_zoom_set(data, elm_map_zoom_max_get(data));
303              elm_map_region_show(data, lon, lat);
304              elm_map_paused_set(data, b);
305           }
306      }
307
308    elm_map_name_del(name);
309    name = NULL;
310 }
311
312 static void
313 _map_name_loaded_fail(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
314 {
315    printf("name,loaded,fail\n");
316 }
317
318 static void
319 map_show_urmatt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
320 {
321    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
322    if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12);
323    elm_map_region_show(data,7.325201, 48.526813);
324 }
325
326 static void
327 map_bring_seoul(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
328 {
329    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
330    if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12);
331    elm_map_region_bring_in(data, 126.977969, 37.566535);
332 }
333
334 static void
335 _paused_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
336 {
337    elm_map_paused_set(data, EINA_TRUE);
338 }
339
340 static void
341 _paused_unset(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
342 {
343    elm_map_paused_set(data, EINA_FALSE);
344 }
345
346 static void
347 _zoom_in(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
348 {
349    int zoom;
350
351    zoom = elm_map_zoom_get(data) + 1;
352    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
353    elm_map_zoom_set(data, zoom);
354 }
355
356 static void
357 _zoom_out(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
358 {
359    int zoom;
360
361    zoom = elm_map_zoom_get(data) - 1;
362    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
363    elm_map_zoom_set(data, zoom);
364 }
365
366 static void
367 _zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
368 {
369    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT);
370 }
371
372 static void
373 _zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
374 {
375    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL);
376 }
377
378 static void
379 _zoom_manual(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
380 {
381    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
382 }
383
384 static void
385 _track_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
386 {
387    Evas_Object *fs, *bg, *vbox, *hbox, *sep;
388    char *path = NULL;
389
390    fs_win = elm_win_add(NULL, "fileselector", ELM_WIN_BASIC);
391    elm_win_title_set(fs_win, "File Selector");
392    elm_win_autodel_set(fs_win, 1);
393
394    bg = elm_bg_add(fs_win);
395    elm_win_resize_object_add(fs_win, bg);
396    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
397    evas_object_show(bg);
398
399    vbox = elm_box_add(fs_win);
400    elm_win_resize_object_add(fs_win, vbox);
401    evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
402    evas_object_show(vbox);
403
404    fs = elm_fileselector_add(fs_win);
405    elm_fileselector_is_save_set(fs, EINA_TRUE);
406    elm_fileselector_expandable_set(fs, EINA_FALSE);
407    path = getenv("HOME");
408    //if "HOME" is not available, set current dir. path
409    if (!path)
410      path = ".";
411    elm_fileselector_path_set(fs, path);
412    evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
413    evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
414    elm_box_pack_end(vbox, fs);
415    evas_object_show(fs);
416
417    evas_object_smart_callback_add(fs, "done", my_map_gpx_fileselector_done, data);
418
419    sep = elm_separator_add(fs_win);
420    elm_separator_horizontal_set(sep, EINA_TRUE);
421    elm_box_pack_end(vbox, sep);
422    evas_object_show(sep);
423
424    hbox = elm_box_add(fs_win);
425    elm_box_horizontal_set(hbox, EINA_TRUE);
426    elm_box_pack_end(vbox, hbox);
427    evas_object_show(hbox);
428
429    evas_object_resize(fs_win, 240, 350);
430    evas_object_show(fs_win);
431 }
432
433
434 static void
435 _track_remove(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
436 {
437    elm_map_track_remove(data, track);
438 }
439
440 static void
441 _rotate_cw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
442 {
443    double d;
444    Evas_Coord x, y, w, h;
445    float half_w, half_h;
446    evas_object_geometry_get(data, &x, &y, &w, &h);
447    half_w = (float)w * 0.5;
448    half_h = (float)h * 0.5;
449
450    elm_map_rotate_get(data, &d, NULL, NULL);
451    d += 15.0;
452    elm_map_rotate_set(data, d, x + half_w, y + half_h);
453 }
454
455 static void
456 _rotate_ccw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
457 {
458    double d;
459    Evas_Coord x, y, w, h;
460    float half_w, half_h;
461    evas_object_geometry_get(data, &x, &y, &w, &h);
462    half_w = (float)w * 0.5;
463    half_h = (float)h * 0.5;
464
465    elm_map_rotate_get(data, &d, NULL, NULL);
466    d -= 15.0;
467    elm_map_rotate_set(data, d, x + half_w, y + half_h);
468 }
469
470 static void
471 _rotate_reset(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
472 {
473    Evas_Coord x, y, w, h;
474    float half_w, half_h;
475    evas_object_geometry_get(data, &x, &y, &w, &h);
476    half_w = (float)w * 0.5;
477    half_h = (float)h * 0.5;
478
479    elm_map_rotate_set(data, 0.0, x + half_w, y + half_h);
480 }
481
482 static void
483 _wheel_disable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
484 {
485    elm_map_wheel_disabled_set(data, EINA_TRUE);
486 }
487
488 static void
489 _wheel_enable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
490 {
491    elm_map_wheel_disabled_set(data, EINA_FALSE);
492 }
493
494 static void
495 _zoom_min_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
496 {
497    elm_map_zoom_min_set(data, 1);
498 }
499
500 static void
501 _zoom_max_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
502 {
503    elm_map_zoom_max_set(data, 10);
504 }
505
506 static void
507 src_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
508 {
509    Map_Source *s = data;
510
511    if (!s) return;
512    elm_map_source_set(s->map, s->type, s->source_name);
513 }
514
515 static Evas_Object *
516 _box_get(Evas_Object *obj, Overlay_Data *data, Elm_Map_Overlay *ovl)
517 {
518    Evas_Object *bx, *img, *label;
519    double lon, lat;
520    char buf[256];
521    bx = elm_box_add(obj);
522    evas_object_show(bx);
523
524    img = evas_object_image_add(evas_object_evas_get(obj));
525    evas_object_image_file_set(img, data->file, NULL);
526    evas_object_image_filled_set(img, EINA_TRUE);
527    evas_object_size_hint_min_set(img, 64, 64);
528    evas_object_show(img);
529    elm_box_pack_end(bx, img);
530
531    label = elm_label_add(bx);
532    elm_map_overlay_region_get(ovl, &lon, &lat);
533    snprintf(buf, sizeof(buf), "%0.4lf %0.4lf", lon, lat);
534    elm_object_text_set(label, buf);
535    evas_object_show(label);
536    elm_box_pack_end(bx, label);
537    return bx;
538 }
539
540 static void
541 _overlay_hide(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
542 {
543    elm_map_overlay_hide_set(data, EINA_TRUE);
544 }
545
546 static void
547 _overlay_pause(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
548 {
549    elm_map_overlay_paused_set(data, EINA_TRUE);
550 }
551
552 static void
553 _overlay_unpause(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
554 {
555    elm_map_overlay_paused_set(data, EINA_FALSE);
556 }
557
558 static void
559 _overlay_show(void *data, Evas_Object *obj __UNUSED__, void *ev __UNUSED__)
560 {
561    elm_map_overlay_show(data);
562 }
563
564 static Evas_Object *
565 _btn_box_get(Evas_Object *obj, Elm_Map_Overlay *ovl)
566 {
567    Evas_Object *bx, *btn, *btn2, *btn3, *btn4;
568    bx = elm_box_add(obj);
569    elm_box_horizontal_set(bx, EINA_TRUE);
570    evas_object_show(bx);
571
572    btn = elm_button_add(bx);
573    elm_object_text_set(btn, "Hide");
574    evas_object_smart_callback_add(btn, "clicked", _overlay_hide, ovl);
575    evas_object_show(btn);
576    elm_box_pack_end(bx, btn);
577
578    btn2 = elm_button_add(bx);
579    elm_object_text_set(btn2, "Pause");
580    evas_object_smart_callback_add(btn2, "clicked", _overlay_pause, ovl);
581    evas_object_show(btn2);
582    elm_box_pack_end(bx, btn2);
583
584    btn3 = elm_button_add(bx);
585    elm_object_text_set(btn3, "Unpause");
586    evas_object_smart_callback_add(btn3, "clicked", _overlay_unpause, ovl);
587    evas_object_show(btn3);
588    elm_box_pack_end(bx, btn3);
589
590    btn4 = elm_button_add(bx);
591    elm_object_text_set(btn4, "Show");
592    evas_object_smart_callback_add(btn4, "clicked", _overlay_show, ovl);
593    evas_object_show(btn4);
594    elm_box_pack_end(bx, btn4);
595
596    return bx;
597 }
598
599 static Evas_Object *
600 _label_get(Evas_Object *obj)
601 {
602    Evas_Object *label;
603    label = elm_label_add(obj);
604    elm_object_text_set(label, "Here is a parking lot.");
605    return label;
606 }
607
608 static Evas_Object *
609 _icon_get(Evas_Object *obj, Overlay_Data *data)
610 {
611    Evas_Object *icon = elm_icon_add(obj);
612    elm_icon_file_set(icon, data->file, NULL);
613    evas_object_show(icon);
614
615    return icon;
616 }
617
618 static void
619 _submenu_src_add(void *data, Elm_Object_Item *parent)
620 {
621    int idx;
622    const char **tile_srcs;
623    const char **route_srcs;
624    const char **name_srcs;
625
626    if ((!data) || (!parent)) return;
627
628    tile_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_TILE);
629    route_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_ROUTE);
630    name_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_NAME);
631
632    for (idx = 0; tile_srcs[idx]; idx++)
633      {
634         if (idx >= SOURCE_MAX) break;
635         ts[idx].map = data;
636         ts[idx].type = ELM_MAP_SOURCE_TYPE_TILE;
637         ts[idx].source_name = strdup(tile_srcs[idx]);
638         elm_menu_item_add(menu, parent, "", tile_srcs[idx], src_set, &ts[idx]);
639      }
640    for (idx = 0; route_srcs[idx]; idx++)
641      {
642         if (idx >= SOURCE_MAX) break;
643         rs[idx].map = data;
644         rs[idx].type = ELM_MAP_SOURCE_TYPE_ROUTE;
645         rs[idx].source_name = strdup(route_srcs[idx]);
646         elm_menu_item_add(menu, parent, "", route_srcs[idx], src_set, &rs[idx]);
647      }
648    for (idx = 0; name_srcs[idx]; idx++)
649      {
650         if (idx >= SOURCE_MAX) break;
651         ns[idx].map = data;
652         ns[idx].type = ELM_MAP_SOURCE_TYPE_NAME;
653         ns[idx].source_name = strdup(name_srcs[idx]);
654         elm_menu_item_add(menu, parent, "", name_srcs[idx], src_set, &ns[idx]);
655      }
656 }
657
658 static void
659 _submenu_move_add(void *data, Elm_Object_Item *parent)
660 {
661    if ((!data) || (!parent)) return;
662    elm_menu_item_add(menu, parent, NULL, "Show Urmatt", map_show_urmatt, data);
663    elm_menu_item_add(menu, parent, NULL, "Bring Seoul", map_bring_seoul, data);
664
665 }
666
667 static void
668 _submenu_zoom_add(void *data, Elm_Object_Item *parent)
669 {
670    if ((!data) || (!parent)) return;
671    elm_menu_item_add(menu, parent, NULL, "Zoom +", _zoom_in, data);
672    elm_menu_item_add(menu, parent, NULL, "Zoom -", _zoom_out, data);
673    elm_menu_item_add(menu, parent, NULL, "Zoom Fit", _zoom_fit, data);
674    elm_menu_item_add(menu, parent, NULL, "Zoom Fill", _zoom_fill, data);
675    elm_menu_item_add(menu, parent, NULL, "Zoom Manual", _zoom_manual, data);
676    elm_menu_item_add(menu, parent, NULL, "Zoom Min to 1", _zoom_min_set, data);
677    elm_menu_item_add(menu, parent, NULL, "Zoom Max to 10", _zoom_max_set, data);
678 }
679
680 static void
681 _submenu_prop_add(void *data, Elm_Object_Item *parent)
682 {
683    if ((!data) || (!parent)) return;
684    elm_menu_item_add(menu, parent, NULL, "Paused Set", _paused_set, data);
685    elm_menu_item_add(menu, parent, NULL, "Paused Unset", _paused_unset, data);
686    elm_menu_item_add(menu, parent, NULL, "Rotate CW", _rotate_cw, data);
687    elm_menu_item_add(menu, parent, NULL, "Rotate CCW", _rotate_ccw, data);
688    elm_menu_item_add(menu, parent, NULL, "Reset Rotate", _rotate_reset, data);
689    elm_menu_item_add(menu, parent, NULL, "Disable Wheel", _wheel_disable, data);
690    elm_menu_item_add(menu, parent, NULL, "Enable Wheel", _wheel_enable, data);
691 }
692
693 static void
694 _submenu_track_add(void *data, Elm_Object_Item *parent)
695 {
696    if ((!data) || (!parent)) return;
697    elm_menu_item_add(menu, parent, NULL, "Add Track", _track_add, data);
698    elm_menu_item_add(menu, parent, NULL, "Remove Track", _track_remove, data);
699 }
700
701 static void
702 _map_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
703 {
704    Evas_Event_Mouse_Down *down = event_info;
705    Elm_Object_Item *menu_it;
706    if (!down) return;
707
708    if (down->button == 2)
709      {
710         old_x = down->canvas.x;
711         old_y = down->canvas.y;
712         old_d = 0.0;
713      }
714    else if (down->button == 3)
715      {
716         down_x = down->canvas.x;
717         down_y = down->canvas.y;
718         menu = elm_menu_add(obj);
719         menu_it = elm_menu_item_add(menu, NULL, "", "Source", NULL, NULL);
720         _submenu_src_add(data, menu_it);
721         menu_it = elm_menu_item_add(menu, NULL, "", "Move", NULL, NULL);
722         _submenu_move_add(data, menu_it);
723         menu_it = elm_menu_item_add(menu, NULL, "", "Zoom", NULL, NULL);
724         _submenu_zoom_add(data, menu_it);
725         menu_it = elm_menu_item_add(menu, NULL, "", "Prop", NULL, NULL);
726         _submenu_prop_add(data, menu_it);
727         menu_it = elm_menu_item_add(menu, NULL, "", "Track", NULL, NULL);
728         _submenu_track_add(data, menu_it);
729
730         elm_menu_move(menu, down->canvas.x, down->canvas.y);
731         evas_object_show(menu);
732      }
733 }
734
735 static void
736 _map_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
737 {
738    Evas_Event_Mouse_Move *move = event_info;
739    Evas_Coord x, y, w, h;
740    float half_w, half_h;
741    int d, d_diff;
742    double cur_d;
743    if (!move) return;
744
745    if (move->buttons == 2)
746      {
747         evas_object_geometry_get(data, &x, &y, &w, &h);
748         half_w = (float)w * 0.5;
749         half_h = (float)h * 0.5;
750         elm_map_rotate_get(data, &cur_d, NULL, NULL);
751
752         d = move->cur.canvas.x - old_x;
753         if (!old_d) old_d = d;
754         else
755           {
756              d_diff = old_d - d;
757              if (d_diff > 0)
758                {
759                   old_d --;
760                   cur_d += 1.0;
761                }
762              else if (d_diff < 0)
763                {
764                   old_d ++;
765                   cur_d -= 1.0;
766                }
767              old_d = d;
768              elm_map_rotate_set(data, cur_d, x + half_w, y + half_h);
769           }
770      }
771 }
772
773 static void
774 _map_mouse_up(void *data __UNUSED__, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
775 {
776    Evas_Event_Mouse_Up *up = event_info;
777    if (!up) return;
778
779    if (up->button == 2)
780      {
781         old_x = 0;
782         old_y = 0;
783      }
784 }
785
786 static void
787 _overlay_cb(void *data __UNUSED__, Evas_Object *map, void *ev)
788 {
789    printf("Overlay clicked: ");
790    Elm_Map_Overlay *overlay = ev;
791    Overlay_Data *od;
792    Elm_Map_Overlay_Type type = elm_map_overlay_type_get(overlay);
793
794    if (type != ELM_MAP_OVERLAY_TYPE_DEFAULT) return;
795
796    if (!bubble_img)  bubble_img = elm_map_overlay_bubble_add(map);
797    elm_map_overlay_bubble_follow(bubble_img, overlay);
798    elm_map_overlay_bubble_content_clear(bubble_img);
799
800    od = elm_map_overlay_data_get(overlay);
801    if (od)
802       elm_map_overlay_bubble_content_append(bubble_img,
803                                             _box_get(map, od, overlay));
804    elm_map_overlay_bubble_content_append(bubble_img,
805                                          _btn_box_get(map, overlay));
806 }
807
808 static void
809 _parking_cb(void *data __UNUSED__, Evas_Object *map, Elm_Map_Overlay *ovl)
810 {
811    if (elm_map_overlay_type_get(ovl) != ELM_MAP_OVERLAY_TYPE_DEFAULT) return;
812
813    double lon, lat;
814    Evas_Coord x, y;
815    elm_map_overlay_region_get(ovl, &lon, &lat);
816    elm_map_region_to_canvas_convert(map, lon, lat, &x, &y);
817    printf("Parking clicked: %lf %lf %d %d\n", lon, lat, x, y);
818
819    elm_map_canvas_to_region_convert(map, x+40, y+50, &lon, &lat);
820    if (!bubble_parking)
821      {
822         Evas_Object *bubble, *label;
823         bubble = elm_bubble_add(map);
824         elm_bubble_pos_set(bubble, ELM_BUBBLE_POS_TOP_LEFT);
825         elm_object_text_set(bubble, "Overlay object");
826         elm_object_part_text_set(bubble, "info", "Bubble is overlayed");
827
828         label = elm_label_add(bubble);
829         elm_object_text_set(label, "Parking Here !!");
830         evas_object_show(label);
831         elm_object_content_set(bubble, label);
832
833         evas_object_resize(bubble, 125, 50);
834         evas_object_show(bubble);
835
836         bubble_parking = elm_map_overlay_add(map, lon, lat);
837         elm_map_overlay_content_set(bubble_parking, bubble);
838      }
839    else elm_map_overlay_region_set(bubble_parking, lon, lat);
840    elm_map_overlay_data_set(bubble_parking, ovl);
841 }
842
843 static void
844 _del_map(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *ei __UNUSED__)
845 {
846    if (route_start)    elm_map_overlay_del(route_start);
847    if (route_end)      elm_map_overlay_del(route_end);
848    if (route_clas)     elm_map_overlay_del(route_clas);
849    if (bubble_img)     elm_map_overlay_del(bubble_img);
850    if (bubble_parking) elm_map_overlay_del(bubble_parking);
851    if (route_ovl)      elm_map_overlay_del(route_ovl);
852    route_start = NULL;
853    route_end = NULL;
854    route_clas = NULL;
855    bubble_img = NULL;
856    bubble_parking = NULL;
857    route_ovl = NULL;
858
859    if (route) elm_map_route_del(route);
860    if (name) elm_map_name_del(name);
861    route = NULL;
862    name = NULL;
863 }
864
865 void
866 test_map(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
867 {
868    Evas_Object *win, *bg, *map;
869    int idx = 0;
870    const char **tile_srcs;
871    const char **route_srcs;
872    const char **name_srcs;
873
874    win = elm_win_add(NULL, "map", ELM_WIN_BASIC);
875    elm_win_title_set(win, "Map");
876    elm_win_autodel_set(win, EINA_TRUE);
877
878    bg = elm_bg_add(win);
879    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
880    elm_win_resize_object_add(win, bg);
881    evas_object_show(bg);
882
883    map = elm_map_add(win);
884    if (map)
885      {
886         Elm_Map_Overlay *ovl_1, *ovl_2, *ovl_3, *ovl_4, *ovl_5, *ovl_6;
887         Elm_Map_Overlay *ovl_7, *ovl_8, *ovl_9, *ovl_10, *ovl_11;
888         Elm_Map_Overlay *parking1, *parking2, *parking3, *parking4, *parking5;
889         Elm_Map_Overlay *grp1, *grp2, *grp_parking;
890
891         evas_object_event_callback_add(map, EVAS_CALLBACK_DEL, _del_map, NULL);
892
893         srand(time(NULL));
894
895         tile_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_TILE);
896         route_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_ROUTE);
897         name_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_NAME);
898
899         if (!tile_srcs) return;
900         printf("Tile sources [ ");
901         for (idx = 0; tile_srcs[idx] ; idx++) printf("%s, ", tile_srcs[idx]);
902         printf("]\n");
903         if (!route_srcs) return;
904         printf("Route sources [ ");
905         for (idx = 0; route_srcs[idx] ; idx++) printf("%s, ", route_srcs[idx]);
906         printf("]\n");
907         if (!name_srcs) return;
908         printf("Name sources [ ");
909         for (idx = 0; name_srcs[idx] ; idx++) printf("%s, ", name_srcs[idx]);
910         printf("]\n");
911
912         evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
913         elm_win_resize_object_add(win, map);
914         evas_object_data_set(map, "window", win);
915
916         evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_DOWN,
917                                        _map_mouse_down, map);
918         evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_MOVE,
919                                        _map_mouse_move, map);
920         evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_UP,
921                                        _map_mouse_up, map);
922
923         evas_object_smart_callback_add(map, "clicked", _map_clicked, map);
924         evas_object_smart_callback_add(map, "clicked,double", _map_clicked_double, map);
925         evas_object_smart_callback_add(map, "press", _map_press, map);
926         evas_object_smart_callback_add(map, "longpressed", _map_longpressed, map);
927         evas_object_smart_callback_add(map, "scroll", _map_scroll, map);
928         evas_object_smart_callback_add(map, "scroll,drag,start", _map_drag_start, map);
929         evas_object_smart_callback_add(map, "scroll,drag,stop", _map_drag_stop, map);
930         evas_object_smart_callback_add(map, "scroll,anim,start", _map_anim_start, map);
931         evas_object_smart_callback_add(map, "scroll,anim,stop", _map_anim_stop, map);
932         evas_object_smart_callback_add(map, "zoom,start", _map_zoom_start, map);
933         evas_object_smart_callback_add(map, "zoom,stop", _map_zoom_stop, map);
934         evas_object_smart_callback_add(map, "zoom,change", _map_zoom_change, map);
935         evas_object_smart_callback_add(map, "tile,load", _map_tile_load, map);
936         evas_object_smart_callback_add(map, "tile,loaded", _map_tile_loaded, map);
937         evas_object_smart_callback_add(map, "tile,loaded,fail", _map_tile_loaded_fail, map);
938         evas_object_smart_callback_add(map, "route,load", _map_route_load, map);
939         evas_object_smart_callback_add(map, "route,loaded", _map_route_loaded, map);
940         evas_object_smart_callback_add(map, "route,loaded,fail", _map_route_loaded_fail, map);
941         evas_object_smart_callback_add(map, "name,load", _map_name_load, map);
942         evas_object_smart_callback_add(map, "name,loaded", _map_name_loaded, map);
943         evas_object_smart_callback_add(map, "name,loaded,fail", _map_name_loaded_fail, map);
944         evas_object_smart_callback_add(map, "overlay,clicked", _overlay_cb, map);
945
946         // Create Overlays
947         ovl_1 = elm_map_overlay_add(map, 2.352, 48.857);
948         elm_map_overlay_color_set(ovl_1, 0x00, 0xfa, 0x9a, 0xff);
949         elm_map_overlay_displayed_zoom_min_set(ovl_1, 5);
950         ovl_2 = elm_map_overlay_add(map, 3, 48.857);
951         elm_map_overlay_color_set(ovl_2, 0xff, 0xd7, 0x00, 0xff);
952         elm_map_overlay_displayed_zoom_min_set(ovl_2, 4);
953         ovl_3 = elm_map_overlay_add(map, 2.352, 49);
954         elm_map_overlay_displayed_zoom_min_set(ovl_3, 3);
955         ovl_4 = elm_map_overlay_add(map, 7.31451, 48.857127);
956         ovl_5 = elm_map_overlay_add(map, 7.314704, 48.857119);
957         ovl_6 = elm_map_overlay_add(map, 7.31432, 48.856785);
958         ovl_7 = elm_map_overlay_add(map, 7.3148, 48.85725);
959         ovl_8 = elm_map_overlay_add(map, 7.316445, 48.8572210000694);
960         ovl_9 = elm_map_overlay_add(map, 7.316527000125, 48.85609);
961         ovl_10 = elm_map_overlay_add(map, 7.3165409990833, 48.856078);
962         ovl_11 = elm_map_overlay_add(map, 7.319812, 48.856561);
963         elm_map_overlay_data_set(ovl_1, &data1);
964         elm_map_overlay_data_set(ovl_2, &data2);
965         elm_map_overlay_data_set(ovl_3, &data3);
966         elm_map_overlay_data_set(ovl_4, &data4);
967         elm_map_overlay_data_set(ovl_5, &data5);
968         elm_map_overlay_data_set(ovl_6, &data6);
969         elm_map_overlay_data_set(ovl_7, &data7);
970         elm_map_overlay_data_set(ovl_8, &data8);
971         elm_map_overlay_data_set(ovl_9, &data9);
972         elm_map_overlay_data_set(ovl_10, &data10);
973         elm_map_overlay_data_set(ovl_11, &data11);
974
975         // Append overlays to groups
976         grp1 = elm_map_overlay_class_add(map);
977         elm_map_overlay_class_zoom_max_set(grp1, 6);
978         elm_map_overlay_class_append(grp1, ovl_1);
979         elm_map_overlay_class_append(grp1, ovl_2);
980         elm_map_overlay_class_append(grp1, ovl_3);
981         elm_map_overlay_class_append(grp1, ovl_4);
982         elm_map_overlay_class_append(grp1, ovl_5);
983         elm_map_overlay_class_append(grp1, ovl_6);
984
985         // Append overlays to groups
986         grp2 = elm_map_overlay_class_add(map);
987         elm_map_overlay_displayed_zoom_min_set(grp2, 9);
988         elm_map_overlay_class_append(grp2, ovl_7);
989         elm_map_overlay_class_append(grp2, ovl_8);
990         elm_map_overlay_class_append(grp2, ovl_9);
991         elm_map_overlay_class_append(grp2, ovl_10);
992         elm_map_overlay_class_append(grp2, ovl_11);
993
994         // Create overlays
995         parking1 = elm_map_overlay_add(map, 127.04871, 37.25730);
996         parking2 = elm_map_overlay_add(map, 127.05578, 37.25545);
997         parking3 = elm_map_overlay_add(map, 127.05515, 37.25439);
998         parking4 = elm_map_overlay_add(map, 127.05328, 37.25721);
999         elm_map_overlay_icon_set(parking4, _icon_get(map, &icon_data));
1000         parking5 = elm_map_overlay_add(map, 127.05431, 37.25873);
1001         elm_map_overlay_content_set(parking5, _label_get(map));
1002         elm_map_overlay_get_cb_set(parking1, _parking_cb, NULL);
1003         elm_map_overlay_get_cb_set(parking2, _parking_cb, NULL);
1004         elm_map_overlay_get_cb_set(parking3, _parking_cb, NULL);
1005         elm_map_overlay_get_cb_set(parking4, _parking_cb, NULL);
1006         elm_map_overlay_get_cb_set(parking5, _parking_cb, NULL);
1007
1008         // Append overlays to groups
1009         grp_parking = elm_map_overlay_class_add(map);
1010         elm_map_overlay_icon_set(grp_parking, _icon_get(map, &parking));
1011         elm_map_overlay_get_cb_set(grp_parking, _parking_cb, NULL);
1012         elm_map_overlay_class_append(grp_parking, parking1);
1013         elm_map_overlay_class_append(grp_parking, parking2);
1014         elm_map_overlay_class_append(grp_parking, parking3);
1015         elm_map_overlay_class_append(grp_parking, parking4);
1016         elm_map_overlay_class_append(grp_parking, parking5);
1017
1018         evas_object_show(map);
1019      }
1020
1021    evas_object_resize(win, 800, 800);
1022    evas_object_show(win);
1023 }
1024 #endif