]> err.no Git - mapper/blob - src/ui-common.c
Hide normal/auto zoom toolbar buttons on tablet.
[mapper] / src / ui-common.c
1 #include <config.h>
2
3 #define _GNU_SOURCE
4
5 #include <unistd.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <strings.h>
9 #include <stddef.h>
10 #include <locale.h>
11 #include <math.h>
12 #include <errno.h>
13 #include <sys/wait.h>
14 #include <glib/gstdio.h>
15 #include <gtk/gtk.h>
16 #include <fcntl.h>
17 #include <libgnomevfs/gnome-vfs.h>
18 #include <curl/multi.h>
19 #include <glib/gi18n.h>
20
21 #include "gtkgps.h"
22
23 #include "hildon-mapper.h"
24
25 #include "utils.h"
26 #include "poi.h"
27 #include "route.h"
28 #include "settings.h"
29 #include "gps.h"
30 #include "map.h"
31 #include "mapper-types.h"
32 #include "bt.h"
33 #include "ui-common.h"
34 #include "db.h"
35
36 #include "settings-gui.h"
37
38 /* Callbacks */
39 #include "cb.h"
40
41 /* Default size */
42 #define WINDOW_SIZE_X 800
43 #define WINDOW_SIZE_Y 600
44
45 static GtkWidget *menu_bar;
46 static GtkWidget *toolbar;
47 GtkWidget *_fix_banner=NULL;
48
49 static GtkActionGroup *actions;
50 static GtkActionGroup *map_repos_action_group;
51 static GtkUIManager *ui;
52
53 struct ui_notebook_struct {
54     GtkWidget *notebook;
55     gint map;
56     gint gps;
57     gint heading;
58         gint route;
59 };
60 struct ui_notebook_struct ui_notebook;
61
62 /* A GPS icon would be nice.. anyone ? */
63
64 #ifndef GTK_STOCK_INFO
65 #define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
66 #endif
67
68 /**
69  * Action groups and UI
70  */
71 static const gchar *mapper_ui =
72 "<ui>"
73 "  <menubar name='MenuBar'>"
74 "    <menu action='file'>"
75 "      <menuitem action='file_settings'/>"
76 "      <separator/>"
77 "      <menuitem action='file_quit'/>"
78 "    </menu>"
79 "    <menu action='map' name='map'>"
80 "      <menu action='map_maps' name='map_maps'>"
81 "      </menu>"
82 "      <separator/>"
83 "      <menuitem action='map_manager'/>"
84 "      <menuitem action='map_repositories'/>"
85 "      <separator/>"
86 "      <menuitem action='map_auto_download'/>"
87 "      <separator/>"
88 "     <menu action='autocenter'>"
89 "      <menuitem action='autocenter_latlon'/>"
90 "      <menuitem action='autocenter_lead'/>"
91 "      <menuitem action='autocenter_none'/>"
92 "     </menu>"
93 "    </menu>"
94 "    <menu action='track'>"
95 "      <menuitem action='track_open'/>"
96 "      <menuitem action='track_save'/>"
97 "      <menuitem action='track_clear'/>"
98 "      <separator/>"
99 "      <menuitem action='track_insert_break'/>"
100 "      <menuitem action='track_insert_mark'/>"
101 "      <separator/>"
102 "      <menuitem action='track_dist_last_mark'/>"
103 "      <menuitem action='track_dist_first'/>"
104 "      <separator/>"
105 "      <menuitem action='track_filter'/>"
106 "    </menu>"
107 "    <menu action='route'>"
108 "      <menuitem action='route_open'/>"
109 "      <menuitem action='route_save'/>"
110 "      <menuitem action='route_download'/>"
111 "      <separator/>"
112 "      <menuitem action='route_dist_next'/>"
113 "      <menuitem action='route_dist_last'/>"
114 "      <separator/>"
115 "      <menuitem action='route_reset'/>"
116 "      <menuitem action='route_clear'/>"
117 "    </menu>"
118 "    <menu action='poi'>"
119 "      <menuitem action='poi_search'/>"
120 "      <menuitem action='poi_categories'/>"
121 "      <separator/>"
122 "      <menuitem action='poi_settings'/>"
123 "    </menu>"
124 "    <menu action='view'>"
125 "      <menuitem action='view_zoom_in'/>"
126 "      <menuitem action='view_zoom_out'/>"
127 "      <menuitem action='view_zoom_normal'/>"
128 "      <menuitem action='view_zoom_auto'/>"
129 "      <separator/>"
130 "      <menuitem action='view_fullscreen'/>"
131 "      <separator/>"
132 "      <menu action='view_items'>"
133 "       <menuitem action='view_scale'/>"
134 "       <menuitem action='view_route'/>"
135 "       <menuitem action='view_track'/>"
136 "       <menuitem action='view_vector'/>"
137 "       <menuitem action='view_poi'/>"
138 "      </menu>"
139 "    </menu>"
140 "    <menu action='goto'>"
141 "      <menuitem action='goto_home'/>"
142 "      <menuitem action='goto_destination'/>"
143 "      <menuitem action='goto_gps'/>"
144 "      <separator/>"
145 "      <menuitem action='search_address'/>"
146 "      <menuitem action='goto_latlon'/>"
147 "      <menuitem action='goto_nearpoi'/>"
148 "      <menuitem action='goto_nextway'/>"
149 "      <separator/>"
150 "    </menu>"
151 "    <menu action='gps'>"
152 "      <menuitem action='gps_enabled'/>"
153 "      <menuitem action='gps_information'/>"
154 "      <separator/>"
155 "      <menuitem action='gps_details'/>"
156 "      <separator/>"
157 "      <menuitem action='gps_settings'/>"
158 "    </menu>"
159 "    <menu action='help'>"
160 "      <menuitem action='help_help'/>"
161 "      <menuitem action='help_about'/>"
162 "    </menu>"
163 "  </menubar>"
164 "  <toolbar name='ToolBar'>"
165 "    <toolitem action='goto_home'/>"
166 "    <toolitem action='goto_destination'/>"
167 "    <toolitem action='goto_gps'/>"
168 "    <separator/>"
169 "    <toolitem action='poi_add'/>"
170 "    <toolitem action='poi_quick_add'/>"
171 "    <separator/>"
172 "    <toolitem action='search_address'/>"
173 "    <separator/>"
174 "    <toolitem action='view_zoom_in'/>"
175 "    <toolitem action='view_zoom_out'/>"
176 #ifndef WITH_DEVICE_770
177 "    <toolitem action='view_zoom_normal'/>"
178 "    <toolitem action='view_zoom_auto'/>"
179 #endif
180 "    <separator/>"
181 "  </toolbar>"
182 "</ui>";
183
184 static GtkActionEntry ui_entries[] = {
185         {"file", NULL, N_("_File"), NULL, NULL, NULL },
186         {"file_settings", GTK_STOCK_PREFERENCES, N_("_Settings..."), NULL, NULL, G_CALLBACK(menu_cb_settings) },
187         {"file_quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q", NULL, G_CALLBACK(gtk_main_quit) },
188
189         {"help", NULL, N_("_Help"), NULL, NULL, NULL },
190         {"help_help", GTK_STOCK_HELP, N_("_Help"), NULL, NULL, G_CALLBACK(menu_cb_help) },
191         {"help_about", GTK_STOCK_ABOUT, N_("_About"), "<control>A", NULL, G_CALLBACK(menu_cb_about) },
192
193         {"track", NULL, N_("_Track"), NULL, NULL, NULL },
194         {"track_open", GTK_STOCK_OPEN, N_("_Open..."), NULL, NULL, G_CALLBACK(menu_cb_track_open) },
195         {"track_save", GTK_STOCK_SAVE, N_("_Save..."), "<control>S", NULL, G_CALLBACK(menu_cb_track_save) },
196         {"track_clear", GTK_STOCK_CLEAR, N_("_Clear"), NULL, NULL, G_CALLBACK(menu_cb_track_clear) },
197         {"track_insert_break", NULL, N_("Insert _Break"), NULL, NULL, G_CALLBACK(menu_cb_track_insert_break) },
198         {"track_insert_mark", NULL, N_("Insert _Mark..."), NULL, NULL, G_CALLBACK(menu_cb_track_insert_mark) },
199         {"track_dist_last_mark", NULL, N_("Distance to _last mark"), NULL, NULL, G_CALLBACK(menu_cb_track_distlast) },
200         {"track_dist_first", NULL, N_("Distance from _first"), NULL, NULL, G_CALLBACK(menu_cb_track_distfirst) },
201         {"track_filter", NULL, N_("_Filter..."), NULL, NULL, G_CALLBACK(menu_cb_track_filter) },
202
203         {"route", NULL, N_("_Route"), NULL, NULL, NULL },
204         {"route_open", GTK_STOCK_OPEN, N_("_Open..."), NULL, NULL, G_CALLBACK(menu_cb_route_open) },
205         {"route_save", GTK_STOCK_SAVE, N_("_Save..."), NULL, NULL, G_CALLBACK(menu_cb_route_save) },
206         {"route_download", NULL, N_("Do_wnload..."), NULL, NULL, G_CALLBACK(menu_cb_route_download)},
207         {"route_reset", NULL, N_("Reset"), NULL, NULL, G_CALLBACK(menu_cb_route_reset) },
208         {"route_clear", GTK_STOCK_CLEAR, N_("_Clear"), NULL, NULL, G_CALLBACK(menu_cb_route_clear) },
209         {"route_dist_next", NULL, N_("Show Distance to _Next Waypoint"), NULL, NULL, G_CALLBACK(menu_cb_route_distnext) },
210         {"route_dist_last", NULL, N_("Show Distance to _End of Route"), NULL, NULL, G_CALLBACK(menu_cb_route_distlast) },
211
212         {"poi", NULL, N_("_Poi"), NULL, NULL, NULL },
213         {"poi_categories", GTK_STOCK_INDEX, N_("_Categories.."), NULL, NULL, G_CALLBACK(menu_cb_category) },
214         {"poi_settings", GTK_STOCK_PREFERENCES, N_("_Settings..."), NULL, NULL, NULL },
215         {"poi_add", GTK_STOCK_ADD, N_("_Add"), "<control>A", NULL, G_CALLBACK(cb_poi_add) },
216         {"poi_quick_add", GTK_STOCK_ABOUT, N_("_Quick Add"), "<control>E", NULL, G_CALLBACK(cb_poi_add) },
217         {"poi_search", GTK_STOCK_FIND, N_("_Search..."), NULL, NULL, G_CALLBACK(cb_poi_search) },
218
219         {"map", NULL, N_("_Map"), NULL, NULL, NULL },
220         {"map_maps", NULL, N_("_Maps"), NULL, NULL, NULL },
221         {"map_manager", NULL, N_("Manager..."), NULL, NULL, G_CALLBACK(menu_cb_mapman) },
222         {"map_repositories", NULL, N_("_Repositories..."), NULL, NULL, G_CALLBACK(menu_cb_maps_repoman) },
223         {"autocenter", NULL, N_("_Autocenter"), NULL, NULL, NULL },
224
225         {"view", NULL, N_("_View"), NULL, NULL, NULL },
226         {"view_zoom_in", GTK_STOCK_ZOOM_IN, N_("Zoom _in"), NULL, NULL, G_CALLBACK(cb_zoomin) },
227         {"view_zoom_out", GTK_STOCK_ZOOM_OUT, N_("Zoom _out"), NULL, NULL, G_CALLBACK(cb_zoomout) },
228         {"view_zoom_normal", GTK_STOCK_ZOOM_100, N_("Zoom _normal"), "<control>0", NULL, G_CALLBACK(cb_zoom_base) },
229
230         {"view_items", NULL, N_("_Features"), NULL, NULL, NULL },
231
232         {"goto", NULL, N_("_Go"), NULL, NULL, NULL },
233         {"goto_home", GTK_STOCK_HOME, N_("_Home"), "<control>H", NULL, G_CALLBACK(menu_cb_goto_home) },
234         {"goto_destination", GTK_STOCK_JUMP_TO, N_("_Destination"), "<control>J", NULL, G_CALLBACK(menu_cb_goto_destination) },
235         {"goto_gps", NULL, N_("_GPS"), "<control>G", NULL, G_CALLBACK(menu_cb_goto_gps) },
236         {"search_address", GTK_STOCK_FIND, N_("Address..."), NULL, NULL, G_CALLBACK(menu_cb_search_address) },
237         {"goto_latlon", NULL, N_("Lat/Lon"), NULL, NULL, G_CALLBACK(menu_cb_goto_latlon) },
238         {"goto_nextway", NULL, N_("Next Waypoint"), NULL, NULL, G_CALLBACK(menu_cb_goto_nextway) },
239         {"goto_nearpoi", NULL, N_("Near POI"), NULL, NULL, G_CALLBACK(menu_cb_goto_nearpoi) },
240
241         {"gps", NULL, N_("Gp_s"), NULL, NULL, NULL },
242         {"gps_details", GTK_STOCK_INFO, N_("_Details..."), NULL, NULL, G_CALLBACK(menu_cb_gps_details) },
243         {"gps_settings", NULL, N_("_Settings..."), NULL, NULL, NULL },
244 };
245 static guint n_ui_entries = G_N_ELEMENTS (ui_entries);
246
247 static GtkToggleActionEntry ui_toggle_entries[] = {
248         {"map_auto_download", NULL, N_("Auto download"), NULL, NULL, G_CALLBACK(menu_cb_auto_download), FALSE},
249         {"view_zoom_auto", GTK_STOCK_ZOOM_FIT, N_("AutoZoom"), NULL, NULL, G_CALLBACK(cb_zoom_auto), FALSE},
250         {"gps_enabled", GTK_STOCK_CONNECT, N_("Enabled"), NULL, NULL, G_CALLBACK(menu_cb_enable_gps), FALSE},
251         {"gps_information", GTK_STOCK_INFO, N_("Panel"), NULL, NULL, G_CALLBACK (menu_cb_gps_show_info), FALSE},
252 #if 0
253         {"view_fullscreen", GTK_STOCK_FULLSCREEN, N_("Fullscreen"), NULL, NULL, G_CALLBACK(cb_fullscreen), FALSE},
254 #else
255         {"view_fullscreen", NULL, N_("Fullscreen"), "F11", NULL, G_CALLBACK(cb_fullscreen), FALSE},
256 #endif
257         {"view_scale", NULL, N_("Scale"), NULL, NULL, G_CALLBACK(menu_cb_show_scale), TRUE},
258         {"view_route", NULL, N_("Route"), NULL, NULL, G_CALLBACK(menu_cb_show_routes), TRUE},
259         {"view_track", NULL, N_("Track"), NULL, NULL, G_CALLBACK(menu_cb_show_tracks), TRUE},
260         {"view_vector", NULL, N_("Vector"), NULL, NULL, G_CALLBACK(menu_cb_show_velvec), TRUE},
261         {"view_poi", NULL, N_("POIs"), NULL, NULL, G_CALLBACK(menu_cb_show_poi), TRUE},
262 };
263 static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries);
264
265 static GtkRadioActionEntry ui_autocenter_entries[] = {
266   { "autocenter_latlon", NULL, "Lat/Lon", "<control>1", NULL, CENTER_LATLON },
267   { "autocenter_lead", NULL, "Lead", "<control>2", NULL, CENTER_LEAD },
268   { "autocenter_none", NULL, "None", "<control>3", NULL, CENTER_MANUAL },
269 };
270 static guint n_ui_autocenter_entries = G_N_ELEMENTS (ui_autocenter_entries);
271
272 /************************************************************************************/
273
274 void
275 set_action_sensitive(const char *name, gboolean sensitive)
276 {
277 GtkAction *action = gtk_action_group_get_action(actions, name);
278 g_assert(action);
279 gtk_action_set_sensitive(action, sensitive);
280 }
281
282 void
283 set_action_activate(const char *name, gboolean active)
284 {
285 GtkAction *action = gtk_action_group_get_action(actions, name);
286 g_assert(action);
287 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), active);
288 }
289
290 #if 0
291 void
292 set_radio_action_value(const char *name, gint value)
293 {
294 GtkAction *action = gtk_action_group_get_action(actions, name);
295 gtk_radio_action_set_current_value(action, value);
296 }
297 #endif
298
299 /************************************************************************************/
300
301 #ifdef WITH_HILDON
302 void force_min_visible_bars(HildonControlbar * control_bar, gint num_bars)
303 {
304 GValue val;
305 memset(&val, 0, sizeof(val));
306 g_value_init(&val, G_TYPE_INT);
307 g_value_set_int(&val, num_bars);
308 g_object_set_property(G_OBJECT(control_bar), "minimum-visible-bars", &val);
309 }
310 #else
311 void force_min_visible_bars(void *a, gint b)
312 {
313 }
314 #endif
315
316 /**
317  * Pop up a modal dialog box with simple error information in it.
318  */
319 void 
320 popup_error(GtkWidget * window, const gchar * error)
321 {
322 GtkWidget *dialog;
323
324 #ifdef WITH_HILDON
325 dialog = hildon_note_new_information(GTK_WINDOW(window), error);
326 #else
327 dialog = gtk_message_dialog_new (GTK_WINDOW(window),
328         GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
329         GTK_MESSAGE_INFO, GTK_BUTTONS_OK, error);
330 #endif
331 gtk_dialog_run(GTK_DIALOG(dialog));
332 gtk_widget_destroy(dialog);
333 }
334
335 void 
336 menu_maps_add_repos(void)
337 {
338 GList *curr;
339 static gint id=0;
340 gint i=0;
341
342 if (id>0) {
343         gtk_ui_manager_remove_ui(ui, id);
344 } else {
345         id=gtk_ui_manager_new_merge_id(ui);
346 }
347
348 if (map_repos_action_group) {
349         gtk_ui_manager_remove_action_group(ui, map_repos_action_group);
350         g_object_unref(map_repos_action_group);
351 }
352
353 map_repos_action_group=gtk_action_group_new("map_repos_actions");
354 g_assert(map_repos_action_group);
355 gtk_ui_manager_insert_action_group(ui, map_repos_action_group, 0);
356 gtk_ui_manager_ensure_update(ui);
357
358 for (curr = g_list_last(_repo_list); curr; curr = curr->prev) {
359         RepoData *rd = (RepoData *) curr->data;
360         GtkAction *action;
361         gchar *action_name;
362
363         action_name = g_strdup_printf ("MapRepo%u", i++);
364         action=g_object_new(GTK_TYPE_ACTION, "name", action_name, "label", rd->name, NULL);
365         g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK (menu_cb_maps_select), curr->data);
366         gtk_action_group_add_action(map_repos_action_group, action);
367         g_object_unref(action);
368         gtk_ui_manager_add_ui(ui, id, "/MenuBar/map/map_maps", rd->name, action_name, GTK_UI_MANAGER_MENUITEM, FALSE);
369 }
370
371 }
372
373 /**
374  * Call gtk_window_present() on Mapper.  This also checks the
375  * configuration and brings up the Settings dialog if the GPS Receiver is
376  * not set up, the first time it is called.
377  */
378 gboolean 
379 window_present()
380 {
381 static gint been_here = 0;
382 static gint done_here = 0;
383
384 if (!been_here++) {
385         /* Set connection state first, to avoid going into this if twice. */
386         if (!_rcvr_mac && _enable_gps) {
387                 GtkWidget *confirm;
388
389                 gtk_window_present(GTK_WINDOW(_window));
390                 popup_error(_window, _("It looks like this is your first time running Mapper. Press OK to continue."));
391
392                 if (settings_dialog()) {
393                         popup_error(_window,
394                                    _("OpenStreetMap.org provides public, free-to-use maps.  "
395                                      "You can also download a sample set of repositories from "
396                                      " the internet by using the \"Download...\" button."));
397                         repoman_dialog();
398                         if (_curr_repo->type != REPOTYPE_NONE) {
399                                 confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
400                                              _("You will now see a blank screen.  You can download"
401                                               " maps using the \"Manage Maps\" menu item in the"
402                                               " \"Maps\" menu.  Or, press OK to enable"
403                                               " Auto-Download."));
404                                 if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
405                                         set_action_activate("map_auto_download", FALSE);
406                                 }
407                                 gtk_widget_destroy(confirm);
408                         }
409                 } else {
410                         gtk_main_quit();
411                 }
412         }
413         /* Connect to receiver. */
414         if (_enable_gps && _rcvr_mac)
415                 rcvr_connect_now();
416
417         done_here++;    /* Don't ask... */
418 }
419 if (done_here) {
420         gtk_window_present(GTK_WINDOW(_window));
421
422         /* Re-enable any banners that might have been up. */
423         {
424                 ConnState old_state = _conn_state;
425                 gps_conn_set_state(RCVR_OFF);
426                 gps_conn_set_state(old_state);
427         }
428 }
429
430 return FALSE;
431 }
432
433 static void 
434 menu_init_cmenu()
435 {
436 /* Create needed handles. */
437 GtkMenu *menu;
438 GtkWidget *submenu;
439 GtkWidget *menu_item;
440
441 /* Setup the context menu. */
442 menu = GTK_MENU(gtk_menu_new());
443
444 /* Setup the map context menu. */
445 gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Location")));
446 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
447
448 /* Setup the map context menu. */
449 gtk_menu_append(submenu, _cmenu_loc_show_latlon_item= gtk_menu_item_new_with_label(_("Show Lat/Lon")));
450 gtk_menu_append(submenu, _cmenu_loc_clip_latlon_item = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
451 gtk_menu_append(submenu, gtk_separator_menu_item_new());
452 gtk_menu_append(submenu, _cmenu_loc_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
453 gtk_menu_append(submenu, _cmenu_loc_route_to_item= gtk_menu_item_new_with_label(_("Download Route to...")));
454 gtk_menu_append(submenu, gtk_separator_menu_item_new());
455 gtk_menu_append(submenu, _cmenu_loc_add_route= gtk_menu_item_new_with_label(_("Add Route Point")));
456 gtk_menu_append(submenu, _cmenu_loc_add_way     = gtk_menu_item_new_with_label(_("Add Waypoint...")));
457 gtk_widget_set_sensitive(_cmenu_loc_add_poi, _db != NULL);
458 gtk_menu_append(submenu, gtk_separator_menu_item_new());
459 gtk_menu_append(submenu, _cmenu_loc_set_gps = gtk_menu_item_new_with_label(_("Set as GPS Location")));
460 gtk_menu_append(submenu, _cmenu_loc_set_home = gtk_menu_item_new_with_label(_("Set as Home Location")));
461 gtk_menu_append(submenu, _cmenu_loc_set_destination     = gtk_menu_item_new_with_label(_("Set as Destination")));
462
463 /* Setup the waypoint context menu. */
464 gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Waypoint")));
465 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
466
467 gtk_menu_append(submenu, _cmenu_way_show_latlon_item = gtk_menu_item_new_with_label(_("Show Lat/Lon")));
468 gtk_menu_append(submenu, _cmenu_way_show_desc_item = gtk_menu_item_new_with_label(_("Show Description")));
469 gtk_menu_append(submenu, _cmenu_way_clip_latlon_item = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
470 gtk_menu_append(submenu, _cmenu_way_clip_desc_item = gtk_menu_item_new_with_label(_("Copy Description")));
471 gtk_menu_append(submenu, gtk_separator_menu_item_new());
472 gtk_menu_append(submenu, _cmenu_way_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
473 gtk_menu_append(submenu, _cmenu_way_route_to_item = gtk_menu_item_new_with_label(_("Download Route to...")));
474 gtk_menu_append(submenu, _cmenu_way_delete_item = gtk_menu_item_new_with_label(_("Delete...")));
475 gtk_menu_append(submenu, gtk_separator_menu_item_new());
476 gtk_menu_append(submenu, _cmenu_way_add_poi = gtk_menu_item_new_with_label(_("Add POI...")));
477 gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
478 gtk_menu_append(submenu, gtk_separator_menu_item_new());
479 gtk_menu_append(submenu, _cmenu_way_goto_nextway = gtk_menu_item_new_with_label(_("Go to Next")));
480
481 /* Setup the POI context menu. */
482 gtk_menu_append(menu, _cmenu_poi = gtk_menu_item_new_with_label(_("POI")));
483 gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
484 gtk_menu_item_set_submenu(GTK_MENU_ITEM(_cmenu_poi), submenu = gtk_menu_new());
485
486 gtk_menu_append(submenu, _cmenu_loc_add_poi     = gtk_menu_item_new_with_label(_("Add POI...")));
487 gtk_menu_append(submenu, _cmenu_poi_edit_poi = gtk_menu_item_new_with_label(_("View/Edit...")));
488 gtk_menu_append(submenu, gtk_separator_menu_item_new());
489 gtk_menu_append(submenu, _cmenu_poi_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
490 gtk_menu_append(submenu, _cmenu_poi_route_to_item = gtk_menu_item_new_with_label(_("Download Route to...")));
491 gtk_menu_append(submenu, gtk_separator_menu_item_new());
492 gtk_menu_append(submenu, _cmenu_poi_add_route = gtk_menu_item_new_with_label(_("Add Route Point")));
493 gtk_menu_append(submenu, _cmenu_poi_add_way     = gtk_menu_item_new_with_label(_("Add Waypoint...")));
494 gtk_menu_append(submenu, gtk_separator_menu_item_new());
495 gtk_menu_append(submenu, _cmenu_poi_goto_nearpoi = gtk_menu_item_new_with_label(_("Go to Nearest")));
496
497 /* Connect signals for context menu. */
498 g_signal_connect(G_OBJECT(_cmenu_loc_show_latlon_item), "activate", G_CALLBACK(cmenu_cb_loc_show_latlon), NULL);
499 g_signal_connect(G_OBJECT(_cmenu_loc_clip_latlon_item), "activate", G_CALLBACK(cmenu_cb_loc_clip_latlon), NULL);
500 g_signal_connect(G_OBJECT(_cmenu_loc_route_to_item), "activate", G_CALLBACK(cmenu_cb_loc_route_to), NULL);
501 g_signal_connect(G_OBJECT(_cmenu_loc_distance_to_item), "activate", G_CALLBACK(cmenu_cb_loc_distance_to), NULL);
502 g_signal_connect(G_OBJECT(_cmenu_loc_add_route), "activate", G_CALLBACK(cmenu_cb_loc_add_route), NULL);
503 g_signal_connect(G_OBJECT(_cmenu_loc_add_way), "activate", G_CALLBACK(cmenu_cb_loc_add_way), NULL);
504 g_signal_connect(G_OBJECT(_cmenu_loc_add_poi), "activate", G_CALLBACK(cmenu_cb_loc_add_poi), NULL);
505 g_signal_connect(G_OBJECT(_cmenu_loc_set_gps), "activate", G_CALLBACK(cmenu_cb_loc_set_gps), NULL);
506 g_signal_connect(G_OBJECT(_cmenu_loc_set_home), "activate", G_CALLBACK(cmenu_cb_loc_set_home), NULL);
507 g_signal_connect(G_OBJECT(_cmenu_loc_set_destination), "activate", G_CALLBACK(cmenu_cb_loc_set_destination), NULL);
508
509 g_signal_connect(G_OBJECT(_cmenu_way_show_latlon_item), "activate", G_CALLBACK(cmenu_cb_way_show_latlon), NULL);
510 g_signal_connect(G_OBJECT(_cmenu_way_show_desc_item), "activate", G_CALLBACK(cmenu_cb_way_show_desc), NULL);
511 g_signal_connect(G_OBJECT(_cmenu_way_clip_latlon_item), "activate", G_CALLBACK(cmenu_cb_way_clip_latlon), NULL);
512 g_signal_connect(G_OBJECT(_cmenu_way_clip_desc_item), "activate", G_CALLBACK(cmenu_cb_way_clip_desc), NULL);
513 g_signal_connect(G_OBJECT(_cmenu_way_route_to_item), "activate", G_CALLBACK(cmenu_cb_way_route_to), NULL);
514 g_signal_connect(G_OBJECT(_cmenu_way_distance_to_item), "activate", G_CALLBACK(cmenu_cb_way_distance_to), NULL);
515 g_signal_connect(G_OBJECT(_cmenu_way_delete_item), "activate", G_CALLBACK(cmenu_cb_way_delete), NULL);
516 g_signal_connect(G_OBJECT(_cmenu_way_add_poi), "activate", G_CALLBACK(cmenu_cb_way_add_poi), NULL);
517 g_signal_connect(G_OBJECT(_cmenu_way_goto_nextway), "activate", G_CALLBACK(menu_cb_goto_nextway), NULL);
518
519 g_signal_connect(G_OBJECT(_cmenu_poi_edit_poi), "activate", G_CALLBACK(cmenu_cb_poi_edit_poi), NULL);
520 g_signal_connect(G_OBJECT(_cmenu_poi_route_to_item), "activate", G_CALLBACK(cmenu_cb_poi_route_to), NULL);
521 g_signal_connect(G_OBJECT(_cmenu_poi_distance_to_item), "activate", G_CALLBACK(cmenu_cb_poi_distance_to), NULL);
522 g_signal_connect(G_OBJECT(_cmenu_poi_add_route), "activate", G_CALLBACK(cmenu_cb_poi_add_route), NULL);
523 g_signal_connect(G_OBJECT(_cmenu_poi_add_way), "activate", G_CALLBACK(cmenu_cb_poi_add_way), NULL);
524 g_signal_connect(G_OBJECT(_cmenu_poi_goto_nearpoi), "activate", G_CALLBACK(menu_cb_goto_nearpoi), NULL);
525
526 gtk_widget_show_all(GTK_WIDGET(menu));
527
528 #ifdef WITH_DEVICE_770
529 gtk_widget_tap_and_hold_setup(_map_widget, GTK_WIDGET(menu), NULL, 0);
530 #else
531 _menu_map = menu;
532 #endif
533 }
534
535 void 
536 mapper_init_variables(void)
537 {
538 UNITS_TEXT[UNITS_KM] = _("km");
539 UNITS_TEXT[UNITS_MI] = _("mi.");
540 UNITS_TEXT[UNITS_NM] = _("n.m.");
541
542 INFO_FONT_TEXT[INFO_FONT_XXSMALL] = "xx-small";
543 INFO_FONT_TEXT[INFO_FONT_XSMALL] = "x-small";
544 INFO_FONT_TEXT[INFO_FONT_SMALL] = "small";
545 INFO_FONT_TEXT[INFO_FONT_MEDIUM] = "medium";
546 INFO_FONT_TEXT[INFO_FONT_LARGE] = "large";
547 INFO_FONT_TEXT[INFO_FONT_XLARGE] = "x-large";
548 INFO_FONT_TEXT[INFO_FONT_XXLARGE] = "xx-large";
549
550 CUSTOM_KEY_GCONF[CUSTOM_KEY_UP] = GCONF_KEY_PREFIX "/key_up";
551 CUSTOM_KEY_GCONF[CUSTOM_KEY_DOWN] = GCONF_KEY_PREFIX "/key_down";
552 CUSTOM_KEY_GCONF[CUSTOM_KEY_LEFT] = GCONF_KEY_PREFIX "/key_left";
553 CUSTOM_KEY_GCONF[CUSTOM_KEY_RIGHT] = GCONF_KEY_PREFIX "/key_right";
554 CUSTOM_KEY_GCONF[CUSTOM_KEY_SELECT] = GCONF_KEY_PREFIX "/key_select";
555 CUSTOM_KEY_GCONF[CUSTOM_KEY_INCREASE] = GCONF_KEY_PREFIX "/key_increase";
556 CUSTOM_KEY_GCONF[CUSTOM_KEY_DECREASE] = GCONF_KEY_PREFIX "/key_decrease";
557 CUSTOM_KEY_GCONF[CUSTOM_KEY_FULLSCREEN] = GCONF_KEY_PREFIX "/key_fullscreen";
558 CUSTOM_KEY_GCONF[CUSTOM_KEY_ESC] = GCONF_KEY_PREFIX "/key_esc";
559
560 CUSTOM_KEY_ICON[CUSTOM_KEY_UP] = HWK_BUTTON_UP;
561 CUSTOM_KEY_ICON[CUSTOM_KEY_LEFT] = HWK_BUTTON_LEFT;
562 CUSTOM_KEY_ICON[CUSTOM_KEY_DOWN] = HWK_BUTTON_DOWN;
563 CUSTOM_KEY_ICON[CUSTOM_KEY_RIGHT] = HWK_BUTTON_RIGHT;
564 CUSTOM_KEY_ICON[CUSTOM_KEY_SELECT] = HWK_BUTTON_SELECT;
565 CUSTOM_KEY_ICON[CUSTOM_KEY_INCREASE] = HWK_BUTTON_INCREASE;
566 CUSTOM_KEY_ICON[CUSTOM_KEY_DECREASE] = HWK_BUTTON_DECREASE;
567 CUSTOM_KEY_ICON[CUSTOM_KEY_FULLSCREEN] = HWK_BUTTON_VIEW;
568 CUSTOM_KEY_ICON[CUSTOM_KEY_ESC] = HWK_BUTTON_CANCEL;
569
570 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_UP] = CUSTOM_ACTION_PAN_NORTH;
571 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_LEFT] = CUSTOM_ACTION_PAN_WEST;
572 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DOWN] = CUSTOM_ACTION_PAN_SOUTH;
573 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_RIGHT] = CUSTOM_ACTION_PAN_EAST;
574 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_SELECT] = CUSTOM_ACTION_TOGGLE_AUTOCENTER;
575 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_INCREASE] = CUSTOM_ACTION_ZOOM_IN;
576 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DECREASE] = CUSTOM_ACTION_ZOOM_OUT;
577 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_FULLSCREEN] = CUSTOM_ACTION_TOGGLE_FULLSCREEN;
578 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_ESC] = CUSTOM_ACTION_TOGGLE_TRACKS;
579
580 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_NORTH] = _("Pan North");
581 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_WEST] = _("Pan West");
582 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_SOUTH] = _("Pan South");
583 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_EAST] = _("Pan East");
584 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_AUTOCENTER] = _("Toggle Auto-Center");
585 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_FULLSCREEN] = _("Toggle Fullscreen");
586 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_IN] = _("Zoom In");
587 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_OUT] = _("Zoom Out");
588 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_TRACKS] = _("Toggle Tracks");
589 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SCALE] = _("Toggle Scale");
590 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_POI] = _("Toggle POIs");
591 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_CHANGE_REPO] = _("Select Next Repository");
592 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTNEXT] = _("Show Distance to Next Waypoint");
593 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTLAST] = _("Show Distance to End of Route");
594 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_BREAK] = _("Insert Track Break");
595 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTLAST] = _("Show Distance from Last Break");
596 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTFIRST] = _("Show Distance from Beginning");
597 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPS] = _("Toggle GPS");
598 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPSINFO] = _("Toggle GPS Info");
599 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SPEEDLIMIT] = _("Toggle Speed Limit");
600
601 COLORABLE_GCONF[COLORABLE_MARK] = GCONF_KEY_PREFIX "/color_mark";
602 COLORABLE_GCONF[COLORABLE_MARK_VELOCITY] = GCONF_KEY_PREFIX "/color_mark_velocity";
603 COLORABLE_GCONF[COLORABLE_MARK_OLD] = GCONF_KEY_PREFIX "/color_mark_old";
604 COLORABLE_GCONF[COLORABLE_TRACK] = GCONF_KEY_PREFIX "/color_track";
605 COLORABLE_GCONF[COLORABLE_TRACK_MARK] = GCONF_KEY_PREFIX "/color_track_mark";
606 COLORABLE_GCONF[COLORABLE_TRACK_BREAK] = GCONF_KEY_PREFIX "/color_track_break";
607 COLORABLE_GCONF[COLORABLE_ROUTE] = GCONF_KEY_PREFIX "/color_route";
608 COLORABLE_GCONF[COLORABLE_ROUTE_WAY] = GCONF_KEY_PREFIX "/color_route_way";
609 COLORABLE_GCONF[COLORABLE_ROUTE_BREAK] = GCONF_KEY_PREFIX "/color_route_break";
610 COLORABLE_GCONF[COLORABLE_POI] = GCONF_KEY_PREFIX "/color_poi";
611
612 DEG_FORMAT_TEXT[DDPDDDDD] = "-dd.ddddd°";
613 DEG_FORMAT_TEXT[DD_MMPMMM] = "-dd°mm.mmm'";
614 DEG_FORMAT_TEXT[DD_MM_SSPS] = "-dd°mm'ss.s\"";
615 DEG_FORMAT_TEXT[DDPDDDDD_NSEW] = "dd.ddddd° S";
616 DEG_FORMAT_TEXT[DD_MMPMMM_NSEW] = "dd°mm.mmm' S";
617 DEG_FORMAT_TEXT[DD_MM_SSPS_NSEW] = "dd°mm'ss.s\" S";
618
619 SPEED_LOCATION_TEXT[SPEED_LOCATION_TOP_LEFT] = _("Top-Left");
620 SPEED_LOCATION_TEXT[SPEED_LOCATION_TOP_RIGHT] = _("Top-Right");
621 SPEED_LOCATION_TEXT[SPEED_LOCATION_BOTTOM_RIGHT] = _("Bottom-Right");
622 SPEED_LOCATION_TEXT[SPEED_LOCATION_BOTTOM_LEFT] = _("Bottom-Left");
623 }
624
625 /**
626  * Initialize everything required in preparation for calling gtk_main().
627  */
628 void 
629 mapper_ui_init(void)
630 {
631 GError *error = NULL;
632 GtkWidget *hbox, *mapvbox, *label, *vbox_main;
633 GtkWidget *vbox;
634 GtkWidget *sw;
635 GtkNotebook *notebook;
636 GdkColor color;
637 GtkToolItem *item;
638 GtkTreeViewColumn *column;
639 GtkCellRenderer *renderer;
640
641 #ifdef WITH_HILDON
642 /* Initialize _program. */
643 _program = HILDON_PROGRAM(hildon_program_get_instance());
644
645 /* Initialize _window. */
646 _window = GTK_WIDGET(hildon_window_new());
647 hildon_program_add_window(_program, HILDON_WINDOW(_window));
648 #else
649 _window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
650 gtk_window_set_title(GTK_WINDOW(_window), "Mapper");
651 gtk_widget_set_size_request(GTK_WIDGET(_window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
652 gtk_window_resize(GTK_WINDOW(_window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
653 gtk_window_set_resizable(GTK_WINDOW(_window), TRUE);
654 #endif
655
656 gtk_container_set_border_width (GTK_CONTAINER (_window), 0);
657
658 actions = gtk_action_group_new ("Actions");
659 g_assert(actions);
660
661 ui = gtk_ui_manager_new ();
662 g_assert(ui);
663
664 gtk_action_group_add_actions (actions, ui_entries, n_ui_entries, NULL);
665 gtk_action_group_add_toggle_actions (actions, ui_toggle_entries, n_ui_toggle_entries, NULL);
666 gtk_action_group_add_radio_actions (actions, ui_autocenter_entries, 
667         n_ui_autocenter_entries, _center_mode, G_CALLBACK(menu_cb_autocenter),  NULL);
668
669 gtk_ui_manager_insert_action_group (ui, actions, 0);
670 g_object_unref (actions);
671
672 /* N810 has keyboard so set this up */
673 gtk_window_add_accel_group (GTK_WINDOW(_window), gtk_ui_manager_get_accel_group (ui));
674
675 if (!gtk_ui_manager_add_ui_from_string (ui, mapper_ui, -1, &error)) {
676         g_message ("building menus failed: %s", error->message);
677         g_error_free(error);
678         g_assert(FALSE);
679 }
680
681 /* Menu and Toolbar */
682 menu_bar = gtk_ui_manager_get_widget (ui, "/MenuBar");
683 g_assert(menu_bar);
684
685 toolbar = gtk_ui_manager_get_widget (ui, "/ToolBar");
686 g_assert(toolbar);
687
688 item=gtk_tool_item_new();
689 _progress_item=gtk_progress_bar_new();
690 gtk_tool_item_set_expand(item, TRUE);
691 gtk_progress_bar_set_ellipsize(_progress_item, PANGO_ELLIPSIZE_END);
692 gtk_progress_bar_set_pulse_step(_progress_item, 0.2);
693 gtk_container_add(item, _progress_item);
694 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
695
696 /* Notebook with different views */
697 notebook = gtk_notebook_new();
698 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE);
699
700 info_banner.container=gtk_hbox_new(FALSE, 0);
701 info_banner.location=gtk_label_new("");
702 info_banner.speed=gtk_label_new("");
703 info_banner.distance=gtk_label_new("");
704
705 gtk_misc_set_alignment(GTK_MISC(info_banner.location), 0.f, 0.5f);
706 gtk_misc_set_alignment(GTK_MISC(info_banner.speed), 1.f, 0.5f);
707 gtk_misc_set_alignment(GTK_MISC(info_banner.distance), 1.f, 0.5f);
708
709 gtk_box_pack_start(GTK_BOX(info_banner.container), info_banner.location, TRUE, TRUE, 0);
710 gtk_box_pack_end(GTK_BOX(info_banner.container), info_banner.speed, FALSE, FALSE, 0);
711 gtk_box_pack_end(GTK_BOX(info_banner.container), info_banner.distance, FALSE, FALSE, 0);
712
713 vbox_main = gtk_vbox_new(FALSE, 0);
714 gtk_container_add(GTK_CONTAINER(_window), vbox_main);
715
716 #ifdef WITH_HILDON
717 /* Create and add widgets and supporting data. */
718 gtk_box_pack_start(GTK_BOX(vbox_main), GTK_WIDGET(notebook), TRUE, TRUE, 0);
719 gtk_box_pack_start(GTK_BOX(vbox_main), GTK_WIDGET(info_banner.container), FALSE, FALSE, 0);
720 hildon_program_set_common_toolbar(_program, GTK_TOOLBAR(toolbar));
721 {
722         GtkMenu *hmenu;
723         hmenu = GTK_MENU(gtk_menu_new());
724
725         gtk_container_foreach(GTK_CONTAINER(menu_bar),
726                 (GtkCallback) gtk_widget_reparent, hmenu);
727
728         hildon_window_set_menu(HILDON_WINDOW(_window), hmenu);
729 }
730 gtk_widget_show_all(GTK_WIDGET(toolbar));
731 #else
732 _status_bar = gtk_statusbar_new();
733
734 gtk_box_pack_start(GTK_BOX(vbox_main), menu_bar, FALSE, FALSE, 0);
735 gtk_box_pack_start(GTK_BOX(vbox_main), toolbar, FALSE, FALSE, 0);
736 gtk_box_pack_start(GTK_BOX(vbox_main), notebook, TRUE, TRUE, 0);
737 gtk_box_pack_start(GTK_BOX(vbox_main), info_banner.container, FALSE, FALSE, 0);
738 gtk_box_pack_start(GTK_BOX(vbox_main), _status_bar, FALSE, FALSE, 0);
739 #endif
740
741 label = gtk_label_new("Map");
742 hbox = gtk_hpaned_new();
743
744 /* GPS Panel */
745 _gps_widget = gps_info_panel();
746 gtk_widget_set_size_request(GTK_WIDGET(_gps_widget), 180, 0);
747 gtk_paned_add1(GTK_PANED(hbox), _gps_widget);
748
749 mapvbox = gtk_vbox_new(FALSE, 0);
750 gtk_box_pack_start(GTK_BOX(mapvbox), hbox, TRUE, TRUE, 0);
751 ui_notebook.map=gtk_notebook_append_page(notebook, mapvbox, label);
752
753 /* Map widget */
754 _map_widget = gtk_drawing_area_new();
755 gtk_paned_add2(GTK_PANED(hbox), _map_widget);
756 gtk_widget_realize(_map_widget);
757
758 _scale_context = gtk_widget_get_pango_context(_map_widget);
759 _scale_layout = pango_layout_new(_scale_context);
760 _scale_font = pango_font_description_new();
761 pango_font_description_set_size(_scale_font, 12 * PANGO_SCALE);
762 pango_layout_set_font_description(_scale_layout, _scale_font);
763
764 /* Speed limit */
765 _speed_limit_gc1 = gdk_gc_new(_map_widget->window);
766 color.red = 0xffff;
767 color.green = 0;
768 color.blue = 0;
769 gdk_gc_set_rgb_fg_color(_speed_limit_gc1, &color);
770 color.red = 0;
771 color.green = 0;
772 color.blue = 0;
773 _speed_limit_gc2 = gdk_gc_new(_map_widget->window);
774 gdk_gc_set_rgb_fg_color(_speed_limit_gc2, &color);
775 _speed_limit_context = gtk_widget_get_pango_context(_map_widget);
776 _speed_limit_layout = pango_layout_new(_speed_limit_context);
777 _speed_limit_fontdesc = pango_font_description_new();
778 pango_font_description_set_size(_speed_limit_fontdesc, 64 * PANGO_SCALE);
779 pango_layout_set_font_description(_speed_limit_layout, _speed_limit_fontdesc);
780 pango_layout_set_alignment(_speed_limit_layout, PANGO_ALIGN_CENTER);
781
782 map_poi_init(_map_widget);
783 /* -1: use bit depth of widget->window. */
784 _map_pixmap = gdk_pixmap_new(_map_widget->window, BUF_WIDTH_PIXELS, BUF_HEIGHT_PIXELS, -1);     
785
786 /* GPS Tab */
787 vbox = gtk_vbox_new(FALSE, 0);
788 label = gtk_label_new("Gps");
789 _gps_sat_view = gtk_gps_new(GTK_GPS_MODE_SKY, &_gps);
790 gtk_box_pack_start(GTK_BOX(vbox), _gps_sat_view, TRUE, TRUE, 0);
791 _gps_sat_view = gtk_gps_new(GTK_GPS_MODE_SIGNAL, &_gps);
792 gtk_box_pack_start(GTK_BOX(vbox), _gps_sat_view, TRUE, TRUE, 0);
793 ui_notebook.gps=gtk_notebook_append_page(notebook, vbox, label);
794
795 /* Heading Tab */
796 vbox = gtk_vbox_new(FALSE, 0);
797 label = gtk_label_new("Heading");
798 _tab_compass = gtk_compass_new(&_gps);
799 gtk_box_pack_start(GTK_BOX(vbox), _tab_compass, TRUE, TRUE, 0);
800 ui_notebook.heading=gtk_notebook_append_page(notebook, vbox, label);
801
802 /* Route Tab */
803 vbox=gtk_vbox_new(FALSE, 0);
804 label=gtk_label_new("Route");
805
806 route_tree_view=gtk_tree_view_new();
807 sw=gtk_scrolled_window_new(NULL, NULL);
808 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
809 gtk_box_pack_start(vbox, sw, TRUE, TRUE, 0);
810 gtk_container_add(GTK_CONTAINER(sw), route_tree_view);
811
812 gtk_tree_selection_set_mode(gtk_tree_view_get_selection (GTK_TREE_VIEW(route_tree_view)), GTK_SELECTION_SINGLE);
813 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(route_tree_view), TRUE);
814
815 renderer=gtk_cell_renderer_text_new();
816 column=gtk_tree_view_column_new_with_attributes(_("Location"), renderer, "text", ROUTE_LATLON, NULL);
817 gtk_tree_view_append_column(GTK_TREE_VIEW(route_tree_view), column);
818
819 renderer=gtk_cell_renderer_text_new();
820 column=gtk_tree_view_column_new_with_attributes(_("Distance"), renderer, "text", ROUTE_DISTANCE, NULL);
821 gtk_tree_view_append_column(GTK_TREE_VIEW(route_tree_view), column);
822
823 renderer=gtk_cell_renderer_text_new();
824 column=gtk_tree_view_column_new_with_attributes(_("Waypoint"), renderer, "text", ROUTE_WAYPOINT, NULL);
825 gtk_tree_view_append_column(GTK_TREE_VIEW(route_tree_view), column);
826
827 #if 0
828 g_signal_connect(G_OBJECT(route_tree), "row-activated", G_CALLBACK(route_waypoint_activated_cb), NULL);
829 #endif
830 ui_notebook.route=gtk_notebook_append_page(notebook, vbox, label);
831
832 menu_maps_add_repos();
833 menu_init_cmenu();
834
835 /* Initialize our line styles. */
836 update_gcs();
837
838 _last_spoken_phrase = g_strdup("");
839 memset(&_autoroute_data, 0, sizeof(_autoroute_data));
840
841 /* Set defaults for items */
842 set_action_activate("map_auto_download", _auto_download);
843 set_action_activate("gps_enabled", _enable_gps);
844 set_action_sensitive("goto_gps", _enable_gps);
845
846 set_action_sensitive("autocenter_latlon", _enable_gps);
847 set_action_sensitive("autocenter_lead", _enable_gps);
848
849 set_action_activate("gps_information", _gps_info);
850
851 set_action_activate("view_scale", _show_scale);
852 set_action_activate("view_vector", _show_velvec);
853 set_action_activate("view_poi", _show_poi);
854
855 set_action_activate("view_track", _show_tracks & TRACKS_MASK);
856 set_action_activate("view_route", _show_tracks & ROUTES_MASK);
857
858 /* Connect signals. */
859 g_signal_connect(G_OBJECT(_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
860 g_signal_connect(G_OBJECT(_window), "key_press_event", G_CALLBACK(window_cb_key_press), NULL);
861 g_signal_connect(G_OBJECT(_window), "key_release_event", G_CALLBACK(window_cb_key_release), NULL);
862
863 g_signal_connect(G_OBJECT(_map_widget), "configure_event", G_CALLBACK(map_cb_configure), NULL);
864 g_signal_connect(G_OBJECT(_map_widget), "expose_event", G_CALLBACK(map_cb_expose), NULL);
865 g_signal_connect(G_OBJECT(_map_widget), "button_press_event", G_CALLBACK(map_cb_button_press), NULL);
866 g_signal_connect(G_OBJECT(_map_widget), "button_release_event",G_CALLBACK(map_cb_button_release), NULL);
867 g_signal_connect(G_OBJECT(_map_widget), "scroll_event",  G_CALLBACK(map_cb_scroll_event), NULL);
868
869 gtk_widget_add_events(_map_widget, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
870       | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);
871
872 /* If we have a route, calculate the next point. */
873 route_find_nearest_point();
874
875 gtk_widget_show_all(GTK_WIDGET(vbox_main));
876 gtk_widget_show_all(GTK_WIDGET(_window));
877
878 gps_show_info();
879
880 gtk_idle_add((GSourceFunc)window_present, NULL);
881 }
882
883 GtkWidget *
884 progress_dialog(const gchar *title, GtkWidget *progress)
885 {
886 GtkWidget *dialog;
887
888 dialog = gtk_dialog_new();
889 gtk_window_set_title(GTK_WINDOW(dialog), title);
890 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(_window));
891 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
892 #ifdef WITH_HILDON
893 gtk_window_set_decorated(GTK_WINDOW(dialog), FALSE);
894 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(title), TRUE, TRUE, 0);
895 #else
896 gtk_window_set_deletable(GTK_WINDOW(dialog), FALSE);
897 #endif
898 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progress, TRUE, TRUE, 0);
899 gtk_widget_show_all(dialog);
900 return dialog;
901 }
902
903 void
904 progress_dialog_remove(GtkWidget *dialog)
905 {
906 if (dialog)
907         gtk_widget_destroy(dialog);
908 }