2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * file.c: FILE menu dialog module
6 * Copyright (C) 2001 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
28 #include "xml-label.h"
33 #include "wdgt-media-select.h"
34 #include "wdgt-rotate-label.h"
37 /*===========================================*/
39 /*===========================================*/
41 /* Saved state for new dialog */
42 static gchar *page_size = NULL;
43 static gchar *sheet_name = NULL;
44 static gboolean rotate_flag = FALSE;
46 /* Saved state of file selectors */
47 static gchar *open_path = NULL;
48 static gchar *save_path = NULL;
50 /*===========================================*/
51 /* Local function prototypes. */
52 /*===========================================*/
53 static void create_new_dialog_widgets (glHigDialog *dlg);
54 static void new_template_changed (glWdgtMediaSelect *select,
56 static void new_response (GtkDialog *dlg,
60 static void create_properties_dialog_widgets (glHigDialog *dlg,
62 static void properties_template_changed (glWdgtMediaSelect *select,
64 static void properties_response (GtkDialog *dlg,
68 static void open_ok (GtkWidget *widget,
69 GtkFileSelection *fsel);
71 static void save_as_ok_cb (GtkWidget *widget,
72 GtkFileSelection *fsel);
73 static void save_as_cancel_cb (GtkWidget *widget,
74 GtkFileSelection *fsel);
75 static void save_as_destroy_cb (GtkWidget *widget,
76 gboolean *destroy_flag);
79 /*****************************************************************************/
80 /* "New" menu callback. */
81 /*****************************************************************************/
83 gl_file_new (GtkWindow *window)
87 gl_debug (DEBUG_FILE, "START");
89 g_return_if_fail (window != NULL);
91 dlg = gl_hig_dialog_new_with_buttons (_("New Label or Card"),
93 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
94 GTK_STOCK_OK, GTK_RESPONSE_OK,
95 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
98 create_new_dialog_widgets (GL_HIG_DIALOG (dlg));
100 g_object_set_data (G_OBJECT (dlg), "parent_window", window);
102 g_signal_connect (G_OBJECT(dlg), "response",
103 G_CALLBACK (new_response), dlg);
105 gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
106 gtk_widget_show_all (GTK_WIDGET (dlg));
108 gl_debug (DEBUG_FILE, "END");
111 /*---------------------------------------------------------------------------*/
112 /* PRIVATE. Create widgets. */
113 /*---------------------------------------------------------------------------*/
115 create_new_dialog_widgets (glHigDialog *dlg)
117 GtkWidget *wframe, *template_entry, *rotate_sel;
119 gl_debug (DEBUG_FILE, "START");
121 wframe = gl_hig_category_new (_("Media Type"));
122 gl_hig_dialog_add_widget (dlg, wframe);
124 template_entry = gl_wdgt_media_select_new ();
125 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), template_entry);
127 wframe = gl_hig_category_new (_("Label orientation"));
128 gl_hig_dialog_add_widget (dlg, wframe);
130 rotate_sel = gl_wdgt_rotate_label_new ();
131 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), rotate_sel);
133 g_object_set_data (G_OBJECT (dlg), "template_entry", template_entry);
134 g_object_set_data (G_OBJECT (dlg), "rotate_sel", rotate_sel);
136 g_signal_connect (G_OBJECT (template_entry), "changed",
137 G_CALLBACK (new_template_changed), rotate_sel);
139 if (page_size != NULL) {
140 gl_wdgt_media_select_set_page_size (GL_WDGT_MEDIA_SELECT (template_entry),
143 if (sheet_name != NULL) {
144 gl_wdgt_media_select_set_name (GL_WDGT_MEDIA_SELECT (template_entry),
146 gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL
147 (rotate_sel), sheet_name);
150 gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (template_entry));
151 gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL
152 (rotate_sel), sheet_name);
154 gl_wdgt_rotate_label_set_state (GL_WDGT_ROTATE_LABEL (rotate_sel), rotate_flag);
156 gl_debug (DEBUG_FILE, "END");
159 /*---------------------------------------------------------------------------*/
160 /* PRIVATE. New template changed callback. */
161 /*---------------------------------------------------------------------------*/
163 new_template_changed (glWdgtMediaSelect *select,
166 glWdgtRotateLabel *rotate_sel = GL_WDGT_ROTATE_LABEL (data);
169 gl_debug (DEBUG_FILE, "START");
171 name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (select));
173 gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL (rotate_sel),
178 gl_debug (DEBUG_FILE, "END");
181 /*---------------------------------------------------------------------------*/
182 /* PRIVATE. New "ok" button callback. */
183 /*---------------------------------------------------------------------------*/
185 new_response (GtkDialog *dlg,
189 GtkWidget *template_entry, *rotate_sel, *new_window;
190 glTemplate *template;
195 gl_debug (DEBUG_FILE, "START");
198 case GTK_RESPONSE_OK:
200 GTK_WIDGET (g_object_get_data (G_OBJECT (dlg),
202 rotate_sel = GTK_WIDGET (g_object_get_data (G_OBJECT (dlg),
205 if (page_size != NULL)
208 gl_wdgt_media_select_get_page_size (GL_WDGT_MEDIA_SELECT (template_entry));
210 if (sheet_name != NULL)
213 gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (template_entry));
216 gl_wdgt_rotate_label_get_state (GL_WDGT_ROTATE_LABEL (rotate_sel));
218 template = gl_template_from_name (sheet_name);
220 label = GL_LABEL(gl_label_new ());
221 gl_label_set_template (label, template);
222 gl_label_set_rotate_flag (label, rotate_flag);
225 GL_WINDOW (g_object_get_data (G_OBJECT (dlg),
227 if ( gl_window_is_empty (window) ) {
228 gl_window_set_label (window, label);
230 new_window = gl_window_new_from_label (label);
231 gtk_widget_show_all (new_window);
238 gtk_widget_destroy (GTK_WIDGET (dlg));
240 gl_debug (DEBUG_FILE, "END");
244 /*****************************************************************************/
245 /* "Properties" menu callback. */
246 /*****************************************************************************/
248 gl_file_properties (glLabel *label,
253 gl_debug (DEBUG_FILE, "START");
255 g_return_if_fail (label && GL_IS_LABEL (label));
256 g_return_if_fail (window && GTK_IS_WINDOW (window));
258 dlg = gl_hig_dialog_new_with_buttons (_("Label properties"),
260 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
261 GTK_STOCK_OK, GTK_RESPONSE_OK,
262 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
265 create_properties_dialog_widgets (GL_HIG_DIALOG (dlg), label);
267 g_object_set_data (G_OBJECT (dlg), "label", label);
269 g_signal_connect (G_OBJECT(dlg), "response",
270 G_CALLBACK (properties_response), dlg);
272 gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
273 gtk_widget_show_all (GTK_WIDGET (dlg));
275 gl_debug (DEBUG_FILE, "END");
278 /*---------------------------------------------------------------------------*/
279 /* PRIVATE. Create widgets. */
280 /*---------------------------------------------------------------------------*/
282 create_properties_dialog_widgets (glHigDialog *dlg,
285 GtkWidget *wframe, *template_entry, *rotate_sel;
286 glTemplate *template;
287 gboolean rotate_flag;
289 gl_debug (DEBUG_FILE, "START");
291 wframe = gl_hig_category_new (_("Media Type"));
292 gl_hig_dialog_add_widget (dlg, wframe);
294 template_entry = gl_wdgt_media_select_new ();
295 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), template_entry);
297 wframe = gl_hig_category_new (_("Label orientation"));
298 gl_hig_dialog_add_widget (dlg, wframe);
300 rotate_sel = gl_wdgt_rotate_label_new ();
301 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), rotate_sel);
303 g_object_set_data (G_OBJECT (dlg), "template_entry", template_entry);
304 g_object_set_data (G_OBJECT (dlg), "rotate_sel", rotate_sel);
306 g_signal_connect (G_OBJECT (template_entry), "changed",
307 G_CALLBACK (properties_template_changed), rotate_sel);
309 template = gl_label_get_template (label);
310 rotate_flag = gl_label_get_rotate_flag (label);
312 gl_debug (DEBUG_FILE, "%s, %s", template->page_size, template->name);
314 if (template->page_size != NULL) {
315 gl_wdgt_media_select_set_page_size (GL_WDGT_MEDIA_SELECT (template_entry),
316 template->page_size);
318 if (template->name != NULL) {
319 gchar *template_name = gl_template_get_name_with_desc (template);
320 gl_wdgt_media_select_set_name (GL_WDGT_MEDIA_SELECT (template_entry),
322 gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL
323 (rotate_sel), template_name);
324 g_free (template_name);
327 gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (template_entry));
328 gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL
329 (rotate_sel), sheet_name);
331 gl_wdgt_rotate_label_set_state (GL_WDGT_ROTATE_LABEL (rotate_sel), rotate_flag);
333 gl_debug (DEBUG_FILE, "END");
336 /*---------------------------------------------------------------------------*/
337 /* PRIVATE. Properties template changed callback. */
338 /*---------------------------------------------------------------------------*/
340 properties_template_changed (glWdgtMediaSelect *select,
343 glWdgtRotateLabel *rotate_sel = GL_WDGT_ROTATE_LABEL (data);
346 gl_debug (DEBUG_FILE, "START");
348 name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (select));
350 gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL (rotate_sel),
355 gl_debug (DEBUG_FILE, "END");
358 /*---------------------------------------------------------------------------*/
359 /* PRIVATE. Properties "ok" button callback. */
360 /*---------------------------------------------------------------------------*/
362 properties_response (GtkDialog *dlg,
366 GtkWidget *template_entry, *rotate_sel;
367 glTemplate *template;
372 gl_debug (DEBUG_FILE, "START");
375 case GTK_RESPONSE_OK:
377 GTK_WIDGET (g_object_get_data (G_OBJECT (dlg),
379 rotate_sel = GTK_WIDGET (g_object_get_data (G_OBJECT (dlg),
382 if (page_size != NULL)
385 gl_wdgt_media_select_get_page_size (GL_WDGT_MEDIA_SELECT (template_entry));
387 if (sheet_name != NULL)
390 gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (template_entry));
393 gl_wdgt_rotate_label_get_state (GL_WDGT_ROTATE_LABEL (rotate_sel));
395 template = gl_template_from_name (sheet_name);
397 label = GL_LABEL(g_object_get_data (G_OBJECT (dlg), "label"));
398 gl_label_set_template (label, template);
399 gl_label_set_rotate_flag (label, rotate_flag);
404 gtk_widget_destroy (GTK_WIDGET (dlg));
406 gl_debug (DEBUG_FILE, "END");
409 /*****************************************************************************/
410 /* "Open" menu callback. */
411 /*****************************************************************************/
413 gl_file_open (GtkWindow *window)
415 GtkFileSelection *fsel;
417 gl_debug (DEBUG_FILE, "START");
419 g_return_if_fail (window != NULL);
421 fsel = GTK_FILE_SELECTION (gtk_file_selection_new (_("Open")));
422 gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
423 gtk_window_set_title (GTK_WINDOW (fsel), _("Open label"));
425 g_object_set_data (G_OBJECT (fsel), "parent_window", window);
427 g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
428 G_CALLBACK (open_ok), fsel);
430 g_signal_connect_swapped (G_OBJECT (fsel->cancel_button), "clicked",
431 G_CALLBACK (gtk_widget_destroy),
434 /* Recover state of open dialog */
435 if (open_path != NULL) {
436 gtk_file_selection_set_filename (fsel, open_path);
439 /* show the dialog */
440 gtk_widget_show (GTK_WIDGET (fsel));
442 gl_debug (DEBUG_FILE, "END");
445 /*---------------------------------------------------------------------------*/
446 /* PRIVATE. Open "O.K." button callback. */
447 /*---------------------------------------------------------------------------*/
449 open_ok (GtkWidget *widget,
450 GtkFileSelection *fsel)
455 GnomeRecentModel *recent;
458 gl_debug (DEBUG_FILE, "START");
460 g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
462 /* get the filename */
463 filename = g_strdup (gtk_file_selection_get_filename (fsel));
465 if (!filename || g_file_test (filename, G_FILE_TEST_IS_DIR)) {
467 dlg = gl_hig_alert_new (GTK_WINDOW(fsel),
468 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
471 _("Empty file name selection"),
472 _("Please select a file or supply a valid file name"));
474 gtk_dialog_run (GTK_DIALOG (dlg));
475 gtk_widget_destroy (dlg);
479 if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
481 dlg = gl_hig_alert_new (GTK_WINDOW(fsel),
482 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
485 _("File does not exist"),
486 _("Please select a file or supply a valid file name"));
488 gtk_dialog_run (GTK_DIALOG (dlg));
489 gtk_widget_destroy (dlg);
494 window = g_object_get_data (G_OBJECT(fsel),
497 if ( gl_file_open_real (filename, window) ) {
498 gtk_widget_destroy (GTK_WIDGET (fsel));
507 gl_debug (DEBUG_FILE, "END");
510 /*****************************************************************************/
511 /* "Open recent" menu callback. */
512 /*****************************************************************************/
514 gl_file_open_recent (GnomeRecentView *view,
515 const gchar *filename,
518 gl_debug (DEBUG_FILE, "");
520 return gl_file_open_real (filename, window);
523 /*---------------------------------------------------------------------------*/
524 /* PRIVATE. Open a file. */
525 /*---------------------------------------------------------------------------*/
527 gl_file_open_real (const gchar *filename,
532 glXMLLabelStatus status;
533 GnomeRecentModel *recent;
535 GtkWidget *new_window;
537 gl_debug (DEBUG_FILE, "START");
539 abs_filename = gl_util_make_absolute (filename);
540 label = gl_xml_label_open (abs_filename, &status);
545 gl_debug (DEBUG_FILE, "couldn't open file");
547 primary_msg = g_strdup_printf (_("Could not open file \"%s\""),
550 dlg = gl_hig_alert_new (window,
551 GTK_DIALOG_DESTROY_WITH_PARENT,
555 _("Not a supported file format"));
557 g_free (primary_msg);
559 gtk_dialog_run (GTK_DIALOG (dlg));
560 gtk_widget_destroy (dlg);
562 g_free (abs_filename);
564 gl_debug (DEBUG_FILE, "END false");
570 if ( gl_window_is_empty (GL_WINDOW(window)) ) {
571 gl_window_set_label (GL_WINDOW(window), label);
573 new_window = gl_window_new_from_label (label);
574 gtk_widget_show_all (new_window);
577 recent = gl_recent_get_model ();
578 gnome_recent_model_add (recent, abs_filename);
580 if (open_path != NULL)
582 open_path = g_path_get_dirname (abs_filename);
583 if (open_path != NULL)
584 open_path = g_strconcat (open_path, "/", NULL);
586 g_free (abs_filename);
588 gl_debug (DEBUG_FILE, "END true");
595 /*****************************************************************************/
596 /* "Save" menu callback. */
597 /*****************************************************************************/
599 gl_file_save (glLabel *label,
602 glXMLLabelStatus status;
603 GError *error = NULL;
604 gchar *filename = NULL;
605 GnomeRecentModel *recent;
607 gl_debug (DEBUG_FILE, "");
609 g_return_val_if_fail (label != NULL, FALSE);
611 if (gl_label_is_untitled (label))
613 gl_debug (DEBUG_FILE, "Untitled");
615 return gl_file_save_as (label, window);
618 if (!gl_label_is_modified (label))
620 gl_debug (DEBUG_FILE, "Not modified");
625 filename = gl_label_get_filename (label);
626 g_return_val_if_fail (filename != NULL, FALSE);
628 gl_xml_label_save (label, filename, &status);
630 if (status != XML_LABEL_OK)
635 gl_debug (DEBUG_FILE, "FAILED");
637 primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
640 dialog = gl_hig_alert_new (window,
641 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
645 _("Error encountered during save. The file is still not saved."));
647 g_free (primary_msg);
649 gtk_dialog_run (GTK_DIALOG (dialog));
650 gtk_widget_destroy (dialog);
658 gl_debug (DEBUG_FILE, "OK");
660 recent = gl_recent_get_model ();
661 gnome_recent_model_add (recent, filename);
669 /*****************************************************************************/
670 /* "Save As" menu callback. */
671 /*****************************************************************************/
673 gl_file_save_as (glLabel *label,
676 GtkFileSelection *fsel;
677 gboolean saved_flag = FALSE;
678 gboolean destroy_flag = FALSE;
681 gl_debug (DEBUG_FILE, "START");
683 g_return_val_if_fail (label && GL_IS_LABEL(label), FALSE);
684 g_return_val_if_fail (window && GTK_IS_WINDOW(window), FALSE);
686 name = gl_label_get_short_name (label);
687 title = g_strdup_printf (_("Save \"%s\" as"), name);
690 fsel = GTK_FILE_SELECTION (gtk_file_selection_new (title));
691 gtk_window_set_modal (GTK_WINDOW (fsel), TRUE);
692 gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
694 g_object_set_data (G_OBJECT (fsel), "label", label);
695 g_object_set_data (G_OBJECT (fsel), "saved_flag", &saved_flag);
697 g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
698 G_CALLBACK (save_as_ok_cb), fsel);
700 g_signal_connect (G_OBJECT (fsel->cancel_button), "clicked",
701 G_CALLBACK (save_as_cancel_cb), fsel);
703 g_signal_connect (G_OBJECT (fsel), "destroy",
704 G_CALLBACK (save_as_destroy_cb), &destroy_flag);
706 /* Recover proper state of save-as dialog */
707 if (save_path != NULL) {
708 gtk_file_selection_set_filename (fsel, save_path);
711 /* show the dialog */
712 gtk_widget_show (GTK_WIDGET (fsel));
714 /* Hold here and process events until we are done with this dialog. */
717 /* Destroy dialog if not already destroyed. */
719 /* Disconnect our destroy callback first, so that we don't
720 * kill the current gtk_main() loop. */
721 g_signal_handlers_disconnect_by_func (GTK_OBJECT (fsel),
722 G_CALLBACK (save_as_destroy_cb),
724 gtk_widget_destroy (GTK_WIDGET (fsel));
729 gl_debug (DEBUG_FILE, "END");
731 /* Return flag as set by one of the above callbacks, TRUE = saved */
735 /*---------------------------------------------------------------------------*/
736 /* PRIVATE. "Save As" ok button callback. */
737 /*---------------------------------------------------------------------------*/
739 save_as_ok_cb (GtkWidget *widget,
740 GtkFileSelection *fsel)
742 gchar *raw_filename, *filename;
745 glXMLLabelStatus status;
746 GnomeRecentModel *recent;
747 gboolean *saved_flag;
749 gboolean cancel_flag = FALSE;
751 gl_debug (DEBUG_FILE, "START");
753 g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
755 label = g_object_get_data (G_OBJECT(fsel), "label");
756 saved_flag = g_object_get_data (G_OBJECT(fsel), "saved_flag");
758 /* get the filename */
759 raw_filename = g_strdup (gtk_file_selection_get_filename (fsel));
761 gl_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename);
763 if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
765 dlg = gl_hig_alert_new (GTK_WINDOW(fsel),
766 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
769 _("Empty file name selection"),
770 _("Please supply a valid file name"));
772 gtk_dialog_run (GTK_DIALOG (dlg));
773 gtk_widget_destroy (dlg);
777 filename = gl_util_add_extension (raw_filename);
779 gl_debug (DEBUG_FILE, "filename = \"%s\"", filename);
781 if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
784 primary_msg = g_strdup_printf (_("Overwrite file \"%s\"?"),
787 dlg = gl_hig_alert_new (GTK_WINDOW(fsel),
788 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
789 GTK_MESSAGE_QUESTION,
792 _("File already exists."));
794 g_free (primary_msg);
796 ret = gtk_dialog_run (GTK_DIALOG (dlg));
797 if ( ret == GTK_RESPONSE_NO ) {
800 gtk_widget_destroy (dlg);
805 gl_xml_label_save (label, filename, &status);
807 gl_debug (DEBUG_FILE, "status of save = %d", status);
809 if ( status != XML_LABEL_OK ) {
811 primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
814 dlg = gl_hig_alert_new (GTK_WINDOW(fsel),
815 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
819 _("Error encountered during save. The file is still not saved."));
821 g_free (primary_msg);
823 gtk_dialog_run (GTK_DIALOG (dlg));
824 gtk_widget_destroy (dlg);
830 recent = gl_recent_get_model ();
831 gnome_recent_model_add (recent, filename);
833 if (save_path != NULL)
835 save_path = g_path_get_dirname (filename);
836 if (save_path != NULL)
837 save_path = g_strconcat (save_path, "/", NULL);
839 gtk_widget_destroy (GTK_WIDGET (fsel));
847 g_free (raw_filename);
849 gl_debug (DEBUG_FILE, "END");
852 /*---------------------------------------------------------------------------*/
853 /* PRIVATE. "Save As" cancel button callback. */
854 /*---------------------------------------------------------------------------*/
856 save_as_cancel_cb (GtkWidget *widget,
857 GtkFileSelection *fsel)
859 gboolean *saved_flag = g_object_get_data (G_OBJECT (fsel), "saved_flag");
861 g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
864 gtk_widget_hide (GTK_WIDGET (fsel));
868 /*---------------------------------------------------------------------------*/
869 /* PRIVATE. "Save As" destroy callback. */
870 /*---------------------------------------------------------------------------*/
872 save_as_destroy_cb (GtkWidget *widget,
873 gboolean *destroy_flag)
875 *destroy_flag = TRUE;
880 /*****************************************************************************/
881 /* "Close" menu callback. */
882 /*****************************************************************************/
884 gl_file_close (glWindow *window)
888 gboolean close = TRUE;
890 gl_debug (DEBUG_FILE, "START");
892 g_return_val_if_fail (window && GL_IS_WINDOW(window), TRUE);
894 if ( !gl_window_is_empty (window) ) {
896 view = GL_VIEW(window->view);
899 if (gl_label_is_modified (label)) {
900 GtkWidget *msgbox, *w;
901 gchar *fname = NULL, *msg = NULL;
905 fname = gl_label_get_short_name (label);
907 msg = g_strdup_printf (_("Save changes to document \"%s\" before closing?"),
910 msgbox = gl_hig_alert_new (GTK_WINDOW(window),
911 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
915 _("Your changes will be lost if you don't save them."));
917 gtk_dialog_add_button (GTK_DIALOG (msgbox),
918 _("Close without saving"),
921 gtk_dialog_add_button (GTK_DIALOG (msgbox),
922 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
924 gtk_dialog_add_button (GTK_DIALOG (msgbox),
925 GTK_STOCK_SAVE, GTK_RESPONSE_YES);
927 gtk_dialog_set_default_response (GTK_DIALOG (msgbox), GTK_RESPONSE_YES);
929 gtk_window_set_resizable (GTK_WINDOW (msgbox), FALSE);
931 ret = gtk_dialog_run (GTK_DIALOG (msgbox));
933 gtk_widget_destroy (msgbox);
940 case GTK_RESPONSE_YES:
941 close = gl_file_save (label,
944 case GTK_RESPONSE_NO:
951 gl_debug (DEBUG_FILE, "CLOSE: %s", close ? "TRUE" : "FALSE");
957 gtk_widget_destroy (GTK_WIDGET(window));
959 if ( gl_window_get_window_list () == NULL ) {
961 gl_debug (DEBUG_FILE, "All windows closed.");
968 gl_debug (DEBUG_FILE, "END");
973 /*****************************************************************************/
974 /* "Exit" menu callback. */
975 /*****************************************************************************/
979 const GList *window_list;
982 gl_debug (DEBUG_FILE, "START");
984 window_list = gl_window_get_window_list ();
986 for (p=(GList *)window_list; p != NULL; p=p_next) {
989 gl_file_close (GL_WINDOW(p->data));
992 gl_debug (DEBUG_FILE, "END");