~ubuntu-branches/ubuntu/vivid/gbonds/vivid

« back to all changes in this revision

Viewing changes to src/file.c

  • Committer: Bazaar Package Importer
  • Author(s): Richard Laager
  • Date: 2007-03-14 23:50:34 UTC
  • Revision ID: james.westby@ubuntu.com-20070314235034-997qegw33jx0wb9r
Tags: upstream-2.0.2
ImportĀ upstreamĀ versionĀ 2.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  (GBONDS) GNOME based Savings Bond Inventory Program
 
3
 *
 
4
 *  file.c:  FILE menu dialog module
 
5
 *
 
6
 *  Copyright (C) 2001-2003  Jim Evins <evins@snaught.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 <config.h>
 
24
 
 
25
#include <gnome.h>
 
26
#include <string.h>
 
27
 
 
28
#include "doc-xml.h"
 
29
#include "doc-sbw.h"
 
30
#include "file.h"
 
31
#include "recent.h"
 
32
#include "hig.h"
 
33
#include "util.h"
 
34
 
 
35
#include "debug.h"
 
36
 
 
37
/*===========================================*/
 
38
/* Private globals                           */
 
39
/*===========================================*/
 
40
 
 
41
/* Saved state of file selectors */
 
42
static gchar *open_path   = NULL;
 
43
static gchar *import_path = NULL;
 
44
static gchar *save_path   = NULL;
 
45
 
 
46
/*===========================================*/
 
47
/* Local function prototypes.                */
 
48
/*===========================================*/
 
49
#ifdef HAVE_FILE_CHOOSER
 
50
static void open_response             (GtkDialog         *chooser,
 
51
                                       gint               response,
 
52
                                       GtkWindow         *window);
 
53
static void import_response           (GtkDialog         *chooser,
 
54
                                       gint               response,
 
55
                                       GtkWindow         *window);
 
56
static void save_as_response          (GtkDialog         *chooser,
 
57
                                       gint               response,
 
58
                                       gbDoc             *doc);
 
59
#else
 
60
static void open_ok                   (GtkWidget         *widget,
 
61
                                       GtkFileSelection  *fsel);
 
62
 
 
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);
 
71
#endif
 
72
 
 
73
gboolean    import_real               (const gchar       *filename,
 
74
                                       GtkWindow         *window);
 
75
 
 
76
 
 
77
 
 
78
/*****************************************************************************/
 
79
/* "New" menu callback.                                                      */
 
80
/*****************************************************************************/
 
81
void
 
82
gb_file_new (GtkWindow *window)
 
83
{
 
84
        gbDoc     *doc;
 
85
        GtkWidget *new_window;
 
86
 
 
87
        gb_debug (DEBUG_FILE, "START");
 
88
 
 
89
        g_return_if_fail (window && GB_IS_WINDOW(window));
 
90
 
 
91
        doc = GB_DOC(gb_doc_new ());
 
92
 
 
93
        if ( gb_window_is_empty (GB_WINDOW(window)) ) {
 
94
                gb_window_set_doc (GB_WINDOW(window), doc);
 
95
        } else {
 
96
                new_window = gb_window_new_from_doc (doc);
 
97
                gtk_widget_show_all (new_window);
 
98
        }
 
99
 
 
100
        g_object_unref (doc);
 
101
 
 
102
        gb_debug (DEBUG_FILE, "END");
 
103
}
 
104
 
 
105
#ifdef HAVE_FILE_CHOOSER
 
106
 
 
107
/*****************************************************************************/
 
108
/* "Open" menu callback.                                                     */
 
109
/*****************************************************************************/
 
110
void
 
111
gb_file_open (GtkWindow *window)
 
112
{
 
113
        GtkWidget     *chooser;
 
114
        GtkFileFilter *filter;
 
115
 
 
116
        gb_debug (DEBUG_FILE, "START");
 
117
 
 
118
        g_return_if_fail (window != NULL);
 
119
 
 
120
        chooser = gtk_file_chooser_dialog_new ("Open inventory",
 
121
                                               window,
 
122
                                               GTK_FILE_CHOOSER_ACTION_OPEN,
 
123
                                               GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
 
124
                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
125
                                               NULL);
 
126
 
 
127
        /* Recover state of open dialog */
 
128
        if (open_path != NULL) {
 
129
                gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
 
130
                                                     open_path);
 
131
        }
 
132
 
 
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);
 
137
 
 
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);
 
142
 
 
143
        gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
 
144
 
 
145
        g_signal_connect (G_OBJECT (chooser), "response",
 
146
                          G_CALLBACK (open_response), window);
 
147
 
 
148
        /* show the dialog */
 
149
        gtk_widget_show (GTK_WIDGET (chooser));
 
150
 
 
151
        gb_debug (DEBUG_FILE, "END");
 
152
}
 
153
 
 
154
/*---------------------------------------------------------------------------*/
 
155
/* PRIVATE.  Open "response" callback.                                       */
 
156
/*---------------------------------------------------------------------------*/
 
157
static void
 
158
open_response (GtkDialog     *chooser,
 
159
               gint           response,
 
160
               GtkWindow     *window)
 
161
{
 
162
        gchar            *raw_filename;
 
163
        gchar            *filename;
 
164
        GtkWidget        *dlg;
 
165
        gint              ret;
 
166
        EggRecentModel   *recent;
 
167
 
 
168
        gb_debug (DEBUG_FILE, "START");
 
169
 
 
170
        g_return_if_fail (chooser && GTK_IS_FILE_CHOOSER (chooser));
 
171
        g_return_if_fail (window && GTK_IS_WINDOW (window));
 
172
 
 
173
        switch (response) {
 
174
 
 
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);
 
179
 
 
180
                if (!raw_filename || 
 
181
                    !filename || 
 
182
                    g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
 
183
 
 
184
                        dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
 
185
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
186
                                        GTK_MESSAGE_WARNING,
 
187
                                        GTK_BUTTONS_CLOSE,
 
188
                                        _("Empty file name selection"),
 
189
                                        _("Please select a file or supply a valid file name"));
 
190
 
 
191
                        gtk_dialog_run (GTK_DIALOG (dlg));
 
192
                        gtk_widget_destroy (dlg);
 
193
 
 
194
                } else {
 
195
 
 
196
                        if (!g_file_test (raw_filename, G_FILE_TEST_IS_REGULAR)) {
 
197
 
 
198
                                dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
 
199
                                                GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
200
                                                GTK_MESSAGE_WARNING,
 
201
                                                GTK_BUTTONS_CLOSE,
 
202
                                                _("File does not exist"),
 
203
                                                _("Please select a file or supply a valid file name"));
 
204
 
 
205
                                gtk_dialog_run (GTK_DIALOG (dlg));
 
206
                                gtk_widget_destroy (dlg);
 
207
 
 
208
 
 
209
                        } else {
 
210
                
 
211
                                if ( gb_file_open_real (filename, window) ) {
 
212
                                        gtk_widget_destroy (GTK_WIDGET (chooser));
 
213
                                }
 
214
 
 
215
                        }
 
216
 
 
217
                }
 
218
 
 
219
                g_free (filename);
 
220
                g_free (raw_filename);
 
221
                break;
 
222
 
 
223
        default:
 
224
                gtk_widget_destroy (GTK_WIDGET (chooser));
 
225
                break;
 
226
 
 
227
        }
 
228
 
 
229
        gb_debug (DEBUG_FILE, "END");
 
230
}
 
231
 
 
232
#else
 
233
 
 
234
/*****************************************************************************/
 
235
/* "Open" menu callback.                                                     */
 
236
/*****************************************************************************/
 
237
void
 
238
gb_file_open (GtkWindow *window)
 
239
{
 
240
        GtkFileSelection *fsel;
 
241
 
 
242
        gb_debug (DEBUG_FILE, "START");
 
243
 
 
244
        g_return_if_fail (window != NULL);
 
245
 
 
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"));
 
249
 
 
250
        g_object_set_data (G_OBJECT (fsel), "parent_window", window);
 
251
 
 
252
        g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
 
253
                          G_CALLBACK (open_ok), fsel);
 
254
 
 
255
        g_signal_connect_swapped (G_OBJECT (fsel->cancel_button), "clicked",
 
256
                                  G_CALLBACK (gtk_widget_destroy),
 
257
                                  G_OBJECT (fsel));
 
258
 
 
259
        /* Recover state of open dialog */
 
260
        if (open_path != NULL) {
 
261
                gtk_file_selection_set_filename (fsel, open_path);
 
262
        }
 
263
 
 
264
        /* show the dialog */
 
265
        gtk_widget_show (GTK_WIDGET (fsel));
 
266
 
 
267
        gb_debug (DEBUG_FILE, "END");
 
268
}
 
269
 
 
270
/*---------------------------------------------------------------------------*/
 
271
/* PRIVATE.  Open "O.K." button callback.                                    */
 
272
/*---------------------------------------------------------------------------*/
 
273
static void
 
274
open_ok (GtkWidget        *widget,
 
275
         GtkFileSelection *fsel)
 
276
{
 
277
        gchar            *filename;
 
278
        GtkWidget        *dlg;
 
279
        gint              ret;
 
280
        EggRecentModel   *recent;
 
281
        GtkWindow        *window;
 
282
 
 
283
        gb_debug (DEBUG_FILE, "START");
 
284
 
 
285
        g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
 
286
 
 
287
        /* get the filename */
 
288
        filename = g_strdup (gtk_file_selection_get_filename (fsel));
 
289
 
 
290
        if (!filename || g_file_test (filename, G_FILE_TEST_IS_DIR)) {
 
291
 
 
292
                dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
 
293
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
294
                                        GTK_MESSAGE_WARNING,
 
295
                                        GTK_BUTTONS_CLOSE,
 
296
                                        _("Empty file name selection"),
 
297
                                        _("Please select a file or supply a valid file name"));
 
298
 
 
299
                gtk_dialog_run (GTK_DIALOG (dlg));
 
300
                gtk_widget_destroy (dlg);
 
301
 
 
302
        } else {
 
303
 
 
304
                if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
 
305
 
 
306
                        dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
 
307
                                                GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
308
                                                GTK_MESSAGE_WARNING,
 
309
                                                GTK_BUTTONS_CLOSE,
 
310
                                                _("File does not exist"),
 
311
                                                _("Please select a file or supply a valid file name"));
 
312
 
 
313
                        gtk_dialog_run (GTK_DIALOG (dlg));
 
314
                        gtk_widget_destroy (dlg);
 
315
 
 
316
 
 
317
                } else {
 
318
                
 
319
                        window = g_object_get_data (G_OBJECT(fsel),
 
320
                                                    "parent_window");
 
321
 
 
322
                        if ( gb_file_open_real (filename, window) ) {
 
323
                                gtk_widget_destroy (GTK_WIDGET (fsel));
 
324
                        }
 
325
 
 
326
                }
 
327
 
 
328
        }
 
329
 
 
330
        g_free (filename);
 
331
 
 
332
        gb_debug (DEBUG_FILE, "END");
 
333
}
 
334
 
 
335
#endif
 
336
 
 
337
/*****************************************************************************/
 
338
/* "Open recent" menu callback.                                              */
 
339
/*****************************************************************************/
 
340
gboolean
 
341
gb_file_open_recent (EggRecentView   *view,
 
342
                     EggRecentItem   *item,
 
343
                     GtkWindow       *window)
 
344
{
 
345
        gboolean result = FALSE;
 
346
        gchar *filename;
 
347
        
 
348
        gb_debug (DEBUG_FILE, "");
 
349
 
 
350
        filename = gb_recent_get_filename (item);
 
351
 
 
352
        if (filename) {
 
353
                gb_debug (DEBUG_FILE, "open recent: %s", filename);
 
354
 
 
355
                result = gb_file_open_real (filename, window);
 
356
                g_free (filename);
 
357
        }
 
358
 
 
359
        return result;
 
360
}
 
361
 
 
362
/*---------------------------------------------------------------------------*/
 
363
/* PRIVATE.  Open a file.                                                    */
 
364
/*---------------------------------------------------------------------------*/
 
365
gboolean
 
366
gb_file_open_real (const gchar     *filename,
 
367
                   GtkWindow       *window)
 
368
{
 
369
        gchar            *abs_filename;
 
370
        gbDoc            *doc;
 
371
        gbDocXMLStatus    status;
 
372
        EggRecentModel   *recent;
 
373
        gint              ret;
 
374
        GtkWidget        *new_window;
 
375
 
 
376
        gb_debug (DEBUG_FILE, "START");
 
377
 
 
378
        abs_filename = gb_util_make_absolute (filename);
 
379
        doc = gb_doc_xml_open (abs_filename, &status);
 
380
        if (!doc) {
 
381
                GtkWidget *dlg;
 
382
                gchar *primary_msg;
 
383
 
 
384
                gb_debug (DEBUG_FILE, "couldn't open file");
 
385
 
 
386
                primary_msg = g_strdup_printf (_("Could not open file \"%s\""),
 
387
                                               filename);
 
388
 
 
389
                dlg = gb_hig_alert_new (window,
 
390
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
 
391
                                        GTK_MESSAGE_ERROR,
 
392
                                        GTK_BUTTONS_CLOSE,
 
393
                                        primary_msg,
 
394
                                        _("Not a supported file format"));
 
395
 
 
396
                g_free (primary_msg);
 
397
 
 
398
                gtk_dialog_run (GTK_DIALOG (dlg));
 
399
                gtk_widget_destroy (dlg);
 
400
 
 
401
                g_free (abs_filename);
 
402
 
 
403
                gb_debug (DEBUG_FILE, "END false");
 
404
 
 
405
                return FALSE;
 
406
 
 
407
        } else {
 
408
 
 
409
                if ( gb_window_is_empty (GB_WINDOW(window)) ) {
 
410
                        gb_window_set_doc (GB_WINDOW(window), doc);
 
411
                } else {
 
412
                        new_window = gb_window_new_from_doc (doc);
 
413
                        gtk_widget_show_all (new_window);
 
414
                }
 
415
 
 
416
                gb_recent_add_uri (abs_filename);
 
417
 
 
418
                if (open_path != NULL)
 
419
                        g_free (open_path);
 
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);
 
424
#endif
 
425
 
 
426
                g_free (abs_filename);
 
427
 
 
428
                gb_debug (DEBUG_FILE, "END true");
 
429
 
 
430
                return TRUE;
 
431
 
 
432
        }
 
433
}
 
434
 
 
435
#ifdef HAVE_FILE_CHOOSER
 
436
 
 
437
/*****************************************************************************/
 
438
/* "Import" menu callback.                                                   */
 
439
/*****************************************************************************/
 
440
void
 
441
gb_file_import (GtkWindow *window)
 
442
{
 
443
        GtkWidget     *chooser;
 
444
        GtkFileFilter *filter;
 
445
 
 
446
        gb_debug (DEBUG_FILE, "START");
 
447
 
 
448
        g_return_if_fail (window != NULL);
 
449
 
 
450
        chooser = gtk_file_chooser_dialog_new ("Import inventory",
 
451
                                               window,
 
452
                                               GTK_FILE_CHOOSER_ACTION_OPEN,
 
453
                                               GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
 
454
                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
455
                                               NULL);
 
456
 
 
457
        /* Recover state of import dialog */
 
458
        if (import_path != NULL) {
 
459
                gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
 
460
                                                     import_path);
 
461
        }
 
462
 
 
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);
 
467
 
 
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);
 
472
 
 
473
        gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
 
474
 
 
475
        g_signal_connect (G_OBJECT (chooser), "response",
 
476
                          G_CALLBACK (import_response), window);
 
477
 
 
478
        /* show the dialog */
 
479
        gtk_widget_show (GTK_WIDGET (chooser));
 
480
 
 
481
        gb_debug (DEBUG_FILE, "END");
 
482
}
 
483
 
 
484
/*---------------------------------------------------------------------------*/
 
485
/* PRIVATE.  Import "response" callback.                                     */
 
486
/*---------------------------------------------------------------------------*/
 
487
static void
 
488
import_response (GtkDialog     *chooser,
 
489
                 gint           response,
 
490
                 GtkWindow     *window)
 
491
{
 
492
        gchar            *raw_filename;
 
493
        gchar            *filename;
 
494
        GtkWidget        *dlg;
 
495
        gint              ret;
 
496
        EggRecentModel   *recent;
 
497
 
 
498
        gb_debug (DEBUG_FILE, "START");
 
499
 
 
500
        g_return_if_fail (chooser && GTK_IS_FILE_CHOOSER (chooser));
 
501
        g_return_if_fail (window && GTK_IS_WINDOW (window));
 
502
 
 
503
        switch (response) {
 
504
 
 
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);
 
509
 
 
510
                if (!raw_filename || 
 
511
                    !filename || 
 
512
                    g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
 
513
 
 
514
                        dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
 
515
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
516
                                        GTK_MESSAGE_WARNING,
 
517
                                        GTK_BUTTONS_CLOSE,
 
518
                                        _("Empty file name selection"),
 
519
                                        _("Please select a file or supply a valid file name"));
 
520
 
 
521
                        gtk_dialog_run (GTK_DIALOG (dlg));
 
522
                        gtk_widget_destroy (dlg);
 
523
 
 
524
                } else {
 
525
 
 
526
                        if (!g_file_test (raw_filename, G_FILE_TEST_IS_REGULAR)) {
 
527
 
 
528
                                dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
 
529
                                                GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
530
                                                GTK_MESSAGE_WARNING,
 
531
                                                GTK_BUTTONS_CLOSE,
 
532
                                                _("File does not exist"),
 
533
                                                _("Please select a file or supply a valid file name"));
 
534
 
 
535
                                gtk_dialog_run (GTK_DIALOG (dlg));
 
536
                                gtk_widget_destroy (dlg);
 
537
 
 
538
 
 
539
                        } else {
 
540
                
 
541
                                if ( import_real (filename, window) ) {
 
542
                                        gtk_widget_destroy (GTK_WIDGET (chooser));
 
543
                                }
 
544
 
 
545
                        }
 
546
 
 
547
                }
 
548
 
 
549
                g_free (filename);
 
550
                g_free (raw_filename);
 
551
                break;
 
552
 
 
553
        default:
 
554
                gtk_widget_destroy (GTK_WIDGET (chooser));
 
555
                break;
 
556
 
 
557
        }
 
558
 
 
559
        gb_debug (DEBUG_FILE, "END");
 
560
}
 
561
 
 
562
#else
 
563
 
 
564
/*****************************************************************************/
 
565
/* "Import" menu callback.                                                   */
 
566
/*****************************************************************************/
 
567
void
 
568
gb_file_import (GtkWindow *window)
 
569
{
 
570
        GtkFileSelection *fsel;
 
571
 
 
572
        gb_debug (DEBUG_FILE, "START");
 
573
 
 
574
        g_return_if_fail (window != NULL);
 
575
 
 
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"));
 
579
 
 
580
        g_object_set_data (G_OBJECT (fsel), "parent_window", window);
 
581
 
 
582
        g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
 
583
                          G_CALLBACK (import_ok), fsel);
 
584
 
 
585
        g_signal_connect_swapped (G_OBJECT (fsel->cancel_button), "clicked",
 
586
                                  G_CALLBACK (gtk_widget_destroy),
 
587
                                  G_OBJECT (fsel));
 
588
 
 
589
        /* Recover state of import dialog */
 
590
        if (import_path != NULL) {
 
591
                gtk_file_selection_set_filename (fsel, import_path);
 
592
        }
 
593
 
 
594
        /* show the dialog */
 
595
        gtk_widget_show (GTK_WIDGET (fsel));
 
596
 
 
597
        gb_debug (DEBUG_FILE, "END");
 
598
}
 
599
 
 
600
/*---------------------------------------------------------------------------*/
 
601
/* PRIVATE.  Import "O.K." button callback.                                  */
 
602
/*---------------------------------------------------------------------------*/
 
603
static void
 
604
import_ok (GtkWidget        *widget,
 
605
           GtkFileSelection *fsel)
 
606
{
 
607
        gchar            *filename;
 
608
        GtkWidget        *dlg;
 
609
        gint              ret;
 
610
        EggRecentModel   *recent;
 
611
        GtkWindow        *window;
 
612
 
 
613
        gb_debug (DEBUG_FILE, "START");
 
614
 
 
615
        g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
 
616
 
 
617
        /* get the filename */
 
618
        filename = g_strdup (gtk_file_selection_get_filename (fsel));
 
619
 
 
620
        if (!filename || g_file_test (filename, G_FILE_TEST_IS_DIR)) {
 
621
 
 
622
                dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
 
623
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
624
                                        GTK_MESSAGE_WARNING,
 
625
                                        GTK_BUTTONS_CLOSE,
 
626
                                        _("Empty file name selection"),
 
627
                                        _("Please select a file or supply a valid file name"));
 
628
 
 
629
                gtk_dialog_run (GTK_DIALOG (dlg));
 
630
                gtk_widget_destroy (dlg);
 
631
 
 
632
        } else {
 
633
 
 
634
                if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
 
635
 
 
636
                        dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
 
637
                                                GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
638
                                                GTK_MESSAGE_WARNING,
 
639
                                                GTK_BUTTONS_CLOSE,
 
640
                                                _("File does not exist"),
 
641
                                                _("Please select a file or supply a valid file name"));
 
642
 
 
643
                        gtk_dialog_run (GTK_DIALOG (dlg));
 
644
                        gtk_widget_destroy (dlg);
 
645
 
 
646
 
 
647
                } else {
 
648
                
 
649
                        window = g_object_get_data (G_OBJECT(fsel),
 
650
                                                    "parent_window");
 
651
 
 
652
                        if ( import_real (filename, window) ) {
 
653
                                gtk_widget_destroy (GTK_WIDGET (fsel));
 
654
                        }
 
655
 
 
656
                }
 
657
 
 
658
        }
 
659
 
 
660
        g_free (filename);
 
661
 
 
662
        gb_debug (DEBUG_FILE, "END");
 
663
}
 
664
 
 
665
#endif
 
666
 
 
667
/*---------------------------------------------------------------------------*/
 
668
/* PRIVATE.  Import a file.                                                  */
 
669
/*---------------------------------------------------------------------------*/
 
670
gboolean
 
671
import_real (const gchar     *filename,
 
672
             GtkWindow       *window)
 
673
{
 
674
        gchar            *abs_filename;
 
675
        gbDoc            *doc;
 
676
        gbDocSBWStatus    status;
 
677
        EggRecentModel   *recent;
 
678
        gint              ret;
 
679
        GtkWidget        *new_window;
 
680
 
 
681
        gb_debug (DEBUG_FILE, "START");
 
682
 
 
683
        abs_filename = gb_util_make_absolute (filename);
 
684
        doc = gb_doc_sbw_open (abs_filename, &status);
 
685
        if (!doc) {
 
686
                GtkWidget *dlg;
 
687
                gchar *primary_msg;
 
688
 
 
689
                gb_debug (DEBUG_FILE, "couldn't open file");
 
690
 
 
691
                primary_msg = g_strdup_printf (_("Could not open file \"%s\""),
 
692
                                               filename);
 
693
 
 
694
                dlg = gb_hig_alert_new (window,
 
695
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
 
696
                                        GTK_MESSAGE_ERROR,
 
697
                                        GTK_BUTTONS_CLOSE,
 
698
                                        primary_msg,
 
699
                                        _("Not a supported file format"));
 
700
 
 
701
                g_free (primary_msg);
 
702
 
 
703
                gtk_dialog_run (GTK_DIALOG (dlg));
 
704
                gtk_widget_destroy (dlg);
 
705
 
 
706
                g_free (abs_filename);
 
707
 
 
708
                gb_debug (DEBUG_FILE, "END false");
 
709
 
 
710
                return FALSE;
 
711
 
 
712
        } else {
 
713
 
 
714
                if ( gb_window_is_empty (GB_WINDOW(window)) ) {
 
715
                        gb_window_set_doc (GB_WINDOW(window), doc);
 
716
                } else {
 
717
                        new_window = gb_window_new_from_doc (doc);
 
718
                        gtk_widget_show_all (new_window);
 
719
                }
 
720
 
 
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);
 
727
#endif
 
728
                g_free (abs_filename);
 
729
 
 
730
                gb_debug (DEBUG_FILE, "END true");
 
731
 
 
732
                return TRUE;
 
733
 
 
734
        }
 
735
}
 
736
 
 
737
/*****************************************************************************/
 
738
/* "Save" menu callback.                                                     */
 
739
/*****************************************************************************/
 
740
gboolean
 
741
gb_file_save (gbDoc     *doc,
 
742
              GtkWindow *window)
 
743
{
 
744
        gbDocXMLStatus    status;
 
745
        GError           *error = NULL;
 
746
        gchar            *filename = NULL;
 
747
        EggRecentModel   *recent;
 
748
 
 
749
        gb_debug (DEBUG_FILE, "");
 
750
 
 
751
        g_return_val_if_fail (doc != NULL, FALSE);
 
752
        
 
753
        if (gb_doc_is_untitled (doc))
 
754
        {
 
755
                gb_debug (DEBUG_FILE, "Untitled");
 
756
 
 
757
                return gb_file_save_as (doc, window);
 
758
        }
 
759
 
 
760
        if (!gb_doc_is_modified (doc))  
 
761
        {
 
762
                gb_debug (DEBUG_FILE, "Not modified");
 
763
 
 
764
                return TRUE;
 
765
        }
 
766
        
 
767
        filename = gb_doc_get_filename (doc);
 
768
        g_return_val_if_fail (filename != NULL, FALSE);
 
769
        
 
770
        gb_doc_xml_save (doc, filename, &status);
 
771
 
 
772
        if (status != GB_DOC_XML_OK)
 
773
        {
 
774
                GtkWidget *dialog;
 
775
                gchar *primary_msg;
 
776
 
 
777
                gb_debug (DEBUG_FILE, "FAILED");
 
778
 
 
779
                primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
 
780
                                               filename);
 
781
 
 
782
                dialog = gb_hig_alert_new (window,
 
783
                                           GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
784
                                           GTK_MESSAGE_ERROR,
 
785
                                           GTK_BUTTONS_CLOSE,
 
786
                                           primary_msg,
 
787
                                           _("Error encountered during save.  The file is still not saved."));
 
788
 
 
789
                g_free (primary_msg);
 
790
 
 
791
                gtk_dialog_run (GTK_DIALOG (dialog));
 
792
                gtk_widget_destroy (dialog);
 
793
 
 
794
                g_free (filename);
 
795
 
 
796
                return FALSE;
 
797
        }       
 
798
        else
 
799
        {
 
800
                gb_debug (DEBUG_FILE, "OK");
 
801
 
 
802
                gb_recent_add_uri (filename);
 
803
 
 
804
                g_free (filename);
 
805
 
 
806
                return TRUE;
 
807
        }
 
808
}
 
809
 
 
810
#ifdef HAVE_FILE_CHOOSER
 
811
 
 
812
/*****************************************************************************/
 
813
/* "Save As" menu callback.                                                  */
 
814
/*****************************************************************************/
 
815
gboolean
 
816
gb_file_save_as (gbDoc     *doc,
 
817
                 GtkWindow *window)
 
818
{
 
819
        GtkWidget        *chooser;
 
820
        GtkFileFilter    *filter;
 
821
        gboolean          saved_flag = FALSE;
 
822
        gchar            *name, *title;
 
823
 
 
824
        gb_debug (DEBUG_FILE, "START");
 
825
 
 
826
        g_return_val_if_fail (doc && GB_IS_DOC(doc), FALSE);
 
827
        g_return_val_if_fail (window && GTK_IS_WINDOW(window), FALSE);
 
828
 
 
829
        name = gb_doc_get_short_name (doc);
 
830
        title = g_strdup_printf (_("Save \"%s\" as"), name);
 
831
        g_free (name);
 
832
 
 
833
        chooser = gtk_file_chooser_dialog_new (title,
 
834
                                               window,
 
835
                                               GTK_FILE_CHOOSER_ACTION_SAVE,
 
836
                                               GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
 
837
                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 
838
                                               NULL);
 
839
 
 
840
        gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
 
841
 
 
842
        g_free (title);
 
843
 
 
844
        /* Recover proper state of save-as dialog */
 
845
        if (save_path != NULL) {
 
846
                gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
 
847
                                                     save_path);
 
848
        }
 
849
 
 
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);
 
854
 
 
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);
 
859
 
 
860
        gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
 
861
 
 
862
        g_signal_connect (G_OBJECT (chooser), "response",
 
863
                          G_CALLBACK (save_as_response), doc);
 
864
 
 
865
        g_object_set_data (G_OBJECT (chooser), "saved_flag", &saved_flag);
 
866
 
 
867
        /* show the dialog */
 
868
        gtk_widget_show (GTK_WIDGET (chooser));
 
869
 
 
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.   */
 
872
        gtk_main ();
 
873
 
 
874
        gb_debug (DEBUG_FILE, "END");
 
875
 
 
876
        /* Return flag as set by one of the above callbacks, TRUE = saved */
 
877
        return saved_flag;
 
878
}
 
879
 
 
880
/*---------------------------------------------------------------------------*/
 
881
/* PRIVATE.  "Save As" ok button callback.                                   */
 
882
/*---------------------------------------------------------------------------*/
 
883
static void
 
884
save_as_response (GtkDialog     *chooser,
 
885
                  gint           response,
 
886
                  gbDoc         *doc)
 
887
{
 
888
        gchar            *raw_filename, *filename, *full_filename;
 
889
        GtkWidget        *dlg;
 
890
        gbDocXMLStatus    status;
 
891
        EggRecentModel   *recent;
 
892
        gboolean         *saved_flag;
 
893
        gchar            *primary_msg;
 
894
        gboolean          cancel_flag = FALSE;
 
895
 
 
896
        gb_debug (DEBUG_FILE, "START");
 
897
 
 
898
        g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
 
899
 
 
900
        saved_flag = g_object_get_data (G_OBJECT(chooser), "saved_flag");
 
901
 
 
902
        switch (response) {
 
903
 
 
904
        case GTK_RESPONSE_ACCEPT:
 
905
                /* get the filename */
 
906
                raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
 
907
 
 
908
                gb_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename);
 
909
 
 
910
                if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
 
911
 
 
912
                        dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
 
913
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
914
                                        GTK_MESSAGE_WARNING,
 
915
                                        GTK_BUTTONS_CLOSE,
 
916
                                        _("Empty file name selection"),
 
917
                                        _("Please supply a valid file name"));
 
918
 
 
919
                        gtk_dialog_run (GTK_DIALOG (dlg));
 
920
                        gtk_widget_destroy (dlg);
 
921
 
 
922
                } else {
 
923
 
 
924
                        full_filename = gb_util_add_extension (raw_filename);
 
925
 
 
926
                        filename = g_filename_to_utf8 (full_filename, -1,
 
927
                                                       NULL, NULL, NULL);
 
928
 
 
929
                        gb_debug (DEBUG_FILE, "filename = \"%s\"", filename);
 
930
 
 
931
                        if (g_file_test (full_filename, G_FILE_TEST_IS_REGULAR)) {
 
932
                                gint ret;
 
933
 
 
934
                                primary_msg = g_strdup_printf (_("Overwrite file \"%s\"?"),
 
935
                                                               filename);
 
936
 
 
937
                                dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
 
938
                                                GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
939
                                                GTK_MESSAGE_QUESTION,
 
940
                                                GTK_BUTTONS_YES_NO,
 
941
                                                primary_msg,
 
942
                                                _("File already exists."));
 
943
                        
 
944
                                g_free (primary_msg);
 
945
 
 
946
                                ret = gtk_dialog_run (GTK_DIALOG (dlg));
 
947
                                if ( ret == GTK_RESPONSE_NO ) {
 
948
                                        cancel_flag = TRUE;
 
949
                                }
 
950
                                gtk_widget_destroy (dlg);
 
951
                        }
 
952
 
 
953
                        if (!cancel_flag) {
 
954
 
 
955
                                gb_doc_xml_save (doc, filename, &status);
 
956
 
 
957
                                gb_debug (DEBUG_FILE, "status of save = %d", status);
 
958
 
 
959
                                if ( status != GB_DOC_XML_OK ) {
 
960
 
 
961
                                        primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
 
962
                                                                       filename);
 
963
 
 
964
                                        dlg = gb_hig_alert_new (GTK_WINDOW(chooser),
 
965
                                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
966
                                                        GTK_MESSAGE_ERROR,
 
967
                                                        GTK_BUTTONS_CLOSE,
 
968
                                                        primary_msg,
 
969
                                                        _("Error encountered during save.  The file is still not saved."));
 
970
 
 
971
                                        g_free (primary_msg);
 
972
 
 
973
                                        gtk_dialog_run (GTK_DIALOG (dlg));
 
974
                                        gtk_widget_destroy (dlg);
 
975
 
 
976
                                } else {
 
977
 
 
978
                                        *saved_flag = TRUE;
 
979
 
 
980
                                        gb_recent_add_uri (filename);
 
981
 
 
982
                                        if (save_path != NULL)
 
983
                                                g_free (save_path);
 
984
                                        save_path = g_path_get_dirname (filename);
 
985
 
 
986
                                        gtk_widget_destroy (GTK_WIDGET (chooser));
 
987
                                        gtk_main_quit ();
 
988
                                }
 
989
 
 
990
                        }
 
991
 
 
992
                        g_free (filename);
 
993
                        g_free (full_filename);
 
994
                }
 
995
 
 
996
                g_free (raw_filename);
 
997
                break;
 
998
 
 
999
        default:
 
1000
                *saved_flag = FALSE;
 
1001
                gtk_widget_destroy (GTK_WIDGET (chooser));
 
1002
                gtk_main_quit ();
 
1003
                break;
 
1004
 
 
1005
        }
 
1006
 
 
1007
        gb_debug (DEBUG_FILE, "END");
 
1008
}
 
1009
 
 
1010
#else
 
1011
 
 
1012
/*****************************************************************************/
 
1013
/* "Save As" menu callback.                                                  */
 
1014
/*****************************************************************************/
 
1015
gboolean
 
1016
gb_file_save_as (gbDoc     *doc,
 
1017
                 GtkWindow *window)
 
1018
{
 
1019
        GtkFileSelection *fsel;
 
1020
        gboolean          saved_flag = FALSE;
 
1021
        gboolean          destroy_flag = FALSE;
 
1022
        gchar            *name, *title;
 
1023
 
 
1024
        gb_debug (DEBUG_FILE, "START");
 
1025
 
 
1026
        g_return_val_if_fail (doc && GB_IS_DOC(doc), FALSE);
 
1027
        g_return_val_if_fail (window && GTK_IS_WINDOW(window), FALSE);
 
1028
 
 
1029
        name = gb_doc_get_short_name (doc);
 
1030
        title = g_strdup_printf (_("Save \"%s\" as"), name);
 
1031
        g_free (name);
 
1032
 
 
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);
 
1036
 
 
1037
        g_object_set_data (G_OBJECT (fsel), "doc", doc);
 
1038
        g_object_set_data (G_OBJECT (fsel), "saved_flag", &saved_flag);
 
1039
 
 
1040
        g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
 
1041
                          G_CALLBACK (save_as_ok_cb), fsel);
 
1042
 
 
1043
        g_signal_connect (G_OBJECT (fsel->cancel_button), "clicked",
 
1044
                          G_CALLBACK (save_as_cancel_cb), fsel);
 
1045
 
 
1046
        g_signal_connect (G_OBJECT (fsel), "destroy",
 
1047
                          G_CALLBACK (save_as_destroy_cb), &destroy_flag);
 
1048
 
 
1049
        /* Recover proper state of save-as dialog */
 
1050
        if (save_path != NULL) {
 
1051
                gtk_file_selection_set_filename (fsel, save_path);
 
1052
        }
 
1053
 
 
1054
        /* show the dialog */
 
1055
        gtk_widget_show (GTK_WIDGET (fsel));
 
1056
 
 
1057
        /* Hold here and process events until we are done with this dialog. */
 
1058
        gtk_main ();
 
1059
 
 
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),
 
1066
                                                      &destroy_flag);
 
1067
                gtk_widget_destroy (GTK_WIDGET (fsel));
 
1068
        }
 
1069
 
 
1070
        g_free (title);
 
1071
 
 
1072
        gb_debug (DEBUG_FILE, "END");
 
1073
 
 
1074
        /* Return flag as set by one of the above callbacks, TRUE = saved */
 
1075
        return saved_flag;
 
1076
}
 
1077
 
 
1078
/*---------------------------------------------------------------------------*/
 
1079
/* PRIVATE.  "Save As" ok button callback.                                   */
 
1080
/*---------------------------------------------------------------------------*/
 
1081
static void
 
1082
save_as_ok_cb (GtkWidget        *widget,
 
1083
               GtkFileSelection *fsel)
 
1084
{
 
1085
        gchar            *raw_filename, *filename;
 
1086
        GtkWidget        *dlg;
 
1087
        gbDoc            *doc;
 
1088
        gbDocXMLStatus    status;
 
1089
        EggRecentModel   *recent;
 
1090
        gboolean         *saved_flag;
 
1091
        gchar            *primary_msg;
 
1092
        gboolean          cancel_flag = FALSE;
 
1093
 
 
1094
        gb_debug (DEBUG_FILE, "START");
 
1095
 
 
1096
        g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
 
1097
 
 
1098
        doc = g_object_get_data (G_OBJECT(fsel), "doc");
 
1099
        saved_flag = g_object_get_data (G_OBJECT(fsel), "saved_flag");
 
1100
 
 
1101
        /* get the filename */
 
1102
        raw_filename = g_strdup (gtk_file_selection_get_filename (fsel));
 
1103
 
 
1104
        gb_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename);
 
1105
 
 
1106
        if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
 
1107
 
 
1108
                dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
 
1109
                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
1110
                                        GTK_MESSAGE_WARNING,
 
1111
                                        GTK_BUTTONS_CLOSE,
 
1112
                                        _("Empty file name selection"),
 
1113
                                        _("Please supply a valid file name"));
 
1114
 
 
1115
                gtk_dialog_run (GTK_DIALOG (dlg));
 
1116
                gtk_widget_destroy (dlg);
 
1117
 
 
1118
        } else {
 
1119
 
 
1120
                filename = gb_util_add_extension (raw_filename);
 
1121
 
 
1122
                gb_debug (DEBUG_FILE, "filename = \"%s\"", filename);
 
1123
 
 
1124
                if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
 
1125
                        gint ret;
 
1126
 
 
1127
                        primary_msg = g_strdup_printf (_("Overwrite file \"%s\"?"),
 
1128
                                                       filename);
 
1129
 
 
1130
                        dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
 
1131
                                                GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
1132
                                                GTK_MESSAGE_QUESTION,
 
1133
                                                GTK_BUTTONS_YES_NO,
 
1134
                                                primary_msg,
 
1135
                                                _("File already exists."));
 
1136
                        
 
1137
                        g_free (primary_msg);
 
1138
 
 
1139
                        ret = gtk_dialog_run (GTK_DIALOG (dlg));
 
1140
                        if ( ret == GTK_RESPONSE_NO ) {
 
1141
                                cancel_flag = TRUE;
 
1142
                        }
 
1143
                        gtk_widget_destroy (dlg);
 
1144
                }
 
1145
 
 
1146
                if (!cancel_flag) {
 
1147
 
 
1148
                        gb_doc_xml_save (doc, filename, &status);
 
1149
 
 
1150
                        gb_debug (DEBUG_FILE, "status of save = %d", status);
 
1151
 
 
1152
                        if ( status != GB_DOC_XML_OK ) {
 
1153
 
 
1154
                                primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
 
1155
                                                               filename);
 
1156
 
 
1157
                                dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
 
1158
                                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
1159
                                                        GTK_MESSAGE_ERROR,
 
1160
                                                        GTK_BUTTONS_CLOSE,
 
1161
                                                        primary_msg,
 
1162
                                                        _("Error encountered during save.  The file is still not saved."));
 
1163
 
 
1164
                                g_free (primary_msg);
 
1165
 
 
1166
                                gtk_dialog_run (GTK_DIALOG (dlg));
 
1167
                                gtk_widget_destroy (dlg);
 
1168
 
 
1169
                        } else {
 
1170
 
 
1171
                                *saved_flag = TRUE;
 
1172
 
 
1173
                                gb_recent_add_uri (filename);
 
1174
 
 
1175
                                if (save_path != NULL)
 
1176
                                        g_free (save_path);
 
1177
                                save_path = g_path_get_dirname (filename);
 
1178
                                if (save_path != NULL)
 
1179
                                        save_path = g_strconcat (save_path, "/", NULL);
 
1180
 
 
1181
                                gtk_widget_destroy (GTK_WIDGET (fsel));
 
1182
                        }
 
1183
 
 
1184
                }
 
1185
 
 
1186
                g_free (filename);
 
1187
        }
 
1188
 
 
1189
        g_free (raw_filename);
 
1190
 
 
1191
        gb_debug (DEBUG_FILE, "END");
 
1192
}
 
1193
 
 
1194
/*---------------------------------------------------------------------------*/
 
1195
/* PRIVATE.  "Save As" cancel button callback.                               */
 
1196
/*---------------------------------------------------------------------------*/
 
1197
static void
 
1198
save_as_cancel_cb (GtkWidget        *widget,
 
1199
                   GtkFileSelection *fsel)
 
1200
{
 
1201
        gboolean *saved_flag = g_object_get_data (G_OBJECT (fsel), "saved_flag");
 
1202
 
 
1203
        g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
 
1204
 
 
1205
        *saved_flag = FALSE;
 
1206
        gtk_widget_hide (GTK_WIDGET (fsel));
 
1207
        gtk_main_quit ();
 
1208
}
 
1209
 
 
1210
/*---------------------------------------------------------------------------*/
 
1211
/* PRIVATE.  "Save As" destroy callback.                                     */
 
1212
/*---------------------------------------------------------------------------*/
 
1213
static void
 
1214
save_as_destroy_cb (GtkWidget *widget,
 
1215
                    gboolean  *destroy_flag)
 
1216
{
 
1217
        *destroy_flag = TRUE;
 
1218
        gtk_main_quit ();
 
1219
}
 
1220
 
 
1221
#endif
 
1222
 
 
1223
/*****************************************************************************/
 
1224
/* "Close" menu callback.                                                    */
 
1225
/*****************************************************************************/
 
1226
gboolean
 
1227
gb_file_close (gbWindow *window)
 
1228
{
 
1229
        gbView  *view;
 
1230
        gbDoc   *doc;
 
1231
        gboolean close = TRUE;
 
1232
 
 
1233
        gb_debug (DEBUG_FILE, "START");
 
1234
 
 
1235
        g_return_val_if_fail (window && GB_IS_WINDOW(window), TRUE);
 
1236
 
 
1237
        if ( !gb_window_is_empty (window) ) {
 
1238
 
 
1239
                view = GB_VIEW(window->view);
 
1240
                doc = view->doc;
 
1241
 
 
1242
                if (gb_doc_is_modified (doc))   {
 
1243
                        GtkWidget *msgbox, *w;
 
1244
                        gchar *fname = NULL, *msg = NULL;
 
1245
                        gint ret;
 
1246
                        gboolean exiting;
 
1247
 
 
1248
                        fname = gb_doc_get_short_name (doc);
 
1249
                        
 
1250
                        msg = g_strdup_printf (_("Save changes to document \"%s\" before closing?"),
 
1251
                                               fname);
 
1252
                        
 
1253
                        msgbox = gb_hig_alert_new (GTK_WINDOW(window),
 
1254
                                                   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 
1255
                                                   GTK_MESSAGE_WARNING,
 
1256
                                                   GTK_BUTTONS_NONE,
 
1257
                                                   msg,
 
1258
                                                   _("Your changes will be lost if you don't save them."));
 
1259
 
 
1260
                        gtk_dialog_add_button (GTK_DIALOG (msgbox),
 
1261
                                               _("Close without saving"),
 
1262
                                               GTK_RESPONSE_NO);
 
1263
 
 
1264
                        gtk_dialog_add_button (GTK_DIALOG (msgbox),
 
1265
                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
 
1266
 
 
1267
                        gtk_dialog_add_button (GTK_DIALOG (msgbox),
 
1268
                                               GTK_STOCK_SAVE, GTK_RESPONSE_YES);
 
1269
 
 
1270
                        gtk_dialog_set_default_response (GTK_DIALOG (msgbox), GTK_RESPONSE_YES);
 
1271
 
 
1272
                        gtk_window_set_resizable (GTK_WINDOW (msgbox), FALSE);
 
1273
 
 
1274
                        ret = gtk_dialog_run (GTK_DIALOG (msgbox));
 
1275
                
 
1276
                        gtk_widget_destroy (msgbox);
 
1277
 
 
1278
                        g_free (fname);
 
1279
                        g_free (msg);
 
1280
                
 
1281
                        switch (ret)
 
1282
                        {
 
1283
                        case GTK_RESPONSE_YES:
 
1284
                                close = gb_file_save (doc,
 
1285
                                                      GTK_WINDOW(window));
 
1286
                                break;
 
1287
                        case GTK_RESPONSE_NO:
 
1288
                                close = TRUE;
 
1289
                                break;
 
1290
                        default:
 
1291
                                close = FALSE;
 
1292
                        }
 
1293
 
 
1294
                        gb_debug (DEBUG_FILE, "CLOSE: %s", close ? "TRUE" : "FALSE");
 
1295
                }
 
1296
 
 
1297
        }
 
1298
 
 
1299
        if (close) {
 
1300
                gtk_widget_destroy (GTK_WIDGET(window));
 
1301
 
 
1302
                if ( gb_window_get_window_list () == NULL ) {
 
1303
                        
 
1304
                        gb_debug (DEBUG_FILE, "All windows closed.");
 
1305
        
 
1306
                        bonobo_main_quit ();
 
1307
                }
 
1308
 
 
1309
        }
 
1310
 
 
1311
        gb_debug (DEBUG_FILE, "END");
 
1312
 
 
1313
        return close;
 
1314
}
 
1315
 
 
1316
/*****************************************************************************/
 
1317
/* "Exit" menu callback.                                                     */
 
1318
/*****************************************************************************/
 
1319
void
 
1320
gb_file_exit (void)
 
1321
{
 
1322
        const GList *window_list;
 
1323
        GList       *p, *p_next;
 
1324
 
 
1325
        gb_debug (DEBUG_FILE, "START");
 
1326
 
 
1327
        window_list = gb_window_get_window_list ();
 
1328
 
 
1329
        for (p=(GList *)window_list; p != NULL; p=p_next) {
 
1330
                p_next = p->next;
 
1331
 
 
1332
                gb_file_close (GB_WINDOW(p->data));
 
1333
        }
 
1334
 
 
1335
        gb_debug (DEBUG_FILE, "END");
 
1336
}