3 * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
7 * gLabels is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * gLabels is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with gLabels. If not, see <http://www.gnu.org/licenses/>.
25 #include <glib/gi18n.h>
29 #include "xml-label.h"
31 #include "file-util.h"
33 #include "new-label-dialog.h"
34 #include "libglabels/libglabels.h"
39 /*===========================================*/
41 /*===========================================*/
43 /* Saved state for new dialog */
44 static gchar *page_size = NULL;
45 static gchar *category = NULL;
46 static gchar *sheet_name = NULL;
47 static gboolean rotate_flag = FALSE;
49 /* Saved state of file selectors */
50 static gchar *open_path = NULL;
51 static gchar *save_path = NULL;
54 /*===========================================*/
55 /* Local function prototypes. */
56 /*===========================================*/
57 static void new_response (GtkDialog *dialog,
61 static void properties_response (GtkDialog *dialog,
65 static void open_response (GtkDialog *chooser,
68 static void save_as_response (GtkDialog *chooser,
73 /*****************************************************************************/
74 /* "New" menu callback. */
75 /*****************************************************************************/
77 gl_file_new (glWindow *window)
81 gl_debug (DEBUG_FILE, "START");
83 g_return_if_fail (window && GTK_IS_WINDOW (window));
85 dialog = gl_new_label_dialog_new (GTK_WINDOW (window));
86 gtk_window_set_title (GTK_WINDOW (dialog), _("New Label or Card"));
88 g_object_set_data (G_OBJECT (dialog), "parent_window", window);
90 g_signal_connect (G_OBJECT(dialog), "response",
91 G_CALLBACK (new_response), dialog);
93 if (page_size != NULL) {
94 gl_new_label_dialog_set_filter_parameters (GL_NEW_LABEL_DIALOG (dialog),
98 if (sheet_name != NULL) {
99 gl_new_label_dialog_set_template_name (GL_NEW_LABEL_DIALOG (dialog),
102 gl_new_label_dialog_set_rotate_state (GL_NEW_LABEL_DIALOG (dialog), rotate_flag);
104 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
105 gtk_widget_show_all (GTK_WIDGET (dialog));
107 gl_debug (DEBUG_FILE, "END");
111 /*---------------------------------------------------------------------------*/
112 /* PRIVATE. New "ok" button callback. */
113 /*---------------------------------------------------------------------------*/
115 new_response (GtkDialog *dialog,
119 lglTemplate *template;
122 GtkWidget *new_window;
124 gl_debug (DEBUG_FILE, "START");
128 case GTK_RESPONSE_OK:
130 gl_new_label_dialog_get_filter_parameters (GL_NEW_LABEL_DIALOG (dialog),
134 if (sheet_name != NULL)
137 gl_new_label_dialog_get_template_name (GL_NEW_LABEL_DIALOG (dialog));
140 gl_new_label_dialog_get_rotate_state (GL_NEW_LABEL_DIALOG (dialog));
142 template = lgl_db_lookup_template_from_name (sheet_name);
144 label = GL_LABEL(gl_label_new ());
145 gl_label_set_template (label, template);
146 gl_label_set_rotate_flag (label, rotate_flag);
148 lgl_template_free (template);
151 GL_WINDOW (g_object_get_data (G_OBJECT (dialog),
153 if ( gl_window_is_empty (window) ) {
154 gl_window_set_label (window, label);
156 new_window = gl_window_new_from_label (label);
157 gtk_widget_show_all (new_window);
166 gtk_widget_destroy (GTK_WIDGET (dialog));
168 gl_debug (DEBUG_FILE, "END");
172 /*****************************************************************************/
173 /* "Properties" menu callback. */
174 /*****************************************************************************/
176 gl_file_properties (glLabel *label,
182 gl_debug (DEBUG_FILE, "START");
184 g_return_if_fail (label && GL_IS_LABEL (label));
185 g_return_if_fail (window && GTK_IS_WINDOW (window));
187 dialog = gl_new_label_dialog_new (GTK_WINDOW (window));
188 gtk_window_set_title (GTK_WINDOW (dialog), _("Label properties"));
190 g_object_set_data (G_OBJECT (dialog), "label", label);
192 g_signal_connect (G_OBJECT(dialog), "response",
193 G_CALLBACK (properties_response), dialog);
195 if (label->template->paper_id != NULL) {
196 gl_new_label_dialog_set_filter_parameters (GL_NEW_LABEL_DIALOG (dialog),
197 label->template->paper_id,
200 name = lgl_template_get_name (label->template);
202 gl_new_label_dialog_set_template_name (GL_NEW_LABEL_DIALOG (dialog), name);
206 gl_new_label_dialog_set_rotate_state (GL_NEW_LABEL_DIALOG (dialog),
209 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
210 gtk_widget_show_all (GTK_WIDGET (dialog));
212 gl_debug (DEBUG_FILE, "END");
216 /*---------------------------------------------------------------------------*/
217 /* PRIVATE. Properties "ok" button callback. */
218 /*---------------------------------------------------------------------------*/
220 properties_response (GtkDialog *dialog,
224 lglTemplate *template;
227 gl_debug (DEBUG_FILE, "START");
231 case GTK_RESPONSE_OK:
233 gl_new_label_dialog_get_filter_parameters (GL_NEW_LABEL_DIALOG (dialog),
237 if (sheet_name != NULL)
240 gl_new_label_dialog_get_template_name (GL_NEW_LABEL_DIALOG (dialog));
243 gl_new_label_dialog_get_rotate_state (GL_NEW_LABEL_DIALOG (dialog));
245 template = lgl_db_lookup_template_from_name (sheet_name);
247 label = GL_LABEL(g_object_get_data (G_OBJECT (dialog), "label"));
248 gl_label_set_template (label, template);
249 gl_label_set_rotate_flag (label, rotate_flag);
257 gtk_widget_destroy (GTK_WIDGET (dialog));
259 gl_debug (DEBUG_FILE, "END");
263 /*****************************************************************************/
264 /* "Open" menu callback. */
265 /*****************************************************************************/
267 gl_file_open (glWindow *window)
270 GtkFileFilter *filter;
272 gl_debug (DEBUG_FILE, "START");
274 g_return_if_fail (window != NULL);
276 chooser = gtk_file_chooser_dialog_new ("Open label",
278 GTK_FILE_CHOOSER_ACTION_OPEN,
279 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
280 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
283 /* Recover state of open dialog */
284 if (open_path != NULL) {
285 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
289 filter = gtk_file_filter_new ();
290 gtk_file_filter_add_pattern (filter, "*");
291 gtk_file_filter_set_name (filter, _("All files"));
292 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
294 filter = gtk_file_filter_new ();
295 gtk_file_filter_add_pattern (filter, "*.glabels");
296 gtk_file_filter_set_name (filter, _("gLabels documents"));
297 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
299 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
301 g_signal_connect (G_OBJECT (chooser), "response",
302 G_CALLBACK (open_response), window);
304 /* show the dialog */
305 gtk_widget_show (GTK_WIDGET (chooser));
307 gl_debug (DEBUG_FILE, "END");
311 /*---------------------------------------------------------------------------*/
312 /* PRIVATE. Open "response" callback. */
313 /*---------------------------------------------------------------------------*/
315 open_response (GtkDialog *chooser,
323 gl_debug (DEBUG_FILE, "START");
325 g_return_if_fail (chooser && GTK_IS_FILE_CHOOSER (chooser));
326 g_return_if_fail (window && GTK_IS_WINDOW (window));
330 case GTK_RESPONSE_ACCEPT:
331 /* get the filename */
332 raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
333 filename = g_filename_to_utf8 (raw_filename, -1, NULL, NULL, NULL);
337 g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
339 dialog = gtk_message_dialog_new (GTK_WINDOW(chooser),
340 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
343 _("Empty file name selection"));
344 gtk_message_dialog_format_secondary_text (
345 GTK_MESSAGE_DIALOG (dialog),
346 _("Please select a file or supply a valid file name"));
348 gtk_dialog_run (GTK_DIALOG (dialog));
349 gtk_widget_destroy (dialog);
353 if (!g_file_test (raw_filename, G_FILE_TEST_IS_REGULAR)) {
355 dialog = gtk_message_dialog_new (GTK_WINDOW(chooser),
356 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
359 _("File does not exist"));
360 gtk_message_dialog_format_secondary_text (
361 GTK_MESSAGE_DIALOG (dialog),
362 _("Please select a file or supply a valid file name"));
364 gtk_dialog_run (GTK_DIALOG (dialog));
365 gtk_widget_destroy (dialog);
370 if ( gl_file_open_real (filename, window) ) {
371 gtk_widget_destroy (GTK_WIDGET (chooser));
379 g_free (raw_filename);
383 gtk_widget_destroy (GTK_WIDGET (chooser));
388 gl_debug (DEBUG_FILE, "END");
392 /*****************************************************************************/
393 /* "Open recent" menu callback. */
394 /*****************************************************************************/
396 gl_file_open_recent (const gchar *filename,
399 gl_debug (DEBUG_FILE, "");
402 gl_debug (DEBUG_FILE, "open recent: %s", filename);
404 gl_file_open_real (filename, window);
409 /*---------------------------------------------------------------------------*/
410 /* PRIVATE. Open a file. */
411 /*---------------------------------------------------------------------------*/
413 gl_file_open_real (const gchar *filename,
418 glXMLLabelStatus status;
419 GtkWidget *new_window;
421 gl_debug (DEBUG_FILE, "START");
423 abs_filename = gl_file_util_make_absolute (filename);
424 label = gl_xml_label_open (abs_filename, &status);
428 gl_debug (DEBUG_FILE, "couldn't open file");
430 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
431 GTK_DIALOG_DESTROY_WITH_PARENT,
434 _("Could not open file \"%s\""),
436 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
437 _("Not a supported file format"));
439 gtk_dialog_run (GTK_DIALOG (dialog));
440 gtk_widget_destroy (dialog);
442 g_free (abs_filename);
444 gl_debug (DEBUG_FILE, "END false");
450 if ( gl_window_is_empty (GL_WINDOW(window)) ) {
451 gl_window_set_label (GL_WINDOW(window), label);
453 new_window = gl_window_new_from_label (label);
454 gtk_widget_show_all (new_window);
457 gl_recent_add_utf8_filename (abs_filename);
459 if (open_path != NULL)
461 open_path = g_path_get_dirname (abs_filename);
462 g_free (abs_filename);
464 gl_debug (DEBUG_FILE, "END true");
472 /*****************************************************************************/
473 /* "Save" menu callback. */
474 /*****************************************************************************/
476 gl_file_save (glLabel *label,
479 glXMLLabelStatus status;
480 gchar *filename = NULL;
482 gl_debug (DEBUG_FILE, "");
484 g_return_val_if_fail (label != NULL, FALSE);
486 if (gl_label_is_untitled (label))
488 gl_debug (DEBUG_FILE, "Untitled");
490 return gl_file_save_as (label, window);
493 if (!gl_label_is_modified (label))
495 gl_debug (DEBUG_FILE, "Not modified");
500 filename = gl_label_get_filename (label);
501 g_return_val_if_fail (filename != NULL, FALSE);
503 gl_xml_label_save (label, filename, &status);
505 if (status != XML_LABEL_OK)
509 gl_debug (DEBUG_FILE, "FAILED");
511 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
512 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
515 _("Could not save file \"%s\""),
517 gtk_message_dialog_format_secondary_text (
518 GTK_MESSAGE_DIALOG (dialog),
519 _("Error encountered during save. The file is still not saved."));
521 gtk_dialog_run (GTK_DIALOG (dialog));
522 gtk_widget_destroy (dialog);
530 gl_debug (DEBUG_FILE, "OK");
532 gl_recent_add_utf8_filename (filename);
541 /*****************************************************************************/
542 /* "Save As" menu callback. */
543 /*****************************************************************************/
545 gl_file_save_as (glLabel *label,
549 GtkFileFilter *filter;
550 gboolean saved_flag = FALSE;
553 gl_debug (DEBUG_FILE, "START");
555 g_return_val_if_fail (label && GL_IS_LABEL(label), FALSE);
556 g_return_val_if_fail (window && GL_IS_WINDOW(window), FALSE);
558 name = gl_label_get_short_name (label);
559 title = g_strdup_printf (_("Save \"%s\" as"), name);
562 chooser = gtk_file_chooser_dialog_new (title,
564 GTK_FILE_CHOOSER_ACTION_SAVE,
565 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
566 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
569 gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
573 /* Recover proper state of save-as dialog */
574 if (save_path != NULL) {
575 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser),
579 filter = gtk_file_filter_new ();
580 gtk_file_filter_add_pattern (filter, "*");
581 gtk_file_filter_set_name (filter, _("All files"));
582 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
584 filter = gtk_file_filter_new ();
585 gtk_file_filter_add_pattern (filter, "*.glabels");
586 gtk_file_filter_set_name (filter, _("gLabels documents"));
587 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
589 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
591 g_signal_connect (G_OBJECT (chooser), "response",
592 G_CALLBACK (save_as_response), label);
594 g_object_set_data (G_OBJECT (chooser), "saved_flag", &saved_flag);
596 /* show the dialog */
597 gtk_widget_show (GTK_WIDGET (chooser));
599 /* Hold here and process events until we are done with this dialog. */
600 /* This is so we can return a boolean result of our save attempt. */
603 gl_debug (DEBUG_FILE, "END");
605 /* Return flag as set by one of the above callbacks, TRUE = saved */
610 /*---------------------------------------------------------------------------*/
611 /* PRIVATE. "Save As" ok button callback. */
612 /*---------------------------------------------------------------------------*/
614 save_as_response (GtkDialog *chooser,
618 gchar *raw_filename, *filename, *full_filename;
620 glXMLLabelStatus status;
621 gboolean *saved_flag;
622 gboolean cancel_flag = FALSE;
624 gl_debug (DEBUG_FILE, "START");
626 g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
628 saved_flag = g_object_get_data (G_OBJECT(chooser), "saved_flag");
632 case GTK_RESPONSE_ACCEPT:
633 /* get the filename */
634 raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
636 gl_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename);
638 if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
640 dialog = gtk_message_dialog_new (GTK_WINDOW(chooser),
641 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
644 _("Empty file name selection"));
645 gtk_message_dialog_format_secondary_text (
646 GTK_MESSAGE_DIALOG (dialog),
647 _("Please supply a valid file name"));
649 gtk_dialog_run (GTK_DIALOG (dialog));
650 gtk_widget_destroy (dialog);
654 full_filename = gl_file_util_add_extension (raw_filename);
656 filename = g_filename_to_utf8 (full_filename, -1,
659 gl_debug (DEBUG_FILE, "filename = \"%s\"", filename);
661 if (g_file_test (full_filename, G_FILE_TEST_IS_REGULAR)) {
664 dialog = gtk_message_dialog_new (GTK_WINDOW(chooser),
665 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
666 GTK_MESSAGE_QUESTION,
668 _("Overwrite file \"%s\"?"),
670 gtk_message_dialog_format_secondary_text (
671 GTK_MESSAGE_DIALOG (dialog),
672 _("File already exists."));
674 ret = gtk_dialog_run (GTK_DIALOG (dialog));
675 if ( ret == GTK_RESPONSE_NO ) {
678 gtk_widget_destroy (dialog);
683 gl_xml_label_save (label, filename, &status);
685 gl_debug (DEBUG_FILE, "status of save = %d", status);
687 if ( status != XML_LABEL_OK ) {
689 dialog = gtk_message_dialog_new (
691 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
694 _("Could not save file \"%s\""),
696 gtk_message_dialog_format_secondary_text (
697 GTK_MESSAGE_DIALOG (dialog),
698 _("Error encountered during save. The file is still not saved."));
700 gtk_dialog_run (GTK_DIALOG (dialog));
701 gtk_widget_destroy (dialog);
707 gl_recent_add_utf8_filename (filename);
709 if (save_path != NULL)
711 save_path = g_path_get_dirname (filename);
713 gtk_widget_destroy (GTK_WIDGET (chooser));
720 g_free (full_filename);
723 g_free (raw_filename);
728 gtk_widget_destroy (GTK_WIDGET (chooser));
734 gl_debug (DEBUG_FILE, "END");
738 /*****************************************************************************/
739 /* "Close" menu callback. */
740 /*****************************************************************************/
742 gl_file_close (glWindow *window)
746 gboolean close = TRUE;
748 gl_debug (DEBUG_FILE, "START");
750 g_return_val_if_fail (window && GL_IS_WINDOW(window), TRUE);
752 if ( !gl_window_is_empty (window) ) {
754 view = GL_VIEW(window->view);
757 if (gl_label_is_modified (label)) {
762 fname = gl_label_get_short_name (label);
764 dialog = gtk_message_dialog_new (GTK_WINDOW(window),
765 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
768 _("Save changes to document \"%s\" before closing?"),
770 gtk_message_dialog_format_secondary_text (
771 GTK_MESSAGE_DIALOG (dialog),
772 _("Your changes will be lost if you don't save them."));
774 gtk_dialog_add_button (GTK_DIALOG (dialog),
775 _("Close without saving"),
778 gtk_dialog_add_button (GTK_DIALOG (dialog),
779 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
781 gtk_dialog_add_button (GTK_DIALOG (dialog),
782 GTK_STOCK_SAVE, GTK_RESPONSE_YES);
784 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
786 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
788 ret = gtk_dialog_run (GTK_DIALOG (dialog));
790 gtk_widget_destroy (dialog);
796 case GTK_RESPONSE_YES:
797 close = gl_file_save (label, window);
799 case GTK_RESPONSE_NO:
806 gl_debug (DEBUG_FILE, "CLOSE: %s", close ? "TRUE" : "FALSE");
812 gtk_widget_destroy (GTK_WIDGET(window));
814 if ( gl_window_get_window_list () == NULL ) {
816 gl_debug (DEBUG_FILE, "All windows closed.");
823 gl_debug (DEBUG_FILE, "END");
829 /*****************************************************************************/
830 /* "Exit" menu callback. */
831 /*****************************************************************************/
835 const GList *window_list;
838 gl_debug (DEBUG_FILE, "START");
840 window_list = gl_window_get_window_list ();
842 for (p=(GList *)window_list; p != NULL; p=p_next) {
845 gl_file_close (GL_WINDOW(p->data));
848 gl_debug (DEBUG_FILE, "END");
854 * Local Variables: -- emacs
856 * c-basic-offset: 8 -- emacs
857 * tab-width: 8 -- emacs
858 * indent-tabs-mode: nil -- emacs