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 #include "viksearch.h"
34 #include <glib/gi18n.h>
40 void a_dialog_msg ( GtkWindow
*parent
, gint type
, const gchar
*info
, const gchar
*extra
)
42 GtkWidget
*msgbox
= gtk_message_dialog_new ( parent
, GTK_DIALOG_DESTROY_WITH_PARENT
, type
, GTK_BUTTONS_OK
, info
, extra
);
43 gtk_dialog_run ( GTK_DIALOG(msgbox
) );
44 gtk_widget_destroy ( msgbox
);
47 gboolean
a_dialog_goto_latlon ( GtkWindow
*parent
, struct LatLon
*ll
, const struct LatLon
*old
)
49 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Go to Lat/Lon"),
51 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
57 GtkWidget
*latlabel
, *lonlabel
;
59 gchar
*tmp_lat
, *tmp_lon
;
61 latlabel
= gtk_label_new (_("Latitude:"));
62 lat
= gtk_entry_new ();
63 tmp_lat
= g_strdup_printf ( "%f", old
->lat
);
64 gtk_entry_set_text ( GTK_ENTRY(lat
), tmp_lat
);
67 lonlabel
= gtk_label_new (_("Longitude:"));
68 lon
= gtk_entry_new ();
69 tmp_lon
= g_strdup_printf ( "%f", old
->lon
);
70 gtk_entry_set_text ( GTK_ENTRY(lon
), tmp_lon
);
73 gtk_widget_show ( latlabel
);
74 gtk_widget_show ( lonlabel
);
75 gtk_widget_show ( lat
);
76 gtk_widget_show ( lon
);
78 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latlabel
, FALSE
, FALSE
, 0);
79 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lat
, FALSE
, FALSE
, 0);
80 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonlabel
, FALSE
, FALSE
, 0);
81 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lon
, FALSE
, FALSE
, 0);
83 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
85 ll
->lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lat
) ) );
86 ll
->lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lon
) ) );
87 gtk_widget_destroy ( dialog
);
91 gtk_widget_destroy ( dialog
);
95 gboolean
a_dialog_goto_utm ( GtkWindow
*parent
, struct UTM
*utm
, const struct UTM
*old
)
97 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Go to Lat/Lon"),
99 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
105 GtkWidget
*norlabel
, *easlabel
, *nor
, *eas
;
106 GtkWidget
*zonehbox
, *zonespin
, *letterentry
;
107 gchar
*tmp_eas
, *tmp_nor
;
110 norlabel
= gtk_label_new (_("Northing:"));
111 nor
= gtk_entry_new ();
112 tmp_nor
= g_strdup_printf("%ld", (long) old
->northing
);
113 gtk_entry_set_text ( GTK_ENTRY(nor
), tmp_nor
);
116 easlabel
= gtk_label_new (_("Easting:"));
117 eas
= gtk_entry_new ();
118 tmp_eas
= g_strdup_printf("%ld", (long) old
->easting
);
119 gtk_entry_set_text ( GTK_ENTRY(eas
), tmp_eas
);
122 zonehbox
= gtk_hbox_new ( FALSE
, 0 );
123 gtk_box_pack_start ( GTK_BOX(zonehbox
), gtk_label_new ( _("Zone:") ), FALSE
, FALSE
, 5 );
124 zonespin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( old
->zone
, 1, 60, 1, 5, 5 ), 1, 0 );
125 gtk_box_pack_start ( GTK_BOX(zonehbox
), zonespin
, TRUE
, TRUE
, 5 );
126 gtk_box_pack_start ( GTK_BOX(zonehbox
), gtk_label_new ( _("Letter:") ), FALSE
, FALSE
, 5 );
127 letterentry
= gtk_entry_new ();
128 gtk_entry_set_max_length ( GTK_ENTRY(letterentry
), 1 );
129 gtk_entry_set_width_chars ( GTK_ENTRY(letterentry
), 2 );
130 tmp_letter
[0] = old
->letter
;
131 tmp_letter
[1] = '\0';
132 gtk_entry_set_text ( GTK_ENTRY(letterentry
), tmp_letter
);
133 gtk_box_pack_start ( GTK_BOX(zonehbox
), letterentry
, FALSE
, FALSE
, 5 );
135 gtk_widget_show ( norlabel
);
136 gtk_widget_show ( easlabel
);
137 gtk_widget_show ( nor
);
138 gtk_widget_show ( eas
);
140 gtk_widget_show_all ( zonehbox
);
142 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), norlabel
, FALSE
, FALSE
, 0);
143 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), nor
, FALSE
, FALSE
, 0);
144 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), easlabel
, FALSE
, FALSE
, 0);
145 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), eas
, FALSE
, FALSE
, 0);
146 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), zonehbox
, FALSE
, FALSE
, 0);
148 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
151 utm
->northing
= atof ( gtk_entry_get_text ( GTK_ENTRY(nor
) ) );
152 utm
->easting
= atof ( gtk_entry_get_text ( GTK_ENTRY(eas
) ) );
153 utm
->zone
= gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(zonespin
) );
154 letter
= gtk_entry_get_text ( GTK_ENTRY(letterentry
) );
156 utm
->letter
= toupper(*letter
);
157 gtk_widget_destroy ( dialog
);
161 gtk_widget_destroy ( dialog
);
165 void a_dialog_response_accept ( GtkDialog
*dialog
)
167 gtk_dialog_response ( dialog
, GTK_RESPONSE_ACCEPT
);
170 static void symbol_entry_changed_cb(GtkWidget
*combo
, GtkListStore
*store
)
175 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo
), &iter
))
178 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
179 /* Note: symm is NULL when "(none)" is select (first cell is empty) */
180 gtk_widget_set_tooltip_text(combo
, sym
);
184 /* todo: less on this side, like add track */
185 gboolean
a_dialog_new_waypoint ( GtkWindow
*parent
, gchar
**dest
, VikWaypoint
*wp
, GHashTable
*waypoints
, VikCoordMode coord_mode
)
187 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Waypoint Properties"),
189 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
196 GtkWidget
*latlabel
, *lonlabel
, *namelabel
, *latentry
, *lonentry
, *altentry
, *altlabel
, *nameentry
=NULL
, *commentlabel
,
197 *commententry
, *imagelabel
, *imageentry
, *symbollabel
, *symbolentry
;
203 gchar
*lat
, *lon
, *alt
;
205 vik_coord_to_latlon ( &(wp
->coord
), &ll
);
207 lat
= g_strdup_printf ( "%f", ll
.lat
);
208 lon
= g_strdup_printf ( "%f", ll
.lon
);
209 alt
= g_strdup_printf ( "%f", wp
->altitude
);
213 namelabel
= gtk_label_new (_("Name:"));
214 nameentry
= gtk_entry_new ();
216 gtk_entry_set_text( GTK_ENTRY(nameentry
), *dest
);
220 g_signal_connect_swapped ( nameentry
, "activate", G_CALLBACK(a_dialog_response_accept
), GTK_DIALOG(dialog
) );
221 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), namelabel
, FALSE
, FALSE
, 0);
222 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), nameentry
, FALSE
, FALSE
, 0);
225 latlabel
= gtk_label_new (_("Latitude:"));
226 latentry
= gtk_entry_new ();
227 gtk_entry_set_text ( GTK_ENTRY(latentry
), lat
);
230 lonlabel
= gtk_label_new (_("Longitude:"));
231 lonentry
= gtk_entry_new ();
232 gtk_entry_set_text ( GTK_ENTRY(lonentry
), lon
);
235 altlabel
= gtk_label_new (_("Altitude:"));
236 altentry
= gtk_entry_new ();
237 gtk_entry_set_text ( GTK_ENTRY(altentry
), alt
);
240 commentlabel
= gtk_label_new (_("Comment:"));
241 commententry
= gtk_entry_new ();
243 cmt
= a_vik_search_get_search_string_for_this_place(VIK_WINDOW(parent
));
245 gtk_entry_set_text(GTK_ENTRY(commententry
), cmt
);
247 imagelabel
= gtk_label_new (_("Image:"));
248 imageentry
= vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN
);
252 symbollabel
= gtk_label_new (_("Symbol:"));
255 store
= gtk_list_store_new(3, G_TYPE_STRING
, GDK_TYPE_PIXBUF
, G_TYPE_STRING
);
256 symbolentry
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
257 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(symbolentry
), 6);
258 g_signal_connect(symbolentry
, "changed",
259 G_CALLBACK(symbol_entry_changed_cb
), store
);
260 gtk_list_store_append (store
, &iter
);
261 gtk_list_store_set (store
, &iter
, 0, NULL
, 1, NULL
, 2, _("(none)"), -1);
262 a_populate_sym_list(store
);
264 r
= gtk_cell_renderer_pixbuf_new ();
265 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry
), r
, FALSE
);
266 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry
), r
, "pixbuf", 1, NULL
);
268 r
= gtk_cell_renderer_text_new ();
269 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry
), r
, FALSE
);
270 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry
), r
, "text", 2, NULL
);
272 if ( dest
== NULL
&& wp
->symbol
) {
275 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
)) {
276 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
277 if (sym
&& !strcmp(sym
, wp
->symbol
)) {
284 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(symbolentry
), &iter
);
288 if ( dest
== NULL
&& wp
->comment
)
289 gtk_entry_set_text ( GTK_ENTRY(commententry
), wp
->comment
);
291 if ( dest
== NULL
&& wp
->image
)
292 vik_file_entry_set_filename ( VIK_FILE_ENTRY(imageentry
), wp
->image
);
295 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latlabel
, FALSE
, FALSE
, 0);
296 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latentry
, FALSE
, FALSE
, 0);
297 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonlabel
, FALSE
, FALSE
, 0);
298 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonentry
, FALSE
, FALSE
, 0);
299 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), altlabel
, FALSE
, FALSE
, 0);
300 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), altentry
, FALSE
, FALSE
, 0);
301 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), commentlabel
, FALSE
, FALSE
, 0);
302 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), commententry
, FALSE
, FALSE
, 0);
303 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), imagelabel
, FALSE
, FALSE
, 0);
304 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), imageentry
, FALSE
, FALSE
, 0);
305 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), symbollabel
, FALSE
, FALSE
, 0);
306 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), GTK_WIDGET(symbolentry
), FALSE
, FALSE
, 0);
308 gtk_widget_show_all ( GTK_DIALOG(dialog
)->vbox
);
310 while ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
314 const gchar
*constname
= gtk_entry_get_text ( GTK_ENTRY(nameentry
) );
315 if ( strlen(constname
) == 0 ) /* TODO: other checks (isalpha or whatever ) */
316 a_dialog_info_msg ( parent
, _("Please enter a name for the waypoint.") );
318 gchar
*name
= g_strdup ( constname
);
320 if ( g_hash_table_lookup ( waypoints
, name
) && !a_dialog_overwrite ( parent
, _("The waypoint \"%s\" exists, do you want to overwrite it?"), name
) )
326 ll
.lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry
) ) );
327 ll
.lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry
) ) );
328 vik_coord_load_from_latlon ( &(wp
->coord
), coord_mode
, &ll
);
329 wp
->altitude
= atof ( gtk_entry_get_text ( GTK_ENTRY(altentry
) ) );
330 vik_waypoint_set_comment ( wp
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) );
331 vik_waypoint_set_image ( wp
, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry
) ) );
332 if ( wp
->image
&& *(wp
->image
) && (!a_thumbnails_exists(wp
->image
)) )
333 a_thumbnails_create ( wp
->image
);
336 GtkTreeIter iter
, first
;
337 gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &first
);
338 if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX(symbolentry
), &iter
) || !memcmp(&iter
, &first
, sizeof(GtkTreeIter
)) ) {
339 vik_waypoint_set_symbol ( wp
, NULL
);
342 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
343 vik_waypoint_set_symbol ( wp
, sym
);
348 gtk_widget_destroy ( dialog
);
351 } /* else (valid name) */
355 ll
.lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry
) ) );
356 ll
.lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry
) ) );
357 vik_coord_load_from_latlon ( &(wp
->coord
), coord_mode
, &ll
);
358 wp
->altitude
= atof ( gtk_entry_get_text ( GTK_ENTRY(altentry
) ) );
359 if ( (! wp
->comment
) || strcmp ( wp
->comment
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) ) != 0 )
360 vik_waypoint_set_comment ( wp
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) );
361 if ( (! wp
->image
) || strcmp ( wp
->image
, vik_file_entry_get_filename ( VIK_FILE_ENTRY ( imageentry
) ) ) != 0 )
363 vik_waypoint_set_image ( wp
, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry
) ) );
364 if ( wp
->image
&& *(wp
->image
) && (!a_thumbnails_exists(wp
->image
)) )
365 a_thumbnails_create ( wp
->image
);
369 GtkTreeIter iter
, first
;
370 gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &first
);
371 if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX(symbolentry
), &iter
) || !memcmp(&iter
, &first
, sizeof(GtkTreeIter
)) ) {
372 vik_waypoint_set_symbol ( wp
, NULL
);
375 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
376 vik_waypoint_set_symbol ( wp
, sym
);
381 gtk_widget_destroy ( dialog
);
386 gtk_widget_destroy ( dialog
);
390 static void get_selected_foreach_func(GtkTreeModel
*model
,
397 gtk_tree_model_get (model
, iter
, 0, &name
, -1);
398 *list
= g_list_prepend(*list
, name
);
401 GList
*a_dialog_select_from_list ( GtkWindow
*parent
, GHashTable
*tracks
, GList
*track_names
, gboolean multiple_selection_allowed
, const gchar
*title
, const gchar
*msg
)
404 GtkCellRenderer
*renderer
;
407 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (title
,
409 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
415 GtkWidget
*label
= gtk_label_new ( msg
);
416 GtkListStore
*store
= gtk_list_store_new(1, G_TYPE_STRING
);
418 GList
*track_runner
= track_names
;
421 gtk_list_store_append(store
, &iter
);
422 gtk_list_store_set(store
, &iter
, 0, track_runner
->data
, -1);
423 track_runner
= g_list_next(track_runner
);
426 view
= gtk_tree_view_new();
427 renderer
= gtk_cell_renderer_text_new();
428 gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view
), -1, NULL
, renderer
, "text", 0, NULL
);
429 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), GTK_TREE_MODEL(store
));
430 gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(view
), FALSE
);
431 gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view
)),
432 multiple_selection_allowed
? GTK_SELECTION_MULTIPLE
: GTK_SELECTION_BROWSE
);
433 g_object_unref(store
);
435 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), label
, FALSE
, FALSE
, 0);
436 gtk_widget_show ( label
);
437 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), view
, FALSE
, FALSE
, 0);
438 gtk_widget_show ( view
);
440 while ( gtk_dialog_run (GTK_DIALOG (dialog
)) == GTK_RESPONSE_ACCEPT
)
443 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(view
));
444 gtk_tree_selection_selected_foreach(selection
, get_selected_foreach_func
, &names
);
447 gtk_widget_destroy ( dialog
);
450 a_dialog_error_msg(parent
, _("Nothing was selected"));
452 gtk_widget_destroy ( dialog
);
456 gchar
*a_dialog_new_track ( GtkWindow
*parent
, GHashTable
*tracks
)
458 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Add Track"),
460 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
466 GtkWidget
*label
= gtk_label_new ( _("Track Name:") );
467 GtkWidget
*entry
= gtk_entry_new ();
469 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), label
, FALSE
, FALSE
, 0);
470 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), entry
, FALSE
, FALSE
, 0);
472 g_signal_connect_swapped ( entry
, "activate", G_CALLBACK(a_dialog_response_accept
), GTK_DIALOG(dialog
) );
474 gtk_widget_show ( label
);
475 gtk_widget_show ( entry
);
477 while ( gtk_dialog_run (GTK_DIALOG (dialog
)) == GTK_RESPONSE_ACCEPT
)
479 const gchar
*constname
= gtk_entry_get_text ( GTK_ENTRY(entry
) );
480 if ( *constname
== '\0' )
481 a_dialog_info_msg ( parent
, _("Please enter a name for the track.") );
483 gchar
*name
= g_strdup ( constname
);
485 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
) ) ) )
491 gtk_widget_destroy ( dialog
);
496 gtk_widget_destroy ( dialog
);
500 /* creates a vbox full of labels */
501 GtkWidget
*a_dialog_create_label_vbox ( gchar
**texts
, int label_count
)
503 GtkWidget
*vbox
, *label
;
505 vbox
= gtk_vbox_new( TRUE
, 3 );
507 for ( i
= 0; i
< label_count
; i
++ )
509 label
= gtk_label_new(NULL
);
510 gtk_label_set_markup ( GTK_LABEL(label
), _(texts
[i
]) );
511 gtk_box_pack_start ( GTK_BOX(vbox
), label
, FALSE
, TRUE
, 5 );
516 gboolean
a_dialog_overwrite ( GtkWindow
*parent
, const gchar
*message
, const gchar
*extra
)
519 dia
= gtk_message_dialog_new ( parent
,
520 GTK_DIALOG_DESTROY_WITH_PARENT
,
521 GTK_MESSAGE_QUESTION
,
525 if ( gtk_dialog_run ( GTK_DIALOG(dia
) ) == GTK_RESPONSE_YES
)
527 gtk_widget_destroy ( dia
);
532 gtk_widget_destroy ( dia
);
537 static void zoom_spin_changed ( GtkSpinButton
*spin
, GtkWidget
*pass_along
[3] )
539 if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(pass_along
[2]) ) )
540 gtk_spin_button_set_value (
541 GTK_SPIN_BUTTON(pass_along
[GTK_WIDGET(spin
) == pass_along
[0] ? 1 : 0]),
542 gtk_spin_button_get_value ( spin
) );
545 gboolean
a_dialog_custom_zoom ( GtkWindow
*parent
, gdouble
*xmpp
, gdouble
*ympp
)
547 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (_("Zoom Factors..."),
549 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
555 GtkWidget
*table
, *label
, *xlabel
, *xspin
, *ylabel
, *yspin
, *samecheck
;
556 GtkWidget
*pass_along
[3];
558 table
= gtk_table_new ( 4, 2, FALSE
);
559 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), table
, TRUE
, TRUE
, 0 );
561 label
= gtk_label_new ( _("Zoom factor (in meters per pixel:") );
562 xlabel
= gtk_label_new ( _("X (easting): "));
563 ylabel
= gtk_label_new ( _("Y (northing): "));
565 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 );
566 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 );
568 pass_along
[2] = samecheck
= gtk_check_button_new_with_label ( _("X and Y zoom factors must be equal") );
569 /* TODO -- same factor */
570 /* samecheck = gtk_check_button_new_with_label ( "Same x/y zoom factor" ); */
572 if ( *xmpp
== *ympp
)
573 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(samecheck
), TRUE
);
575 gtk_table_attach_defaults ( GTK_TABLE(table
), label
, 0, 2, 0, 1 );
576 gtk_table_attach_defaults ( GTK_TABLE(table
), xlabel
, 0, 1, 1, 2 );
577 gtk_table_attach_defaults ( GTK_TABLE(table
), xspin
, 1, 2, 1, 2 );
578 gtk_table_attach_defaults ( GTK_TABLE(table
), ylabel
, 0, 1, 2, 3 );
579 gtk_table_attach_defaults ( GTK_TABLE(table
), yspin
, 1, 2, 2, 3 );
580 gtk_table_attach_defaults ( GTK_TABLE(table
), samecheck
, 0, 2, 3, 4 );
582 gtk_widget_show_all ( table
);
584 g_signal_connect ( G_OBJECT(xspin
), "value-changed", G_CALLBACK(zoom_spin_changed
), pass_along
);
585 g_signal_connect ( G_OBJECT(yspin
), "value-changed", G_CALLBACK(zoom_spin_changed
), pass_along
);
587 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
589 *xmpp
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(xspin
) );
590 *ympp
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(yspin
) );
591 gtk_widget_destroy ( dialog
);
594 gtk_widget_destroy ( dialog
);
598 static void split_spin_focused ( GtkSpinButton
*spin
, GtkWidget
*pass_along
[1] )
600 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pass_along
[0]), 1);
603 gboolean
a_dialog_time_threshold ( GtkWindow
*parent
, gchar
*title_text
, gchar
*label_text
, guint
*thr
)
605 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (title_text
,
607 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
613 GtkWidget
*table
, *t1
, *t2
, *t3
, *t4
, *spin
, *label
;
614 GtkWidget
*pass_along
[1];
616 table
= gtk_table_new ( 4, 2, FALSE
);
617 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), table
, TRUE
, TRUE
, 0 );
619 label
= gtk_label_new (label_text
);
621 t1
= gtk_radio_button_new_with_label ( NULL
, _("1 min") );
622 t2
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t1
), _("1 hour") );
623 t3
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t2
), _("1 day") );
624 t4
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t3
), _("Custom (in minutes):") );
628 spin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( *thr
, 0, 65536, 1, 5, 5 ), 1, 0 );
630 gtk_table_attach_defaults ( GTK_TABLE(table
), label
, 0, 2, 0, 1 );
631 gtk_table_attach_defaults ( GTK_TABLE(table
), t1
, 0, 1, 1, 2 );
632 gtk_table_attach_defaults ( GTK_TABLE(table
), t2
, 0, 1, 2, 3 );
633 gtk_table_attach_defaults ( GTK_TABLE(table
), t3
, 0, 1, 3, 4 );
634 gtk_table_attach_defaults ( GTK_TABLE(table
), t4
, 0, 1, 4, 5 );
635 gtk_table_attach_defaults ( GTK_TABLE(table
), spin
, 1, 2, 4, 5 );
637 gtk_widget_show_all ( table
);
639 g_signal_connect ( G_OBJECT(spin
), "grab-focus", G_CALLBACK(split_spin_focused
), pass_along
);
641 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
643 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t1
))) {
645 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t2
))) {
647 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t3
))) {
649 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t4
))) {
650 *thr
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(spin
) );
652 gtk_widget_destroy ( dialog
);
655 gtk_widget_destroy ( dialog
);
659 static void about_url_hook (GtkAboutDialog
*about
,
663 open_url (GTK_WINDOW(about
), link
);
666 static void about_email_hook (GtkAboutDialog
*about
,
670 new_email (GTK_WINDOW(about
), email
);
673 void a_dialog_about ( GtkWindow
*parent
)
675 const gchar
*program_name
= PACKAGE_NAME
;
676 const gchar
*version
= VIKING_VERSION
;
677 const gchar
*website
= VIKING_URL
;
678 const gchar
*copyright
= "2003-2008, Evan Battaglia";
679 const gchar
*comments
= _("GPS Data and Topo Analyzer, Explorer, and Manager.");
680 const gchar
*license
= _("This program is free software; you can redistribute it and/or modify "
681 "it under the terms of the GNU General Public License as published by "
682 "the Free Software Foundation; either version 2 of the License, or "
683 "(at your option) any later version."
685 "This program is distributed in the hope that it will be useful, "
686 "but WITHOUT ANY WARRANTY; without even the implied warranty of "
687 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
688 "GNU General Public License for more details."
690 "You should have received a copy of the GNU General Public License "
691 "along with this program; if not, write to the Free Software "
692 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA");
694 gtk_about_dialog_set_url_hook (about_url_hook
, NULL
, NULL
);
695 gtk_about_dialog_set_email_hook (about_email_hook
, NULL
, NULL
);
696 gtk_show_about_dialog (parent
,
697 /* TODO do not set program-name and correctly set info for g_get_application_name */
698 "program-name", program_name
,
701 "comments", comments
,
702 "copyright", copyright
,
704 "wrap-license", TRUE
,
705 /* logo automatically retrieved via gtk_window_get_default_icon_list */
710 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
)
714 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
);
716 GtkWidget
*map_label
= gtk_label_new(_("Map type:"));
717 GtkComboBox
*map_combo
= GTK_COMBO_BOX(gtk_combo_box_new_text());
718 for (s
= mapnames
; *s
; s
++)
719 gtk_combo_box_append_text(map_combo
, *s
);
720 gtk_combo_box_set_active (map_combo
, default_map
);
721 GtkWidget
*zoom_label
= gtk_label_new(_("Zoom level:"));
722 GtkComboBox
*zoom_combo
= GTK_COMBO_BOX(gtk_combo_box_new_text());
723 for (s
= zoom_list
; *s
; s
++)
724 gtk_combo_box_append_text(zoom_combo
, *s
);
725 gtk_combo_box_set_active (zoom_combo
, default_zoom
);
727 GtkTable
*box
= GTK_TABLE(gtk_table_new(2, 2, FALSE
));
728 gtk_table_attach_defaults(box
, GTK_WIDGET(map_label
), 0, 1, 0, 1);
729 gtk_table_attach_defaults(box
, GTK_WIDGET(map_combo
), 1, 2, 0, 1);
730 gtk_table_attach_defaults(box
, GTK_WIDGET(zoom_label
), 0, 1, 1, 2);
731 gtk_table_attach_defaults(box
, GTK_WIDGET(zoom_combo
), 1, 2, 1, 2);
733 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), GTK_WIDGET(box
), FALSE
, FALSE
, 5 );
735 gtk_widget_show_all ( dialog
);
736 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) != GTK_RESPONSE_ACCEPT
) {
737 gtk_widget_destroy(dialog
);
741 *selected_map
= gtk_combo_box_get_active(map_combo
);
742 *selected_zoom
= gtk_combo_box_get_active(zoom_combo
);
744 gtk_widget_destroy(dialog
);