+/**
+ * export_to:
+ *
+ * Export all TRW Layers in the list to individual files in the specified directory
+ *
+ * Returns: %TRUE on success
+ */
+static gboolean export_to ( VikWindow *vw, GList *gl, VikFileType_t vft, const gchar *dir, const gchar *extension )
+{
+ gboolean success = TRUE;
+
+ gint export_count = 0;
+
+ vik_window_set_busy_cursor ( vw );
+
+ while ( gl ) {
+
+ gchar *fn = g_strconcat ( dir, G_DIR_SEPARATOR_S, VIK_LAYER(gl->data)->name, extension, NULL );
+
+ // Some protection in attempting to write too many same named files
+ // As this will get horribly slow...
+ gboolean safe = FALSE;
+ gint ii = 2;
+ while ( ii < 5000 ) {
+ if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) ) {
+ // Try rename
+ g_free ( fn );
+ fn = g_strdup_printf ( "%s%s%s#%03d%s", dir, G_DIR_SEPARATOR_S, VIK_LAYER(gl->data)->name, ii, extension );
+ }
+ else {
+ safe = TRUE;
+ break;
+ }
+ ii++;
+ }
+ if ( ii == 5000 )
+ success = FALSE;
+
+ // NB: We allow exporting empty layers
+ if ( safe ) {
+ gboolean this_success = a_file_export ( VIK_TRW_LAYER(gl->data), fn, vft, NULL, TRUE );
+
+ // Show some progress
+ if ( this_success ) {
+ export_count++;
+ gchar *message = g_strconcat ( _("Exporting to file: "), fn, NULL );
+ vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, message );
+ while ( gtk_events_pending() )
+ gtk_main_iteration ();
+ g_free ( message );
+ }
+
+ success = success && this_success;
+ }
+
+ g_free ( fn );
+ gl = g_list_next ( gl );
+ }
+
+ vik_window_clear_busy_cursor ( vw );
+
+ // Confirm what happened.
+ gchar *message = g_strdup_printf ( _("Exported files: %d"), export_count );
+ vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, message );
+ g_free ( message );
+
+ return success;
+}
+
+static void export_to_common ( VikWindow *vw, VikFileType_t vft, const gchar *extension )
+{
+ GList *gl = vik_layers_panel_get_all_layers_of_type ( vw->viking_vlp, VIK_LAYER_TRW, TRUE );
+
+ if ( !gl ) {
+ a_dialog_info_msg ( GTK_WINDOW(vw), _("Nothing to Export!") );
+ return;
+ }
+
+ GtkWidget *dialog = gtk_dialog_new_with_buttons ( _("Export to directory"),
+ GTK_WINDOW(vw),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_ACCEPT,
+ NULL );
+
+ GtkWidget *gw = gtk_file_chooser_widget_new ( GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER );
+ gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), gw, TRUE, TRUE, 0 );
+
+ // try to make it a nice size - otherwise seems to default to something impractically small
+ gtk_window_set_default_size ( GTK_WINDOW(dialog), 600, 300 );
+
+ gtk_widget_show_all ( dialog );
+
+ if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) {
+ gchar *dir = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(gw) );
+ gtk_widget_destroy ( dialog );
+ if ( dir ) {
+ if ( !export_to ( vw, gl, vft, dir, extension ) )
+ a_dialog_error_msg ( GTK_WINDOW(vw),_("Could not convert all files") );
+ g_free ( dir );
+ }
+ }
+ else
+ gtk_widget_destroy ( dialog );
+
+ g_list_free ( gl );
+}
+
+static void export_to_gpx ( GtkAction *a, VikWindow *vw )
+{
+ export_to_common ( vw, FILE_TYPE_GPX, ".gpx" );
+}
+
+static void export_to_kml ( GtkAction *a, VikWindow *vw )
+{
+ export_to_common ( vw, FILE_TYPE_KML, ".kml" );
+}
+
+static void file_properties_cb ( GtkAction *a, VikWindow *vw )
+{
+ gchar *message = NULL;
+ if ( vw->filename ) {
+ if ( g_file_test ( vw->filename, G_FILE_TEST_EXISTS ) ) {
+ // Get some timestamp information of the file
+ GStatBuf stat_buf;
+ if ( g_stat ( vw->filename, &stat_buf ) == 0 ) {
+ gchar time_buf[64];
+ strftime ( time_buf, sizeof(time_buf), "%c", gmtime((const time_t *)&stat_buf.st_mtime) );
+ gchar *size = NULL;
+ gint byte_size = stat_buf.st_size;
+ // See http://en.wikipedia.org/wiki/Megabyte (and Kilobyte)
+ // hence using 1000 rather than 1024
+ // so get output as per 'ls' or the Gtk file open dialog
+ if ( byte_size < 1000 )
+ size = g_strdup_printf ( _("%d bytes"), byte_size );
+ else if ( byte_size < 1000*1000 )
+ size = g_strdup_printf ( _("%3.1f kB"), (gdouble)byte_size / 1000 );
+ else
+ size = g_strdup_printf ( _("%3.1f MB"), (gdouble)byte_size / (1000*1000) );
+ message = g_strdup_printf ( _("%s\n\n%s\n\n%s"), vw->filename, time_buf, size );
+ g_free (size);
+ }
+ }
+ else
+ message = g_strdup ( _("File not accessible") );
+ }
+ else
+ message = g_strdup ( _("No Viking File") );
+
+ // Show the info
+ a_dialog_info_msg ( GTK_WINDOW(vw), message );
+ g_free ( message );
+}
+