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
31 #include "media_select.h"
32 #include "rotate_select.h"
34 /*===========================================*/
36 /*===========================================*/
38 /* Saved state for new dialog */
39 static gchar *page_size = NULL;
40 static gchar *sheet_name = NULL;
41 static gboolean rotate_flag = FALSE;
43 /* Saved state of file selectors */
44 static gchar *open_path = NULL;
45 static gchar *save_path = NULL;
47 /*===========================================*/
48 /* Local function prototypes. */
49 /*===========================================*/
50 static void create_new_dialog_widgets (GnomeDialog * new_dlg);
51 static void new_template_changed (glMediaSelect * select,
53 static void new_ok (GtkWidget * widget,
55 static void open_ok (GtkWidget * widget,
56 GtkFileSelection * fsel);
57 static void save_as_ok (GtkWidget * widget,
58 GtkFileSelection * fsel);
60 /*****************************************************************************/
61 /* "New" menu callback. */
62 /*****************************************************************************/
64 gl_file_new_cb (GtkWidget * widget,
68 GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
70 g_return_if_fail (app != NULL);
72 new_dlg = gnome_dialog_new (_("New Label or Card"),
73 GNOME_STOCK_BUTTON_OK,
74 GNOME_STOCK_BUTTON_CANCEL, NULL);
75 gtk_window_set_transient_for (GTK_WINDOW (new_dlg), GTK_WINDOW (app));
77 create_new_dialog_widgets (GNOME_DIALOG (new_dlg));
79 gnome_dialog_button_connect (GNOME_DIALOG (new_dlg), 0,
80 GTK_SIGNAL_FUNC (new_ok), new_dlg);
82 gnome_dialog_button_connect_object (GNOME_DIALOG (new_dlg), 1,
85 GTK_OBJECT (new_dlg));
87 gtk_widget_show_all (GTK_WIDGET (new_dlg));
90 /*---------------------------------------------------------------------------*/
91 /* PRIVATE. Create widgets to enter a bond by sn and idate. */
92 /*---------------------------------------------------------------------------*/
94 create_new_dialog_widgets (GnomeDialog * new_dlg)
96 GtkWidget *wframe, *wvbox, *template_entry, *rotate_sel;
98 wframe = gtk_frame_new (_("Media Type"));
99 gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (new_dlg)->vbox),
100 wframe, FALSE, FALSE, 0);
102 wvbox = gtk_vbox_new (FALSE, GNOME_PAD);
103 gtk_container_set_border_width (GTK_CONTAINER (wvbox), 10);
104 gtk_container_add (GTK_CONTAINER (wframe), wvbox);
106 template_entry = gl_media_select_new ();
107 gtk_container_add (GTK_CONTAINER (wvbox), template_entry);
109 wframe = gtk_frame_new (_("Label orientation"));
110 gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (new_dlg)->vbox),
111 wframe, FALSE, FALSE, 0);
113 wvbox = gtk_vbox_new (FALSE, GNOME_PAD);
114 gtk_container_set_border_width (GTK_CONTAINER (wvbox), 10);
115 gtk_container_add (GTK_CONTAINER (wframe), wvbox);
117 rotate_sel = gl_rotate_select_new ();
118 gtk_box_pack_start (GTK_BOX (wvbox), rotate_sel, FALSE, FALSE, 0);
120 gtk_object_set_data (GTK_OBJECT (new_dlg), "template_entry",
122 gtk_object_set_data (GTK_OBJECT (new_dlg), "rotate_sel", rotate_sel);
124 gtk_signal_connect (GTK_OBJECT (template_entry), "changed",
125 GTK_SIGNAL_FUNC (new_template_changed), rotate_sel);
127 if (page_size != NULL) {
128 gl_media_select_set_page_size (GL_MEDIA_SELECT (template_entry),
131 if (sheet_name != NULL) {
132 gl_media_select_set_name (GL_MEDIA_SELECT (template_entry),
134 gl_rotate_select_set_template_name (GL_ROTATE_SELECT
135 (rotate_sel), sheet_name);
138 gl_media_select_get_name (GL_MEDIA_SELECT (template_entry));
139 gl_rotate_select_set_template_name (GL_ROTATE_SELECT
140 (rotate_sel), sheet_name);
142 gl_rotate_select_set_state (GL_ROTATE_SELECT (rotate_sel), rotate_flag);
146 /*---------------------------------------------------------------------------*/
147 /* PRIVATE. New template changed callback. */
148 /*---------------------------------------------------------------------------*/
150 new_template_changed (glMediaSelect * select,
153 glRotateSelect *rotate_sel = GL_ROTATE_SELECT (data);
156 name = gl_media_select_get_name (GL_MEDIA_SELECT (select));
158 gl_rotate_select_set_template_name (GL_ROTATE_SELECT (rotate_sel),
164 /*---------------------------------------------------------------------------*/
165 /* PRIVATE. New "ok" button callback. */
166 /*---------------------------------------------------------------------------*/
168 new_ok (GtkWidget * widget,
171 GnomeDialog *new_dlg = GNOME_DIALOG (data);
172 GtkWidget *template_entry, *rotate_sel;
175 GTK_WIDGET (gtk_object_get_data
176 (GTK_OBJECT (new_dlg), "template_entry"));
178 GTK_WIDGET (gtk_object_get_data
179 (GTK_OBJECT (new_dlg), "rotate_sel"));
181 if (page_size != NULL)
184 gl_media_select_get_page_size (GL_MEDIA_SELECT (template_entry));
186 if (sheet_name != NULL)
189 gl_media_select_get_name (GL_MEDIA_SELECT (template_entry));
192 gl_rotate_select_get_state (GL_ROTATE_SELECT (rotate_sel));
194 gl_mdi_new_child (sheet_name, rotate_flag);
196 gtk_widget_destroy (GTK_WIDGET (new_dlg));
199 /*****************************************************************************/
200 /* "Open" menu callback. */
201 /*****************************************************************************/
203 gl_file_open_cb (GtkWidget * widget,
206 GtkFileSelection *fsel;
207 GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
209 g_return_if_fail (app != NULL);
211 fsel = GTK_FILE_SELECTION (gtk_file_selection_new (_("Open")));
212 gtk_window_set_transient_for (GTK_WINDOW (fsel), GTK_WINDOW (app));
213 gtk_window_set_title (GTK_WINDOW (fsel), _("Open label"));
215 gtk_signal_connect (GTK_OBJECT (fsel->ok_button), "clicked",
216 GTK_SIGNAL_FUNC (open_ok), fsel);
218 gtk_signal_connect_object (GTK_OBJECT (fsel->cancel_button), "clicked",
219 GTK_SIGNAL_FUNC (gtk_widget_destroy),
222 /* Recover state of open dialog */
223 if (open_path != NULL) {
224 gtk_file_selection_set_filename (fsel, open_path);
227 /* show the dialog */
228 gtk_widget_show (GTK_WIDGET (fsel));
231 /*---------------------------------------------------------------------------*/
232 /* PRIVATE. Open "O.K." button callback. */
233 /*---------------------------------------------------------------------------*/
235 open_ok (GtkWidget * widget,
236 GtkFileSelection * fsel)
241 g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
243 /* get the filename */
244 filename = g_strdup (gtk_file_selection_get_filename (fsel));
246 if (!gl_mdi_new_child_from_xml_file (filename)) {
249 gnome_error_dialog_parented (_("Cannot open file"),
251 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
255 gtk_widget_destroy (GTK_WIDGET (fsel));
257 if (open_path != NULL)
259 open_path = g_dirname (filename);
260 if (open_path != NULL)
261 open_path = g_strconcat (open_path, "/", NULL);
269 /*****************************************************************************/
270 /* "Save" menu callback. */
271 /*****************************************************************************/
273 gl_file_save_cb (GtkWidget * widget,
276 GnomeMDIChild *child = gnome_mdi_get_active_child (GNOME_MDI (data));
277 GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
280 g_return_if_fail (child != NULL);
281 g_return_if_fail (app != NULL);
283 filename = gl_mdi_get_filename (child);
285 gl_file_save_as_cb (widget, data);
287 if (!gl_mdi_save_child_to_xml_file (child, filename)) {
288 gnome_error_dialog_parented (_("Cannot save file"),
296 /*****************************************************************************/
297 /* "Save As" menu callback. */
298 /*****************************************************************************/
300 gl_file_save_as_cb (GtkWidget * widget,
303 GnomeMDIChild *child = gnome_mdi_get_active_child (GNOME_MDI (data));
304 GtkFileSelection *fsel;
305 GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
308 g_return_if_fail (child != NULL);
309 g_return_if_fail (app != NULL);
311 fsel = GTK_FILE_SELECTION (gtk_file_selection_new (_("Save As")));
312 id = gl_mdi_get_id (child);
313 gtk_object_set_data (GTK_OBJECT (fsel), "id", GINT_TO_POINTER (id));
315 gtk_window_set_transient_for (GTK_WINDOW (fsel), GTK_WINDOW (app));
316 gtk_window_set_title (GTK_WINDOW (fsel), _("Save label as"));
318 gtk_signal_connect (GTK_OBJECT (fsel->ok_button), "clicked",
319 GTK_SIGNAL_FUNC (save_as_ok), fsel);
321 gtk_signal_connect_object (GTK_OBJECT (fsel->cancel_button), "clicked",
322 GTK_SIGNAL_FUNC (gtk_widget_destroy),
325 /* Recover proper state of save-as dialog */
326 if (save_path != NULL) {
327 gtk_file_selection_set_filename (fsel, save_path);
330 /* show the dialog */
331 gtk_widget_show (GTK_WIDGET (fsel));
335 /*---------------------------------------------------------------------------*/
336 /* PRIVATE. "Save As" ok button callback. */
337 /*---------------------------------------------------------------------------*/
339 save_as_ok (GtkWidget * widget,
340 GtkFileSelection * fsel)
342 gchar *raw_filename, *filename;
345 GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (fsel), "id"));
346 GnomeMDIChild *child = gl_mdi_find_child (id);
348 g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
351 gtk_widget_destroy (GTK_WIDGET (fsel));
352 dlg = gnome_error_dialog (_("Label no longer valid!"));
353 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
357 /* get the filename */
358 raw_filename = g_strdup (gtk_file_selection_get_filename (fsel));
360 if (!raw_filename || (raw_filename[strlen (raw_filename) - 1] == '/')) {
362 dlg = gnome_warning_dialog_parented (_("Must supply file name"),
364 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
368 filename = gl_util_add_extension (raw_filename);
370 if (!gl_mdi_save_child_to_xml_file (child, filename)) {
373 gnome_error_dialog_parented (_
374 ("Error writing file"),
376 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
380 if (save_path != NULL)
382 save_path = g_dirname (filename);
383 if (save_path != NULL)
384 save_path = g_strconcat (save_path, "/", NULL);
386 gtk_widget_destroy (GTK_WIDGET (fsel));
392 g_free (raw_filename);
395 /*****************************************************************************/
396 /* "Close" menu callback. */
397 /*****************************************************************************/
399 gl_file_close_cb (GtkWidget * widget,
402 GnomeMDIChild *child = gnome_mdi_get_active_child (GNOME_MDI (data));
404 gl_mdi_close_child (child);
407 /*****************************************************************************/
408 /* "Exit" menu callback. */
409 /*****************************************************************************/
411 gl_file_exit_cb (GtkWidget * widget,