]> git.sur5r.net Git - glabels/blob - glabels1/src/prefs.c
8e76eecbccdabe6874df94fe51b12618d3a58295
[glabels] / glabels1 / src / prefs.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  prefs.c:  Application preferences module
5  *
6  *  Copyright (C) 2001-2002  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 #include <config.h>
23
24 #include "mdi.h"
25 #include "propertybox.h"
26 #include "prefs.h"
27
28 #include "debug.h"
29
30 /*============================================*/
31 /* Private types.                             */
32 /*============================================*/
33
34 typedef struct {
35         glPrefsUnits default_units;
36         gchar *default_page_size;
37 } Prefs;
38
39 /*============================================*/
40 /* Private globals.                           */
41 /*============================================*/
42 static GtkWidget *dialog = NULL;
43
44 static Prefs *prefs = NULL;
45
46 static GtkWidget *unit_pts_radio, *unit_inches_radio, *unit_mm_radio;
47 static GtkWidget *page_size_us_letter_radio, *page_size_a4_radio;
48
49 /*============================================*/
50 /* Private function prototypes.               */
51 /*============================================*/
52 static void apply_cb (glPropertyBox * propertybox, gint arg1, gpointer user_data);
53
54 static void prefs_destroy_cb (void);
55
56 static void prefs_changed_cb (void);
57
58 static Prefs *read_prefs (void);
59
60 static void sync_prefs (Prefs * p);
61
62 static void free_prefs (Prefs * p);
63
64 static void add_general_page (GtkWidget * dialog);
65
66 static void set_general_page_from_prefs (Prefs * p);
67
68 static void set_prefs_from_general_page (Prefs * p);
69 \f
70 /****************************************************************************/
71 /* Create and display preferences dialog.                                   */
72 /****************************************************************************/
73 void
74 gl_prefs_cb (GtkWidget * widget,
75              gpointer data)
76 {
77         GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
78
79         if (prefs == NULL) {
80                 prefs = read_prefs ();
81         }
82
83         if (dialog == NULL) {
84                 dialog = gl_property_box_new ();
85                 gtk_window_set_title (GTK_WINDOW (dialog),
86                                       _("Glabels: Preferences"));
87                 gtk_window_set_transient_for (GTK_WINDOW (dialog),
88                                               GTK_WINDOW (app));
89
90                 add_general_page (dialog);
91
92                 gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
93                                     GTK_SIGNAL_FUNC (prefs_destroy_cb), NULL);
94
95                 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
96                                     GTK_SIGNAL_FUNC (prefs_destroy_cb), NULL);
97
98                 gtk_signal_connect (GTK_OBJECT (dialog), "apply",
99                                     GTK_SIGNAL_FUNC (apply_cb), NULL);
100
101                 gtk_widget_show_all (GTK_WIDGET (dialog));
102         }
103 }
104 \f
105 /*--------------------------------------------------------------------------*/
106 /* PRIVATE.  "Apply" button callback.                                       */
107 /*--------------------------------------------------------------------------*/
108 static void
109 apply_cb (glPropertyBox * propertybox,
110           gint arg1,
111           gpointer user_data)
112 {
113         set_prefs_from_general_page (prefs);
114         sync_prefs (prefs);
115 }
116
117 /*--------------------------------------------------------------------------*/
118 /* PRIVATE.  Callback to finish cleaning up after tearing down dialog.      */
119 /*--------------------------------------------------------------------------*/
120 static void
121 prefs_destroy_cb (void)
122 {
123         dialog = NULL;
124 }
125
126 /*--------------------------------------------------------------------------*/
127 /* PRIVATE.  Callback for when any control in the dialog has changed.       */
128 /*--------------------------------------------------------------------------*/
129 static void
130 prefs_changed_cb (void)
131 {
132         gl_property_box_changed (GL_PROPERTY_BOX (dialog));
133 }
134 \f
135 /*--------------------------------------------------------------------------*/
136 /* PRIVATE.  Read and set preferences from disk.                            */
137 /*--------------------------------------------------------------------------*/
138 static Prefs *
139 read_prefs (void)
140 {
141         Prefs *p;
142         gchar *string;
143         gboolean dflt;
144
145         p = g_new0 (Prefs, 1);
146
147         gnome_config_push_prefix ("/glabels/General/");
148
149         string = gnome_config_get_string_with_default ("Units=Inches", &dflt);
150         if (dflt)
151                 gnome_config_set_string ("Units", "Inches");
152         if (g_strcasecmp (string, "Points") == 0) {
153                 p->default_units = GL_PREFS_UNITS_PTS;
154         } else if (g_strcasecmp (string, "Inches") == 0) {
155                 p->default_units = GL_PREFS_UNITS_INCHES;
156         } else if (g_strcasecmp (string, "Millimeters") == 0) {
157                 p->default_units = GL_PREFS_UNITS_MM;
158         }
159         g_free (string);
160
161         p->default_page_size =
162             gnome_config_get_string_with_default ("Page_size=US-Letter", &dflt);
163         if (dflt)
164                 gnome_config_set_string ("Page_size", "US-Letter");
165
166         gnome_config_pop_prefix ();
167
168         return p;
169 }
170
171 /*--------------------------------------------------------------------------*/
172 /* PRIVATE. Sync preferences with disk.                                     */
173 /*--------------------------------------------------------------------------*/
174 static void
175 sync_prefs (Prefs * p)
176 {
177         gnome_config_push_prefix ("/glabels/General/");
178         switch (p->default_units) {
179         case GL_PREFS_UNITS_PTS:
180                 gnome_config_set_string ("Units", "Points");
181                 break;
182         case GL_PREFS_UNITS_INCHES:
183                 gnome_config_set_string ("Units", "Inches");
184                 break;
185         case GL_PREFS_UNITS_MM:
186                 gnome_config_set_string ("Units", "Millimeters");
187                 break;
188         default:
189                 WARN ("Illegal units");
190                 break;
191         }
192         gnome_config_set_string ("Page_size", p->default_page_size);
193         gnome_config_pop_prefix ();
194         gnome_config_sync ();
195 }
196 \f
197 /*--------------------------------------------------------------------------*/
198 /* PRIVATE.  Free previously allocated preferences structure.               */
199 /*--------------------------------------------------------------------------*/
200 static void
201 free_prefs (Prefs * p)
202 {
203         g_free (p);
204 }
205 \f
206 /*--------------------------------------------------------------------------*/
207 /* PRIVATE. Create and add the general page tab with controls to the dialog.*/
208 /*--------------------------------------------------------------------------*/
209 static void
210 add_general_page (GtkWidget * dialog)
211 {
212         GtkWidget *wframe, *wlabel, *wvbox, *wvbox1;
213         GSList *radio_group = NULL;
214
215         wlabel = gtk_label_new (_("General"));
216
217         wvbox = gtk_vbox_new (FALSE, 0);
218
219         /* ----- Display Units Frame ------------------------------------ */
220         wframe = gtk_frame_new (_("Display units"));
221         gtk_container_set_border_width (GTK_CONTAINER (wframe), 10);
222         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
223
224         wvbox1 = gtk_vbox_new (FALSE, GNOME_PAD);
225         gtk_container_set_border_width (GTK_CONTAINER (wvbox1), 10);
226         gtk_container_add (GTK_CONTAINER (wframe), wvbox1);
227
228         radio_group = NULL;
229
230         unit_pts_radio =
231             gtk_radio_button_new_with_label (radio_group, _("Points"));
232         radio_group =
233             gtk_radio_button_group (GTK_RADIO_BUTTON (unit_pts_radio));
234         gtk_box_pack_start (GTK_BOX (wvbox1), unit_pts_radio, FALSE, FALSE, 0);
235
236         unit_inches_radio =
237             gtk_radio_button_new_with_label (radio_group, _("Inches"));
238         radio_group =
239             gtk_radio_button_group (GTK_RADIO_BUTTON (unit_inches_radio));
240         gtk_box_pack_start (GTK_BOX (wvbox1), unit_inches_radio, FALSE, FALSE,
241                             0);
242
243         unit_mm_radio =
244             gtk_radio_button_new_with_label (radio_group, _("Millimeters"));
245         radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (unit_mm_radio));
246         gtk_box_pack_start (GTK_BOX (wvbox1), unit_mm_radio, FALSE, FALSE, 0);
247
248         /* ----- Display Units Frame ------------------------------------ */
249         wframe = gtk_frame_new (_("Default page size"));
250         gtk_container_set_border_width (GTK_CONTAINER (wframe), 10);
251         gtk_box_pack_start (GTK_BOX (wvbox), wframe, FALSE, FALSE, 0);
252
253         wvbox1 = gtk_vbox_new (FALSE, GNOME_PAD);
254         gtk_container_set_border_width (GTK_CONTAINER (wvbox1), 10);
255         gtk_container_add (GTK_CONTAINER (wframe), wvbox1);
256
257         radio_group = NULL;
258
259         page_size_us_letter_radio =
260             gtk_radio_button_new_with_label (radio_group, "US-Letter");
261         radio_group =
262             gtk_radio_button_group (GTK_RADIO_BUTTON
263                                     (page_size_us_letter_radio));
264         gtk_box_pack_start (GTK_BOX (wvbox1), page_size_us_letter_radio, FALSE,
265                             FALSE, 0);
266
267         page_size_a4_radio =
268             gtk_radio_button_new_with_label (radio_group, "A4");
269         radio_group =
270             gtk_radio_button_group (GTK_RADIO_BUTTON (page_size_a4_radio));
271         gtk_box_pack_start (GTK_BOX (wvbox1), page_size_a4_radio,
272                             FALSE, FALSE, 0);
273
274         gl_property_box_append_page (GL_PROPERTY_BOX (dialog), wvbox, wlabel);
275
276         set_general_page_from_prefs (prefs);
277
278         gtk_signal_connect (GTK_OBJECT (unit_pts_radio), "toggled",
279                             GTK_SIGNAL_FUNC (prefs_changed_cb), NULL);
280         gtk_signal_connect (GTK_OBJECT (unit_inches_radio), "toggled",
281                             GTK_SIGNAL_FUNC (prefs_changed_cb), NULL);
282         gtk_signal_connect (GTK_OBJECT (unit_mm_radio), "toggled",
283                             GTK_SIGNAL_FUNC (prefs_changed_cb), NULL);
284
285         gtk_signal_connect (GTK_OBJECT (page_size_us_letter_radio), "toggled",
286                             GTK_SIGNAL_FUNC (prefs_changed_cb), NULL);
287         gtk_signal_connect (GTK_OBJECT (page_size_a4_radio), "toggled",
288                             GTK_SIGNAL_FUNC (prefs_changed_cb), NULL);
289 }
290 \f
291 /*--------------------------------------------------------------------------*/
292 /* PRIVATE.  Initialize general tab controls from current prefs.            */
293 /*--------------------------------------------------------------------------*/
294 static void
295 set_general_page_from_prefs (Prefs * p)
296 {
297         switch (p->default_units) {
298         case GL_PREFS_UNITS_PTS:
299                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
300                                               (unit_pts_radio), TRUE);
301                 break;
302         case GL_PREFS_UNITS_INCHES:
303                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
304                                               (unit_inches_radio), TRUE);
305                 break;
306         case GL_PREFS_UNITS_MM:
307                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (unit_mm_radio),
308                                               TRUE);
309                 break;
310         default:
311                 WARN ("Illegal units");
312                 break;
313         }
314
315         if (g_strcasecmp (p->default_page_size, "US-Letter") == 0) {
316                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
317                                               (page_size_us_letter_radio),
318                                               TRUE);
319         } else if (g_strcasecmp (p->default_page_size, "A4") == 0) {
320                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
321                                               (page_size_a4_radio), TRUE);
322         } else {
323                 WARN ("Illegal page size: %s", p->default_page_size);
324         }
325 }
326
327 /*--------------------------------------------------------------------------*/
328 /* PRIVATE.  Set current preferences based on general controls.             */
329 /*--------------------------------------------------------------------------*/
330 static void
331 set_prefs_from_general_page (Prefs * p)
332 {
333         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (unit_pts_radio))) {
334                 p->default_units = GL_PREFS_UNITS_PTS;
335         } else
336             if (gtk_toggle_button_get_active
337                 (GTK_TOGGLE_BUTTON (unit_inches_radio))) {
338                 p->default_units = GL_PREFS_UNITS_INCHES;
339         } else
340             if (gtk_toggle_button_get_active
341                 (GTK_TOGGLE_BUTTON (unit_mm_radio))) {
342                 p->default_units = GL_PREFS_UNITS_MM;
343         }
344
345         if (gtk_toggle_button_get_active
346             (GTK_TOGGLE_BUTTON (page_size_us_letter_radio))) {
347                 g_free (p->default_page_size);
348                 p->default_page_size = g_strdup ("US-Letter");
349         } else
350             if (gtk_toggle_button_get_active
351                 (GTK_TOGGLE_BUTTON (page_size_a4_radio))) {
352                 g_free (p->default_page_size);
353                 p->default_page_size = g_strdup ("A4");
354         }
355
356 }
357
358 /****************************************************************************/
359 /* Get desired units.                                                       */
360 /****************************************************************************/
361 glPrefsUnits
362 gl_prefs_get_units(void)
363 {
364         return prefs->default_units;
365 }
366
367 /****************************************************************************/
368 /* Get desired units per point.                                             */
369 /****************************************************************************/
370 gdouble
371 gl_prefs_get_units_per_point (void)
372 {
373         if (prefs == NULL) {
374                 prefs = read_prefs ();
375         }
376
377         switch (prefs->default_units) {
378         case GL_PREFS_UNITS_PTS:
379                 return 1.0;     /* points */
380         case GL_PREFS_UNITS_INCHES:
381                 return 1.0 / 72.0;      /* inches */
382         case GL_PREFS_UNITS_MM:
383                 return 0.35277778;      /* mm */
384         default:
385                 WARN ("Illegal units"); /* Should not happen */
386                 return 1.0;
387         }
388 }
389
390 /****************************************************************************/
391 /* Get precision for desired units.                                         */
392 /****************************************************************************/
393 gint
394 gl_prefs_get_units_precision (void)
395 {
396         if (prefs == NULL) {
397                 prefs = read_prefs ();
398         }
399
400         switch (prefs->default_units) {
401         case GL_PREFS_UNITS_PTS:
402                 return 1;       /* points */
403         case GL_PREFS_UNITS_INCHES:
404                 return 3;       /* inches */
405         case GL_PREFS_UNITS_MM:
406                 return 1;       /* mm */
407         default:
408                 WARN ("Illegal units"); /* Should not happen */
409                 return 1.0;
410         }
411 }
412
413 /****************************************************************************/
414 /* Get step size for desired units.                                         */
415 /****************************************************************************/
416 gdouble
417 gl_prefs_get_units_step_size (void)
418 {
419         if (prefs == NULL) {
420                 prefs = read_prefs ();
421         }
422
423         switch (prefs->default_units) {
424         case GL_PREFS_UNITS_PTS:
425                 return 0.1;     /* points */
426         case GL_PREFS_UNITS_INCHES:
427                 return 0.001;   /* inches */
428         case GL_PREFS_UNITS_MM:
429                 return 0.1;     /* mm */
430         default:
431                 WARN ("Illegal units"); /* Should not happen */
432                 return 1.0;
433         }
434 }
435
436 /****************************************************************************/
437 /* Get string representing desired units.                                   */
438 /****************************************************************************/
439 const gchar *
440 gl_prefs_get_units_string (void)
441 {
442         if (prefs == NULL) {
443                 prefs = read_prefs ();
444         }
445
446         switch (prefs->default_units) {
447         case GL_PREFS_UNITS_PTS:
448                 return _("points");
449         case GL_PREFS_UNITS_INCHES:
450                 return _("inches");
451         case GL_PREFS_UNITS_MM:
452                 return _("mm");
453         default:
454                 WARN ("Illegal units"); /* Should not happen */
455                 return _("points");
456         }
457 }
458
459 /****************************************************************************/
460 /* Get default page size.                                                   */
461 /****************************************************************************/
462 const gchar *
463 gl_prefs_get_page_size (void)
464 {
465         if (prefs == NULL) {
466                 prefs = read_prefs ();
467         }
468
469         return prefs->default_page_size;
470 }