2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * prefs.c: Application preferences module
6 * Copyright (C) 2001-2002 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
25 #include "propertybox.h"
30 /*============================================*/
32 /*============================================*/
35 glPrefsUnits default_units;
36 gchar *default_page_size;
39 /*============================================*/
40 /* Private globals. */
41 /*============================================*/
42 static GtkWidget *dialog = NULL;
44 static Prefs *prefs = NULL;
46 static GtkWidget *unit_pts_radio, *unit_inches_radio, *unit_mm_radio;
47 static GtkWidget *page_size_us_letter_radio, *page_size_a4_radio;
49 /*============================================*/
50 /* Private function prototypes. */
51 /*============================================*/
52 static void apply_cb (glPropertyBox * propertybox, gint arg1, gpointer user_data);
54 static void prefs_destroy_cb (void);
56 static void prefs_changed_cb (void);
58 static Prefs *read_prefs (void);
60 static void sync_prefs (Prefs * p);
62 static void free_prefs (Prefs * p);
64 static void add_general_page (GtkWidget * dialog);
66 static void set_general_page_from_prefs (Prefs * p);
68 static void set_prefs_from_general_page (Prefs * p);
70 /****************************************************************************/
71 /* Create and display preferences dialog. */
72 /****************************************************************************/
74 gl_prefs_cb (GtkWidget * widget,
77 GnomeApp *app = gnome_mdi_get_active_window (GNOME_MDI (data));
80 prefs = read_prefs ();
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),
90 add_general_page (dialog);
92 gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
93 GTK_SIGNAL_FUNC (prefs_destroy_cb), NULL);
95 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
96 GTK_SIGNAL_FUNC (prefs_destroy_cb), NULL);
98 gtk_signal_connect (GTK_OBJECT (dialog), "apply",
99 GTK_SIGNAL_FUNC (apply_cb), NULL);
101 gtk_widget_show_all (GTK_WIDGET (dialog));
105 /*--------------------------------------------------------------------------*/
106 /* PRIVATE. "Apply" button callback. */
107 /*--------------------------------------------------------------------------*/
109 apply_cb (glPropertyBox * propertybox,
113 set_prefs_from_general_page (prefs);
117 /*--------------------------------------------------------------------------*/
118 /* PRIVATE. Callback to finish cleaning up after tearing down dialog. */
119 /*--------------------------------------------------------------------------*/
121 prefs_destroy_cb (void)
126 /*--------------------------------------------------------------------------*/
127 /* PRIVATE. Callback for when any control in the dialog has changed. */
128 /*--------------------------------------------------------------------------*/
130 prefs_changed_cb (void)
132 gl_property_box_changed (GL_PROPERTY_BOX (dialog));
135 /*--------------------------------------------------------------------------*/
136 /* PRIVATE. Read and set preferences from disk. */
137 /*--------------------------------------------------------------------------*/
145 p = g_new0 (Prefs, 1);
147 gnome_config_push_prefix ("/glabels/General/");
149 string = gnome_config_get_string_with_default ("Units=Inches", &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;
161 p->default_page_size =
162 gnome_config_get_string_with_default ("Page_size=US-Letter", &dflt);
164 gnome_config_set_string ("Page_size", "US-Letter");
166 gnome_config_pop_prefix ();
171 /*--------------------------------------------------------------------------*/
172 /* PRIVATE. Sync preferences with disk. */
173 /*--------------------------------------------------------------------------*/
175 sync_prefs (Prefs * p)
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");
182 case GL_PREFS_UNITS_INCHES:
183 gnome_config_set_string ("Units", "Inches");
185 case GL_PREFS_UNITS_MM:
186 gnome_config_set_string ("Units", "Millimeters");
189 WARN ("Illegal units");
192 gnome_config_set_string ("Page_size", p->default_page_size);
193 gnome_config_pop_prefix ();
194 gnome_config_sync ();
197 /*--------------------------------------------------------------------------*/
198 /* PRIVATE. Free previously allocated preferences structure. */
199 /*--------------------------------------------------------------------------*/
201 free_prefs (Prefs * p)
206 /*--------------------------------------------------------------------------*/
207 /* PRIVATE. Create and add the general page tab with controls to the dialog.*/
208 /*--------------------------------------------------------------------------*/
210 add_general_page (GtkWidget * dialog)
212 GtkWidget *wframe, *wlabel, *wvbox, *wvbox1;
213 GSList *radio_group = NULL;
215 wlabel = gtk_label_new (_("General"));
217 wvbox = gtk_vbox_new (FALSE, 0);
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);
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);
231 gtk_radio_button_new_with_label (radio_group, _("Points"));
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);
237 gtk_radio_button_new_with_label (radio_group, _("Inches"));
239 gtk_radio_button_group (GTK_RADIO_BUTTON (unit_inches_radio));
240 gtk_box_pack_start (GTK_BOX (wvbox1), unit_inches_radio, FALSE, FALSE,
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);
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);
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);
259 page_size_us_letter_radio =
260 gtk_radio_button_new_with_label (radio_group, "US-Letter");
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,
268 gtk_radio_button_new_with_label (radio_group, "A4");
270 gtk_radio_button_group (GTK_RADIO_BUTTON (page_size_a4_radio));
271 gtk_box_pack_start (GTK_BOX (wvbox1), page_size_a4_radio,
274 gl_property_box_append_page (GL_PROPERTY_BOX (dialog), wvbox, wlabel);
276 set_general_page_from_prefs (prefs);
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);
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);
291 /*--------------------------------------------------------------------------*/
292 /* PRIVATE. Initialize general tab controls from current prefs. */
293 /*--------------------------------------------------------------------------*/
295 set_general_page_from_prefs (Prefs * p)
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);
302 case GL_PREFS_UNITS_INCHES:
303 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
304 (unit_inches_radio), TRUE);
306 case GL_PREFS_UNITS_MM:
307 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (unit_mm_radio),
311 WARN ("Illegal units");
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),
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);
323 WARN ("Illegal page size: %s", p->default_page_size);
327 /*--------------------------------------------------------------------------*/
328 /* PRIVATE. Set current preferences based on general controls. */
329 /*--------------------------------------------------------------------------*/
331 set_prefs_from_general_page (Prefs * p)
333 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (unit_pts_radio))) {
334 p->default_units = GL_PREFS_UNITS_PTS;
336 if (gtk_toggle_button_get_active
337 (GTK_TOGGLE_BUTTON (unit_inches_radio))) {
338 p->default_units = GL_PREFS_UNITS_INCHES;
340 if (gtk_toggle_button_get_active
341 (GTK_TOGGLE_BUTTON (unit_mm_radio))) {
342 p->default_units = GL_PREFS_UNITS_MM;
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");
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");
358 /****************************************************************************/
359 /* Get desired units. */
360 /****************************************************************************/
362 gl_prefs_get_units(void)
364 return prefs->default_units;
367 /****************************************************************************/
368 /* Get desired units per point. */
369 /****************************************************************************/
371 gl_prefs_get_units_per_point (void)
374 prefs = read_prefs ();
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 */
385 WARN ("Illegal units"); /* Should not happen */
390 /****************************************************************************/
391 /* Get precision for desired units. */
392 /****************************************************************************/
394 gl_prefs_get_units_precision (void)
397 prefs = read_prefs ();
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:
408 WARN ("Illegal units"); /* Should not happen */
413 /****************************************************************************/
414 /* Get step size for desired units. */
415 /****************************************************************************/
417 gl_prefs_get_units_step_size (void)
420 prefs = read_prefs ();
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:
431 WARN ("Illegal units"); /* Should not happen */
436 /****************************************************************************/
437 /* Get string representing desired units. */
438 /****************************************************************************/
440 gl_prefs_get_units_string (void)
443 prefs = read_prefs ();
446 switch (prefs->default_units) {
447 case GL_PREFS_UNITS_PTS:
449 case GL_PREFS_UNITS_INCHES:
451 case GL_PREFS_UNITS_MM:
454 WARN ("Illegal units"); /* Should not happen */
459 /****************************************************************************/
460 /* Get default page size. */
461 /****************************************************************************/
463 gl_prefs_get_page_size (void)
466 prefs = read_prefs ();
469 return prefs->default_page_size;