2
* (GBONDS) GNOME based Savings Bond Inventory Program
4
* file.c: FILE menu dialog module
6
* Copyright (C) 2001-2003 Jim Evins <evins@snaught.com>.
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.
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.
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
37
/*===========================================*/
39
/*===========================================*/
41
/* Saved state of file selectors */
42
static gchar *open_path = NULL;
43
static gchar *import_path = NULL;
44
static gchar *save_path = NULL;
46
/*===========================================*/
47
/* Local function prototypes. */
48
/*===========================================*/
49
#ifdef HAVE_FILE_CHOOSER
50
static void open_response (GtkDialog *chooser,
53
static void import_response (GtkDialog *chooser,
56
static void save_as_response (GtkDialog *chooser,
60
static void open_ok (GtkWidget *widget,
61
GtkFileSelection *fsel);
63
static void import_ok (GtkWidget *widget,
64
GtkFileSelection *fsel);
65
static void save_as_ok_cb (GtkWidget *widget,
66
GtkFileSelection *fsel);
67
static void save_as_cancel_cb (GtkWidget *widget,
68
GtkFileSelection *fsel);
69
static void save_as_destroy_cb (GtkWidget *widget,
70
gboolean *destroy_flag);
73
gboolean import_real (const gchar *filename,
78
/*****************************************************************************/
79
/* "New" menu callback. */
80
/*****************************************************************************/
82
gb_file_new (GtkWindow *window)
85
GtkWidget *new_window;
87
gb_debug (DEBUG_FILE, "START");
89
g_return_if_fail (window && GB_IS_WINDOW(window));
91
doc = GB_DOC(gb_doc_new ());
93
if ( gb_window_is_empty (GB_WINDOW(window)) ) {
94
gb_window_set_doc (GB_WINDOW(window), doc);
96
new_window = gb_window_new_from_doc (doc);
97
gtk_widget_show_all (new_window);
100
g_object_unref (doc);
102
gb_debug (DEBUG_FILE, "END");
105
#ifdef HAVE_FILE_CHOOSER
107
/*****************************************************************************/
108
/* "Open" menu callback. */
109
/*****************************************************************************/
111
gb_file_open (GtkWindow *window)
114
GtkFileFilter *filter;
116
gb_debug (DEBUG_FILE, "START");
118
g_return_if_fail (window != NULL);
120
chooser = gtk_file_chooser_dialog_new ("Open inventory",
122
GTK_FILE_CHOOSER_ACTION_OPEN,
123
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
124
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
127
/* Recover state of open dialog */
128
if (open_path != NULL) {
129
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
133
filter = gtk_file_filter_new ();
134
gtk_file_filter_add_pattern (filter, "*");
135
gtk_file_filter_set_name (filter, _("All files"));
136
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
138
filter = gtk_file_filter_new ();
139
gtk_file_filter_add_pattern (filter, "*.gbonds");
140
gtk_file_filter_set_name (filter, _("GBonds documents"));
141
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
143
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
145
g_signal_connect (G_OBJECT (chooser), "response",
146
G_CALLBACK (open_response), window);
148
/* show the dialog */
149
gtk_widget_show (GTK_WIDGET (chooser));
151
gb_debug (DEBUG_FILE, "END");
154
/*---------------------------------------------------------------------------*/
155
/* PRIVATE. Open "response" callback. */
156
/*---------------------------------------------------------------------------*/
158
open_response (GtkDialog *chooser,
166
EggRecentModel *recent;
168
gb_debug (DEBUG_FILE, "START");
170
g_return_if_fail (chooser && GTK_IS_FILE_CHOOSER (chooser));
171
g_return_if_fail (window && GTK_IS_WINDOW (window));
175
case GTK_RESPONSE_ACCEPT:
176
/* get the filename */
177
raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
178
filename = g_filename_to_utf8 (raw_filename, -1, NULL, NULL, NULL);
182
g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
184
dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
185
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
188
_("Empty file name selection"),
189
_("Please select a file or supply a valid file name"));
191
gtk_dialog_run (GTK_DIALOG (dlg));
192
gtk_widget_destroy (dlg);
196
if (!g_file_test (raw_filename, G_FILE_TEST_IS_REGULAR)) {
198
dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
199
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
202
_("File does not exist"),
203
_("Please select a file or supply a valid file name"));
205
gtk_dialog_run (GTK_DIALOG (dlg));
206
gtk_widget_destroy (dlg);
211
if ( gb_file_open_real (filename, window) ) {
212
gtk_widget_destroy (GTK_WIDGET (chooser));
220
g_free (raw_filename);
224
gtk_widget_destroy (GTK_WIDGET (chooser));
229
gb_debug (DEBUG_FILE, "END");
234
/*****************************************************************************/
235
/* "Open" menu callback. */
236
/*****************************************************************************/
238
gb_file_open (GtkWindow *window)
240
GtkFileSelection *fsel;
242
gb_debug (DEBUG_FILE, "START");
244
g_return_if_fail (window != NULL);
246
fsel = GTK_FILE_SELECTION (gtk_file_selection_new (_("Open")));
247
gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
248
gtk_window_set_title (GTK_WINDOW (fsel), _("Open inventory"));
250
g_object_set_data (G_OBJECT (fsel), "parent_window", window);
252
g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
253
G_CALLBACK (open_ok), fsel);
255
g_signal_connect_swapped (G_OBJECT (fsel->cancel_button), "clicked",
256
G_CALLBACK (gtk_widget_destroy),
259
/* Recover state of open dialog */
260
if (open_path != NULL) {
261
gtk_file_selection_set_filename (fsel, open_path);
264
/* show the dialog */
265
gtk_widget_show (GTK_WIDGET (fsel));
267
gb_debug (DEBUG_FILE, "END");
270
/*---------------------------------------------------------------------------*/
271
/* PRIVATE. Open "O.K." button callback. */
272
/*---------------------------------------------------------------------------*/
274
open_ok (GtkWidget *widget,
275
GtkFileSelection *fsel)
280
EggRecentModel *recent;
283
gb_debug (DEBUG_FILE, "START");
285
g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
287
/* get the filename */
288
filename = g_strdup (gtk_file_selection_get_filename (fsel));
290
if (!filename || g_file_test (filename, G_FILE_TEST_IS_DIR)) {
292
dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
293
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
296
_("Empty file name selection"),
297
_("Please select a file or supply a valid file name"));
299
gtk_dialog_run (GTK_DIALOG (dlg));
300
gtk_widget_destroy (dlg);
304
if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
306
dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
307
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
310
_("File does not exist"),
311
_("Please select a file or supply a valid file name"));
313
gtk_dialog_run (GTK_DIALOG (dlg));
314
gtk_widget_destroy (dlg);
319
window = g_object_get_data (G_OBJECT(fsel),
322
if ( gb_file_open_real (filename, window) ) {
323
gtk_widget_destroy (GTK_WIDGET (fsel));
332
gb_debug (DEBUG_FILE, "END");
337
/*****************************************************************************/
338
/* "Open recent" menu callback. */
339
/*****************************************************************************/
341
gb_file_open_recent (EggRecentView *view,
345
gboolean result = FALSE;
348
gb_debug (DEBUG_FILE, "");
350
filename = gb_recent_get_filename (item);
353
gb_debug (DEBUG_FILE, "open recent: %s", filename);
355
result = gb_file_open_real (filename, window);
362
/*---------------------------------------------------------------------------*/
363
/* PRIVATE. Open a file. */
364
/*---------------------------------------------------------------------------*/
366
gb_file_open_real (const gchar *filename,
371
gbDocXMLStatus status;
372
EggRecentModel *recent;
374
GtkWidget *new_window;
376
gb_debug (DEBUG_FILE, "START");
378
abs_filename = gb_util_make_absolute (filename);
379
doc = gb_doc_xml_open (abs_filename, &status);
384
gb_debug (DEBUG_FILE, "couldn't open file");
386
primary_msg = g_strdup_printf (_("Could not open file \"%s\""),
389
dlg = gb_hig_alert_new (window,
390
GTK_DIALOG_DESTROY_WITH_PARENT,
394
_("Not a supported file format"));
396
g_free (primary_msg);
398
gtk_dialog_run (GTK_DIALOG (dlg));
399
gtk_widget_destroy (dlg);
401
g_free (abs_filename);
403
gb_debug (DEBUG_FILE, "END false");
409
if ( gb_window_is_empty (GB_WINDOW(window)) ) {
410
gb_window_set_doc (GB_WINDOW(window), doc);
412
new_window = gb_window_new_from_doc (doc);
413
gtk_widget_show_all (new_window);
416
gb_recent_add_uri (abs_filename);
418
if (open_path != NULL)
420
open_path = g_path_get_dirname (abs_filename);
421
#ifndef HAVE_FILE_CHOOSER
422
if (open_path != NULL)
423
open_path = g_strconcat (open_path, "/", NULL);
426
g_free (abs_filename);
428
gb_debug (DEBUG_FILE, "END true");
435
#ifdef HAVE_FILE_CHOOSER
437
/*****************************************************************************/
438
/* "Import" menu callback. */
439
/*****************************************************************************/
441
gb_file_import (GtkWindow *window)
444
GtkFileFilter *filter;
446
gb_debug (DEBUG_FILE, "START");
448
g_return_if_fail (window != NULL);
450
chooser = gtk_file_chooser_dialog_new ("Import inventory",
452
GTK_FILE_CHOOSER_ACTION_OPEN,
453
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
454
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
457
/* Recover state of import dialog */
458
if (import_path != NULL) {
459
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
463
filter = gtk_file_filter_new ();
464
gtk_file_filter_add_pattern (filter, "*");
465
gtk_file_filter_set_name (filter, _("All files"));
466
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
468
filter = gtk_file_filter_new ();
469
gtk_file_filter_add_pattern (filter, "*.sbw");
470
gtk_file_filter_set_name (filter, _("SBW documents"));
471
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
473
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
475
g_signal_connect (G_OBJECT (chooser), "response",
476
G_CALLBACK (import_response), window);
478
/* show the dialog */
479
gtk_widget_show (GTK_WIDGET (chooser));
481
gb_debug (DEBUG_FILE, "END");
484
/*---------------------------------------------------------------------------*/
485
/* PRIVATE. Import "response" callback. */
486
/*---------------------------------------------------------------------------*/
488
import_response (GtkDialog *chooser,
496
EggRecentModel *recent;
498
gb_debug (DEBUG_FILE, "START");
500
g_return_if_fail (chooser && GTK_IS_FILE_CHOOSER (chooser));
501
g_return_if_fail (window && GTK_IS_WINDOW (window));
505
case GTK_RESPONSE_ACCEPT:
506
/* get the filename */
507
raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
508
filename = g_filename_to_utf8 (raw_filename, -1, NULL, NULL, NULL);
512
g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
514
dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
515
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
518
_("Empty file name selection"),
519
_("Please select a file or supply a valid file name"));
521
gtk_dialog_run (GTK_DIALOG (dlg));
522
gtk_widget_destroy (dlg);
526
if (!g_file_test (raw_filename, G_FILE_TEST_IS_REGULAR)) {
528
dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
529
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
532
_("File does not exist"),
533
_("Please select a file or supply a valid file name"));
535
gtk_dialog_run (GTK_DIALOG (dlg));
536
gtk_widget_destroy (dlg);
541
if ( import_real (filename, window) ) {
542
gtk_widget_destroy (GTK_WIDGET (chooser));
550
g_free (raw_filename);
554
gtk_widget_destroy (GTK_WIDGET (chooser));
559
gb_debug (DEBUG_FILE, "END");
564
/*****************************************************************************/
565
/* "Import" menu callback. */
566
/*****************************************************************************/
568
gb_file_import (GtkWindow *window)
570
GtkFileSelection *fsel;
572
gb_debug (DEBUG_FILE, "START");
574
g_return_if_fail (window != NULL);
576
fsel = GTK_FILE_SELECTION (gtk_file_selection_new (_("Import")));
577
gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
578
gtk_window_set_title (GTK_WINDOW (fsel), _("Import inventory"));
580
g_object_set_data (G_OBJECT (fsel), "parent_window", window);
582
g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
583
G_CALLBACK (import_ok), fsel);
585
g_signal_connect_swapped (G_OBJECT (fsel->cancel_button), "clicked",
586
G_CALLBACK (gtk_widget_destroy),
589
/* Recover state of import dialog */
590
if (import_path != NULL) {
591
gtk_file_selection_set_filename (fsel, import_path);
594
/* show the dialog */
595
gtk_widget_show (GTK_WIDGET (fsel));
597
gb_debug (DEBUG_FILE, "END");
600
/*---------------------------------------------------------------------------*/
601
/* PRIVATE. Import "O.K." button callback. */
602
/*---------------------------------------------------------------------------*/
604
import_ok (GtkWidget *widget,
605
GtkFileSelection *fsel)
610
EggRecentModel *recent;
613
gb_debug (DEBUG_FILE, "START");
615
g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
617
/* get the filename */
618
filename = g_strdup (gtk_file_selection_get_filename (fsel));
620
if (!filename || g_file_test (filename, G_FILE_TEST_IS_DIR)) {
622
dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
623
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
626
_("Empty file name selection"),
627
_("Please select a file or supply a valid file name"));
629
gtk_dialog_run (GTK_DIALOG (dlg));
630
gtk_widget_destroy (dlg);
634
if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
636
dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
637
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
640
_("File does not exist"),
641
_("Please select a file or supply a valid file name"));
643
gtk_dialog_run (GTK_DIALOG (dlg));
644
gtk_widget_destroy (dlg);
649
window = g_object_get_data (G_OBJECT(fsel),
652
if ( import_real (filename, window) ) {
653
gtk_widget_destroy (GTK_WIDGET (fsel));
662
gb_debug (DEBUG_FILE, "END");
667
/*---------------------------------------------------------------------------*/
668
/* PRIVATE. Import a file. */
669
/*---------------------------------------------------------------------------*/
671
import_real (const gchar *filename,
676
gbDocSBWStatus status;
677
EggRecentModel *recent;
679
GtkWidget *new_window;
681
gb_debug (DEBUG_FILE, "START");
683
abs_filename = gb_util_make_absolute (filename);
684
doc = gb_doc_sbw_open (abs_filename, &status);
689
gb_debug (DEBUG_FILE, "couldn't open file");
691
primary_msg = g_strdup_printf (_("Could not open file \"%s\""),
694
dlg = gb_hig_alert_new (window,
695
GTK_DIALOG_DESTROY_WITH_PARENT,
699
_("Not a supported file format"));
701
g_free (primary_msg);
703
gtk_dialog_run (GTK_DIALOG (dlg));
704
gtk_widget_destroy (dlg);
706
g_free (abs_filename);
708
gb_debug (DEBUG_FILE, "END false");
714
if ( gb_window_is_empty (GB_WINDOW(window)) ) {
715
gb_window_set_doc (GB_WINDOW(window), doc);
717
new_window = gb_window_new_from_doc (doc);
718
gtk_widget_show_all (new_window);
721
if (import_path != NULL)
722
g_free (import_path);
723
import_path = g_path_get_dirname (abs_filename);
724
#ifndef HAVE_FILE_CHOOSER
725
if (import_path != NULL)
726
import_path = g_strconcat (import_path, "/", NULL);
728
g_free (abs_filename);
730
gb_debug (DEBUG_FILE, "END true");
737
/*****************************************************************************/
738
/* "Save" menu callback. */
739
/*****************************************************************************/
741
gb_file_save (gbDoc *doc,
744
gbDocXMLStatus status;
745
GError *error = NULL;
746
gchar *filename = NULL;
747
EggRecentModel *recent;
749
gb_debug (DEBUG_FILE, "");
751
g_return_val_if_fail (doc != NULL, FALSE);
753
if (gb_doc_is_untitled (doc))
755
gb_debug (DEBUG_FILE, "Untitled");
757
return gb_file_save_as (doc, window);
760
if (!gb_doc_is_modified (doc))
762
gb_debug (DEBUG_FILE, "Not modified");
767
filename = gb_doc_get_filename (doc);
768
g_return_val_if_fail (filename != NULL, FALSE);
770
gb_doc_xml_save (doc, filename, &status);
772
if (status != GB_DOC_XML_OK)
777
gb_debug (DEBUG_FILE, "FAILED");
779
primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
782
dialog = gb_hig_alert_new (window,
783
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
787
_("Error encountered during save. The file is still not saved."));
789
g_free (primary_msg);
791
gtk_dialog_run (GTK_DIALOG (dialog));
792
gtk_widget_destroy (dialog);
800
gb_debug (DEBUG_FILE, "OK");
802
gb_recent_add_uri (filename);
810
#ifdef HAVE_FILE_CHOOSER
812
/*****************************************************************************/
813
/* "Save As" menu callback. */
814
/*****************************************************************************/
816
gb_file_save_as (gbDoc *doc,
820
GtkFileFilter *filter;
821
gboolean saved_flag = FALSE;
824
gb_debug (DEBUG_FILE, "START");
826
g_return_val_if_fail (doc && GB_IS_DOC(doc), FALSE);
827
g_return_val_if_fail (window && GTK_IS_WINDOW(window), FALSE);
829
name = gb_doc_get_short_name (doc);
830
title = g_strdup_printf (_("Save \"%s\" as"), name);
833
chooser = gtk_file_chooser_dialog_new (title,
835
GTK_FILE_CHOOSER_ACTION_SAVE,
836
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
837
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
840
gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
844
/* Recover proper state of save-as dialog */
845
if (save_path != NULL) {
846
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
850
filter = gtk_file_filter_new ();
851
gtk_file_filter_add_pattern (filter, "*");
852
gtk_file_filter_set_name (filter, _("All files"));
853
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
855
filter = gtk_file_filter_new ();
856
gtk_file_filter_add_pattern (filter, "*.gbonds");
857
gtk_file_filter_set_name (filter, _("GBonds documents"));
858
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
860
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
862
g_signal_connect (G_OBJECT (chooser), "response",
863
G_CALLBACK (save_as_response), doc);
865
g_object_set_data (G_OBJECT (chooser), "saved_flag", &saved_flag);
867
/* show the dialog */
868
gtk_widget_show (GTK_WIDGET (chooser));
870
/* Hold here and process events until we are done with this dialog. */
871
/* This is so we can return a boolean result of our save attempt. */
874
gb_debug (DEBUG_FILE, "END");
876
/* Return flag as set by one of the above callbacks, TRUE = saved */
880
/*---------------------------------------------------------------------------*/
881
/* PRIVATE. "Save As" ok button callback. */
882
/*---------------------------------------------------------------------------*/
884
save_as_response (GtkDialog *chooser,
888
gchar *raw_filename, *filename, *full_filename;
890
gbDocXMLStatus status;
891
EggRecentModel *recent;
892
gboolean *saved_flag;
894
gboolean cancel_flag = FALSE;
896
gb_debug (DEBUG_FILE, "START");
898
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
900
saved_flag = g_object_get_data (G_OBJECT(chooser), "saved_flag");
904
case GTK_RESPONSE_ACCEPT:
905
/* get the filename */
906
raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
908
gb_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename);
910
if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
912
dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
913
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
916
_("Empty file name selection"),
917
_("Please supply a valid file name"));
919
gtk_dialog_run (GTK_DIALOG (dlg));
920
gtk_widget_destroy (dlg);
924
full_filename = gb_util_add_extension (raw_filename);
926
filename = g_filename_to_utf8 (full_filename, -1,
929
gb_debug (DEBUG_FILE, "filename = \"%s\"", filename);
931
if (g_file_test (full_filename, G_FILE_TEST_IS_REGULAR)) {
934
primary_msg = g_strdup_printf (_("Overwrite file \"%s\"?"),
937
dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
938
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
939
GTK_MESSAGE_QUESTION,
942
_("File already exists."));
944
g_free (primary_msg);
946
ret = gtk_dialog_run (GTK_DIALOG (dlg));
947
if ( ret == GTK_RESPONSE_NO ) {
950
gtk_widget_destroy (dlg);
955
gb_doc_xml_save (doc, filename, &status);
957
gb_debug (DEBUG_FILE, "status of save = %d", status);
959
if ( status != GB_DOC_XML_OK ) {
961
primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
964
dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
965
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
969
_("Error encountered during save. The file is still not saved."));
971
g_free (primary_msg);
973
gtk_dialog_run (GTK_DIALOG (dlg));
974
gtk_widget_destroy (dlg);
980
gb_recent_add_uri (filename);
982
if (save_path != NULL)
984
save_path = g_path_get_dirname (filename);
986
gtk_widget_destroy (GTK_WIDGET (chooser));
993
g_free (full_filename);
996
g_free (raw_filename);
1000
*saved_flag = FALSE;
1001
gtk_widget_destroy (GTK_WIDGET (chooser));
1007
gb_debug (DEBUG_FILE, "END");
1012
/*****************************************************************************/
1013
/* "Save As" menu callback. */
1014
/*****************************************************************************/
1016
gb_file_save_as (gbDoc *doc,
1019
GtkFileSelection *fsel;
1020
gboolean saved_flag = FALSE;
1021
gboolean destroy_flag = FALSE;
1022
gchar *name, *title;
1024
gb_debug (DEBUG_FILE, "START");
1026
g_return_val_if_fail (doc && GB_IS_DOC(doc), FALSE);
1027
g_return_val_if_fail (window && GTK_IS_WINDOW(window), FALSE);
1029
name = gb_doc_get_short_name (doc);
1030
title = g_strdup_printf (_("Save \"%s\" as"), name);
1033
fsel = GTK_FILE_SELECTION (gtk_file_selection_new (title));
1034
gtk_window_set_modal (GTK_WINDOW (fsel), TRUE);
1035
gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
1037
g_object_set_data (G_OBJECT (fsel), "doc", doc);
1038
g_object_set_data (G_OBJECT (fsel), "saved_flag", &saved_flag);
1040
g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
1041
G_CALLBACK (save_as_ok_cb), fsel);
1043
g_signal_connect (G_OBJECT (fsel->cancel_button), "clicked",
1044
G_CALLBACK (save_as_cancel_cb), fsel);
1046
g_signal_connect (G_OBJECT (fsel), "destroy",
1047
G_CALLBACK (save_as_destroy_cb), &destroy_flag);
1049
/* Recover proper state of save-as dialog */
1050
if (save_path != NULL) {
1051
gtk_file_selection_set_filename (fsel, save_path);
1054
/* show the dialog */
1055
gtk_widget_show (GTK_WIDGET (fsel));
1057
/* Hold here and process events until we are done with this dialog. */
1060
/* Destroy dialog if not already destroyed. */
1061
if (!destroy_flag) {
1062
/* Disconnect our destroy callback first, so that we don't
1063
* kill the current gtk_main() loop. */
1064
g_signal_handlers_disconnect_by_func (GTK_OBJECT (fsel),
1065
G_CALLBACK (save_as_destroy_cb),
1067
gtk_widget_destroy (GTK_WIDGET (fsel));
1072
gb_debug (DEBUG_FILE, "END");
1074
/* Return flag as set by one of the above callbacks, TRUE = saved */
1078
/*---------------------------------------------------------------------------*/
1079
/* PRIVATE. "Save As" ok button callback. */
1080
/*---------------------------------------------------------------------------*/
1082
save_as_ok_cb (GtkWidget *widget,
1083
GtkFileSelection *fsel)
1085
gchar *raw_filename, *filename;
1088
gbDocXMLStatus status;
1089
EggRecentModel *recent;
1090
gboolean *saved_flag;
1092
gboolean cancel_flag = FALSE;
1094
gb_debug (DEBUG_FILE, "START");
1096
g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
1098
doc = g_object_get_data (G_OBJECT(fsel), "doc");
1099
saved_flag = g_object_get_data (G_OBJECT(fsel), "saved_flag");
1101
/* get the filename */
1102
raw_filename = g_strdup (gtk_file_selection_get_filename (fsel));
1104
gb_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename);
1106
if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
1108
dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
1109
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1110
GTK_MESSAGE_WARNING,
1112
_("Empty file name selection"),
1113
_("Please supply a valid file name"));
1115
gtk_dialog_run (GTK_DIALOG (dlg));
1116
gtk_widget_destroy (dlg);
1120
filename = gb_util_add_extension (raw_filename);
1122
gb_debug (DEBUG_FILE, "filename = \"%s\"", filename);
1124
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
1127
primary_msg = g_strdup_printf (_("Overwrite file \"%s\"?"),
1130
dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
1131
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1132
GTK_MESSAGE_QUESTION,
1135
_("File already exists."));
1137
g_free (primary_msg);
1139
ret = gtk_dialog_run (GTK_DIALOG (dlg));
1140
if ( ret == GTK_RESPONSE_NO ) {
1143
gtk_widget_destroy (dlg);
1148
gb_doc_xml_save (doc, filename, &status);
1150
gb_debug (DEBUG_FILE, "status of save = %d", status);
1152
if ( status != GB_DOC_XML_OK ) {
1154
primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
1157
dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
1158
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1162
_("Error encountered during save. The file is still not saved."));
1164
g_free (primary_msg);
1166
gtk_dialog_run (GTK_DIALOG (dlg));
1167
gtk_widget_destroy (dlg);
1173
gb_recent_add_uri (filename);
1175
if (save_path != NULL)
1177
save_path = g_path_get_dirname (filename);
1178
if (save_path != NULL)
1179
save_path = g_strconcat (save_path, "/", NULL);
1181
gtk_widget_destroy (GTK_WIDGET (fsel));
1189
g_free (raw_filename);
1191
gb_debug (DEBUG_FILE, "END");
1194
/*---------------------------------------------------------------------------*/
1195
/* PRIVATE. "Save As" cancel button callback. */
1196
/*---------------------------------------------------------------------------*/
1198
save_as_cancel_cb (GtkWidget *widget,
1199
GtkFileSelection *fsel)
1201
gboolean *saved_flag = g_object_get_data (G_OBJECT (fsel), "saved_flag");
1203
g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
1205
*saved_flag = FALSE;
1206
gtk_widget_hide (GTK_WIDGET (fsel));
1210
/*---------------------------------------------------------------------------*/
1211
/* PRIVATE. "Save As" destroy callback. */
1212
/*---------------------------------------------------------------------------*/
1214
save_as_destroy_cb (GtkWidget *widget,
1215
gboolean *destroy_flag)
1217
*destroy_flag = TRUE;
1223
/*****************************************************************************/
1224
/* "Close" menu callback. */
1225
/*****************************************************************************/
1227
gb_file_close (gbWindow *window)
1231
gboolean close = TRUE;
1233
gb_debug (DEBUG_FILE, "START");
1235
g_return_val_if_fail (window && GB_IS_WINDOW(window), TRUE);
1237
if ( !gb_window_is_empty (window) ) {
1239
view = GB_VIEW(window->view);
1242
if (gb_doc_is_modified (doc)) {
1243
GtkWidget *msgbox, *w;
1244
gchar *fname = NULL, *msg = NULL;
1248
fname = gb_doc_get_short_name (doc);
1250
msg = g_strdup_printf (_("Save changes to document \"%s\" before closing?"),
1253
msgbox = gb_hig_alert_new (GTK_WINDOW(window),
1254
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1255
GTK_MESSAGE_WARNING,
1258
_("Your changes will be lost if you don't save them."));
1260
gtk_dialog_add_button (GTK_DIALOG (msgbox),
1261
_("Close without saving"),
1264
gtk_dialog_add_button (GTK_DIALOG (msgbox),
1265
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
1267
gtk_dialog_add_button (GTK_DIALOG (msgbox),
1268
GTK_STOCK_SAVE, GTK_RESPONSE_YES);
1270
gtk_dialog_set_default_response (GTK_DIALOG (msgbox), GTK_RESPONSE_YES);
1272
gtk_window_set_resizable (GTK_WINDOW (msgbox), FALSE);
1274
ret = gtk_dialog_run (GTK_DIALOG (msgbox));
1276
gtk_widget_destroy (msgbox);
1283
case GTK_RESPONSE_YES:
1284
close = gb_file_save (doc,
1285
GTK_WINDOW(window));
1287
case GTK_RESPONSE_NO:
1294
gb_debug (DEBUG_FILE, "CLOSE: %s", close ? "TRUE" : "FALSE");
1300
gtk_widget_destroy (GTK_WIDGET(window));
1302
if ( gb_window_get_window_list () == NULL ) {
1304
gb_debug (DEBUG_FILE, "All windows closed.");
1306
bonobo_main_quit ();
1311
gb_debug (DEBUG_FILE, "END");
1316
/*****************************************************************************/
1317
/* "Exit" menu callback. */
1318
/*****************************************************************************/
1322
const GList *window_list;
1325
gb_debug (DEBUG_FILE, "START");
1327
window_list = gb_window_get_window_list ();
1329
for (p=(GList *)window_list; p != NULL; p=p_next) {
1332
gb_file_close (GB_WINDOW(p->data));
1335
gb_debug (DEBUG_FILE, "END");