+ vik_viewport_set_center_coord ( vw->viking_vvp, &new_center, TRUE );
+ draw_update ( vw );
+}
+
+/**
+ * center_changed_cb:
+ */
+static void center_changed_cb ( VikWindow *vw )
+{
+// ATM Keep back always available, so when we pan - we can jump to the last requested position
+/*
+ GtkAction* action_back = gtk_action_group_get_action ( vw->action_group, "GoBack" );
+ if ( action_back ) {
+ gtk_action_set_sensitive ( action_back, vik_viewport_back_available(vw->viking_vvp) );
+ }
+*/
+ GtkAction* action_forward = gtk_action_group_get_action ( vw->action_group, "GoForward" );
+ if ( action_forward ) {
+ gtk_action_set_sensitive ( action_forward, vik_viewport_forward_available(vw->viking_vvp) );
+ }
+
+ toolbar_action_set_sensitive ( vw->viking_vtb, "GoForward", vik_viewport_forward_available(vw->viking_vvp) );
+}
+
+/**
+ * draw_goto_back_and_forth:
+ */
+static void draw_goto_back_and_forth ( GtkAction *a, VikWindow *vw )
+{
+ gboolean changed = FALSE;
+ if (!strcmp(gtk_action_get_name(a), "GoBack")) {
+ changed = vik_viewport_go_back ( vw->viking_vvp );
+ }
+ else if (!strcmp(gtk_action_get_name(a), "GoForward")) {
+ changed = vik_viewport_go_forward ( vw->viking_vvp );
+ }
+ else {
+ return;
+ }
+
+ // Recheck buttons sensitivities, as the center changed signal is not sent on back/forward changes
+ // (otherwise we would get stuck in an infinite loop!)
+ center_changed_cb ( vw );
+
+ if ( changed )
+ draw_update ( vw );
+}
+
+/**
+ * Refresh maps displayed
+ */
+static void draw_refresh_cb ( GtkAction *a, VikWindow *vw )
+{
+ // Only get 'new' maps
+ simple_map_update ( vw, TRUE );
+}
+
+static void menu_addlayer_cb ( GtkAction *a, VikWindow *vw )
+{
+ VikLayerTypeEnum type;
+ for ( type = 0; type < VIK_LAYER_NUM_TYPES; type++ ) {
+ if (!strcmp(vik_layer_get_interface(type)->name, gtk_action_get_name(a))) {
+ if ( vik_layers_panel_new_layer ( vw->viking_vlp, type ) ) {
+ draw_update ( vw );
+ vw->modified = TRUE;
+ }
+ }
+ }
+}
+
+static void menu_copy_layer_cb ( GtkAction *a, VikWindow *vw )
+{
+ a_clipboard_copy_selected ( vw->viking_vlp );
+}
+
+static void menu_cut_layer_cb ( GtkAction *a, VikWindow *vw )
+{
+ vik_layers_panel_cut_selected ( vw->viking_vlp );
+ vw->modified = TRUE;
+}
+
+static void menu_paste_layer_cb ( GtkAction *a, VikWindow *vw )
+{
+ if ( vik_layers_panel_paste_selected ( vw->viking_vlp ) )
+ {
+ vw->modified = TRUE;
+ }
+}
+
+static void menu_properties_cb ( GtkAction *a, VikWindow *vw )
+{
+ if ( ! vik_layers_panel_properties ( vw->viking_vlp ) )
+ a_dialog_info_msg ( GTK_WINDOW(vw), _("You must select a layer to show its properties.") );
+}
+
+static void help_help_cb ( GtkAction *a, VikWindow *vw )
+{
+#ifdef WINDOWS
+ ShellExecute(NULL, "open", ""PACKAGE".pdf", NULL, NULL, SW_SHOWNORMAL);
+#else /* WINDOWS */
+ gchar *uri;
+ uri = g_strdup_printf("ghelp:%s", PACKAGE);
+ GError *error = NULL;
+ gboolean show = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, &error);
+ if ( !show && !error )
+ // No error to show, so unlikely this will get called
+ a_dialog_error_msg ( GTK_WINDOW(vw), _("The help system is not available.") );
+ else if ( error ) {
+ // Main error path
+ a_dialog_error_msg_extra ( GTK_WINDOW(vw), _("Help is not available because: %s.\nEnsure a Mime Type ghelp handler program is installed (e.g. yelp)."), error->message );
+ g_error_free ( error );
+ }
+ g_free(uri);
+#endif /* WINDOWS */
+}
+
+static void toggle_side_panel ( VikWindow *vw )
+{
+ vw->show_side_panel = !vw->show_side_panel;
+ if ( vw->show_side_panel )
+ gtk_widget_show(GTK_WIDGET(vw->viking_vlp));
+ else
+ gtk_widget_hide(GTK_WIDGET(vw->viking_vlp));
+}
+
+static void toggle_full_screen ( VikWindow *vw )
+{
+ vw->show_full_screen = !vw->show_full_screen;
+ if ( vw->show_full_screen )
+ gtk_window_fullscreen ( GTK_WINDOW(vw) );
+ else
+ gtk_window_unfullscreen ( GTK_WINDOW(vw) );
+}
+
+static void toggle_statusbar ( VikWindow *vw )
+{
+ vw->show_statusbar = !vw->show_statusbar;
+ if ( vw->show_statusbar )
+ gtk_widget_show ( GTK_WIDGET(vw->viking_vs) );
+ else
+ gtk_widget_hide ( GTK_WIDGET(vw->viking_vs) );
+}
+
+static void toggle_toolbar ( VikWindow *vw )
+{
+ vw->show_toolbar = !vw->show_toolbar;
+ if ( vw->show_toolbar )
+ gtk_widget_show ( toolbar_get_widget (vw->viking_vtb) );
+ else
+ gtk_widget_hide ( toolbar_get_widget (vw->viking_vtb) );
+}
+
+static void toggle_main_menu ( VikWindow *vw )
+{
+ vw->show_main_menu = !vw->show_main_menu;
+ if ( vw->show_main_menu )
+ gtk_widget_show ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) );
+ else
+ gtk_widget_hide ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) );
+}
+
+// Only for 'view' toggle menu widgets ATM.
+GtkWidget *get_show_widget_by_name(VikWindow *vw, const gchar *name)
+{
+ g_return_val_if_fail(name != NULL, NULL);
+
+ // ATM only FullScreen is *not* in SetShow path
+ gchar *path;
+ if ( g_strcmp0 ("FullScreen", name ) )
+ path = g_strconcat("/ui/MainMenu/View/SetShow/", name, NULL);
+ else
+ path = g_strconcat("/ui/MainMenu/View/", name, NULL);
+
+ GtkWidget *widget = gtk_ui_manager_get_widget(vw->uim, path);
+ g_free(path);
+
+ return widget;
+}
+
+static void tb_view_side_panel_cb ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vw->show_side_panel;
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else
+ toggle_side_panel ( vw );