12 #include <glib/gstdio.h>
15 #include <libgnomevfs/gnome-vfs.h>
16 #include <curl/multi.h>
17 #include <glib/gi18n.h>
20 #include "gtkcompass.h"
22 #include "hildon-mapper.h"
30 #include "mapper-types.h"
31 #include "ui-common.h"
33 #include "gps-panels.h"
37 #include "settings-gui.h"
45 #define WINDOW_SIZE_X 800
46 #define WINDOW_SIZE_Y 480
48 static GtkWidget *menu_bar;
49 static GtkWidget *toolbar;
50 GtkWidget *_fix_banner=NULL;
52 static GtkActionGroup *actions;
53 static GtkActionGroup *map_repos_action_group;
54 static GtkUIManager *ui;
56 struct ui_notebook_struct {
65 struct ui_notebook_struct ui_notebook;
67 static poi_quick_data tqp;
69 /* A GPS icon would be nice.. anyone ? */
71 #ifndef GTK_STOCK_INFO
72 #define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
75 static gboolean mapper_cb_quit(GtkWidget *widget, GdkEvent *event, gpointer data);
78 * Action groups and UI
80 static const gchar *mapper_ui =
82 " <menubar name='MenuBar'>"
83 " <menu action='file'>"
84 " <menu action='file_settings'>"
85 " <menuitem action='file_settings_gps'/>"
86 " <menuitem action='file_settings_generic'/>"
87 " <menuitem action='file_settings_colors'/>"
88 #ifdef WITH_DEVICE_770
89 " <menuitem action='file_settings_keys'/>"
92 " <menuitem action='file_settings_osm'/>"
95 " <menuitem action='file_import_osm'/>"
96 " <menuitem action='file_quit'/>"
98 " <menu action='map' name='map'>"
99 " <menu action='map_maps' name='map_maps'>"
102 " <menuitem action='map_manager'/>"
103 " <menuitem action='map_repositories'/>"
105 " <menuitem action='map_auto_download'/>"
107 " <menu action='autocenter'>"
108 " <menuitem action='autocenter_latlon'/>"
109 " <menuitem action='autocenter_lead'/>"
110 " <menuitem action='autocenter_none'/>"
113 " <menu action='search'>"
114 " <menuitem action='poi_search'/>"
115 " <menuitem action='search_address'/>"
117 " <menu action='track'>"
118 " <menuitem action='track_open'/>"
119 " <menuitem action='track_save'/>"
120 " <menuitem action='track_clear'/>"
122 " <menuitem action='track_insert_break'/>"
123 " <menuitem action='track_insert_mark'/>"
125 " <menuitem action='track_dist_last_mark'/>"
126 " <menuitem action='track_dist_first'/>"
128 " <menuitem action='track_filter'/>"
130 " <menu action='route'>"
131 " <menuitem action='route_open'/>"
132 " <menuitem action='route_save'/>"
133 " <menuitem action='route_download'/>"
135 " <menuitem action='route_dist_next'/>"
136 " <menuitem action='route_dist_last'/>"
138 " <menuitem action='route_reset'/>"
139 " <menuitem action='route_clear'/>"
141 " <menu action='poi'>"
142 " <menuitem action='poi_categories'/>"
145 " <menuitem action='poi_import'/>"
146 " <menuitem action='poi_export'/>"
149 " <menu action='view'>"
150 " <menuitem action='view_zoom_in'/>"
151 " <menuitem action='view_zoom_out'/>"
152 " <menuitem action='view_zoom_normal'/>"
153 " <menuitem action='view_zoom_auto'/>"
155 " <menuitem action='view_fullscreen'/>"
157 " <menu action='view_items'>"
158 " <menuitem action='view_scale'/>"
159 " <menuitem action='view_route'/>"
160 " <menuitem action='view_track'/>"
161 " <menuitem action='view_vector'/>"
162 " <menuitem action='view_poi'/>"
165 " <menu action='goto'>"
166 " <menuitem action='goto_home'/>"
167 " <menuitem action='goto_destination'/>"
168 " <menuitem action='goto_gps'/>"
170 " <menuitem action='goto_latlon'/>"
171 " <menuitem action='goto_nearpoi'/>"
172 " <menuitem action='goto_nextway'/>"
175 " <menu action='gps'>"
176 " <menuitem action='gps_enabled'/>"
177 " <menuitem action='gps_information'/>"
179 " <menu action='help'>"
180 #if defined (WITH_OSSO_HELP) || defined(WITH_HILDON_HELP)
181 " <menuitem action='help_help'/>"
183 " <menuitem action='help_about'/>"
186 " <toolbar name='ToolBar'>"
187 " <toolitem action='goto_home'/>"
188 " <toolitem action='goto_destination'/>"
189 " <toolitem action='goto_gps'/>"
191 " <toolitem action='poi_add'/>"
192 " <toolitem action='poi_quick_add'/>"
194 " <toolitem action='search_address'/>"
196 " <toolitem action='view_zoom_in'/>"
197 " <toolitem action='view_zoom_out'/>"
198 #ifndef WITH_DEVICE_770
199 " <toolitem action='view_zoom_normal'/>"
200 " <toolitem action='view_zoom_auto'/>"
204 " <toolbar name='MappingToolBar'>"
205 " <toolitem action='goto_gps'/>"
207 " <toolitem action='poi_add'/>"
208 " <toolitem action='poi_quick_add'/>"
209 " <toolitem action='track_insert_break'/>"
210 " <toolitem action='track_insert_mark'/>"
212 " <toolitem action='search_address'/>"
216 static GtkActionEntry ui_entries[] = {
217 {"file", NULL, N_("_File"), NULL, NULL, NULL },
218 {"file_settings", GTK_STOCK_PREFERENCES, N_("_Settings..."), NULL, NULL, NULL },
219 {"file_settings_generic", NULL, N_("Generic..."), NULL, NULL, G_CALLBACK(menu_cb_settings) },
220 {"file_settings_colors", NULL, N_("_Colors..."), NULL, NULL, G_CALLBACK(menu_cb_settings_colors) },
221 {"file_settings_gps", NULL, N_("_Gps..."), NULL, NULL, G_CALLBACK(menu_cb_settings_gps) },
222 {"file_settings_osm", NULL, N_("_Map info..."), NULL, NULL, G_CALLBACK(menu_cb_settings_osm) },
223 {"file_import_osm", NULL, N_("_Import OSM data..."), NULL, NULL, G_CALLBACK(menu_cb_import_osm) },
224 {"file_quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q", NULL, G_CALLBACK(mapper_cb_quit) },
226 {"help", NULL, N_("_Help"), NULL, NULL, NULL },
227 {"help_help", GTK_STOCK_HELP, N_("_Help"), NULL, NULL, G_CALLBACK(menu_cb_help) },
228 {"help_about", GTK_STOCK_ABOUT, N_("_About"), "<control>A", NULL, G_CALLBACK(menu_cb_about) },
230 {"track", NULL, N_("_Track"), NULL, NULL, NULL },
231 {"track_open", GTK_STOCK_OPEN, N_("_Open..."), NULL, NULL, G_CALLBACK(menu_cb_track_open) },
232 {"track_save", GTK_STOCK_SAVE, N_("_Save..."), "<control>S", NULL, G_CALLBACK(menu_cb_track_save) },
233 {"track_clear", GTK_STOCK_CLEAR, N_("_Clear"), NULL, NULL, G_CALLBACK(menu_cb_track_clear) },
234 {"track_insert_break", NULL, N_("Insert _Break"), NULL, NULL, G_CALLBACK(menu_cb_track_insert_break) },
235 {"track_insert_mark", NULL, N_("Insert _Mark..."), NULL, NULL, G_CALLBACK(menu_cb_track_insert_mark) },
236 {"track_dist_last_mark", NULL, N_("Distance to _last mark"), NULL, NULL, G_CALLBACK(menu_cb_track_distlast) },
237 {"track_dist_first", NULL, N_("Distance from _first"), NULL, NULL, G_CALLBACK(menu_cb_track_distfirst) },
238 {"track_filter", NULL, N_("_Filter..."), NULL, NULL, G_CALLBACK(menu_cb_track_filter) },
240 {"route", NULL, N_("_Route"), NULL, NULL, NULL },
241 {"route_open", GTK_STOCK_OPEN, N_("_Open..."), NULL, NULL, G_CALLBACK(menu_cb_route_open) },
242 {"route_save", GTK_STOCK_SAVE, N_("_Save..."), NULL, NULL, G_CALLBACK(menu_cb_route_save) },
243 {"route_download", NULL, N_("Do_wnload..."), NULL, NULL, G_CALLBACK(menu_cb_route_download)},
244 {"route_reset", NULL, N_("Reset"), NULL, NULL, G_CALLBACK(menu_cb_route_reset) },
245 {"route_clear", GTK_STOCK_CLEAR, N_("_Clear"), NULL, NULL, G_CALLBACK(menu_cb_route_clear) },
246 {"route_dist_next", NULL, N_("Show Distance to _Next Waypoint"), NULL, NULL, G_CALLBACK(menu_cb_route_distnext) },
247 {"route_dist_last", NULL, N_("Show Distance to _End of Route"), NULL, NULL, G_CALLBACK(menu_cb_route_distlast) },
249 {"poi", NULL, N_("_Poi"), NULL, NULL, NULL },
250 {"poi_categories", GTK_STOCK_INDEX, N_("_Categories.."), NULL, NULL, G_CALLBACK(menu_cb_category) },
251 {"poi_settings", GTK_STOCK_PREFERENCES, N_("_Settings..."), NULL, NULL, NULL },
252 {"poi_add", GTK_STOCK_ADD, N_("_Add"), "<control>A", NULL, G_CALLBACK(cb_poi_add) },
253 {"poi_quick_add", GTK_STOCK_ABOUT, N_("_Quick Add"), "<control>E", NULL, G_CALLBACK(cb_poi_add) },
254 {"poi_import", GTK_STOCK_OPEN, N_("_Import..."), NULL, NULL, NULL },
255 {"poi_export", GTK_STOCK_SAVE, N_("_Export..."), NULL, NULL, NULL },
257 {"search", NULL, N_("_Search"), NULL, NULL, NULL },
258 {"poi_search", GTK_STOCK_FIND, N_("_Search..."), "<control>P", NULL, G_CALLBACK(cb_poi_search) },
259 {"search_address", GTK_STOCK_FIND, N_("Address..."), "<control>F", NULL, G_CALLBACK(menu_cb_search_address) },
261 {"map", NULL, N_("_Map"), NULL, NULL, NULL },
262 {"map_maps", NULL, N_("_Maps"), NULL, NULL, NULL },
263 {"map_manager", NULL, N_("Manager..."), NULL, NULL, G_CALLBACK(menu_cb_mapman) },
264 {"map_repositories", NULL, N_("_Repositories..."), NULL, NULL, G_CALLBACK(menu_cb_maps_repoman) },
265 {"autocenter", NULL, N_("_Autocenter"), NULL, NULL, NULL },
267 {"view", NULL, N_("_View"), NULL, NULL, NULL },
268 {"view_zoom_in", GTK_STOCK_ZOOM_IN, N_("Zoom _in"), NULL, NULL, G_CALLBACK(cb_zoomin) },
269 {"view_zoom_out", GTK_STOCK_ZOOM_OUT, N_("Zoom _out"), NULL, NULL, G_CALLBACK(cb_zoomout) },
270 {"view_zoom_normal", GTK_STOCK_ZOOM_100, N_("Zoom _normal"), "<control>0", NULL, G_CALLBACK(cb_zoom_base) },
272 {"view_items", NULL, N_("_Features"), NULL, NULL, NULL },
274 {"goto", NULL, N_("_Go"), NULL, NULL, NULL },
275 {"goto_home", GTK_STOCK_HOME, N_("_Home"), "<control>H", NULL, G_CALLBACK(menu_cb_goto_home) },
276 {"goto_destination", GTK_STOCK_JUMP_TO, N_("_Destination"), "<control>J", NULL, G_CALLBACK(menu_cb_goto_destination) },
277 {"goto_gps", NULL, N_("_GPS"), "<control>G", NULL, G_CALLBACK(menu_cb_goto_gps) },
278 {"goto_latlon", NULL, N_("Lat/Lon"), NULL, NULL, G_CALLBACK(menu_cb_goto_latlon) },
279 {"goto_nextway", NULL, N_("Next Waypoint"), NULL, NULL, G_CALLBACK(menu_cb_goto_nextway) },
280 {"goto_nearpoi", NULL, N_("Near POI"), NULL, NULL, G_CALLBACK(menu_cb_goto_nearpoi) },
282 {"gps", NULL, N_("Gp_s"), NULL, NULL, NULL },
283 {"gps_settings", NULL, N_("_Settings..."), NULL, NULL, NULL },
285 static guint n_ui_entries = G_N_ELEMENTS (ui_entries);
287 static GtkToggleActionEntry ui_toggle_entries[] = {
288 {"map_auto_download", NULL, N_("Auto download"), NULL, NULL, G_CALLBACK(menu_cb_auto_download), FALSE},
289 {"view_zoom_auto", GTK_STOCK_ZOOM_FIT, N_("AutoZoom"), NULL, NULL, G_CALLBACK(cb_zoom_auto), FALSE},
290 {"gps_enabled", GTK_STOCK_CONNECT, N_("Enabled"), NULL, NULL, G_CALLBACK(menu_cb_enable_gps), FALSE},
291 {"gps_information", GTK_STOCK_INFO, N_("Panel"), NULL, NULL, G_CALLBACK (menu_cb_gps_show_info), FALSE},
293 {"view_fullscreen", GTK_STOCK_FULLSCREEN, N_("Fullscreen"), NULL, NULL, G_CALLBACK(cb_fullscreen), FALSE},
295 {"view_fullscreen", NULL, N_("Fullscreen"), "F11", NULL, G_CALLBACK(cb_fullscreen), FALSE},
297 {"view_scale", NULL, N_("Scale"), NULL, NULL, G_CALLBACK(menu_cb_show_scale), TRUE},
298 {"view_route", NULL, N_("Route"), NULL, NULL, G_CALLBACK(menu_cb_show_routes), TRUE},
299 {"view_track", NULL, N_("Track"), NULL, NULL, G_CALLBACK(menu_cb_show_tracks), TRUE},
300 {"view_vector", NULL, N_("Vector"), NULL, NULL, G_CALLBACK(menu_cb_show_velvec), TRUE},
301 {"view_poi", NULL, N_("POIs"), NULL, NULL, G_CALLBACK(menu_cb_show_poi), TRUE},
303 static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries);
305 static GtkRadioActionEntry ui_autocenter_entries[] = {
306 { "autocenter_latlon", NULL, "Lat/Lon", "<control>L", NULL, CENTER_LATLON },
307 { "autocenter_lead", NULL, "Lead", "<control>E", NULL, CENTER_LEAD },
308 { "autocenter_none", NULL, "None", "<control>N", NULL, CENTER_MANUAL },
310 static guint n_ui_autocenter_entries = G_N_ELEMENTS (ui_autocenter_entries);
312 /************************************************************************************/
315 set_action_sensitive(const char *name, gboolean sensitive)
317 GtkAction *action = gtk_action_group_get_action(actions, name);
319 gtk_action_set_sensitive(action, sensitive);
323 set_action_activate(const char *name, gboolean active)
325 GtkAction *action = gtk_action_group_get_action(actions, name);
327 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), active);
332 set_radio_action_value(const char *name, gint value)
334 GtkAction *action = gtk_action_group_get_action(actions, name);
335 gtk_radio_action_set_current_value(action, value);
339 /************************************************************************************/
342 void force_min_visible_bars(HildonControlbar * control_bar, gint num_bars)
345 memset(&val, 0, sizeof(val));
346 g_value_init(&val, G_TYPE_INT);
347 g_value_set_int(&val, num_bars);
348 g_object_set_property(G_OBJECT(control_bar), "minimum-visible-bars", &val);
351 void force_min_visible_bars(void *a, gint b)
357 mapper_cb_quit(GtkWidget *widget, GdkEvent *event, gpointer data)
359 if (dialog_confirm(_window, _("Are sure you'd like to quit ?"))==TRUE) {
367 menu_maps_add_repos(void)
374 gtk_ui_manager_remove_ui(ui, id);
376 id=gtk_ui_manager_new_merge_id(ui);
379 if (map_repos_action_group) {
380 gtk_ui_manager_remove_action_group(ui, map_repos_action_group);
381 g_object_unref(map_repos_action_group);
384 map_repos_action_group=gtk_action_group_new("map_repos_actions");
385 g_assert(map_repos_action_group);
386 gtk_ui_manager_insert_action_group(ui, map_repos_action_group, 0);
387 gtk_ui_manager_ensure_update(ui);
389 for (curr = g_list_last(_repo_list); curr; curr = curr->prev) {
390 RepoData *rd = (RepoData *) curr->data;
394 action_name = g_strdup_printf ("MapRepo%u", i++);
395 action=g_object_new(GTK_TYPE_ACTION, "name", action_name, "label", rd->name, NULL);
396 g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK (menu_cb_maps_select), curr->data);
397 gtk_action_group_add_action(map_repos_action_group, action);
398 g_object_unref(action);
399 gtk_ui_manager_add_ui(ui, id, "/MenuBar/map/map_maps", rd->name, action_name, GTK_UI_MANAGER_MENUITEM, FALSE);
405 * Call gtk_window_present() on Mapper.
410 gtk_window_present(GTK_WINDOW(_window));
417 /* Create needed handles. */
420 GtkWidget *menu_item;
422 /* Setup the context menu. */
423 menu = GTK_MENU(gtk_menu_new());
425 /* Setup the map context menu. */
426 gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Location")));
427 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
429 /* Setup the map context menu. */
430 gtk_menu_append(submenu, _cmenu_loc_show_latlon_item= gtk_menu_item_new_with_label(_("Show Lat/Lon")));
431 gtk_menu_append(submenu, _cmenu_loc_clip_latlon_item = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
432 gtk_menu_append(submenu, gtk_separator_menu_item_new());
433 gtk_menu_append(submenu, _cmenu_loc_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
434 gtk_menu_append(submenu, _cmenu_loc_route_to_item= gtk_menu_item_new_with_label(_("Download Route to...")));
435 gtk_menu_append(submenu, gtk_separator_menu_item_new());
436 gtk_menu_append(submenu, _cmenu_loc_add_route= gtk_menu_item_new_with_label(_("Add Route Point")));
437 gtk_menu_append(submenu, _cmenu_loc_add_way = gtk_menu_item_new_with_label(_("Add Waypoint...")));
438 gtk_menu_append(submenu, gtk_separator_menu_item_new());
439 gtk_menu_append(submenu, _cmenu_loc_set_gps = gtk_menu_item_new_with_label(_("Set as GPS Location")));
440 gtk_menu_append(submenu, _cmenu_loc_set_home = gtk_menu_item_new_with_label(_("Set as Home Location")));
441 gtk_menu_append(submenu, _cmenu_loc_set_destination = gtk_menu_item_new_with_label(_("Set as Destination")));
443 /* Setup the waypoint context menu. */
444 gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Waypoint")));
445 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
447 gtk_menu_append(submenu, _cmenu_way_show_latlon_item = gtk_menu_item_new_with_label(_("Show Lat/Lon")));
448 gtk_menu_append(submenu, _cmenu_way_show_desc_item = gtk_menu_item_new_with_label(_("Show Description")));
449 gtk_menu_append(submenu, _cmenu_way_clip_latlon_item = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
450 gtk_menu_append(submenu, _cmenu_way_clip_desc_item = gtk_menu_item_new_with_label(_("Copy Description")));
451 gtk_menu_append(submenu, gtk_separator_menu_item_new());
452 gtk_menu_append(submenu, _cmenu_way_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
453 gtk_menu_append(submenu, _cmenu_way_route_to_item = gtk_menu_item_new_with_label(_("Download Route to...")));
454 gtk_menu_append(submenu, _cmenu_way_delete_item = gtk_menu_item_new_with_label(_("Delete...")));
455 gtk_menu_append(submenu, gtk_separator_menu_item_new());
456 gtk_menu_append(submenu, _cmenu_way_add_poi = gtk_menu_item_new_with_label(_("Add POI...")));
457 gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
458 gtk_menu_append(submenu, gtk_separator_menu_item_new());
459 gtk_menu_append(submenu, _cmenu_way_goto_nextway = gtk_menu_item_new_with_label(_("Go to Next")));
461 /* Setup the POI context menu. */
462 gtk_menu_append(menu, _cmenu_poi = gtk_menu_item_new_with_label(_("POI")));
463 gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
464 gtk_menu_item_set_submenu(GTK_MENU_ITEM(_cmenu_poi), submenu = gtk_menu_new());
466 gtk_menu_append(submenu, _cmenu_loc_add_poi = gtk_menu_item_new_with_label(_("Add POI...")));
467 gtk_menu_append(submenu, _cmenu_poi_edit_poi = gtk_menu_item_new_with_label(_("View/Edit...")));
468 gtk_menu_append(submenu, gtk_separator_menu_item_new());
469 gtk_menu_append(submenu, _cmenu_poi_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
470 gtk_menu_append(submenu, _cmenu_poi_route_to_item = gtk_menu_item_new_with_label(_("Download Route to...")));
471 gtk_menu_append(submenu, gtk_separator_menu_item_new());
472 gtk_menu_append(submenu, _cmenu_poi_add_route = gtk_menu_item_new_with_label(_("Add Route Point")));
473 gtk_menu_append(submenu, _cmenu_poi_add_way = gtk_menu_item_new_with_label(_("Add Waypoint...")));
474 gtk_menu_append(submenu, gtk_separator_menu_item_new());
475 gtk_menu_append(submenu, _cmenu_poi_goto_nearpoi = gtk_menu_item_new_with_label(_("Go to Nearest")));
477 /* Connect signals for context menu. */
478 g_signal_connect(G_OBJECT(_cmenu_loc_show_latlon_item), "activate", G_CALLBACK(cmenu_cb_loc_show_latlon), NULL);
479 g_signal_connect(G_OBJECT(_cmenu_loc_clip_latlon_item), "activate", G_CALLBACK(cmenu_cb_loc_clip_latlon), NULL);
480 g_signal_connect(G_OBJECT(_cmenu_loc_route_to_item), "activate", G_CALLBACK(cmenu_cb_loc_route_to), NULL);
481 g_signal_connect(G_OBJECT(_cmenu_loc_distance_to_item), "activate", G_CALLBACK(cmenu_cb_loc_distance_to), NULL);
482 g_signal_connect(G_OBJECT(_cmenu_loc_add_route), "activate", G_CALLBACK(cmenu_cb_loc_add_route), NULL);
483 g_signal_connect(G_OBJECT(_cmenu_loc_add_way), "activate", G_CALLBACK(cmenu_cb_loc_add_way), NULL);
484 g_signal_connect(G_OBJECT(_cmenu_loc_add_poi), "activate", G_CALLBACK(cmenu_cb_loc_add_poi), NULL);
485 g_signal_connect(G_OBJECT(_cmenu_loc_set_gps), "activate", G_CALLBACK(cmenu_cb_loc_set_gps), NULL);
486 g_signal_connect(G_OBJECT(_cmenu_loc_set_home), "activate", G_CALLBACK(cmenu_cb_loc_set_home), NULL);
487 g_signal_connect(G_OBJECT(_cmenu_loc_set_destination), "activate", G_CALLBACK(cmenu_cb_loc_set_destination), NULL);
489 g_signal_connect(G_OBJECT(_cmenu_way_show_latlon_item), "activate", G_CALLBACK(cmenu_cb_way_show_latlon), NULL);
490 g_signal_connect(G_OBJECT(_cmenu_way_show_desc_item), "activate", G_CALLBACK(cmenu_cb_way_show_desc), NULL);
491 g_signal_connect(G_OBJECT(_cmenu_way_clip_latlon_item), "activate", G_CALLBACK(cmenu_cb_way_clip_latlon), NULL);
492 g_signal_connect(G_OBJECT(_cmenu_way_clip_desc_item), "activate", G_CALLBACK(cmenu_cb_way_clip_desc), NULL);
493 g_signal_connect(G_OBJECT(_cmenu_way_route_to_item), "activate", G_CALLBACK(cmenu_cb_way_route_to), NULL);
494 g_signal_connect(G_OBJECT(_cmenu_way_distance_to_item), "activate", G_CALLBACK(cmenu_cb_way_distance_to), NULL);
495 g_signal_connect(G_OBJECT(_cmenu_way_delete_item), "activate", G_CALLBACK(cmenu_cb_way_delete), NULL);
496 g_signal_connect(G_OBJECT(_cmenu_way_add_poi), "activate", G_CALLBACK(cmenu_cb_way_add_poi), NULL);
497 g_signal_connect(G_OBJECT(_cmenu_way_goto_nextway), "activate", G_CALLBACK(menu_cb_goto_nextway), NULL);
499 g_signal_connect(G_OBJECT(_cmenu_poi_edit_poi), "activate", G_CALLBACK(cmenu_cb_poi_edit_poi), NULL);
500 g_signal_connect(G_OBJECT(_cmenu_poi_route_to_item), "activate", G_CALLBACK(cmenu_cb_poi_route_to), NULL);
501 g_signal_connect(G_OBJECT(_cmenu_poi_distance_to_item), "activate", G_CALLBACK(cmenu_cb_poi_distance_to), NULL);
502 g_signal_connect(G_OBJECT(_cmenu_poi_add_route), "activate", G_CALLBACK(cmenu_cb_poi_add_route), NULL);
503 g_signal_connect(G_OBJECT(_cmenu_poi_add_way), "activate", G_CALLBACK(cmenu_cb_poi_add_way), NULL);
504 g_signal_connect(G_OBJECT(_cmenu_poi_goto_nearpoi), "activate", G_CALLBACK(menu_cb_goto_nearpoi), NULL);
506 gtk_widget_show_all(GTK_WIDGET(menu));
508 #ifdef WITH_DEVICE_770
509 gtk_widget_tap_and_hold_setup(_map_widget, GTK_WIDGET(menu), NULL, 0);
516 mapper_window_new(void)
521 _program=HILDON_PROGRAM(hildon_program_get_instance());
522 window=GTK_WIDGET(hildon_window_new());
523 hildon_program_add_window(_program, HILDON_WINDOW(window));
525 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
526 gtk_window_set_title(GTK_WINDOW(window), "Mapper");
527 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
528 gtk_widget_set_size_request(GTK_WIDGET(window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
529 gtk_window_resize(GTK_WINDOW(window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
536 * Create a tree view inside given container
539 mapper_tree_view_new(GtkWidget *container)
541 GtkWidget *tree_view, *sw;
542 GtkTreeViewColumn *column;
543 GtkCellRenderer *renderer;
545 tree_view=gtk_tree_view_new();
546 sw=gtk_scrolled_window_new(NULL, NULL);
547 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
548 gtk_container_add(GTK_CONTAINER(sw), tree_view);
549 gtk_box_pack_start(container, sw, TRUE, TRUE, 0);
550 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)), GTK_SELECTION_SINGLE);
551 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), TRUE);
553 renderer=gtk_cell_renderer_text_new();
554 column=gtk_tree_view_column_new_with_attributes(_("Location"), renderer, "text", ROUTE_LATLON, NULL);
555 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
557 renderer=gtk_cell_renderer_text_new();
558 column=gtk_tree_view_column_new_with_attributes(_("Distance"), renderer, "text", ROUTE_DISTANCE, NULL);
559 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
561 renderer=gtk_cell_renderer_text_new();
562 column=gtk_tree_view_column_new_with_attributes(_("Waypoint"), renderer, "text", ROUTE_WAYPOINT, NULL);
563 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
569 * Initialize everything required in preparation for calling gtk_main().
574 GError *error = NULL;
575 GtkWidget *hbox, *mapvbox, *label, *vbox_main;
577 GtkNotebook *notebook;
579 GtkTreeViewColumn *column;
580 GtkCellRenderer *renderer;
582 _window=mapper_window_new();
583 gtk_container_set_border_width (GTK_CONTAINER (_window), 0);
585 actions = gtk_action_group_new ("Actions");
588 ui = gtk_ui_manager_new ();
591 gtk_action_group_add_actions (actions, ui_entries, n_ui_entries, NULL);
592 gtk_action_group_add_toggle_actions (actions, ui_toggle_entries, n_ui_toggle_entries, NULL);
593 gtk_action_group_add_radio_actions (actions, ui_autocenter_entries,
594 n_ui_autocenter_entries, _center_mode, G_CALLBACK(menu_cb_autocenter), NULL);
596 gtk_ui_manager_insert_action_group (ui, actions, 0);
597 g_object_unref (actions);
599 /* N810 has keyboard so set this up on hildon too */
600 gtk_window_add_accel_group (GTK_WINDOW(_window), gtk_ui_manager_get_accel_group (ui));
602 if (!gtk_ui_manager_add_ui_from_string (ui, mapper_ui, -1, &error)) {
603 g_message ("building menus failed: %s", error->message);
608 /* Menu and Toolbar */
609 menu_bar = gtk_ui_manager_get_widget (ui, "/MenuBar");
612 toolbar = gtk_ui_manager_get_widget (ui, "/ToolBar");
615 /* Toolbar progress item */
616 item=gtk_tool_item_new();
617 _progress_item=gtk_progress_bar_new();
618 gtk_tool_item_set_expand(item, TRUE);
619 gtk_progress_bar_set_ellipsize(_progress_item, PANGO_ELLIPSIZE_END);
620 gtk_progress_bar_set_pulse_step(_progress_item, 0.2);
621 gtk_container_add(item, _progress_item);
622 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
624 /* Notebook with different views */
625 notebook = gtk_notebook_new();
626 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE);
628 info_banner.container=gtk_hbox_new(FALSE, 0);
629 info_banner.location=gtk_label_new("");
630 info_banner.speed=gtk_label_new("");
631 info_banner.distance=gtk_label_new("");
633 gtk_misc_set_alignment(GTK_MISC(info_banner.location), 0.f, 0.5f);
634 gtk_misc_set_alignment(GTK_MISC(info_banner.speed), 1.f, 0.5f);
635 gtk_misc_set_alignment(GTK_MISC(info_banner.distance), 1.f, 0.5f);
637 gtk_box_pack_start(GTK_BOX(info_banner.container), info_banner.location, TRUE, TRUE, 0);
638 gtk_box_pack_end(GTK_BOX(info_banner.container), info_banner.speed, FALSE, FALSE, 0);
639 gtk_box_pack_end(GTK_BOX(info_banner.container), info_banner.distance, FALSE, FALSE, 0);
641 vbox_main = gtk_vbox_new(FALSE, 0);
642 gtk_container_add(GTK_CONTAINER(_window), vbox_main);
645 /* Create and add widgets and supporting data. */
646 gtk_box_pack_start(GTK_BOX(vbox_main), GTK_WIDGET(notebook), TRUE, TRUE, 0);
647 gtk_box_pack_start(GTK_BOX(vbox_main), GTK_WIDGET(info_banner.container), FALSE, FALSE, 0);
648 hildon_program_set_common_toolbar(_program, GTK_TOOLBAR(toolbar));
651 hmenu = GTK_MENU(gtk_menu_new());
653 gtk_container_foreach(GTK_CONTAINER(menu_bar), (GtkCallback)gtk_widget_reparent, hmenu);
654 hildon_window_set_menu(HILDON_WINDOW(_window), hmenu);
656 gtk_widget_show_all(GTK_WIDGET(toolbar));
658 _status_bar = gtk_statusbar_new();
659 gtk_box_pack_start(GTK_BOX(vbox_main), menu_bar, FALSE, FALSE, 0);
660 gtk_box_pack_start(GTK_BOX(vbox_main), toolbar, FALSE, FALSE, 0);
661 gtk_box_pack_start(GTK_BOX(vbox_main), notebook, TRUE, TRUE, 0);
662 gtk_box_pack_start(GTK_BOX(vbox_main), info_banner.container, FALSE, FALSE, 0);
663 gtk_box_pack_start(GTK_BOX(vbox_main), _status_bar, FALSE, FALSE, 0);
666 label = gtk_label_new("Map");
667 hbox = gtk_hpaned_new();
670 _gps_widget=gps_info_panel();
671 gtk_widget_set_size_request(GTK_WIDGET(_gps_widget), 180, 0);
672 gtk_paned_add1(GTK_PANED(hbox), _gps_widget);
674 mapvbox=gtk_vbox_new(FALSE, 0);
675 gtk_box_pack_start(GTK_BOX(mapvbox), hbox, TRUE, TRUE, 0);
676 ui_notebook.map=gtk_notebook_append_page(notebook, mapvbox, label);
679 _map_widget = map_new();
680 gtk_paned_add2(GTK_PANED(hbox), _map_widget);
683 vbox = gtk_vbox_new(FALSE, 0);
684 label = gtk_label_new("Gps");
685 _gps_sat_view = gtk_gps_new(GTK_GPS_MODE_SKY, &_gps->data);
686 gtk_box_pack_start(GTK_BOX(vbox), _gps_sat_view, TRUE, TRUE, 0);
687 _gps_sat_view = gtk_gps_new(GTK_GPS_MODE_SIGNAL, &_gps->data);
688 gtk_box_pack_start(GTK_BOX(vbox), _gps_sat_view, TRUE, TRUE, 0);
689 ui_notebook.gps=gtk_notebook_append_page(notebook, vbox, label);
692 vbox = gtk_vbox_new(FALSE, 0);
693 label = gtk_label_new("Heading");
694 _tab_compass = gtk_compass_new(&_gps->data);
695 gtk_box_pack_start(GTK_BOX(vbox), _tab_compass, TRUE, TRUE, 0);
696 ui_notebook.heading=gtk_notebook_append_page(notebook, vbox, label);
699 vbox=gtk_vbox_new(FALSE, 0);
700 label=gtk_label_new("Track");
701 track_tree_view=mapper_tree_view_new(vbox);
703 g_signal_connect(G_OBJECT(track_tree_view), "row-activated", G_CALLBACK(track_waypoint_activated_cb), NULL);
705 ui_notebook.track=gtk_notebook_append_page(notebook, vbox, label);
708 vbox=gtk_vbox_new(FALSE, 0);
709 label=gtk_label_new("Route");
710 route_tree_view=mapper_tree_view_new(vbox);
712 g_signal_connect(G_OBJECT(route_tree_view), "row-activated", G_CALLBACK(route_waypoint_activated_cb), NULL);
714 ui_notebook.route=gtk_notebook_append_page(notebook, vbox, label);
717 label=gtk_label_new("Quick POI");
720 vbox=poi_quick_button_box(&tqp);
721 ui_notebook.qpoi=gtk_notebook_append_page(notebook, vbox, label);
723 menu_maps_add_repos();
726 _last_spoken_phrase = g_strdup("");
727 memset(&_autoroute_data, 0, sizeof(_autoroute_data));
729 g_signal_connect(G_OBJECT(_window), "delete_event", G_CALLBACK(mapper_cb_quit), NULL);
730 g_signal_connect(G_OBJECT(_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
732 gtk_widget_show_all(GTK_WIDGET(vbox_main));
733 gtk_widget_show_all(GTK_WIDGET(_window));
735 /* Initialize our line styles. */
738 /* Set defaults for items */
739 set_action_activate("map_auto_download", _auto_download);
740 set_action_activate("gps_enabled", _enable_gps);
741 set_action_sensitive("goto_gps", _enable_gps);
743 set_action_sensitive("autocenter_latlon", _enable_gps);
744 set_action_sensitive("autocenter_lead", _enable_gps);
746 set_action_activate("gps_information", _gps_info);
748 set_action_activate("view_scale", _show_scale);
749 set_action_activate("view_vector", _show_velvec);
750 set_action_activate("view_poi", _show_poi);
752 set_action_activate("view_track", _show_tracks & TRACKS_MASK);
753 set_action_activate("view_route", _show_tracks & ROUTES_MASK);
755 /* Connect signals. */
756 g_signal_connect(G_OBJECT(_window), "key_press_event", G_CALLBACK(window_cb_key_press), NULL);
757 g_signal_connect(G_OBJECT(_window), "key_release_event", G_CALLBACK(window_cb_key_release), NULL);
759 /* If we have a route, calculate the next point. */
760 route_find_nearest_point();
762 gps_show_info(&_gps->data);
764 gtk_idle_add((GSourceFunc)window_present, NULL);
768 gps_info_update(Gps *gps)
772 gps_display_data(&gps->data);
774 gps_display_data_speed(info_banner.speed, gps->data.speed);
780 gps_satellite_update(Gps *gps)
784 gps_display_details(&gps->data);
790 gps_location_update(Gps *gps)
793 if (filter_check(&filter, &gps->data, &map_loc)==TRUE) {
794 track_add(&_gps->data);
801 * Simple dialog to ask if we should try to reconnect to GPS
802 * returns TRUE or FALSE
805 gps_retry_connection(Gps *gps, const gchar *error)
811 confirm=hildon_note_new_confirmation(GTK_WINDOW(_window), _("Failed to connect to GPS receiver. Retry?"));
812 r=(GTK_RESPONSE_OK==gtk_dialog_run(GTK_DIALOG(confirm))) ? TRUE : FALSE;
813 gtk_widget_destroy(confirm);