33ba6984b50a41a0c32832dac3f2167cca0d6b3c
[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 Marker_Data
12 {
13    const char *file;
14 } Marker_Data;
15
16 typedef struct Map_Source
17 {
18    Evas_Object *map;
19    char *source_name;
20 } Map_Source;
21
22 static Elm_Map_Marker_Class *itc1, *itc2, *itc_parking;
23 static Elm_Map_Group_Class *itc_group1, *itc_group2, *itc_group_parking;
24
25 static Evas_Object *rect, *menu, *fs_win;
26 static int nb_elts;
27 /*static Elm_Map_Marker *markers[MARKER_MAX];*/
28 static Elm_Map_Marker *route_from, *route_to;
29 static Elm_Map_Route *route;
30 static Elm_Map_Name *name;
31 static Elm_Map_Track *track;
32 static const char **source_names = NULL;
33 static Evas_Coord old_x, old_y;
34 static Evas_Coord old_d;
35 static Map_Source ms[SOURCE_MAX];
36
37 Marker_Data data1 = {PACKAGE_DATA_DIR"/images/logo.png"};
38 Marker_Data data2 = {PACKAGE_DATA_DIR"/images/logo_small.png"};
39 Marker_Data data3 = {PACKAGE_DATA_DIR"/images/panel_01.jpg"};
40 Marker_Data data4 = {PACKAGE_DATA_DIR"/images/plant_01.jpg"};
41 Marker_Data data5 = {PACKAGE_DATA_DIR"/images/rock_01.jpg"};
42 Marker_Data data6 = {PACKAGE_DATA_DIR"/images/rock_02.jpg"};
43 Marker_Data data7 = {PACKAGE_DATA_DIR"/images/sky_01.jpg"};
44 Marker_Data data8 = {PACKAGE_DATA_DIR"/images/sky_02.jpg"};
45 Marker_Data data9 = {PACKAGE_DATA_DIR"/images/sky_03.jpg"};
46 Marker_Data data10 = {PACKAGE_DATA_DIR"/images/sky_03.jpg"};
47 Marker_Data data11= {PACKAGE_DATA_DIR"/images/wood_01.jpg"};
48
49 Marker_Data data_parking= {PACKAGE_DATA_DIR"/images/parking.png"};
50
51 static Evas_Object * _marker_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data);
52 static Evas_Object * _group_icon_get(Evas_Object *obj, void *data);
53
54 static void
55 my_map_gpx_fileselector_done(void *data, Evas_Object *obj __UNUSED__, void *event_info)
56 {
57    const char *selected = event_info;
58
59    if (selected)
60      {
61         printf("Selected file: %s\n", selected);
62 #ifdef HAVE_ELEMENTARY_EMAP
63         EMap_Route *emap = emap_route_gpx_new(selected);
64         track = elm_map_track_add(data, emap);
65 #else
66         printf("libEMap is required !\n");
67 #endif
68      }
69    evas_object_del(fs_win);
70 }
71
72 static void
73 my_map_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
74 {
75    printf("clicked\n");
76 }
77
78 static void
79 my_map_press(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
80 {
81    printf("press\n");
82 }
83
84 static void
85 my_map_longpressed(void *data, Evas_Object *obj __UNUSED__, void *event_info)
86 {
87    double lon, lat;
88    Evas_Coord ox, oy, x, y, w, h;
89    int zoom;
90    Evas_Event_Mouse_Down *down = (Evas_Event_Mouse_Down *)event_info;
91    if (!down) return;
92
93    evas_object_geometry_get(data, &ox, &oy, &w, &h);
94    zoom = elm_map_zoom_get(data);
95    elm_map_geo_region_get(obj, &lon, &lat);
96    elm_map_utils_convert_geo_into_coord(obj, lon, lat, pow(2.0, zoom) * 256, &x, &y);
97    x += down->canvas.x - (w / 2) - ox;
98    y += down->canvas.y - (h / 2) - oy;
99    elm_map_utils_convert_coord_into_geo(obj, x, y, pow(2.0, zoom) * 256, &lon, &lat);
100
101    name = elm_map_utils_convert_coord_into_name(data, lon, lat);
102 }
103
104 static void
105 my_map_clicked_double(void *data, Evas_Object *obj, void *event_info)
106 {
107    double lon, lat;
108    double flon, flat, tlon, tlat;
109    Evas_Coord ox, oy, x, y, w, h, rx, ry, tx, ty;
110    double d;
111    int zoom;
112    Evas_Coord size;
113    Evas_Event_Mouse_Down *down = (Evas_Event_Mouse_Down *)event_info;
114    if (!down) return;
115
116    evas_object_geometry_get(data, &ox, &oy, &w, &h);
117    zoom = elm_map_zoom_get(data);
118    if (zoom < 5) return;
119    size = pow(2.0, zoom) * 256;
120    elm_map_geo_region_get(obj, &lon, &lat);
121    elm_map_utils_convert_geo_into_coord(obj, lon, lat, size, &x, &y);
122
123    rx = x;
124    ry = y;
125    x += down->canvas.x - ((float)w * 0.5) - ox;
126    y += down->canvas.y - ((float)h * 0.5) - oy;
127    elm_map_rotate_get(data, &d, NULL, NULL);
128    elm_map_utils_rotate_coord(data, x, y, rx, ry, -d, &tx, &ty);
129    elm_map_utils_convert_coord_into_geo(obj, tx, ty, size, &lon, &lat);
130
131    itc1 = elm_map_marker_class_new(data);
132
133    elm_map_marker_class_del_cb_set(itc1, NULL);
134
135    itc_group1 = elm_map_group_class_new(data);
136    elm_map_group_class_icon_cb_set(itc_group1, _group_icon_get);
137    elm_map_group_class_data_set(itc_group1, (void *)PACKAGE_DATA_DIR"/images/bubble.png");
138    elm_map_group_class_style_set(itc_group1, "empty");
139    elm_map_group_class_zoom_displayed_set(itc_group1, 5);
140
141    if (route_from && route_to)
142      {
143         elm_map_marker_remove(route_from);
144         route_from = NULL;
145         elm_map_marker_remove(route_to);
146         route_to = NULL;
147         elm_map_route_remove(route);
148      }
149
150    if (!route_from) route_from = elm_map_marker_add(data, lon, lat, itc1, itc_group1, NULL);
151    else route_to = elm_map_marker_add(data, lon, lat, itc1, itc_group1, NULL);
152
153    if (route_from && route_to)
154      {
155         elm_map_marker_region_get(route_from, &flon, &flat);
156         elm_map_marker_region_get(route_to, &tlon, &tlat);
157         route = elm_map_route_add(data, ELM_MAP_ROUTE_TYPE_MOTOCAR, ELM_MAP_ROUTE_METHOD_FASTEST, flon, flat, tlon, tlat);
158         elm_map_route_color_set(route, 255, 0, 0, 255);
159      }
160 }
161
162 static void
163 my_map_load_detail(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
164 {
165    printf("load,detail\n");
166 }
167
168 static void
169 my_map_loaded_detail(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
170 {
171    printf("loaded,detail\n");
172 }
173
174 static void
175 my_map_zoom_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
176 {
177    printf("zoom,start\n");
178 }
179
180 static void
181 my_map_zoom_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
182 {
183    printf("zoom,stop\n");
184 }
185
186 static void
187 my_map_zoom_change(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
188 {
189    printf("zoom,change\n");
190 }
191
192 static void
193 my_map_anim_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
194 {
195    printf("anim,start\n");
196 }
197
198 static void
199 my_map_anim_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
200 {
201    printf("anim,stop\n");
202 }
203
204 static void
205 my_map_drag_start(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
206 {
207    evas_object_smart_callback_del(data, "longpressed", my_map_longpressed);
208 }
209
210 static void
211 my_map_drag_stop(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
212 {
213    evas_object_smart_callback_add(data, "longpressed", my_map_longpressed, data);
214 }
215
216 static void
217 my_map_scroll(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
218 {
219    double lon, lat;
220    elm_map_geo_region_get(obj, &lon, &lat);
221    printf("scroll longitude : %f latitude : %f\n", lon, lat);
222 }
223
224 static void
225 my_map_downloaded(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
226 {
227    int try_num, finish_num;
228    elm_map_utils_downloading_status_get(data, &try_num, &finish_num);
229    printf("downloaded : %d / %d\n", finish_num, try_num);
230 }
231
232 static void
233 my_map_route_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
234 {
235    printf("route_load\n");
236 }
237
238 static void
239 my_map_route_loaded(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
240 {
241    double d;
242    const char *w, *n;
243    d = elm_map_route_distance_get(route);
244    printf("route distance = %lf km\n", d);
245
246    w = elm_map_route_waypoint_get(route);
247    if (w) printf("[waypoints]\n%s\n", w);
248
249    n = elm_map_route_node_get(route);
250    if (n) printf("[nodes]\n%s\n", n);
251 }
252
253 static void
254 my_map_name_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
255 {
256    printf("name_load\n");
257 }
258
259 static void
260 my_map_name_loaded(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
261 {
262    if (!name) return;
263    double lon, lat;
264    const char *addr = elm_map_name_address_get(name);
265    elm_map_name_region_get(name, &lon, &lat);
266    if (addr)
267      {
268         printf("name of [lon = %lf, lat = %lf] is %s\n", lon, lat, addr);
269         if ((lon != 0.0) && (lat !=0.0))
270           {
271              Eina_Bool b = elm_map_paused_get(data);
272              elm_map_paused_set(data, EINA_TRUE);
273              elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
274              elm_map_geo_region_show(data, lon, lat);
275              elm_map_zoom_set(data, 18);
276              elm_map_paused_set(data, b);
277           }
278      }
279    elm_map_name_remove(name);
280 }
281
282 static void
283 map_show_seoul(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
284 {
285    Eina_Bool b = elm_map_paused_get(data);
286    elm_map_paused_set(data, EINA_TRUE);
287    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
288    elm_map_geo_region_show(data, 126.977969, 37.566535);
289    elm_map_zoom_set(data, 18);
290    elm_map_paused_set(data, b);
291 }
292
293 static void
294 map_bring_seoul(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
295 {
296    elm_map_geo_region_bring_in(data, 126.977969, 37.566535);
297 }
298
299 static void
300 map_paused_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
301 {
302    elm_map_paused_set(data, EINA_TRUE);
303 }
304
305 static void
306 map_paused_unset(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
307 {
308    elm_map_paused_set(data, EINA_FALSE);
309 }
310
311 static void
312 map_zoom_in(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
313 {
314    int zoom;
315
316    zoom = elm_map_zoom_get(data) + 1;
317    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
318    elm_map_zoom_set(data, zoom);
319 }
320
321 static void
322 map_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
323 {
324    int zoom;
325
326    zoom = elm_map_zoom_get(data) - 1;
327    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
328    elm_map_zoom_set(data, zoom);
329 }
330
331 static void
332 map_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
333 {
334    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT);
335 }
336
337 static void
338 map_zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
339 {
340    elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL);
341 }
342
343 static void
344 map_track_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
345 {
346    Evas_Object *fs, *bg, *vbox, *hbox, *sep;
347
348    fs_win = elm_win_add(NULL, "fileselector", ELM_WIN_BASIC);
349    elm_win_title_set(fs_win, "File Selector");
350    elm_win_autodel_set(fs_win, 1);
351
352    bg = elm_bg_add(fs_win);
353    elm_win_resize_object_add(fs_win, bg);
354    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
355    evas_object_show(bg);
356
357    vbox = elm_box_add(fs_win);
358    elm_win_resize_object_add(fs_win, vbox);
359    evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
360    evas_object_show(vbox);
361
362    fs = elm_fileselector_add(fs_win);
363    elm_fileselector_is_save_set(fs, EINA_TRUE);
364    elm_fileselector_expandable_set(fs, EINA_FALSE);
365    elm_fileselector_path_set(fs, getenv("HOME"));
366    evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
367    evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
368    elm_box_pack_end(vbox, fs);
369    evas_object_show(fs);
370
371    evas_object_smart_callback_add(fs, "done", my_map_gpx_fileselector_done, data);
372
373    sep = elm_separator_add(fs_win);
374    elm_separator_horizontal_set(sep, EINA_TRUE);
375    elm_box_pack_end(vbox, sep);
376    evas_object_show(sep);
377
378    hbox = elm_box_add(fs_win);
379    elm_box_horizontal_set(hbox, EINA_TRUE);
380    elm_box_pack_end(vbox, hbox);
381    evas_object_show(hbox);
382
383    evas_object_resize(fs_win, 240, 350);
384    evas_object_show(fs_win);
385 }
386
387
388 static void
389 map_track_remove(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
390 {
391    elm_map_track_remove(track);
392 }
393
394 static void
395 map_rotate_cw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
396 {
397    double d;
398    Evas_Coord x, y, w, h;
399    float half_w, half_h;
400    evas_object_geometry_get(data, &x, &y, &w, &h);
401    half_w = (float)w * 0.5;
402    half_h = (float)h * 0.5;
403
404    elm_map_rotate_get(data, &d, NULL, NULL);
405    d += 15.0;
406    elm_map_rotate_set(data, d, x + half_w, y + half_h);
407 }
408
409 static void
410 map_rotate_ccw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
411 {
412    double d;
413    Evas_Coord x, y, w, h;
414    float half_w, half_h;
415    evas_object_geometry_get(data, &x, &y, &w, &h);
416    half_w = (float)w * 0.5;
417    half_h = (float)h * 0.5;
418
419    elm_map_rotate_get(data, &d, NULL, NULL);
420    d -= 15.0;
421    elm_map_rotate_set(data, d, x + half_w, y + half_h);
422 }
423
424 static void
425 map_rotate_reset(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
426 {
427    Evas_Coord x, y, w, h;
428    float half_w, half_h;
429    evas_object_geometry_get(data, &x, &y, &w, &h);
430    half_w = (float)w * 0.5;
431    half_h = (float)h * 0.5;
432
433    elm_map_rotate_set(data, 0.0, x + half_w, y + half_h);
434 }
435
436 static void
437 map_zoom_min_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
438 {
439    elm_map_source_zoom_min_set(data, 1);
440 }
441
442 static void
443 map_zoom_max_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
444 {
445    elm_map_source_zoom_max_set(data, 10);
446 }
447
448 static void
449 map_source(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
450 {
451    Map_Source *s = data;
452
453    if (!s) return;
454    elm_map_source_name_set(s->map, s->source_name);
455 }
456
457 /*
458 static void
459 map_marker_add(void *data)
460 {
461    int i;
462    Elm_Map_Group_Class *g_clas;
463    Elm_Map_Marker_Class *m_clas;
464    Marker_Data *d = &data7;
465
466    if (*markers) return;
467    for (i =0; i<MARKER_MAX; i++)
468      {
469         d = &data7;
470
471         int r1 = rand() % (180*2*100);
472         if (r1<=180) r1 = -r1;
473         else r1 = r1 - 180*100;
474
475         int r2 = rand() % (85*2*100);
476         if (r2<=85) r2 = -r2;
477         else r2 = r2 - 85*100;
478
479         int style = rand() % 3;
480         if (!style) m_clas = itc1;
481         else if (style == 1) m_clas = itc2;
482         else
483           {
484              m_clas = itc_parking;
485              d = &data_parking;
486           }
487
488         style = rand() % 2;
489         if (!style) g_clas = itc_group1;
490         else g_clas = itc_group2;
491
492         markers[i] = elm_map_marker_add(data, r1/100., r2/100., m_clas, g_clas, d);
493      }
494    nb_elts += 1000;
495    printf("nb elements: %d\n", nb_elts);
496 }
497
498 static void
499 map_marker_remove(void *data __UNUSED__)
500 {
501    int i;
502
503    for (i = 0; i<MARKER_MAX; i++)
504      {
505         if (markers[i])
506           {
507              elm_map_marker_remove(markers[i]);
508              markers[i] = NULL;
509           }
510      }
511 }
512
513 static void
514 my_map_entry_focused(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
515 {
516    const char *s = elm_scrolled_entry_entry_get(obj);
517    if (!strcmp(s, NAME_ENTRY_TEXT)) elm_scrolled_entry_entry_set(obj, "");
518 }
519
520 static void
521 my_map_entry_activated(void *data, Evas_Object *obj, void *event_info __UNUSED__)
522 {
523    const char *s = elm_scrolled_entry_entry_get(obj);
524    char *addr = strdup(s);
525    name = elm_map_utils_convert_name_into_coord(data, addr);
526    if (addr) free (addr);
527 }
528 */
529
530 static Evas_Object *
531 _marker_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data)
532 {
533    Marker_Data *d = data;
534
535    Evas_Object *bx = elm_box_add(obj);
536    evas_object_show(bx);
537
538    if (d == &data3)
539      {
540         Evas_Object *icon = elm_icon_add(obj);
541         elm_icon_file_set(icon, d->file, NULL);
542         evas_object_show(icon);
543
544         Evas_Object *o = elm_button_add(obj);
545         elm_button_icon_set(o, icon);
546         evas_object_show(o);
547         elm_box_pack_end(bx, o);
548      }
549    else
550      {
551         Evas_Object *o = evas_object_image_add(evas_object_evas_get(obj));
552         evas_object_image_file_set(o, d->file, NULL);
553         evas_object_image_filled_set(o, EINA_TRUE);
554         evas_object_size_hint_min_set(o, 64, 64);
555         evas_object_show(o);
556         elm_box_pack_end(bx, o);
557
558         Evas_Object *lbl = elm_label_add(obj);
559         elm_label_label_set(lbl, "Wolves Go !");
560         evas_object_show(lbl);
561         elm_box_pack_end(bx, lbl);
562      }
563
564    return bx;
565 }
566
567 static Evas_Object *
568 _icon_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data)
569 {
570    Marker_Data *d = data;
571
572    Evas_Object *icon = elm_icon_add(obj);
573    elm_icon_file_set(icon, d->file, NULL);
574    evas_object_show(icon);
575
576    return icon;
577 }
578
579 static Evas_Object *
580 _group_icon_get(Evas_Object *obj, void *data)
581 {
582    char *file = data;
583
584    Evas_Object *icon = elm_icon_add(obj);
585    elm_icon_file_set(icon, file, NULL);
586    evas_object_show(icon);
587
588    return icon;
589 }
590
591 static void
592 _map_move_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
593 {
594    int x,y,w,h;
595
596    evas_object_geometry_get(data,&x,&y,&w,&h);
597    evas_object_resize(rect,w,h);
598    evas_object_move(rect,x,y);
599 }
600
601 static void
602 _populate(void *data, Elm_Menu_Item *item)
603 {
604    int idx;
605
606    if ((!data) || (!item) || (!source_names)) return;
607    for (idx = 0; source_names[idx]; idx++)
608      {
609         if (idx >= SOURCE_MAX) break;
610         ms[idx].map = data;
611         ms[idx].source_name = strdup(source_names[idx]);
612         elm_menu_item_add(menu, item, "", source_names[idx], map_source, &ms[idx]);
613      }
614 }
615
616 static void
617 _map_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
618 {
619    Evas_Event_Mouse_Down *down = event_info;
620    Elm_Menu_Item *item;
621    if (!down) return;
622
623    if (down->button == 2)
624      {
625         old_x = down->canvas.x;
626         old_y = down->canvas.y;
627         old_d = 0.0;
628      }
629    else if (down->button == 3)
630      {
631         menu = elm_menu_add(obj);
632         item = elm_menu_item_add(menu, NULL, NULL, "Source", NULL, NULL);
633         _populate(data, item);
634         elm_menu_item_add(menu, NULL, NULL, "Show Seoul", map_show_seoul, data);
635         elm_menu_item_add(menu, NULL, NULL, "Bring Seoul", map_bring_seoul, data);
636         elm_menu_item_add(menu, NULL, NULL, "Paused Set", map_paused_set, data);
637         elm_menu_item_add(menu, NULL, NULL, "Paused Unset", map_paused_unset, data);
638         elm_menu_item_add(menu, NULL, NULL, "Zoom +", map_zoom_in, data);
639         elm_menu_item_add(menu, NULL, NULL, "Zoom -", map_zoom_out, data);
640         elm_menu_item_add(menu, NULL, NULL, "Zoom Fit", map_zoom_fit, data);
641         elm_menu_item_add(menu, NULL, NULL, "Zoom Fill", map_zoom_fill, data);
642         elm_menu_item_add(menu, NULL, NULL, "Add Track", map_track_add, data);
643         elm_menu_item_add(menu, NULL, NULL, "Remove Track", map_track_remove, data);
644         elm_menu_item_add(menu, NULL, NULL, "Add Marker", NULL, NULL);
645         elm_menu_item_add(menu, NULL, NULL, "Rotate CW", map_rotate_cw, data);
646         elm_menu_item_add(menu, NULL, NULL, "Rotate CCW", map_rotate_ccw, data);
647         elm_menu_item_add(menu, NULL, NULL, "Reset Rotate", map_rotate_reset, data);
648         elm_menu_item_add(menu, NULL, NULL, "Set Zoom Min to 1", map_zoom_min_set, data);
649         elm_menu_item_add(menu, NULL, NULL, "Set Zoom Max to 10", map_zoom_max_set, data);
650
651         elm_menu_move(menu, down->canvas.x, down->canvas.y);
652         evas_object_show(menu);
653      }
654 }
655
656 static void
657 _map_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
658 {
659    Evas_Event_Mouse_Move *move = event_info;
660    Evas_Coord x, y, w, h;
661    float half_w, half_h;
662    int d, d_diff;
663    double cur_d;
664    if (!move) return;
665
666    if (move->buttons == 2)
667      {
668         evas_object_geometry_get(data, &x, &y, &w, &h);
669         half_w = (float)w * 0.5;
670         half_h = (float)h * 0.5;
671         elm_map_rotate_get(data, &cur_d, NULL, NULL);
672
673         d = move->cur.canvas.x - old_x;
674         if (!old_d) old_d = d;
675         else
676           {
677              d_diff = old_d - d;
678              if (d_diff > 0)
679                {
680                   old_d --;
681                   cur_d += 1.0;
682                }
683              else if (d_diff < 0)
684                {
685                   old_d ++;
686                   cur_d -= 1.0;
687                }
688              old_d = d;
689              elm_map_rotate_set(data, cur_d, x + half_w, y + half_h);
690           }
691      }
692 }
693
694 static void
695 _map_mouse_up(void *data __UNUSED__, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
696 {
697    Evas_Event_Mouse_Up *up = event_info;
698    if (!up) return;
699
700    if (up->button == 2)
701      {
702         old_x = 0;
703         old_y = 0;
704      }
705 }
706
707 void
708 test_map(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
709 {
710    Evas_Object *win, *bg, *map;
711    int idx = 0;
712
713    win = elm_win_add(NULL, "map", ELM_WIN_BASIC);
714    elm_win_title_set(win, "Map");
715    elm_win_autodel_set(win, 1);
716
717    bg = elm_bg_add(win);
718    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
719    elm_win_resize_object_add(win, bg);
720    evas_object_show(bg);
721
722    map = elm_map_add(win);
723    if (map)
724      {
725         srand(time(NULL));
726
727         source_names = elm_map_source_names_get(map);
728
729         if (!source_names) return;
730         printf("map sources [ ");
731         for (idx = 0; source_names[idx] ; idx++) printf("%s ", source_names[idx]);
732         printf("]\n");
733
734         evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
735         elm_win_resize_object_add(win, map);
736         evas_object_data_set(map, "window", win);
737
738         //
739         itc1 = elm_map_marker_class_new(map);
740         elm_map_marker_class_get_cb_set(itc1, _marker_get);
741         elm_map_marker_class_del_cb_set(itc1, NULL);
742
743         itc2 = elm_map_marker_class_new(map);
744         elm_map_marker_class_get_cb_set(itc2, _marker_get);
745         elm_map_marker_class_del_cb_set(itc2, NULL);
746         elm_map_marker_class_style_set(itc2, "radio2");
747
748         itc_parking = elm_map_marker_class_new(map);
749         elm_map_marker_class_get_cb_set(itc_parking, _marker_get);
750         elm_map_marker_class_del_cb_set(itc_parking, NULL);
751         elm_map_marker_class_icon_cb_set(itc_parking, _icon_get);
752         elm_map_marker_class_style_set(itc_parking, "empty");
753         //
754
755         //
756         itc_group1 = elm_map_group_class_new(map);
757         elm_map_group_class_data_set(itc_group1, (void *)PACKAGE_DATA_DIR"/images/plant_01.jpg");
758
759         itc_group2 = elm_map_group_class_new(map);
760         elm_map_group_class_style_set(itc_group2, "radio2");
761         elm_map_group_class_zoom_displayed_set(itc_group1, 3);
762
763         itc_group_parking = elm_map_group_class_new(map);
764         elm_map_group_class_icon_cb_set(itc_group_parking, _group_icon_get);
765         elm_map_group_class_data_set(itc_group_parking, (void *)PACKAGE_DATA_DIR"/images/parking.png");
766         elm_map_group_class_style_set(itc_group_parking, "empty");
767         elm_map_group_class_zoom_displayed_set(itc_group_parking, 5);
768         //
769
770         rect = evas_object_rectangle_add(evas_object_evas_get(win));
771         evas_object_color_set(rect, 0, 0, 0, 0);
772         evas_object_repeat_events_set(rect,1);
773         evas_object_show(rect);
774         evas_object_raise(rect);
775
776         evas_object_event_callback_add(map, EVAS_CALLBACK_RESIZE,
777                                        _map_move_resize_cb, map);
778         evas_object_event_callback_add(map, EVAS_CALLBACK_MOVE,
779                                        _map_move_resize_cb, map);
780         evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_DOWN,
781                                        _map_mouse_down, map);
782         evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_MOVE,
783                                        _map_mouse_move, map);
784         evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_UP,
785                                        _map_mouse_up, map);
786
787         elm_map_marker_add(map, 2.352, 48.857, itc1, itc_group1, &data1);
788         elm_map_marker_add(map, 2.355, 48.857, itc1, itc_group1, &data3);
789         elm_map_marker_add(map, 3, 48.857, itc2, itc_group1, &data2);
790         elm_map_marker_add(map, 2.352, 49, itc2, itc_group1, &data1);
791
792         elm_map_marker_add(map, 7.31451, 48.857127, itc1, itc_group1, &data10);
793         elm_map_marker_add(map, 7.314704, 48.857119, itc1, itc_group1, &data4);
794         elm_map_marker_add(map, 7.314704, 48.857119, itc2, itc_group1, &data5);
795         elm_map_marker_add(map, 7.31432, 48.856785, itc2, itc_group1, &data6);
796         elm_map_marker_add(map, 7.3148, 48.85725, itc1, itc_group2, &data7);
797         elm_map_marker_add(map, 7.316445, 48.8572210000694, itc1, itc_group1, &data8);
798         elm_map_marker_add(map, 7.316527000125, 48.85609, itc2, itc_group2, &data9);
799         elm_map_marker_add(map, 7.3165409990833, 48.856078, itc2, itc_group1, &data11);
800         elm_map_marker_add(map, 7.319812, 48.856561, itc2, itc_group2, &data10);
801
802         nb_elts = 13;
803
804         evas_object_smart_callback_add(map, "clicked", my_map_clicked, win);
805         evas_object_smart_callback_add(map, "press", my_map_press, win);
806         evas_object_smart_callback_add(map, "longpressed", my_map_longpressed, map);
807         evas_object_smart_callback_add(map, "clicked,double", my_map_clicked_double, map);
808         evas_object_smart_callback_add(map, "load,detail", my_map_load_detail, win);
809         evas_object_smart_callback_add(map, "loaded,detail", my_map_loaded_detail, win);
810         evas_object_smart_callback_add(map, "zoom,start", my_map_zoom_start, win);
811         evas_object_smart_callback_add(map, "zoom,stop", my_map_zoom_stop, win);
812         evas_object_smart_callback_add(map, "zoom,change", my_map_zoom_change, win);
813         evas_object_smart_callback_add(map, "scroll,anim,start", my_map_anim_start, win);
814         evas_object_smart_callback_add(map, "scroll,anim,stop", my_map_anim_stop, win);
815         evas_object_smart_callback_add(map, "scroll,drag,start", my_map_drag_start, map);
816         evas_object_smart_callback_add(map, "scroll,drag,stop", my_map_drag_stop, map);
817         evas_object_smart_callback_add(map, "scroll", my_map_scroll, win);
818         evas_object_smart_callback_add(map, "downloaded", my_map_downloaded, map);
819         evas_object_smart_callback_add(map, "route,load", my_map_route_load, map);
820         evas_object_smart_callback_add(map, "route,loaded", my_map_route_loaded, map);
821         evas_object_smart_callback_add(map, "name,load", my_map_name_load, map);
822         evas_object_smart_callback_add(map, "name,loaded", my_map_name_loaded, map);
823
824         evas_object_show(map);
825      }
826
827    evas_object_resize(win, 800, 800);
828    evas_object_show(win);
829 }
830 #endif