2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
4 * Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "thumbnails.h"
28 #include "garminsymbols.h"
29 #include "degrees_converters.h"
31 #ifdef VIK_CONFIG_GOOGLE
32 #include "googlesearch.h"
34 #ifdef VIK_CONFIG_GEONAMES
35 #include "geonamessearch.h"
39 #include <glib/gi18n.h>
45 void a_dialog_msg ( GtkWindow
*parent
, gint type
, const gchar
*info
, const gchar
*extra
)
47 GtkWidget
*msgbox
= gtk_message_dialog_new ( parent
, GTK_DIALOG_DESTROY_WITH_PARENT
, type
, GTK_BUTTONS_OK
, info
, extra
);
48 gtk_dialog_run ( GTK_DIALOG(msgbox
) );
49 gtk_widget_destroy ( msgbox
);
52 gboolean
a_dialog_goto_latlon ( GtkWindow
*parent
, struct LatLon
*ll
, const struct LatLon
*old
)
54 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Go to Lat/Lon"),
56 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
62 GtkWidget
*latlabel
, *lonlabel
;
64 gchar
*tmp_lat
, *tmp_lon
;
66 latlabel
= gtk_label_new (_("Latitude:"));
67 lat
= gtk_entry_new ();
68 tmp_lat
= g_strdup_printf ( "%f", old
->lat
);
69 gtk_entry_set_text ( GTK_ENTRY(lat
), tmp_lat
);
72 lonlabel
= gtk_label_new (_("Longitude:"));
73 lon
= gtk_entry_new ();
74 tmp_lon
= g_strdup_printf ( "%f", old
->lon
);
75 gtk_entry_set_text ( GTK_ENTRY(lon
), tmp_lon
);
78 gtk_widget_show ( latlabel
);
79 gtk_widget_show ( lonlabel
);
80 gtk_widget_show ( lat
);
81 gtk_widget_show ( lon
);
83 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latlabel
, FALSE
, FALSE
, 0);
84 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lat
, FALSE
, FALSE
, 0);
85 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonlabel
, FALSE
, FALSE
, 0);
86 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lon
, FALSE
, FALSE
, 0);
88 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
90 ll
->lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lat
) ) );
91 ll
->lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lon
) ) );
92 gtk_widget_destroy ( dialog
);
96 gtk_widget_destroy ( dialog
);
100 gboolean
a_dialog_goto_utm ( GtkWindow
*parent
, struct UTM
*utm
, const struct UTM
*old
)
102 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Go to Lat/Lon"),
104 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
110 GtkWidget
*norlabel
, *easlabel
, *nor
, *eas
;
111 GtkWidget
*zonehbox
, *zonespin
, *letterentry
;
112 gchar
*tmp_eas
, *tmp_nor
;
115 norlabel
= gtk_label_new (_("Northing:"));
116 nor
= gtk_entry_new ();
117 tmp_nor
= g_strdup_printf("%ld", (long) old
->northing
);
118 gtk_entry_set_text ( GTK_ENTRY(nor
), tmp_nor
);
121 easlabel
= gtk_label_new (_("Easting:"));
122 eas
= gtk_entry_new ();
123 tmp_eas
= g_strdup_printf("%ld", (long) old
->easting
);
124 gtk_entry_set_text ( GTK_ENTRY(eas
), tmp_eas
);
127 zonehbox
= gtk_hbox_new ( FALSE
, 0 );
128 gtk_box_pack_start ( GTK_BOX(zonehbox
), gtk_label_new ( _("Zone:") ), FALSE
, FALSE
, 5 );
129 zonespin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( old
->zone
, 1, 60, 1, 5, 5 ), 1, 0 );
130 gtk_box_pack_start ( GTK_BOX(zonehbox
), zonespin
, TRUE
, TRUE
, 5 );
131 gtk_box_pack_start ( GTK_BOX(zonehbox
), gtk_label_new ( _("Letter:") ), FALSE
, FALSE
, 5 );
132 letterentry
= gtk_entry_new ();
133 gtk_entry_set_max_length ( GTK_ENTRY(letterentry
), 1 );
134 gtk_entry_set_width_chars ( GTK_ENTRY(letterentry
), 2 );
135 tmp_letter
[0] = old
->letter
;
136 tmp_letter
[1] = '\0';
137 gtk_entry_set_text ( GTK_ENTRY(letterentry
), tmp_letter
);
138 gtk_box_pack_start ( GTK_BOX(zonehbox
), letterentry
, FALSE
, FALSE
, 5 );
140 gtk_widget_show ( norlabel
);
141 gtk_widget_show ( easlabel
);
142 gtk_widget_show ( nor
);
143 gtk_widget_show ( eas
);
145 gtk_widget_show_all ( zonehbox
);
147 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), norlabel
, FALSE
, FALSE
, 0);
148 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), nor
, FALSE
, FALSE
, 0);
149 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), easlabel
, FALSE
, FALSE
, 0);
150 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), eas
, FALSE
, FALSE
, 0);
151 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), zonehbox
, FALSE
, FALSE
, 0);
153 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
156 utm
->northing
= atof ( gtk_entry_get_text ( GTK_ENTRY(nor
) ) );
157 utm
->easting
= atof ( gtk_entry_get_text ( GTK_ENTRY(eas
) ) );
158 utm
->zone
= gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(zonespin
) );
159 letter
= gtk_entry_get_text ( GTK_ENTRY(letterentry
) );
161 utm
->letter
= toupper(*letter
);
162 gtk_widget_destroy ( dialog
);
166 gtk_widget_destroy ( dialog
);
170 void a_dialog_response_accept ( GtkDialog
*dialog
)
172 gtk_dialog_response ( dialog
, GTK_RESPONSE_ACCEPT
);
175 static void symbol_entry_changed_cb(GtkWidget
*combo
, GtkListStore
*store
)
180 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo
), &iter
))
183 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
184 /* Note: symm is NULL when "(none)" is select (first cell is empty) */
185 gtk_widget_set_tooltip_text(combo
, sym
);
189 /* todo: less on this side, like add track */
190 gboolean
a_dialog_new_waypoint ( GtkWindow
*parent
, gchar
**dest
, VikWaypoint
*wp
, GHashTable
*waypoints
, VikCoordMode coord_mode
)
192 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Waypoint Properties"),
194 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
201 GtkWidget
*latlabel
, *lonlabel
, *namelabel
, *latentry
, *lonentry
, *altentry
, *altlabel
, *nameentry
=NULL
, *commentlabel
,
202 *commententry
, *imagelabel
, *imageentry
, *symbollabel
, *symbolentry
;
208 gchar
*lat
, *lon
, *alt
;
210 vik_coord_to_latlon ( &(wp
->coord
), &ll
);
212 lat
= g_strdup_printf ( "%f", ll
.lat
);
213 lon
= g_strdup_printf ( "%f", ll
.lon
);
214 alt
= g_strdup_printf ( "%f", wp
->altitude
);
218 namelabel
= gtk_label_new (_("Name:"));
219 nameentry
= gtk_entry_new ();
221 gtk_entry_set_text( GTK_ENTRY(nameentry
), *dest
);
225 g_signal_connect_swapped ( nameentry
, "activate", G_CALLBACK(a_dialog_response_accept
), GTK_DIALOG(dialog
) );
226 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), namelabel
, FALSE
, FALSE
, 0);
227 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), nameentry
, FALSE
, FALSE
, 0);
230 latlabel
= gtk_label_new (_("Latitude:"));
231 latentry
= gtk_entry_new ();
232 gtk_entry_set_text ( GTK_ENTRY(latentry
), lat
);
235 lonlabel
= gtk_label_new (_("Longitude:"));
236 lonentry
= gtk_entry_new ();
237 gtk_entry_set_text ( GTK_ENTRY(lonentry
), lon
);
240 altlabel
= gtk_label_new (_("Altitude:"));
241 altentry
= gtk_entry_new ();
242 gtk_entry_set_text ( GTK_ENTRY(altentry
), alt
);
245 commentlabel
= gtk_label_new (_("Comment:"));
246 commententry
= gtk_entry_new ();
248 #if defined(VIK_CONFIG_GOOGLE) && VIK_CONFIG_SEARCH==VIK_CONFIG_SEARCH_GOOGLE
249 //if (strcmp(VIK_CONFIG_SEARCH,"google"))
250 cmt
= a_googlesearch_get_search_string_for_this_place(VIK_WINDOW(parent
));
252 #if defined(VIK_CONFIG_GEONAMES) && VIK_CONFIG_SEARCH==VIK_CONFIG_SEARCH_GEONAMES
253 //if (strcmp(VIK_CONFIG_SEARCH,"geonames"))
254 cmt
= a_geonamessearch_get_search_string_for_this_place(VIK_WINDOW(parent
));
257 gtk_entry_set_text(GTK_ENTRY(commententry
), cmt
);
259 imagelabel
= gtk_label_new (_("Image:"));
260 imageentry
= vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN
);
264 symbollabel
= gtk_label_new (_("Symbol:"));
267 store
= gtk_list_store_new(3, G_TYPE_STRING
, GDK_TYPE_PIXBUF
, G_TYPE_STRING
);
268 symbolentry
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
269 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(symbolentry
), 6);
270 g_signal_connect(symbolentry
, "changed",
271 G_CALLBACK(symbol_entry_changed_cb
), store
);
272 gtk_list_store_append (store
, &iter
);
273 gtk_list_store_set (store
, &iter
, 0, NULL
, 1, NULL
, 2, _("(none)"), -1);
274 a_populate_sym_list(store
);
276 r
= gtk_cell_renderer_pixbuf_new ();
277 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry
), r
, FALSE
);
278 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry
), r
, "pixbuf", 1, NULL
);
280 r
= gtk_cell_renderer_text_new ();
281 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry
), r
, FALSE
);
282 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry
), r
, "text", 2, NULL
);
284 if ( dest
== NULL
&& wp
->symbol
) {
287 for (ok
= gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &iter
); ok
; ok
= gtk_tree_model_iter_next ( GTK_TREE_MODEL(store
), &iter
)) {
288 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
289 if (sym
&& !strcmp(sym
, wp
->symbol
)) {
296 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(symbolentry
), &iter
);
300 if ( dest
== NULL
&& wp
->comment
)
301 gtk_entry_set_text ( GTK_ENTRY(commententry
), wp
->comment
);
303 if ( dest
== NULL
&& wp
->image
)
304 vik_file_entry_set_filename ( VIK_FILE_ENTRY(imageentry
), wp
->image
);
307 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latlabel
, FALSE
, FALSE
, 0);
308 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latentry
, FALSE
, FALSE
, 0);
309 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonlabel
, FALSE
, FALSE
, 0);
310 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonentry
, FALSE
, FALSE
, 0);
311 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), altlabel
, FALSE
, FALSE
, 0);
312 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), altentry
, FALSE
, FALSE
, 0);
313 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), commentlabel
, FALSE
, FALSE
, 0);
314 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), commententry
, FALSE
, FALSE
, 0);
315 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), imagelabel
, FALSE
, FALSE
, 0);
316 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), imageentry
, FALSE
, FALSE
, 0);
317 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), symbollabel
, FALSE
, FALSE
, 0);
318 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), GTK_WIDGET(symbolentry
), FALSE
, FALSE
, 0);
320 gtk_widget_show_all ( GTK_DIALOG(dialog
)->vbox
);
322 while ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
326 const gchar
*constname
= gtk_entry_get_text ( GTK_ENTRY(nameentry
) );
327 if ( strlen(constname
) == 0 ) /* TODO: other checks (isalpha or whatever ) */
328 a_dialog_info_msg ( parent
, _("Please enter a name for the waypoint.") );
330 gchar
*name
= g_strdup ( constname
);
332 if ( g_hash_table_lookup ( waypoints
, name
) && !a_dialog_overwrite ( parent
, _("The waypoint \"%s\" exists, do you want to overwrite it?"), name
) )
338 ll
.lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry
) ) );
339 ll
.lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry
) ) );
340 vik_coord_load_from_latlon ( &(wp
->coord
), coord_mode
, &ll
);
341 wp
->altitude
= atof ( gtk_entry_get_text ( GTK_ENTRY(altentry
) ) );
342 vik_waypoint_set_comment ( wp
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) );
343 vik_waypoint_set_image ( wp
, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry
) ) );
344 if ( wp
->image
&& *(wp
->image
) && (!a_thumbnails_exists(wp
->image
)) )
345 a_thumbnails_create ( wp
->image
);
348 GtkTreeIter iter
, first
;
349 gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &first
);
350 if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX(symbolentry
), &iter
) || !memcmp(&iter
, &first
, sizeof(GtkTreeIter
)) ) {
351 vik_waypoint_set_symbol ( wp
, NULL
);
354 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
355 vik_waypoint_set_symbol ( wp
, sym
);
360 gtk_widget_destroy ( dialog
);
363 } /* else (valid name) */
367 ll
.lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry
) ) );
368 ll
.lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry
) ) );
369 vik_coord_load_from_latlon ( &(wp
->coord
), coord_mode
, &ll
);
370 wp
->altitude
= atof ( gtk_entry_get_text ( GTK_ENTRY(altentry
) ) );
371 if ( (! wp
->comment
) || strcmp ( wp
->comment
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) ) != 0 )
372 vik_waypoint_set_comment ( wp
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) );
373 if ( (! wp
->image
) || strcmp ( wp
->image
, vik_file_entry_get_filename ( VIK_FILE_ENTRY ( imageentry
) ) ) != 0 )
375 vik_waypoint_set_image ( wp
, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry
) ) );
376 if ( wp
->image
&& *(wp
->image
) && (!a_thumbnails_exists(wp
->image
)) )
377 a_thumbnails_create ( wp
->image
);
381 GtkTreeIter iter
, first
;
382 gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &first
);
383 if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX(symbolentry
), &iter
) || !memcmp(&iter
, &first
, sizeof(GtkTreeIter
)) ) {
384 vik_waypoint_set_symbol ( wp
, NULL
);
387 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
388 vik_waypoint_set_symbol ( wp
, sym
);
393 gtk_widget_destroy ( dialog
);
398 gtk_widget_destroy ( dialog
);
402 static void get_selected_foreach_func(GtkTreeModel
*model
,
409 gtk_tree_model_get (model
, iter
, 0, &name
, -1);
410 *list
= g_list_prepend(*list
, name
);
413 GList
*a_dialog_select_from_list ( GtkWindow
*parent
, GHashTable
*tracks
, GList
*track_names
, gboolean multiple_selection_allowed
, const gchar
*title
, const gchar
*msg
)
416 GtkCellRenderer
*renderer
;
419 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (title
,
421 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
427 GtkWidget
*label
= gtk_label_new ( msg
);
428 GtkListStore
*store
= gtk_list_store_new(1, G_TYPE_STRING
);
430 GList
*track_runner
= track_names
;
433 gtk_list_store_append(store
, &iter
);
434 gtk_list_store_set(store
, &iter
, 0, track_runner
->data
, -1);
435 track_runner
= g_list_next(track_runner
);
438 view
= gtk_tree_view_new();
439 renderer
= gtk_cell_renderer_text_new();
440 gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view
), -1, NULL
, renderer
, "text", 0, NULL
);
441 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), GTK_TREE_MODEL(store
));
442 gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(view
), FALSE
);
443 gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view
)),
444 multiple_selection_allowed
? GTK_SELECTION_MULTIPLE
: GTK_SELECTION_BROWSE
);
445 g_object_unref(store
);
447 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), label
, FALSE
, FALSE
, 0);
448 gtk_widget_show ( label
);
449 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), view
, FALSE
, FALSE
, 0);
450 gtk_widget_show ( view
);
452 while ( gtk_dialog_run (GTK_DIALOG (dialog
)) == GTK_RESPONSE_ACCEPT
)
455 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(view
));
456 gtk_tree_selection_selected_foreach(selection
, get_selected_foreach_func
, &names
);
459 gtk_widget_destroy ( dialog
);
462 a_dialog_error_msg(parent
, _("Nothing was selected"));
464 gtk_widget_destroy ( dialog
);
468 gchar
*a_dialog_new_track ( GtkWindow
*parent
, GHashTable
*tracks
)
470 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Add Track"),
472 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
478 GtkWidget
*label
= gtk_label_new ( _("Track Name:") );
479 GtkWidget
*entry
= gtk_entry_new ();
481 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), label
, FALSE
, FALSE
, 0);
482 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), entry
, FALSE
, FALSE
, 0);
484 g_signal_connect_swapped ( entry
, "activate", G_CALLBACK(a_dialog_response_accept
), GTK_DIALOG(dialog
) );
486 gtk_widget_show ( label
);
487 gtk_widget_show ( entry
);
489 while ( gtk_dialog_run (GTK_DIALOG (dialog
)) == GTK_RESPONSE_ACCEPT
)
491 const gchar
*constname
= gtk_entry_get_text ( GTK_ENTRY(entry
) );
492 if ( *constname
== '\0' )
493 a_dialog_info_msg ( parent
, _("Please enter a name for the track.") );
495 gchar
*name
= g_strdup ( constname
);
497 if ( g_hash_table_lookup( tracks
, name
) && !a_dialog_overwrite ( parent
, _("The track \"%s\" exists, do you want to overwrite it?"), gtk_entry_get_text ( GTK_ENTRY(entry
) ) ) )
503 gtk_widget_destroy ( dialog
);
508 gtk_widget_destroy ( dialog
);
512 /* creates a vbox full of labels */
513 GtkWidget
*a_dialog_create_label_vbox ( gchar
**texts
, int label_count
)
515 GtkWidget
*vbox
, *label
;
517 vbox
= gtk_vbox_new( TRUE
, 3 );
519 for ( i
= 0; i
< label_count
; i
++ )
521 label
= gtk_label_new(NULL
);
522 gtk_label_set_markup ( GTK_LABEL(label
), _(texts
[i
]) );
523 gtk_box_pack_start ( GTK_BOX(vbox
), label
, FALSE
, TRUE
, 5 );
528 gboolean
a_dialog_overwrite ( GtkWindow
*parent
, const gchar
*message
, const gchar
*extra
)
531 dia
= gtk_message_dialog_new ( parent
,
532 GTK_DIALOG_DESTROY_WITH_PARENT
,
533 GTK_MESSAGE_QUESTION
,
537 if ( gtk_dialog_run ( GTK_DIALOG(dia
) ) == GTK_RESPONSE_YES
)
539 gtk_widget_destroy ( dia
);
544 gtk_widget_destroy ( dia
);
549 static void zoom_spin_changed ( GtkSpinButton
*spin
, GtkWidget
*pass_along
[3] )
551 if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(pass_along
[2]) ) )
552 gtk_spin_button_set_value (
553 GTK_SPIN_BUTTON(pass_along
[GTK_WIDGET(spin
) == pass_along
[0] ? 1 : 0]),
554 gtk_spin_button_get_value ( spin
) );
557 gboolean
a_dialog_custom_zoom ( GtkWindow
*parent
, gdouble
*xmpp
, gdouble
*ympp
)
559 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Zoom Factors..."),
561 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
567 GtkWidget
*table
, *label
, *xlabel
, *xspin
, *ylabel
, *yspin
, *samecheck
;
568 GtkWidget
*pass_along
[3];
570 table
= gtk_table_new ( 4, 2, FALSE
);
571 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), table
, TRUE
, TRUE
, 0 );
573 label
= gtk_label_new ( _("Zoom factor (in meters per pixel:") );
574 xlabel
= gtk_label_new ( _("X (easting): "));
575 ylabel
= gtk_label_new ( _("Y (northing): "));
577 pass_along
[0] = xspin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( *xmpp
, VIK_VIEWPORT_MIN_ZOOM
, VIK_VIEWPORT_MAX_ZOOM
, 1, 5, 5 ), 1, 8 );
578 pass_along
[1] = yspin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( *ympp
, VIK_VIEWPORT_MIN_ZOOM
, VIK_VIEWPORT_MAX_ZOOM
, 1, 5, 5 ), 1, 8 );
580 pass_along
[2] = samecheck
= gtk_check_button_new_with_label ( _("X and Y zoom factors must be equal") );
581 /* TODO -- same factor */
582 /* samecheck = gtk_check_button_new_with_label ( "Same x/y zoom factor" ); */
584 if ( *xmpp
== *ympp
)
585 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(samecheck
), TRUE
);
587 gtk_table_attach_defaults ( GTK_TABLE(table
), label
, 0, 2, 0, 1 );
588 gtk_table_attach_defaults ( GTK_TABLE(table
), xlabel
, 0, 1, 1, 2 );
589 gtk_table_attach_defaults ( GTK_TABLE(table
), xspin
, 1, 2, 1, 2 );
590 gtk_table_attach_defaults ( GTK_TABLE(table
), ylabel
, 0, 1, 2, 3 );
591 gtk_table_attach_defaults ( GTK_TABLE(table
), yspin
, 1, 2, 2, 3 );
592 gtk_table_attach_defaults ( GTK_TABLE(table
), samecheck
, 0, 2, 3, 4 );
594 gtk_widget_show_all ( table
);
596 g_signal_connect ( G_OBJECT(xspin
), "value-changed", G_CALLBACK(zoom_spin_changed
), pass_along
);
597 g_signal_connect ( G_OBJECT(yspin
), "value-changed", G_CALLBACK(zoom_spin_changed
), pass_along
);
599 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
601 *xmpp
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(xspin
) );
602 *ympp
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(yspin
) );
603 gtk_widget_destroy ( dialog
);
606 gtk_widget_destroy ( dialog
);
610 static void split_spin_focused ( GtkSpinButton
*spin
, GtkWidget
*pass_along
[1] )
612 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pass_along
[0]), 1);
615 gboolean
a_dialog_time_threshold ( GtkWindow
*parent
, gchar
*title_text
, gchar
*label_text
, guint
*thr
)
617 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (title_text
,
619 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
625 GtkWidget
*table
, *t1
, *t2
, *t3
, *t4
, *spin
, *label
;
626 GtkWidget
*pass_along
[1];
628 table
= gtk_table_new ( 4, 2, FALSE
);
629 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), table
, TRUE
, TRUE
, 0 );
631 label
= gtk_label_new (label_text
);
633 t1
= gtk_radio_button_new_with_label ( NULL
, _("1 min") );
634 t2
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t1
), _("1 hour") );
635 t3
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t2
), _("1 day") );
636 t4
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t3
), _("Custom (in minutes):") );
640 spin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( *thr
, 0, 65536, 1, 5, 5 ), 1, 0 );
642 gtk_table_attach_defaults ( GTK_TABLE(table
), label
, 0, 2, 0, 1 );
643 gtk_table_attach_defaults ( GTK_TABLE(table
), t1
, 0, 1, 1, 2 );
644 gtk_table_attach_defaults ( GTK_TABLE(table
), t2
, 0, 1, 2, 3 );
645 gtk_table_attach_defaults ( GTK_TABLE(table
), t3
, 0, 1, 3, 4 );
646 gtk_table_attach_defaults ( GTK_TABLE(table
), t4
, 0, 1, 4, 5 );
647 gtk_table_attach_defaults ( GTK_TABLE(table
), spin
, 1, 2, 4, 5 );
649 gtk_widget_show_all ( table
);
651 g_signal_connect ( G_OBJECT(spin
), "grab-focus", G_CALLBACK(split_spin_focused
), pass_along
);
653 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
655 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t1
))) {
657 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t2
))) {
659 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t3
))) {
661 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t4
))) {
662 *thr
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(spin
) );
664 gtk_widget_destroy ( dialog
);
667 gtk_widget_destroy ( dialog
);
671 static void about_url_hook (GtkAboutDialog
*about
,
675 open_url (GTK_WINDOW(about
), link
);
678 static void about_email_hook (GtkAboutDialog
*about
,
682 new_email (GTK_WINDOW(about
), email
);
685 void a_dialog_about ( GtkWindow
*parent
)
687 const gchar
*program_name
= PACKAGE_NAME
;
688 const gchar
*version
= VIKING_VERSION
;
689 const gchar
*website
= VIKING_URL
;
690 const gchar
*copyright
= "2003-2008, Evan Battaglia";
691 const gchar
*comments
= _("GPS Data and Topo Analyzer, Explorer, and Manager.");
692 const gchar
*license
= _("This program is free software; you can redistribute it and/or modify "
693 "it under the terms of the GNU General Public License as published by "
694 "the Free Software Foundation; either version 2 of the License, or "
695 "(at your option) any later version."
697 "This program is distributed in the hope that it will be useful, "
698 "but WITHOUT ANY WARRANTY; without even the implied warranty of "
699 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
700 "GNU General Public License for more details."
702 "You should have received a copy of the GNU General Public License "
703 "along with this program; if not, write to the Free Software "
704 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA");
706 gtk_about_dialog_set_url_hook (about_url_hook
, NULL
, NULL
);
707 gtk_about_dialog_set_email_hook (about_email_hook
, NULL
, NULL
);
708 gtk_show_about_dialog (parent
,
709 /* TODO do not set program-name and correctly set info for g_get_application_name */
710 "program-name", program_name
,
713 "comments", comments
,
714 "copyright", copyright
,
716 "wrap-license", TRUE
,
717 /* logo automatically retrieved via gtk_window_get_default_icon_list */
722 gboolean
a_dialog_map_n_zoom(GtkWindow
*parent
, gchar
*mapnames
[], gint default_map
, gchar
*zoom_list
[], gint default_zoom
, gint
*selected_map
, gint
*selected_zoom
)
726 GtkWidget
*dialog
= gtk_dialog_new_with_buttons ( _("Download along track"), parent
, 0, GTK_STOCK_OK
, GTK_RESPONSE_ACCEPT
, GTK_STOCK_CANCEL
, GTK_RESPONSE_REJECT
, NULL
);
728 GtkWidget
*map_label
= gtk_label_new(_("Map type:"));
729 GtkComboBox
*map_combo
= GTK_COMBO_BOX(gtk_combo_box_new_text());
730 for (s
= mapnames
; *s
; s
++)
731 gtk_combo_box_append_text(map_combo
, *s
);
732 gtk_combo_box_set_active (map_combo
, default_map
);
733 GtkWidget
*zoom_label
= gtk_label_new(_("Zoom level:"));
734 GtkComboBox
*zoom_combo
= GTK_COMBO_BOX(gtk_combo_box_new_text());
735 for (s
= zoom_list
; *s
; s
++)
736 gtk_combo_box_append_text(zoom_combo
, *s
);
737 gtk_combo_box_set_active (zoom_combo
, default_zoom
);
739 GtkTable
*box
= GTK_TABLE(gtk_table_new(2, 2, FALSE
));
740 gtk_table_attach_defaults(box
, GTK_WIDGET(map_label
), 0, 1, 0, 1);
741 gtk_table_attach_defaults(box
, GTK_WIDGET(map_combo
), 1, 2, 0, 1);
742 gtk_table_attach_defaults(box
, GTK_WIDGET(zoom_label
), 0, 1, 1, 2);
743 gtk_table_attach_defaults(box
, GTK_WIDGET(zoom_combo
), 1, 2, 1, 2);
745 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), GTK_WIDGET(box
), FALSE
, FALSE
, 5 );
747 gtk_widget_show_all ( dialog
);
748 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) != GTK_RESPONSE_ACCEPT
) {
749 gtk_widget_destroy(dialog
);
753 *selected_map
= gtk_combo_box_get_active(map_combo
);
754 *selected_zoom
= gtk_combo_box_get_active(zoom_combo
);
756 gtk_widget_destroy(dialog
);