]> git.sur5r.net Git - glabels/blob - glabels1/src/file.c
2009-09-22 Jim Evins <evins@snaught.com>
[glabels] / glabels1 / src / file.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  file.c:  FILE menu dialog module
5  *
6  *  Copyright (C) 2001  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 "file.h"
29 #include "mdi.h"
30 #include "util.h"
31 #include "media_select.h"
32 #include "rotate_select.h"
33
34 /*===========================================*/
35 /* Private globals                           */
36 /*===========================================*/
37
38 /* Saved state for new dialog */
39 static gchar *page_size = NULL;
40 static gchar *sheet_name = NULL;
41 static gboolean rotate_flag = FALSE;
42
43 /* Saved state of file selectors */
44 static gchar *open_path = NULL;
45 static gchar *save_path = NULL;
46
47 /*===========================================*/
48 /* Local function prototypes.                */
49 /*===========================================*/
50 static void create_new_dialog_widgets (GnomeDialog * new_dlg);
51 static void new_template_changed (glMediaSelect * select,
52                                   gpointer data);
53 static void new_ok (GtkWidget * widget,
54                     gpointer data);
55 static void open_ok (GtkWidget * widget,
56                      GtkFileSelection * fsel);
57 static void save_as_ok (GtkWidget * widget,
58                         GtkFileSelection * fsel);
59 \f
60 /*****************************************************************************/
61 /* "New" menu callback.                                                      */
62 /*****************************************************************************/
63 void
64 gl_file_new_cb (GtkWidget * widget,
65                 gpointer data)
66 {
67         GtkWidget *new_dlg;
68         GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
69
70         g_return_if_fail (app != NULL);
71
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));
76
77         create_new_dialog_widgets (GNOME_DIALOG (new_dlg));
78
79         gnome_dialog_button_connect (GNOME_DIALOG (new_dlg), 0,
80                                      GTK_SIGNAL_FUNC (new_ok), new_dlg);
81
82         gnome_dialog_button_connect_object (GNOME_DIALOG (new_dlg), 1,
83                                             GTK_SIGNAL_FUNC
84                                             (gtk_widget_destroy),
85                                             GTK_OBJECT (new_dlg));
86
87         gtk_widget_show_all (GTK_WIDGET (new_dlg));
88 }
89
90 /*---------------------------------------------------------------------------*/
91 /* PRIVATE.  Create widgets to enter a bond by sn and idate.                 */
92 /*---------------------------------------------------------------------------*/
93 static void
94 create_new_dialog_widgets (GnomeDialog * new_dlg)
95 {
96         GtkWidget *wframe, *wvbox, *template_entry, *rotate_sel;
97
98         wframe = gtk_frame_new (_("Media Type"));
99         gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (new_dlg)->vbox),
100                             wframe, FALSE, FALSE, 0);
101
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);
105
106         template_entry = gl_media_select_new ();
107         gtk_container_add (GTK_CONTAINER (wvbox), template_entry);
108
109         wframe = gtk_frame_new (_("Label orientation"));
110         gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (new_dlg)->vbox),
111                             wframe, FALSE, FALSE, 0);
112
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);
116
117         rotate_sel = gl_rotate_select_new ();
118         gtk_box_pack_start (GTK_BOX (wvbox), rotate_sel, FALSE, FALSE, 0);
119
120         gtk_object_set_data (GTK_OBJECT (new_dlg), "template_entry",
121                              template_entry);
122         gtk_object_set_data (GTK_OBJECT (new_dlg), "rotate_sel", rotate_sel);
123
124         gtk_signal_connect (GTK_OBJECT (template_entry), "changed",
125                             GTK_SIGNAL_FUNC (new_template_changed), rotate_sel);
126
127         if (page_size != NULL) {
128                 gl_media_select_set_page_size (GL_MEDIA_SELECT (template_entry),
129                                                page_size);
130         }
131         if (sheet_name != NULL) {
132                 gl_media_select_set_name (GL_MEDIA_SELECT (template_entry),
133                                           sheet_name);
134                 gl_rotate_select_set_template_name (GL_ROTATE_SELECT
135                                                     (rotate_sel), sheet_name);
136         } else {
137                 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);
141         }
142         gl_rotate_select_set_state (GL_ROTATE_SELECT (rotate_sel), rotate_flag);
143
144 }
145
146 /*---------------------------------------------------------------------------*/
147 /* PRIVATE.  New template changed callback.                                  */
148 /*---------------------------------------------------------------------------*/
149 static void
150 new_template_changed (glMediaSelect * select,
151                       gpointer data)
152 {
153         glRotateSelect *rotate_sel = GL_ROTATE_SELECT (data);
154         gchar *name;
155
156         name = gl_media_select_get_name (GL_MEDIA_SELECT (select));
157
158         gl_rotate_select_set_template_name (GL_ROTATE_SELECT (rotate_sel),
159                                             name);
160
161         g_free (name);
162 }
163
164 /*---------------------------------------------------------------------------*/
165 /* PRIVATE.  New "ok" button callback.                                       */
166 /*---------------------------------------------------------------------------*/
167 static void
168 new_ok (GtkWidget * widget,
169         gpointer data)
170 {
171         GnomeDialog *new_dlg = GNOME_DIALOG (data);
172         GtkWidget *template_entry, *rotate_sel;
173
174         template_entry =
175             GTK_WIDGET (gtk_object_get_data
176                         (GTK_OBJECT (new_dlg), "template_entry"));
177         rotate_sel =
178             GTK_WIDGET (gtk_object_get_data
179                         (GTK_OBJECT (new_dlg), "rotate_sel"));
180
181         if (page_size != NULL)
182                 g_free (page_size);
183         page_size =
184             gl_media_select_get_page_size (GL_MEDIA_SELECT (template_entry));
185
186         if (sheet_name != NULL)
187                 g_free (sheet_name);
188         sheet_name =
189             gl_media_select_get_name (GL_MEDIA_SELECT (template_entry));
190
191         rotate_flag =
192             gl_rotate_select_get_state (GL_ROTATE_SELECT (rotate_sel));
193
194         gl_mdi_new_child (sheet_name, rotate_flag);
195
196         gtk_widget_destroy (GTK_WIDGET (new_dlg));
197 }
198
199 /*****************************************************************************/
200 /* "Open" menu callback.                                                     */
201 /*****************************************************************************/
202 void
203 gl_file_open_cb (GtkWidget * widget,
204                  gpointer data)
205 {
206         GtkFileSelection *fsel;
207         GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
208
209         g_return_if_fail (app != NULL);
210
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"));
214
215         gtk_signal_connect (GTK_OBJECT (fsel->ok_button), "clicked",
216                             GTK_SIGNAL_FUNC (open_ok), fsel);
217
218         gtk_signal_connect_object (GTK_OBJECT (fsel->cancel_button), "clicked",
219                                    GTK_SIGNAL_FUNC (gtk_widget_destroy),
220                                    GTK_OBJECT (fsel));
221
222         /* Recover state of open dialog */
223         if (open_path != NULL) {
224                 gtk_file_selection_set_filename (fsel, open_path);
225         }
226
227         /* show the dialog */
228         gtk_widget_show (GTK_WIDGET (fsel));
229 }
230
231 /*---------------------------------------------------------------------------*/
232 /* PRIVATE.  Open "O.K." button callback.                                    */
233 /*---------------------------------------------------------------------------*/
234 static void
235 open_ok (GtkWidget * widget,
236          GtkFileSelection * fsel)
237 {
238         gchar *filename;
239         GtkWidget *dlg;
240
241         g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
242
243         /* get the filename */
244         filename = g_strdup (gtk_file_selection_get_filename (fsel));
245         if (filename) {
246                 if (!gl_mdi_new_child_from_xml_file (filename)) {
247
248                         dlg =
249                             gnome_error_dialog_parented (_("Cannot open file"),
250                                                          GTK_WINDOW (fsel));
251                         gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
252
253                 } else {
254
255                         gtk_widget_destroy (GTK_WIDGET (fsel));
256
257                         if (open_path != NULL)
258                                 g_free (open_path);
259                         open_path = g_dirname (filename);
260                         if (open_path != NULL)
261                                 open_path = g_strconcat (open_path, "/", NULL);
262
263                 }
264         }
265
266         g_free (filename);
267 }
268
269 /*****************************************************************************/
270 /* "Save" menu callback.                                                     */
271 /*****************************************************************************/
272 void
273 gl_file_save_cb (GtkWidget * widget,
274                  gpointer data)
275 {
276         GnomeMDIChild *child = gnome_mdi_get_active_child (GNOME_MDI (data));
277         GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
278         gchar *filename;
279
280         g_return_if_fail (child != NULL);
281         g_return_if_fail (app != NULL);
282
283         filename = gl_mdi_get_filename (child);
284         if (!filename) {
285                 gl_file_save_as_cb (widget, data);
286         } else {
287                 if (!gl_mdi_save_child_to_xml_file (child, filename)) {
288                         gnome_error_dialog_parented (_("Cannot save file"),
289                                                      GTK_WINDOW (app));
290                 }
291         }
292
293         g_free (filename);
294 }
295
296 /*****************************************************************************/
297 /* "Save As" menu callback.                                                  */
298 /*****************************************************************************/
299 void
300 gl_file_save_as_cb (GtkWidget * widget,
301                     gpointer data)
302 {
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));
306         gint id;
307
308         g_return_if_fail (child != NULL);
309         g_return_if_fail (app != NULL);
310
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));
314
315         gtk_window_set_transient_for (GTK_WINDOW (fsel), GTK_WINDOW (app));
316         gtk_window_set_title (GTK_WINDOW (fsel), _("Save label as"));
317
318         gtk_signal_connect (GTK_OBJECT (fsel->ok_button), "clicked",
319                             GTK_SIGNAL_FUNC (save_as_ok), fsel);
320
321         gtk_signal_connect_object (GTK_OBJECT (fsel->cancel_button), "clicked",
322                                    GTK_SIGNAL_FUNC (gtk_widget_destroy),
323                                    GTK_OBJECT (fsel));
324
325         /* Recover proper state of save-as dialog */
326         if (save_path != NULL) {
327                 gtk_file_selection_set_filename (fsel, save_path);
328         }
329
330         /* show the dialog */
331         gtk_widget_show (GTK_WIDGET (fsel));
332
333 }
334
335 /*---------------------------------------------------------------------------*/
336 /* PRIVATE.  "Save As" ok button callback.                                   */
337 /*---------------------------------------------------------------------------*/
338 static void
339 save_as_ok (GtkWidget * widget,
340             GtkFileSelection * fsel)
341 {
342         gchar *raw_filename, *filename;
343         GtkWidget *dlg;
344         gint id =
345             GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (fsel), "id"));
346         GnomeMDIChild *child = gl_mdi_find_child (id);
347
348         g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
349
350         if (child == NULL) {
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);
354                 return;
355         }
356
357         /* get the filename */
358         raw_filename = g_strdup (gtk_file_selection_get_filename (fsel));
359
360         if (!raw_filename || (raw_filename[strlen (raw_filename) - 1] == '/')) {
361
362                 dlg = gnome_warning_dialog_parented (_("Must supply file name"),
363                                                      GTK_WINDOW (fsel));
364                 gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
365
366         } else {
367
368                 filename = gl_util_add_extension (raw_filename);
369
370                 if (!gl_mdi_save_child_to_xml_file (child, filename)) {
371
372                         dlg =
373                             gnome_error_dialog_parented (_
374                                                          ("Error writing file"),
375                                                          GTK_WINDOW (fsel));
376                         gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
377
378                 } else {
379
380                         if (save_path != NULL)
381                                 g_free (save_path);
382                         save_path = g_dirname (filename);
383                         if (save_path != NULL)
384                                 save_path = g_strconcat (save_path, "/", NULL);
385
386                         gtk_widget_destroy (GTK_WIDGET (fsel));
387                 }
388
389                 g_free (filename);
390         }
391
392         g_free (raw_filename);
393 }
394
395 /*****************************************************************************/
396 /* "Close" menu callback.                                                    */
397 /*****************************************************************************/
398 void
399 gl_file_close_cb (GtkWidget * widget,
400                   gpointer data)
401 {
402         GnomeMDIChild *child = gnome_mdi_get_active_child (GNOME_MDI (data));
403
404         gl_mdi_close_child (child);
405 }
406
407 /*****************************************************************************/
408 /* "Exit" menu callback.                                                     */
409 /*****************************************************************************/
410 void
411 gl_file_exit_cb (GtkWidget * widget,
412                  gpointer data)
413 {
414         gl_mdi_close_all ();
415 }