]>
Commit | Line | Data |
---|---|---|
e4a11fbe GB |
1 | |
2 | /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ | |
3 | /* | |
4 | * viking -- GPS Data and Topo Analyzer, Explorer, and Manager | |
5 | * | |
6 | * Copyright (C) 2013, Guilhem Bonnefille <guilhem.bonnefille@gmail.com> | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License as published by | |
10 | * the Free Software Foundation; either version 2 of the License, or | |
11 | * (at your option) any later version. | |
12 | * | |
13 | * This program is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | * GNU General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU General Public License | |
19 | * along with this program; if not, write to the Free Software | |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 | * | |
22 | */ | |
23 | #include <string.h> | |
24 | #include <stdlib.h> | |
25 | #include <stdio.h> | |
26 | #include <glib.h> | |
27 | #include <glib/gstdio.h> | |
28 | #include <glib/gi18n.h> | |
29 | ||
30 | #include "babel.h" | |
17720e63 | 31 | #include "babel_ui.h" |
e4a11fbe GB |
32 | #include "viking.h" |
33 | #include "viktrwlayer_export.h" | |
34 | ||
35 | void vik_trw_layer_export ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name, VikTrack* trk, guint file_type ) | |
36 | { | |
37 | GtkWidget *file_selector; | |
38 | const gchar *fn; | |
39 | gboolean failed = FALSE; | |
40 | file_selector = gtk_file_chooser_dialog_new (title, | |
41 | NULL, | |
42 | GTK_FILE_CHOOSER_ACTION_SAVE, | |
43 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
44 | GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, | |
45 | NULL); | |
46 | gchar *cwd = g_get_current_dir(); | |
47 | if ( cwd ) { | |
48 | gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(file_selector), cwd ); | |
49 | g_free ( cwd ); | |
50 | } | |
51 | ||
52 | gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER(file_selector), default_name ); | |
53 | ||
54 | while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT ) | |
55 | { | |
56 | fn = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ); | |
57 | if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || | |
58 | a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) | |
59 | { | |
60 | gtk_widget_hide ( file_selector ); | |
61 | vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); | |
62 | failed = ! a_file_export ( vtl, fn, file_type, trk, TRUE ); | |
63 | vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); | |
64 | break; | |
65 | } | |
66 | } | |
67 | gtk_widget_destroy ( file_selector ); | |
68 | if ( failed ) | |
69 | a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") ); | |
70 | } | |
71 | ||
72 | ||
73 | /** | |
74 | * Convert the given TRW layer into a temporary GPX file and open it with the specified program | |
75 | * | |
76 | */ | |
77 | void vik_trw_layer_export_external_gpx ( VikTrwLayer *vtl, const gchar* external_program ) | |
78 | { | |
79 | gchar *name_used = NULL; | |
80 | int fd; | |
81 | ||
82 | if ((fd = g_file_open_tmp("tmp-viking.XXXXXX.gpx", &name_used, NULL)) >= 0) { | |
83 | vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); | |
84 | gboolean failed = ! a_file_export ( VIK_TRW_LAYER(vtl), name_used, FILE_TYPE_GPX, NULL, TRUE); | |
85 | vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); | |
86 | if (failed) { | |
87 | a_dialog_error_msg (VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not create temporary file for export.") ); | |
88 | } | |
89 | else { | |
90 | GError *err = NULL; | |
91 | gchar *quoted_file = g_shell_quote ( name_used ); | |
92 | gchar *cmd = g_strdup_printf ( "%s %s", external_program, quoted_file ); | |
93 | g_free ( quoted_file ); | |
94 | if ( ! g_spawn_command_line_async ( cmd, &err ) ) | |
95 | { | |
96 | a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER( vtl), _("Could not launch %s."), external_program ); | |
97 | g_error_free ( err ); | |
98 | } | |
99 | g_free ( cmd ); | |
100 | } | |
101 | // Note ATM the 'temporary' file is not deleted, as loading via another program is not instantaneous | |
102 | //g_remove ( name_used ); | |
103 | // Perhaps should be deleted when the program ends? | |
104 | // For now leave it to the user to delete it / use system temp cleanup methods. | |
105 | g_free ( name_used ); | |
106 | } | |
107 | } | |
108 | ||
17720e63 GB |
109 | |
110 | void vik_trw_layer_export_gpsbabel ( VikTrwLayer *vtl, const gchar *title, const gchar* default_name ) | |
111 | { | |
112 | BabelMode mode = { 0, 0, 0, 0, 0, 0 }; | |
113 | if ( g_hash_table_size (vik_trw_layer_get_routes(vtl)) ) { | |
114 | mode.routesWrite = 1; | |
115 | } | |
116 | if ( g_hash_table_size (vik_trw_layer_get_tracks(vtl)) ) { | |
117 | mode.tracksWrite = 1; | |
118 | } | |
119 | if ( g_hash_table_size (vik_trw_layer_get_waypoints(vtl)) ) { | |
120 | mode.waypointsWrite = 1; | |
121 | } | |
122 | ||
123 | GtkWidget *file_selector; | |
124 | const gchar *fn; | |
125 | gboolean failed = FALSE; | |
126 | file_selector = gtk_file_chooser_dialog_new (title, | |
127 | NULL, | |
128 | GTK_FILE_CHOOSER_ACTION_SAVE, | |
129 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
130 | GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, | |
131 | NULL); | |
132 | gchar *cwd = g_get_current_dir(); | |
133 | if ( cwd ) { | |
134 | gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(file_selector), cwd ); | |
135 | g_free ( cwd ); | |
136 | } | |
137 | ||
138 | /* Build the extra part of the widget */ | |
139 | GtkWidget *babel_selector = a_babel_ui_file_type_selector_new ( mode ); | |
140 | GtkWidget *label = gtk_label_new(_("File format:")); | |
141 | GtkWidget *hbox = gtk_hbox_new(FALSE, 0); | |
142 | gtk_box_pack_start ( GTK_BOX(hbox), label, TRUE, TRUE, 0 ); | |
143 | gtk_box_pack_start ( GTK_BOX(hbox), babel_selector, TRUE, TRUE, 0 ); | |
144 | gtk_widget_show (babel_selector); | |
145 | gtk_widget_show (label); | |
146 | gtk_widget_show_all (hbox); | |
147 | ||
148 | gtk_widget_set_tooltip_text( babel_selector, _("Select the file format.") ); | |
149 | ||
150 | GtkWidget *babel_modes = a_babel_ui_modes_new(mode.tracksWrite, mode.routesWrite, mode.waypointsWrite); | |
151 | gtk_widget_show (babel_modes); | |
152 | ||
153 | gtk_widget_set_tooltip_text( babel_modes, _("Select the information to process.\n" | |
154 | "Warning: the behavior of these switches is highly dependent of the file format selected.\n" | |
155 | "Please, refer to GPSbabel if unsure.") ); | |
156 | ||
157 | GtkWidget *vbox = gtk_vbox_new(FALSE, 0); | |
158 | gtk_box_pack_start ( GTK_BOX(vbox), hbox, TRUE, TRUE, 0 ); | |
159 | gtk_box_pack_start ( GTK_BOX(vbox), babel_modes, TRUE, TRUE, 0 ); | |
160 | gtk_widget_show_all (vbox); | |
161 | ||
162 | gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(file_selector), vbox); | |
163 | ||
164 | /* Add some dynamic: only allow dialog's validation when format selection is done */ | |
165 | g_signal_connect (babel_selector, "changed", G_CALLBACK(a_babel_ui_type_selector_dialog_sensitivity_cb), file_selector); | |
166 | /* Manually call the callback to fix the state */ | |
167 | a_babel_ui_type_selector_dialog_sensitivity_cb (babel_selector, file_selector); | |
168 | ||
169 | /* Set possible name of the file */ | |
170 | gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(file_selector), default_name); | |
171 | ||
172 | while ( gtk_dialog_run ( GTK_DIALOG(file_selector) ) == GTK_RESPONSE_ACCEPT ) | |
173 | { | |
174 | fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(file_selector) ); | |
175 | if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || | |
176 | a_dialog_yes_or_no ( GTK_WINDOW(file_selector), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) | |
177 | { | |
178 | BabelFile *active = a_babel_ui_file_type_selector_get(babel_selector); | |
179 | if (active == NULL) { | |
180 | a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("You did not select a valid file format.") ); | |
181 | } else { | |
182 | gtk_widget_hide ( file_selector ); | |
183 | vik_window_set_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); | |
184 | gboolean tracks, routes, waypoints; | |
185 | a_babel_ui_modes_get( babel_modes, &tracks, &routes, &waypoints ); | |
186 | failed = ! a_file_export_babel ( vtl, fn, active->name, tracks, routes, waypoints ); | |
187 | vik_window_clear_busy_cursor ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vtl)) ); | |
188 | break; | |
189 | } | |
190 | } | |
191 | } | |
192 | //babel_ui_selector_destroy(babel_selector); | |
193 | gtk_widget_destroy ( file_selector ); | |
194 | if ( failed ) | |
195 | a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("The filename you requested could not be opened for writing.") ); | |
196 | } |