]> git.sur5r.net Git - glabels/blob - glabels2/src/template-designer.c
2007-02-03 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / template-designer.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /*
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  template-designer.c:  Template designer module
7  *
8  *  Copyright (C) 2003  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24 #include <config.h>
25
26 #include "template-designer.h"
27
28 #include <glib/gi18n.h>
29 #include <glade/glade-xml.h>
30 #include <libgnome/gnome-program.h>
31 #include <gtk/gtktogglebutton.h>
32 #include <gtk/gtkcombobox.h>
33 #include <gtk/gtkspinbutton.h>
34 #include <gtk/gtklabel.h>
35 #include <string.h>
36 #include <math.h>
37
38 #include "prefs.h"
39 #include <libglabels/paper.h>
40 #include <libglabels/template.h>
41 #include "wdgt-mini-preview.h"
42 #include "print-op.h"
43
44 #include "debug.h"
45
46 /*========================================================*/
47 /* Private macros and constants.                          */
48 /*========================================================*/
49 #define ICON_PIXMAP gnome_program_locate_file (NULL,\
50                                                GNOME_FILE_DOMAIN_APP_PIXMAP,\
51                                                "glabels.png",\
52                                                FALSE, NULL)
53
54 #define EX_RECT_IMAGE gnome_program_locate_file (NULL,\
55                                                GNOME_FILE_DOMAIN_APP_PIXMAP,\
56                                                "glabels/ex-rect-size.png",\
57                                                FALSE, NULL)
58
59 #define EX_ROUND_IMAGE gnome_program_locate_file (NULL,\
60                                                GNOME_FILE_DOMAIN_APP_PIXMAP,\
61                                                "glabels/ex-round-size.png",\
62                                                FALSE, NULL)
63
64 #define EX_CD_IMAGE gnome_program_locate_file (NULL,\
65                                                GNOME_FILE_DOMAIN_APP_PIXMAP,\
66                                                "glabels/ex-cd-size.png",\
67                                                FALSE, NULL)
68
69 #define EX_NLAYOUTS_IMAGE1 gnome_program_locate_file (NULL,\
70                                                GNOME_FILE_DOMAIN_APP_PIXMAP,\
71                                                "glabels/ex-1layout.png",\
72                                                FALSE, NULL)
73
74 #define EX_NLAYOUTS_IMAGE2 gnome_program_locate_file (NULL,\
75                                                GNOME_FILE_DOMAIN_APP_PIXMAP,\
76                                                "glabels/ex-2layouts.png",\
77                                                FALSE, NULL)
78
79 #define DEFAULT_MARGIN 9.0
80
81 #define DEFAULT_RECT_W      252.0
82 #define DEFAULT_RECT_H      144.0
83 #define DEFAULT_RECT_R        0.0
84 #define DEFAULT_RECT_WASTE    0.0 /* Should never exceed 1/2 the distance between items. */
85
86 #define DEFAULT_ROUND_R      72.0
87 #define DEFAULT_ROUND_WASTE   0.0 /* Should never exceed 1/2 the distance between items. */
88
89 #define DEFAULT_CD_RADIUS   166.5
90 #define DEFAULT_CD_HOLE      58.5
91 #define DEFAULT_CD_WASTE      9.0 /* Should never exceed 1/2 the distance between items. */
92
93 #define DELTA 0.01
94 #define MAX_PAGE_DIM_POINTS 5000.0
95
96 /*========================================================*/
97 /* Private types.                                         */
98 /*========================================================*/
99
100 struct _glTemplateDesignerPrivate
101 {
102         /* Assistant pages */
103         GtkWidget       *start_page;
104         GtkWidget       *name_page;
105         GtkWidget       *pg_size_page;
106         GtkWidget       *shape_page;
107         GtkWidget       *rect_size_page;
108         GtkWidget       *round_size_page;
109         GtkWidget       *cd_size_page;
110         GtkWidget       *nlayouts_page;
111         GtkWidget       *layout_page;
112         GtkWidget       *finish_page;
113
114         /* Name page controls */
115         GtkWidget       *brand_entry;
116         GtkWidget       *part_num_entry;
117         GtkWidget       *description_entry;
118
119         /* Page size page controls */
120         GtkWidget       *pg_size_combo;
121         GtkWidget       *pg_w_spin;
122         GtkWidget       *pg_h_spin;
123         GtkWidget       *pg_w_units_label;
124         GtkWidget       *pg_h_units_label;
125
126         /* Shape page controls */
127         GtkWidget       *shape_rect_radio;
128         GtkWidget       *shape_round_radio;
129         GtkWidget       *shape_cd_radio;
130
131         /* Label size (rectangular) page controls */
132         GtkWidget       *rect_image;
133         GtkWidget       *rect_w_spin;
134         GtkWidget       *rect_h_spin;
135         GtkWidget       *rect_r_spin;
136         GtkWidget       *rect_x_waste_spin;
137         GtkWidget       *rect_y_waste_spin;
138         GtkWidget       *rect_margin_spin;
139         GtkWidget       *rect_w_units_label;
140         GtkWidget       *rect_h_units_label;
141         GtkWidget       *rect_r_units_label;
142         GtkWidget       *rect_x_waste_units_label;
143         GtkWidget       *rect_y_waste_units_label;
144         GtkWidget       *rect_margin_units_label;
145
146         /* Label size (round) page controls */
147         GtkWidget       *round_image;
148         GtkWidget       *round_r_spin;
149         GtkWidget       *round_waste_spin;
150         GtkWidget       *round_margin_spin;
151         GtkWidget       *round_r_units_label;
152         GtkWidget       *round_waste_units_label;
153         GtkWidget       *round_margin_units_label;
154
155         /* Label size (cd) page controls */
156         GtkWidget       *cd_image;
157         GtkWidget       *cd_radius_spin;
158         GtkWidget       *cd_hole_spin;
159         GtkWidget       *cd_w_spin;
160         GtkWidget       *cd_h_spin;
161         GtkWidget       *cd_waste_spin;
162         GtkWidget       *cd_margin_spin;
163         GtkWidget       *cd_radius_units_label;
164         GtkWidget       *cd_hole_units_label;
165         GtkWidget       *cd_w_units_label;
166         GtkWidget       *cd_h_units_label;
167         GtkWidget       *cd_waste_units_label;
168         GtkWidget       *cd_margin_units_label;
169
170         /* Number of layouts controls */
171         GtkWidget       *nlayouts_image1;
172         GtkWidget       *nlayouts_image2;
173         GtkWidget       *nlayouts_spin;
174
175         /* Layout page controls */
176         GtkWidget       *layout1_head_label;
177         GtkWidget       *layout1_nx_spin;
178         GtkWidget       *layout1_ny_spin;
179         GtkWidget       *layout1_x0_spin;
180         GtkWidget       *layout1_y0_spin;
181         GtkWidget       *layout1_dx_spin;
182         GtkWidget       *layout1_dy_spin;
183         GtkWidget       *layout2_head_label;
184         GtkWidget       *layout2_nx_spin;
185         GtkWidget       *layout2_ny_spin;
186         GtkWidget       *layout2_x0_spin;
187         GtkWidget       *layout2_y0_spin;
188         GtkWidget       *layout2_dx_spin;
189         GtkWidget       *layout2_dy_spin;
190         GtkWidget       *layout_x0_units_label;
191         GtkWidget       *layout_y0_units_label;
192         GtkWidget       *layout_dx_units_label;
193         GtkWidget       *layout_dy_units_label;
194         GtkWidget       *layout_mini_preview;
195         GtkWidget       *layout_test_button;
196
197         /* Units related stuff */
198         const gchar     *units_string;
199         gdouble          units_per_point;
200         gdouble          climb_rate;
201         gint             digits;
202
203 };
204
205 /* Page numbers for traversing GtkAssistant */
206 enum {
207         START_PAGE_NUM = 0,
208         NAME_PAGE_NUM,
209         PG_SIZE_PAGE_NUM,
210         SHAPE_PAGE_NUM,
211         RECT_SIZE_PAGE_NUM,
212         ROUND_SIZE_PAGE_NUM,
213         CD_SIZE_PAGE_NUM,
214         NLAYOUTS_PAGE_NUM,
215         LAYOUT_PAGE_NUM,
216         FINISH_PAGE_NUM
217 };
218
219 /*========================================================*/
220 /* Private globals.                                       */
221 /*========================================================*/
222
223 static GtkAssistantClass* parent_class = NULL;
224
225 /*========================================================*/
226 /* Private function prototypes.                           */
227 /*========================================================*/
228
229 static void gl_template_designer_class_init       (glTemplateDesignerClass *klass);
230 static void gl_template_designer_init             (glTemplateDesigner      *dlg);
231 static void gl_template_designer_finalize         (GObject                 *object);
232 static void gl_template_designer_construct        (glTemplateDesigner      *dlg);
233
234 static void     construct_start_page              (glTemplateDesigner      *dlg,
235                                                    GdkPixbuf               *logo);
236
237 static void     construct_name_page               (glTemplateDesigner      *dlg,
238                                                    GdkPixbuf               *logo);
239
240 static void     construct_pg_size_page            (glTemplateDesigner      *dlg,
241                                                    GdkPixbuf               *logo);
242
243 static void     construct_shape_page              (glTemplateDesigner      *dlg,
244                                                    GdkPixbuf               *logo);
245
246 static void     construct_rect_size_page          (glTemplateDesigner      *dlg,
247                                                    GdkPixbuf               *logo);
248
249 static void     construct_round_size_page         (glTemplateDesigner      *dlg,
250                                                    GdkPixbuf               *logo);
251
252 static void     construct_cd_size_page            (glTemplateDesigner      *dlg,
253                                                    GdkPixbuf               *logo);
254
255 static void     construct_nlayouts_page           (glTemplateDesigner      *dlg,
256                                                    GdkPixbuf               *logo);
257
258 static void     construct_layout_page             (glTemplateDesigner      *dlg,
259                                                    GdkPixbuf               *logo);
260
261 static void     construct_finish_page             (glTemplateDesigner      *dlg,
262                                                    GdkPixbuf               *logo);
263
264 static void     cancel_cb                         (glTemplateDesigner      *dlg);
265 static void     apply_cb                          (glTemplateDesigner      *dlg);
266 static void     close_cb                          (glTemplateDesigner      *dlg);
267 static void     prepare_cb                        (glTemplateDesigner      *dlg,
268                                                    GtkWidget               *page);
269
270 static gint     forward_page_function             (gint                     current_page,
271                                                    gpointer                 data);
272
273 static void     name_page_changed_cb              (glTemplateDesigner      *dlg);
274
275 static void     pg_size_page_changed_cb           (glTemplateDesigner      *dlg);
276
277 static void     rect_size_page_prepare_cb         (glTemplateDesigner      *dlg);
278
279 static void     round_size_page_prepare_cb        (glTemplateDesigner      *dlg);
280
281 static void     cd_size_page_prepare_cb           (glTemplateDesigner      *dlg);
282
283 static void     layout_page_prepare_cb            (glTemplateDesigner      *dlg);
284
285 static void     layout_page_changed_cb            (glTemplateDesigner      *dlg);
286
287 static void     print_test_cb                     (glTemplateDesigner      *dlg);
288
289 static glTemplate *build_template                 (glTemplateDesigner      *dlg);
290
291 \f
292 /*****************************************************************************/
293 /* Boilerplate object stuff.                                                 */
294 /*****************************************************************************/
295 GType
296 gl_template_designer_get_type (void)
297 {
298         static GType type = 0;
299
300         if (!type)
301         {
302                 static const GTypeInfo info =
303                 {
304                         sizeof (glTemplateDesignerClass),
305                         NULL,           /* base_init */
306                         NULL,           /* base_finalize */
307                         (GClassInitFunc) gl_template_designer_class_init,
308                         NULL,           /* class_finalize */
309                         NULL,           /* class_data */
310                         sizeof (glTemplateDesigner),
311                         0,              /* n_preallocs */
312                         (GInstanceInitFunc) gl_template_designer_init,
313                         NULL
314                 };
315
316                 type = g_type_register_static (GTK_TYPE_ASSISTANT,
317                                                "glTemplateDesigner", &info, 0);
318         }
319
320         return type;
321 }
322
323 static void
324 gl_template_designer_class_init (glTemplateDesignerClass *klass)
325 {
326         GObjectClass *object_class = G_OBJECT_CLASS (klass);
327
328         gl_debug (DEBUG_TEMPLATE, "");
329         
330         parent_class = g_type_class_peek_parent (klass);
331
332         object_class->finalize = gl_template_designer_finalize;         
333 }
334
335 static void
336 gl_template_designer_init (glTemplateDesigner *dialog)
337 {
338         gl_debug (DEBUG_TEMPLATE, "START");
339
340         dialog->priv = g_new0 (glTemplateDesignerPrivate, 1);
341
342         gl_debug (DEBUG_TEMPLATE, "END");
343
344         return;
345 }
346
347 static void 
348 gl_template_designer_finalize (GObject *object)
349 {
350         glTemplateDesigner* dialog;
351         
352         gl_debug (DEBUG_TEMPLATE, "START");
353
354         g_return_if_fail (object != NULL);
355         
356         dialog = GL_TEMPLATE_DESIGNER (object);
357
358         g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog));
359         g_return_if_fail (dialog->priv != NULL);
360
361         G_OBJECT_CLASS (parent_class)->finalize (object);
362
363         g_free (dialog->priv);
364
365         gl_debug (DEBUG_TEMPLATE, "END");
366 }
367
368 /*****************************************************************************/
369 /* NEW preferences dialog.                                                   */
370 /*****************************************************************************/
371 GtkWidget*
372 gl_template_designer_new (GtkWindow *parent)
373 {
374         GtkWidget *dialog;
375
376         gl_debug (DEBUG_TEMPLATE, "START");
377
378         dialog = GTK_WIDGET (g_object_new (GL_TYPE_TEMPLATE_DESIGNER, NULL));
379
380         if (parent)
381                 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
382         
383         gl_template_designer_construct (GL_TEMPLATE_DESIGNER(dialog));
384
385
386         gl_debug (DEBUG_TEMPLATE, "END");
387
388         return dialog;
389 }
390
391 /*---------------------------------------------------------------------------*/
392 /* PRIVATE.  Construct composite widget.                                     */
393 /*---------------------------------------------------------------------------*/
394 static void
395 gl_template_designer_construct (glTemplateDesigner *dialog)
396 {
397         GdkPixbuf  *logo;
398
399         g_return_if_fail (dialog && GL_IS_TEMPLATE_DESIGNER (dialog));
400         g_return_if_fail (dialog->priv != NULL);
401
402         /* Initialize units stuff from prefs */
403         dialog->priv->units_string    = gl_prefs_get_units_string ();
404         dialog->priv->units_per_point = gl_prefs_get_units_per_point ();
405         dialog->priv->climb_rate      = gl_prefs_get_units_step_size ();
406         dialog->priv->digits          = gl_prefs_get_units_precision ();
407
408         gtk_window_set_title (GTK_WINDOW(dialog), _("gLabels Template Designer"));
409
410         logo = gdk_pixbuf_new_from_file (ICON_PIXMAP, NULL);
411
412         /* Costruct and append pages (must be same order as PAGE_NUM enums. */
413         construct_start_page (dialog, logo);
414         construct_name_page (dialog, logo);
415         construct_pg_size_page (dialog, logo);
416         construct_shape_page (dialog, logo);
417         construct_rect_size_page (dialog, logo);
418         construct_round_size_page (dialog, logo);
419         construct_cd_size_page (dialog, logo);
420         construct_nlayouts_page (dialog, logo);
421         construct_layout_page (dialog, logo);
422         construct_finish_page (dialog, logo);
423
424         gtk_assistant_set_forward_page_func (GTK_ASSISTANT (dialog),
425                                              forward_page_function,
426                                              dialog,
427                                              NULL);
428
429         /* signals */
430         g_signal_connect_swapped (G_OBJECT(dialog), "cancel",
431                                   G_CALLBACK(cancel_cb), dialog);
432         g_signal_connect_swapped (G_OBJECT(dialog), "apply",
433                                   G_CALLBACK(apply_cb), dialog);
434         g_signal_connect_swapped (G_OBJECT(dialog), "close",
435                                   G_CALLBACK(close_cb), dialog);
436         g_signal_connect (G_OBJECT(dialog), "prepare",
437                           G_CALLBACK(prepare_cb), NULL);
438
439         gtk_widget_show_all (GTK_WIDGET(dialog));   
440 }
441
442 /*--------------------------------------------------------------------------*/
443 /* PRIVATE.  Construct start page.                                          */
444 /*--------------------------------------------------------------------------*/
445 static void
446 construct_start_page (glTemplateDesigner      *dialog,
447                       GdkPixbuf               *logo)
448 {
449         GladeXML        *gui;
450
451         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
452                              "start_page", NULL);
453         if (!gui)
454         {
455                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
456                 return;
457         }
458
459         dialog->priv->start_page = glade_xml_get_widget (gui, "start_page");
460
461         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
462                                    dialog->priv->start_page);
463
464         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
465                                       dialog->priv->start_page,
466                                       _("Welcome"));
467         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
468                                              dialog->priv->start_page,
469                                              logo);
470         gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
471                                      dialog->priv->start_page,
472                                      GTK_ASSISTANT_PAGE_INTRO);
473         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
474                                          dialog->priv->start_page,
475                                          TRUE);
476 }
477
478 /*--------------------------------------------------------------------------*/
479 /* PRIVATE.  Construct name page.                                           */
480 /*--------------------------------------------------------------------------*/
481 static void
482 construct_name_page (glTemplateDesigner      *dialog,
483                      GdkPixbuf               *logo)
484 {
485         GladeXML        *gui;
486
487         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
488                              "name_page", NULL);
489         if (!gui)
490         {
491                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
492                 return;
493         }
494
495         dialog->priv->name_page         = glade_xml_get_widget (gui, "name_page");
496         dialog->priv->brand_entry       = glade_xml_get_widget (gui, "brand_entry");
497         dialog->priv->part_num_entry    = glade_xml_get_widget (gui, "part_num_entry");
498         dialog->priv->description_entry = glade_xml_get_widget (gui, "description_entry");
499
500         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
501                                    dialog->priv->name_page);
502
503         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
504                                       dialog->priv->name_page,
505                                       _("Name and Description"));
506         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
507                                              dialog->priv->name_page,
508                                              logo);
509
510         /* Connect a handler that listens for changes in these widgets */
511         /* This controls whether we can progress to the next page. */
512         g_signal_connect_swapped (G_OBJECT(dialog->priv->brand_entry), "changed",
513                                   G_CALLBACK(name_page_changed_cb), dialog);
514         g_signal_connect_swapped (G_OBJECT(dialog->priv->part_num_entry), "changed",
515                                   G_CALLBACK(name_page_changed_cb), dialog);
516         g_signal_connect_swapped (G_OBJECT(dialog->priv->description_entry), "changed",
517                                   G_CALLBACK(name_page_changed_cb), dialog);
518
519 }
520
521 /*--------------------------------------------------------------------------*/
522 /* PRIVATE. Construct page size page.                                       */
523 /*--------------------------------------------------------------------------*/
524 static void
525 construct_pg_size_page (glTemplateDesigner      *dialog,
526                         GdkPixbuf               *logo)
527 {
528         GladeXML        *gui;
529         GList           *page_sizes;
530         const gchar     *default_page_size_id;
531         gchar           *default_page_size_name;
532
533         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
534                              "pg_size_page", NULL);
535         if (!gui)
536         {
537                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
538                 return;
539         }
540
541         dialog->priv->pg_size_page     = glade_xml_get_widget (gui, "pg_size_page");
542         dialog->priv->pg_size_combo    = glade_xml_get_widget (gui, "pg_size_combo");
543         dialog->priv->pg_w_spin        = glade_xml_get_widget (gui, "pg_w_spin");
544         dialog->priv->pg_h_spin        = glade_xml_get_widget (gui, "pg_h_spin");
545         dialog->priv->pg_w_units_label = glade_xml_get_widget (gui, "pg_w_units_label");
546         dialog->priv->pg_h_units_label = glade_xml_get_widget (gui, "pg_h_units_label");
547
548         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
549
550         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
551                                    dialog->priv->pg_size_page);
552
553         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
554                                       dialog->priv->pg_size_page,
555                                       _("Page Size"));
556         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
557                                              dialog->priv->pg_size_page,
558                                              logo);
559         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
560                                          dialog->priv->pg_size_page,
561                                          TRUE);
562
563         /* Load page size combo */
564         page_sizes = gl_paper_get_name_list ();
565         gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->pg_size_combo), page_sizes);
566         gl_paper_free_name_list (page_sizes);
567         default_page_size_id = gl_prefs_get_page_size ();
568         default_page_size_name = gl_paper_lookup_name_from_id (default_page_size_id);
569         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name);
570         g_free (default_page_size_name);
571
572         /* Apply units to spinbuttons and units labels. */
573         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
574                                     dialog->priv->digits);
575         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
576                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
577         gtk_label_set_text (GTK_LABEL(dialog->priv->pg_w_units_label),
578                             dialog->priv->units_string);
579         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_w_spin),
580                                    0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
581         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
582                                     dialog->priv->digits);
583         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
584                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
585         gtk_label_set_text (GTK_LABEL(dialog->priv->pg_h_units_label),
586                             dialog->priv->units_string);
587         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_h_spin),
588                                    0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point);
589
590         /* Connect a handler that listens for changes in these widgets */
591         /* This controls sensitivity of related widgets. */
592         g_signal_connect_swapped (G_OBJECT(dialog->priv->pg_size_combo), "changed",
593                                   G_CALLBACK(pg_size_page_changed_cb), dialog);
594 }
595
596 /*--------------------------------------------------------------------------*/
597 /* PRIVATE.  Construct shape page.                                          */
598 /*--------------------------------------------------------------------------*/
599 static void
600 construct_shape_page (glTemplateDesigner      *dialog,
601                       GdkPixbuf               *logo)
602 {
603         GladeXML        *gui;
604
605         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
606                              "shape_page", NULL);
607         if (!gui)
608         {
609                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
610                 return;
611         }
612
613         dialog->priv->shape_page        = glade_xml_get_widget (gui, "shape_page");
614         dialog->priv->shape_rect_radio  = glade_xml_get_widget (gui, "shape_rect_radio");
615         dialog->priv->shape_round_radio = glade_xml_get_widget (gui, "shape_round_radio");
616         dialog->priv->shape_cd_radio    = glade_xml_get_widget (gui, "shape_cd_radio");
617
618         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
619                                    dialog->priv->shape_page);
620
621         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
622                                       dialog->priv->shape_page,
623                                       _("Label or Card Shape"));
624         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
625                                              dialog->priv->shape_page,
626                                              logo);
627         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
628                                          dialog->priv->shape_page,
629                                          TRUE);
630 }
631
632 /*--------------------------------------------------------------------------*/
633 /* PRIVATE.  Construct rect size page.                                      */
634 /*--------------------------------------------------------------------------*/
635 static void
636 construct_rect_size_page (glTemplateDesigner      *dialog,
637                           GdkPixbuf               *logo)
638 {
639         GladeXML        *gui;
640         GdkPixbuf       *pixbuf;
641
642         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
643                              "rect_size_page", NULL);
644         if (!gui)
645         {
646                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
647                 return;
648         }
649
650         dialog->priv->rect_size_page           = glade_xml_get_widget (gui, "rect_size_page");
651         dialog->priv->rect_image               = glade_xml_get_widget (gui, "rect_image");
652         dialog->priv->rect_w_spin              = glade_xml_get_widget (gui, "rect_w_spin");
653         dialog->priv->rect_h_spin              = glade_xml_get_widget (gui, "rect_h_spin");
654         dialog->priv->rect_r_spin              = glade_xml_get_widget (gui, "rect_r_spin");
655         dialog->priv->rect_x_waste_spin        = glade_xml_get_widget (gui, "rect_x_waste_spin");
656         dialog->priv->rect_y_waste_spin        = glade_xml_get_widget (gui, "rect_y_waste_spin");
657         dialog->priv->rect_margin_spin         = glade_xml_get_widget (gui, "rect_margin_spin");
658         dialog->priv->rect_w_units_label       = glade_xml_get_widget (gui, "rect_w_units_label");
659         dialog->priv->rect_h_units_label       = glade_xml_get_widget (gui, "rect_h_units_label");
660         dialog->priv->rect_r_units_label       = glade_xml_get_widget (gui, "rect_r_units_label");
661         dialog->priv->rect_x_waste_units_label = glade_xml_get_widget (gui, "rect_x_waste_units_label");
662         dialog->priv->rect_y_waste_units_label = glade_xml_get_widget (gui, "rect_y_waste_units_label");
663         dialog->priv->rect_margin_units_label  = glade_xml_get_widget (gui, "rect_margin_units_label");
664
665         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
666                                    dialog->priv->rect_size_page);
667
668         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
669                                       dialog->priv->rect_size_page,
670                                       _("Label or Card Size"));
671         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
672                                              dialog->priv->rect_size_page,
673                                              logo);
674         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
675                                          dialog->priv->rect_size_page,
676                                          TRUE);
677
678         /* Initialize illustration. */
679         pixbuf = gdk_pixbuf_new_from_file (EX_RECT_IMAGE, NULL);
680         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->rect_image), pixbuf);
681
682         /* Apply units to spinbuttons and units labels. */
683         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
684                                     dialog->priv->digits);
685         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
686                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
687         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_w_units_label),
688                             dialog->priv->units_string);
689         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
690                                     dialog->priv->digits);
691         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
692                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
693         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_h_units_label),
694                             dialog->priv->units_string);
695         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
696                                     dialog->priv->digits);
697         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
698                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
699         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_r_units_label),
700                             dialog->priv->units_string);
701         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
702                                     dialog->priv->digits);
703         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
704                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
705         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_x_waste_units_label),
706                             dialog->priv->units_string);
707         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
708                                     dialog->priv->digits);
709         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
710                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
711         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_y_waste_units_label),
712                             dialog->priv->units_string);
713         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
714                                     dialog->priv->digits);
715         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
716                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
717         gtk_label_set_text (GTK_LABEL(dialog->priv->rect_margin_units_label),
718                             dialog->priv->units_string);
719
720         /* Load some realistic defaults. */
721         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),
722                                    DEFAULT_RECT_W * dialog->priv->units_per_point);
723         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),
724                                    DEFAULT_RECT_H * dialog->priv->units_per_point);
725         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),
726                                    DEFAULT_RECT_R * dialog->priv->units_per_point);
727         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin),
728                                    DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
729         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin),
730                                    DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
731         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
732                                    DEFAULT_MARGIN * dialog->priv->units_per_point);
733 }
734
735 /*--------------------------------------------------------------------------*/
736 /* PRIVATE.  Construct round size page.                                     */
737 /*--------------------------------------------------------------------------*/
738 static void
739 construct_round_size_page (glTemplateDesigner      *dialog,
740                            GdkPixbuf               *logo)
741 {
742         GladeXML        *gui;
743         GdkPixbuf       *pixbuf;
744
745         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
746                              "round_size_page", NULL);
747         if (!gui)
748         {
749                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
750                 return;
751         }
752
753         dialog->priv->round_size_page          = glade_xml_get_widget (gui, "round_size_page");
754         dialog->priv->round_image              = glade_xml_get_widget (gui, "round_image");
755         dialog->priv->round_r_spin             = glade_xml_get_widget (gui, "round_r_spin");
756         dialog->priv->round_waste_spin         = glade_xml_get_widget (gui, "round_waste_spin");
757         dialog->priv->round_margin_spin        = glade_xml_get_widget (gui, "round_margin_spin");
758         dialog->priv->round_r_units_label      = glade_xml_get_widget (gui, "round_r_units_label");
759         dialog->priv->round_waste_units_label  = glade_xml_get_widget (gui, "round_waste_units_label");
760         dialog->priv->round_margin_units_label = glade_xml_get_widget (gui, "round_margin_units_label");
761
762         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
763                                    dialog->priv->round_size_page);
764
765         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
766                                       dialog->priv->round_size_page,
767                                       _("Label Size (round)"));
768         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
769                                              dialog->priv->round_size_page,
770                                              logo);
771         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
772                                          dialog->priv->round_size_page,
773                                          TRUE);
774
775         /* Initialize illustration. */
776         pixbuf = gdk_pixbuf_new_from_file (EX_ROUND_IMAGE, NULL);
777         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->round_image), pixbuf);
778
779         /* Apply units to spinbuttons and units labels. */
780         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
781                                     dialog->priv->digits);
782         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
783                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
784         gtk_label_set_text (GTK_LABEL(dialog->priv->round_r_units_label),
785                             dialog->priv->units_string);
786         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
787                                     dialog->priv->digits);
788         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
789                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
790         gtk_label_set_text (GTK_LABEL(dialog->priv->round_waste_units_label),
791                             dialog->priv->units_string);
792         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
793                                     dialog->priv->digits);
794         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
795                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
796         gtk_label_set_text (GTK_LABEL(dialog->priv->round_margin_units_label),
797                             dialog->priv->units_string);
798
799         /* Load some realistic defaults. */
800         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),
801                                    DEFAULT_ROUND_R * dialog->priv->units_per_point);
802         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),
803                                    DEFAULT_ROUND_WASTE * dialog->priv->units_per_point);
804         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
805                                    DEFAULT_MARGIN * dialog->priv->units_per_point);
806
807 }
808
809 /*--------------------------------------------------------------------------*/
810 /* PRIVATE.  Construct CD/DVD size page.                                    */
811 /*--------------------------------------------------------------------------*/
812 static void
813 construct_cd_size_page (glTemplateDesigner      *dialog,
814                         GdkPixbuf               *logo)
815 {
816         GladeXML        *gui;
817         GdkPixbuf       *pixbuf;
818
819         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
820                              "cd_size_page", NULL);
821         if (!gui)
822         {
823                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
824                 return;
825         }
826
827         dialog->priv->cd_size_page = glade_xml_get_widget (gui, "cd_size_page");
828         dialog->priv->cd_image     = glade_xml_get_widget (gui, "cd_image");
829         dialog->priv->cd_radius_spin = glade_xml_get_widget (gui, "cd_radius_spin");
830         dialog->priv->cd_hole_spin   = glade_xml_get_widget (gui, "cd_hole_spin");
831         dialog->priv->cd_w_spin      = glade_xml_get_widget (gui, "cd_w_spin");
832         dialog->priv->cd_h_spin      = glade_xml_get_widget (gui, "cd_h_spin");
833         dialog->priv->cd_waste_spin  = glade_xml_get_widget (gui, "cd_waste_spin");
834         dialog->priv->cd_margin_spin = glade_xml_get_widget (gui, "cd_margin_spin");
835         dialog->priv->cd_radius_units_label = glade_xml_get_widget (gui, "cd_radius_units_label");
836         dialog->priv->cd_hole_units_label   = glade_xml_get_widget (gui, "cd_hole_units_label");
837         dialog->priv->cd_w_units_label      = glade_xml_get_widget (gui, "cd_w_units_label");
838         dialog->priv->cd_h_units_label      = glade_xml_get_widget (gui, "cd_h_units_label");
839         dialog->priv->cd_waste_units_label  = glade_xml_get_widget (gui, "cd_waste_units_label");
840         dialog->priv->cd_margin_units_label = glade_xml_get_widget (gui, "cd_margin_units_label");
841
842         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
843                                    dialog->priv->cd_size_page);
844
845         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
846                                       dialog->priv->cd_size_page,
847                                       _("Label Size (CD/DVD)"));
848         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
849                                              dialog->priv->cd_size_page,
850                                              logo);
851         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
852                                          dialog->priv->cd_size_page,
853                                          TRUE);
854
855         /* Initialize illustration. */
856         pixbuf = gdk_pixbuf_new_from_file (EX_CD_IMAGE, NULL);
857         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->cd_image), pixbuf);
858
859         /* Apply units to spinbuttons and units labels. */
860         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
861                                     dialog->priv->digits);
862         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
863                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
864         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_radius_units_label),
865                             dialog->priv->units_string);
866         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
867                                     dialog->priv->digits);
868         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
869                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
870         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_hole_units_label),
871                             dialog->priv->units_string);
872         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
873                                     dialog->priv->digits);
874         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),
875                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
876         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_w_units_label),
877                             dialog->priv->units_string);
878         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
879                                     dialog->priv->digits);
880         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),
881                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
882         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_h_units_label),
883                             dialog->priv->units_string);
884         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
885                                     dialog->priv->digits);
886         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
887                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
888         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_waste_units_label),
889                             dialog->priv->units_string);
890         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
891                                     dialog->priv->digits);
892         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
893                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
894         gtk_label_set_text (GTK_LABEL(dialog->priv->cd_margin_units_label),
895                             dialog->priv->units_string);
896
897         /* Load some realistic defaults. */
898         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),
899                                    DEFAULT_CD_RADIUS * dialog->priv->units_per_point);
900         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),
901                                    DEFAULT_CD_HOLE * dialog->priv->units_per_point);
902         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin),
903                                    DEFAULT_CD_WASTE * dialog->priv->units_per_point);
904         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
905                                    DEFAULT_MARGIN * dialog->priv->units_per_point);
906
907 }
908
909 /*--------------------------------------------------------------------------*/
910 /* PRIVATE.  Construct number of layouts page.                              */
911 /*--------------------------------------------------------------------------*/
912 static void
913 construct_nlayouts_page (glTemplateDesigner      *dialog,
914                          GdkPixbuf               *logo)
915 {
916         GladeXML        *gui;
917         GdkPixbuf       *pixbuf;
918
919         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
920                              "nlayouts_page", NULL);
921         if (!gui)
922         {
923                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
924                 return;
925         }
926
927         dialog->priv->nlayouts_page   = glade_xml_get_widget (gui, "nlayouts_page");
928         dialog->priv->nlayouts_image1 = glade_xml_get_widget (gui, "nlayouts_image1");
929         dialog->priv->nlayouts_image2 = glade_xml_get_widget (gui, "nlayouts_image2");
930         dialog->priv->nlayouts_spin   = glade_xml_get_widget (gui, "nlayouts_spin");
931
932         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
933                                    dialog->priv->nlayouts_page);
934
935         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
936                                       dialog->priv->nlayouts_page,
937                                       _("Number of Layouts"));
938         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
939                                              dialog->priv->nlayouts_page,
940                                              logo);
941         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
942                                          dialog->priv->nlayouts_page,
943                                          TRUE);
944
945         /* Initialize illustrations. */
946         pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE1, NULL);
947         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image1), pixbuf);
948         pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE2, NULL);
949         gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image2), pixbuf);
950
951 }
952
953 /*--------------------------------------------------------------------------*/
954 /* PRIVATE.  Construct layout page.                                         */
955 /*--------------------------------------------------------------------------*/
956 static void
957 construct_layout_page (glTemplateDesigner      *dialog,
958                        GdkPixbuf               *logo)
959 {
960         GladeXML        *gui;
961
962         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
963                              "layout_page", NULL);
964         if (!gui)
965         {
966                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
967                 return;
968         }
969
970         dialog->priv->layout_page           = glade_xml_get_widget (gui, "layout_page");
971         dialog->priv->layout1_head_label    = glade_xml_get_widget (gui, "layout1_head_label");
972         dialog->priv->layout1_nx_spin       = glade_xml_get_widget (gui, "layout1_nx_spin");
973         dialog->priv->layout1_ny_spin       = glade_xml_get_widget (gui, "layout1_ny_spin");
974         dialog->priv->layout1_x0_spin       = glade_xml_get_widget (gui, "layout1_x0_spin");
975         dialog->priv->layout1_y0_spin       = glade_xml_get_widget (gui, "layout1_y0_spin");
976         dialog->priv->layout1_dx_spin       = glade_xml_get_widget (gui, "layout1_dx_spin");
977         dialog->priv->layout1_dy_spin       = glade_xml_get_widget (gui, "layout1_dy_spin");
978         dialog->priv->layout2_head_label    = glade_xml_get_widget (gui, "layout2_head_label");
979         dialog->priv->layout2_nx_spin       = glade_xml_get_widget (gui, "layout2_nx_spin");
980         dialog->priv->layout2_ny_spin       = glade_xml_get_widget (gui, "layout2_ny_spin");
981         dialog->priv->layout2_x0_spin       = glade_xml_get_widget (gui, "layout2_x0_spin");
982         dialog->priv->layout2_y0_spin       = glade_xml_get_widget (gui, "layout2_y0_spin");
983         dialog->priv->layout2_dx_spin       = glade_xml_get_widget (gui, "layout2_dx_spin");
984         dialog->priv->layout2_dy_spin       = glade_xml_get_widget (gui, "layout2_dy_spin");
985         dialog->priv->layout_x0_units_label = glade_xml_get_widget (gui, "layout_x0_units_label");
986         dialog->priv->layout_y0_units_label = glade_xml_get_widget (gui, "layout_y0_units_label");
987         dialog->priv->layout_dx_units_label = glade_xml_get_widget (gui, "layout_dx_units_label");
988         dialog->priv->layout_dy_units_label = glade_xml_get_widget (gui, "layout_dy_units_label");
989         dialog->priv->layout_mini_preview   = glade_xml_get_widget (gui, "layout_mini_preview");
990         dialog->priv->layout_test_button    = glade_xml_get_widget (gui, "layout_test_button");
991
992         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
993                                    dialog->priv->layout_page);
994
995         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
996                                       dialog->priv->layout_page,
997                                       _("Layout(s)"));
998         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
999                                              dialog->priv->layout_page,
1000                                              logo);
1001         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1002                                          dialog->priv->layout_page,
1003                                          TRUE);
1004
1005         /* Apply units to spinbuttons and units labels. */
1006         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
1007                                     dialog->priv->digits);
1008         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin),
1009                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1010         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
1011                                     dialog->priv->digits);
1012         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin),
1013                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1014         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_x0_units_label),
1015                             dialog->priv->units_string);
1016         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1017                                     dialog->priv->digits);
1018         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin),
1019                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1020         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1021                                     dialog->priv->digits);
1022         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin),
1023                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1024         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_y0_units_label),
1025                             dialog->priv->units_string);
1026         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1027                                     dialog->priv->digits);
1028         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin),
1029                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1030         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1031                                     dialog->priv->digits);
1032         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin),
1033                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1034         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dx_units_label),
1035                             dialog->priv->units_string);
1036         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1037                                     dialog->priv->digits);
1038         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin),
1039                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1040         gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1041                                     dialog->priv->digits);
1042         gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin),
1043                                         dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
1044         gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dy_units_label),
1045                             dialog->priv->units_string);
1046
1047         /* Connect a handler that listens for changes in these widgets */
1048         /* This controls sensitivity of related widgets. */
1049         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_nx_spin), "changed",
1050                                   G_CALLBACK(layout_page_changed_cb), dialog);
1051         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_ny_spin), "changed",
1052                                   G_CALLBACK(layout_page_changed_cb), dialog);
1053         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_x0_spin), "changed",
1054                                   G_CALLBACK(layout_page_changed_cb), dialog);
1055         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_y0_spin), "changed",
1056                                   G_CALLBACK(layout_page_changed_cb), dialog);
1057         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dx_spin), "changed",
1058                                   G_CALLBACK(layout_page_changed_cb), dialog);
1059         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dy_spin), "changed",
1060                                   G_CALLBACK(layout_page_changed_cb), dialog);
1061         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_nx_spin), "changed",
1062                                   G_CALLBACK(layout_page_changed_cb), dialog);
1063         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_ny_spin), "changed",
1064                                   G_CALLBACK(layout_page_changed_cb), dialog);
1065         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_x0_spin), "changed",
1066                                   G_CALLBACK(layout_page_changed_cb), dialog);
1067         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_y0_spin), "changed",
1068                                   G_CALLBACK(layout_page_changed_cb), dialog);
1069         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dx_spin), "changed",
1070                                   G_CALLBACK(layout_page_changed_cb), dialog);
1071         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dy_spin), "changed",
1072                                   G_CALLBACK(layout_page_changed_cb), dialog);
1073
1074
1075         /* Print button */
1076         g_signal_connect_swapped (G_OBJECT(dialog->priv->layout_test_button), "clicked",
1077                                   G_CALLBACK(print_test_cb), dialog);
1078
1079 }
1080
1081 /*--------------------------------------------------------------------------*/
1082 /* PRIVATE.  Construct finish page.                                         */
1083 /*--------------------------------------------------------------------------*/
1084 static void
1085 construct_finish_page (glTemplateDesigner      *dialog,
1086                        GdkPixbuf               *logo)
1087 {
1088         GladeXML        *gui;
1089
1090         gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
1091                              "finish_page", NULL);
1092         if (!gui)
1093         {
1094                 g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
1095                 return;
1096         }
1097
1098         dialog->priv->finish_page = glade_xml_get_widget (gui, "finish_page");
1099
1100         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
1101                                    dialog->priv->finish_page);
1102
1103         gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
1104                                       dialog->priv->finish_page,
1105                                       _("Design Completed"));
1106         gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
1107                                              dialog->priv->finish_page,
1108                                              logo);
1109         gtk_assistant_set_page_type (GTK_ASSISTANT (dialog),
1110                                      dialog->priv->finish_page,
1111                                      GTK_ASSISTANT_PAGE_CONFIRM);
1112         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1113                                          dialog->priv->finish_page,
1114                                          TRUE);
1115
1116 }
1117
1118 /*--------------------------------------------------------------------------*/
1119 /* PRIVATE.  cancel callback.                                               */
1120 /*--------------------------------------------------------------------------*/
1121 static void
1122 cancel_cb (glTemplateDesigner *dialog)
1123 {
1124                                                                                
1125         gtk_widget_destroy (GTK_WIDGET(dialog));
1126
1127 }
1128
1129 /*--------------------------------------------------------------------------*/
1130 /* PRIVATE.  apply callback                                                 */
1131 /*--------------------------------------------------------------------------*/
1132 static void
1133 apply_cb (glTemplateDesigner *dialog)
1134 {
1135         glTemplate *template;
1136         
1137         template = build_template (dialog);
1138         gl_template_register (template);
1139                                                                                
1140 }
1141                          
1142 /*--------------------------------------------------------------------------*/
1143 /* PRIVATE.  close callback                                                 */
1144 /*--------------------------------------------------------------------------*/
1145 static void
1146 close_cb (glTemplateDesigner *dialog)
1147 {
1148                                                                                
1149         gtk_widget_destroy (GTK_WIDGET(dialog));
1150
1151 }
1152                          
1153 /*--------------------------------------------------------------------------*/
1154 /* PRIVATE.  prepare page callback                                          */
1155 /*--------------------------------------------------------------------------*/
1156 static void
1157 prepare_cb (glTemplateDesigner      *dialog,
1158             GtkWidget               *page)
1159 {
1160         gint page_num;
1161
1162         page_num = gtk_assistant_get_current_page (GTK_ASSISTANT (dialog));
1163
1164         switch (page_num)
1165         {
1166
1167         case NAME_PAGE_NUM:
1168                 name_page_changed_cb (dialog); /* Use to prepare */
1169                 break;
1170
1171         case PG_SIZE_PAGE_NUM:
1172                 pg_size_page_changed_cb (dialog); /* Use to prepare */
1173                 break;
1174
1175         case RECT_SIZE_PAGE_NUM:
1176                 rect_size_page_prepare_cb (dialog);
1177                 break;
1178
1179         case ROUND_SIZE_PAGE_NUM:
1180                 round_size_page_prepare_cb (dialog);
1181                 break;
1182
1183         case CD_SIZE_PAGE_NUM:
1184                 cd_size_page_prepare_cb (dialog);
1185                 break;
1186
1187         case LAYOUT_PAGE_NUM:
1188                 layout_page_prepare_cb (dialog);
1189                 break;
1190
1191         default:
1192                 /* No preparation needed */
1193                 break;
1194
1195         }
1196 }
1197
1198 /*--------------------------------------------------------------------------*/
1199 /* PRIVATE.  Handle non-linear forward traversal.                           */
1200 /*--------------------------------------------------------------------------*/
1201 static gint
1202 forward_page_function (gint     current_page,
1203                        gpointer data)
1204 {
1205         glTemplateDesigner *dialog = GL_TEMPLATE_DESIGNER (data);
1206
1207         switch (current_page)
1208         {
1209         case START_PAGE_NUM:
1210                 return NAME_PAGE_NUM;
1211
1212         case NAME_PAGE_NUM:
1213                 return PG_SIZE_PAGE_NUM;
1214
1215         case PG_SIZE_PAGE_NUM:
1216                 return SHAPE_PAGE_NUM;
1217
1218         case SHAPE_PAGE_NUM:
1219                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1220                         return RECT_SIZE_PAGE_NUM;
1221                 }
1222                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1223                         return ROUND_SIZE_PAGE_NUM;
1224                 }
1225                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1226                         return CD_SIZE_PAGE_NUM;
1227                 }
1228                 break;
1229
1230         case RECT_SIZE_PAGE_NUM:
1231         case ROUND_SIZE_PAGE_NUM:
1232         case CD_SIZE_PAGE_NUM:
1233                 return NLAYOUTS_PAGE_NUM;
1234
1235         case NLAYOUTS_PAGE_NUM:
1236                 return LAYOUT_PAGE_NUM;
1237
1238         case LAYOUT_PAGE_NUM:
1239                 return FINISH_PAGE_NUM;
1240
1241         case FINISH_PAGE_NUM:
1242         default:
1243                 return -1;
1244         }
1245
1246 }
1247
1248 /*--------------------------------------------------------------------------*/
1249 /* PRIVATE.  Widget on name page "changed" callback.                        */
1250 /*--------------------------------------------------------------------------*/
1251 static void
1252 name_page_changed_cb (glTemplateDesigner *dialog)
1253 {
1254         gchar *brand, *part_num, *desc;
1255
1256         brand    = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1);
1257         part_num = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1);
1258         desc     = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1259
1260         if (brand && brand[0] && part_num && part_num[0] && desc && desc[0])
1261         {
1262
1263                 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1264                                                  dialog->priv->name_page,
1265                                                  TRUE);
1266         }
1267         else
1268         {
1269
1270                 gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
1271                                                  dialog->priv->name_page,
1272                                                  FALSE);
1273         }
1274
1275         g_free (brand);
1276         g_free (part_num);
1277         g_free (desc);
1278 }
1279                                                                                
1280 /*--------------------------------------------------------------------------*/
1281 /* PRIVATE.  Widget on page size page "changed" callback.                   */
1282 /*--------------------------------------------------------------------------*/
1283 static void
1284 pg_size_page_changed_cb (glTemplateDesigner *dialog)
1285 {
1286         gchar   *page_size_name;
1287         glPaper *paper;
1288         
1289
1290         page_size_name =
1291                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1292
1293         if (page_size_name && strlen(page_size_name)) {
1294
1295                 paper = gl_paper_from_name (page_size_name);
1296         
1297
1298                 if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1299                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), TRUE);
1300                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), TRUE);
1301                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1302                                                   TRUE);
1303                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1304                                                   TRUE);
1305
1306                 } else {
1307                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), FALSE);
1308                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), FALSE);
1309                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
1310                                                   FALSE);
1311                         gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label),
1312                                                   FALSE);
1313
1314                         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin),
1315                                                    paper->width * dialog->priv->units_per_point);
1316                         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin),
1317                                                    paper->height * dialog->priv->units_per_point);
1318                 }
1319
1320                 gl_paper_free (paper);
1321         }
1322
1323         g_free (page_size_name);
1324
1325 }
1326                                                                                
1327 /*--------------------------------------------------------------------------*/
1328 /* PRIVATE.  Prepare rectangular size page.                                 */
1329 /*--------------------------------------------------------------------------*/
1330 static void
1331 rect_size_page_prepare_cb (glTemplateDesigner *dialog)
1332 {
1333         gdouble max_w, max_h;
1334         gdouble w, h, r, x_waste, y_waste, margin;
1335
1336         /* Limit label size based on already chosen page size. */
1337         max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1338         max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1339
1340         w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1341         h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1342         r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1343         x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1344         y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1345         margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1346
1347         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_w_spin),
1348                                    dialog->priv->climb_rate, max_w);
1349         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_h_spin),
1350                                    dialog->priv->climb_rate, max_h);
1351         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_r_spin),
1352                                    0.0, MIN(max_w, max_h)/2.0);
1353         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_x_waste_spin),
1354                                    0.0, MIN(max_w, max_h)/4.0);
1355         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_y_waste_spin),
1356                                    0.0, MIN(max_w, max_h)/4.0);
1357         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_margin_spin),
1358                                    0.0, MIN(max_w, max_h)/4.0);
1359
1360         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), w);
1361         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), h);
1362         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), r);
1363         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), x_waste);
1364         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), y_waste);
1365         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), margin);
1366
1367 }
1368
1369 /*--------------------------------------------------------------------------*/
1370 /* PRIVATE.  Prepare round size page.                                       */
1371 /*--------------------------------------------------------------------------*/
1372 static void
1373 round_size_page_prepare_cb (glTemplateDesigner *dialog)
1374 {
1375         gdouble max_w, max_h;
1376         gdouble r, waste, margin;
1377
1378         /* Limit label size based on already chosen page size. */
1379         max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1380         max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1381
1382         r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1383         waste  = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1384         margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1385
1386         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_r_spin),
1387                                    dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1388         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_waste_spin),
1389                                    0.0, MIN(max_w, max_h)/4.0);
1390         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_margin_spin),
1391                                    0.0, MIN(max_w, max_h)/4.0);
1392
1393         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), r);
1394         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), waste);
1395         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), margin);
1396
1397 }
1398
1399 /*--------------------------------------------------------------------------*/
1400 /* PRIVATE.  Prepare cd/dvd size page.                                      */
1401 /*--------------------------------------------------------------------------*/
1402 static void
1403 cd_size_page_prepare_cb (glTemplateDesigner *dialog)
1404 {
1405         gdouble max_w, max_h;
1406         gdouble radius, hole, w, h, waste, margin;
1407
1408         /* Limit label size based on already chosen page size. */
1409         max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1410         max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1411
1412         radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1413         hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1414         w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1415         h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1416         waste  = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1417         margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1418
1419         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_radius_spin),
1420                                    dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1421         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_hole_spin),
1422                                    dialog->priv->climb_rate, MIN(max_w, max_h)/2.0);
1423         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_w_spin),
1424                                    0.0, max_w);
1425         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_h_spin),
1426                                    0.0, max_h);
1427         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_waste_spin),
1428                                    0.0, MIN(max_w, max_h)/4.0);
1429         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_margin_spin),
1430                                    0.0, MIN(max_w, max_h)/4.0);
1431
1432         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), radius);
1433         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), hole);
1434         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), w);
1435         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), h);
1436         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), waste);
1437         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), margin);
1438
1439 }
1440
1441 /*--------------------------------------------------------------------------*/
1442 /* PRIVATE.  Layout page widget changed cb.                                 */
1443 /*--------------------------------------------------------------------------*/
1444 static void
1445 layout_page_prepare_cb (glTemplateDesigner *dialog)
1446 {
1447         gdouble page_w, page_h;
1448         gdouble w, h, x_waste, y_waste;
1449         gint    max_nx, max_ny;
1450         gint    nlayouts;
1451         gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1452         gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1453
1454         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_nx_spin),
1455                                          G_CALLBACK(layout_page_changed_cb),
1456                                          G_OBJECT(dialog));
1457         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_ny_spin),
1458                                          G_CALLBACK(layout_page_changed_cb),
1459                                          G_OBJECT(dialog));
1460         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_x0_spin),
1461                                          G_CALLBACK(layout_page_changed_cb),
1462                                          G_OBJECT(dialog));
1463         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_y0_spin),
1464                                          G_CALLBACK(layout_page_changed_cb),
1465                                          G_OBJECT(dialog));
1466         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_dx_spin),
1467                                          G_CALLBACK(layout_page_changed_cb),
1468                                          G_OBJECT(dialog));
1469         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout1_dy_spin),
1470                                          G_CALLBACK(layout_page_changed_cb),
1471                                          G_OBJECT(dialog));
1472         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_nx_spin),
1473                                          G_CALLBACK(layout_page_changed_cb),
1474                                          G_OBJECT(dialog));
1475         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_ny_spin),
1476                                          G_CALLBACK(layout_page_changed_cb),
1477                                          G_OBJECT(dialog));
1478         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_x0_spin),
1479                                          G_CALLBACK(layout_page_changed_cb),
1480                                          G_OBJECT(dialog));
1481         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_y0_spin),
1482                                          G_CALLBACK(layout_page_changed_cb),
1483                                          G_OBJECT(dialog));
1484         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_dx_spin),
1485                                          G_CALLBACK(layout_page_changed_cb),
1486                                          G_OBJECT(dialog));
1487         g_signal_handlers_block_by_func (G_OBJECT(dialog->priv->layout2_dy_spin),
1488                                          G_CALLBACK(layout_page_changed_cb),
1489                                          G_OBJECT(dialog));
1490
1491         /* Limit ranges based on already chosen page and label sizes. */
1492         page_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
1493         page_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
1494         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1495                 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1496                 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1497                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1498                 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1499         }
1500         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1501                 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1502                 h = w;
1503                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1504                 y_waste = x_waste;
1505         }
1506         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1507                 w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1508                 h = w;
1509                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1510                 y_waste = x_waste;
1511         }
1512         max_nx = MAX (floor (page_w/(w + 2*x_waste) + DELTA), 1.0);
1513         max_ny = MAX (floor (page_h/(h + 2*y_waste) + DELTA), 1.0);
1514
1515         nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1516         ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1517         x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1518         y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1519         dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1520         dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1521         nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1522         ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1523         x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1524         y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1525         dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1526         dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1527
1528         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_nx_spin),
1529                                    1, max_nx);
1530         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_ny_spin),
1531                                    1, max_ny);
1532         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_x0_spin),
1533                                    x_waste, page_w - w - x_waste);
1534         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_y0_spin),
1535                                    y_waste, page_h - h - y_waste);
1536         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dx_spin),
1537                                    w + 2*x_waste, page_w - w - 2*x_waste);
1538         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dy_spin),
1539                                    h + 2*y_waste, page_h - h - 2*y_waste);
1540         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_nx_spin),
1541                                    1, max_nx);
1542         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_ny_spin),
1543                                    1, max_ny);
1544         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_x0_spin),
1545                                    x_waste, page_w - w - x_waste);
1546         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_y0_spin),
1547                                    y_waste, page_h - h - y_waste);
1548         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dx_spin),
1549                                    w + 2*x_waste, page_w - w - 2*x_waste);
1550         gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dy_spin),
1551                                    h + 2*y_waste, page_h - h - 2*y_waste);
1552
1553         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), nx_1);
1554         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), ny_1);
1555         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), x0_1);
1556         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), y0_1);
1557         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), dx_1);
1558         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), dy_1);
1559         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), nx_2);
1560         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), ny_2);
1561         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), x0_2);
1562         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), y0_2);
1563         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), dx_2);
1564         gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), dy_2);
1565
1566         /* Set visibility of layout2 widgets as appropriate. */
1567         nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1568         if ( nlayouts == 1 ) {
1569
1570                 gtk_widget_hide (dialog->priv->layout1_head_label);
1571                 gtk_widget_hide (dialog->priv->layout2_head_label);
1572                 gtk_widget_hide (dialog->priv->layout2_nx_spin);
1573                 gtk_widget_hide (dialog->priv->layout2_ny_spin);
1574                 gtk_widget_hide (dialog->priv->layout2_x0_spin);
1575                 gtk_widget_hide (dialog->priv->layout2_y0_spin);
1576                 gtk_widget_hide (dialog->priv->layout2_dx_spin);
1577                 gtk_widget_hide (dialog->priv->layout2_dy_spin);
1578
1579         } else {
1580
1581                 gtk_widget_show (dialog->priv->layout1_head_label);
1582                 gtk_widget_show (dialog->priv->layout2_head_label);
1583                 gtk_widget_show (dialog->priv->layout2_nx_spin);
1584                 gtk_widget_show (dialog->priv->layout2_ny_spin);
1585                 gtk_widget_show (dialog->priv->layout2_x0_spin);
1586                 gtk_widget_show (dialog->priv->layout2_y0_spin);
1587                 gtk_widget_show (dialog->priv->layout2_dx_spin);
1588                 gtk_widget_show (dialog->priv->layout2_dy_spin);
1589
1590         }
1591
1592         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_nx_spin),
1593                                            G_CALLBACK(layout_page_changed_cb),
1594                                            G_OBJECT(dialog));
1595         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_ny_spin),
1596                                            G_CALLBACK(layout_page_changed_cb),
1597                                            G_OBJECT(dialog));
1598         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_x0_spin),
1599                                            G_CALLBACK(layout_page_changed_cb),
1600                                            G_OBJECT(dialog));
1601         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_y0_spin),
1602                                            G_CALLBACK(layout_page_changed_cb),
1603                                            G_OBJECT(dialog));
1604         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_dx_spin),
1605                                            G_CALLBACK(layout_page_changed_cb),
1606                                            G_OBJECT(dialog));
1607         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout1_dy_spin),
1608                                            G_CALLBACK(layout_page_changed_cb),
1609                                            G_OBJECT(dialog));
1610         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_nx_spin),
1611                                            G_CALLBACK(layout_page_changed_cb),
1612                                            G_OBJECT(dialog));
1613         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_ny_spin),
1614                                            G_CALLBACK(layout_page_changed_cb),
1615                                            G_OBJECT(dialog));
1616         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_x0_spin),
1617                                            G_CALLBACK(layout_page_changed_cb),
1618                                            G_OBJECT(dialog));
1619         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_y0_spin),
1620                                            G_CALLBACK(layout_page_changed_cb),
1621                                            G_OBJECT(dialog));
1622         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_dx_spin),
1623                                            G_CALLBACK(layout_page_changed_cb),
1624                                            G_OBJECT(dialog));
1625         g_signal_handlers_unblock_by_func (G_OBJECT(dialog->priv->layout2_dy_spin),
1626                                            G_CALLBACK(layout_page_changed_cb),
1627                                            G_OBJECT(dialog));
1628
1629         layout_page_changed_cb (dialog);
1630 }
1631
1632 /*--------------------------------------------------------------------------*/
1633 /* PRIVATE.  Layout page widget changed cb.                                 */
1634 /*--------------------------------------------------------------------------*/
1635 static void
1636 layout_page_changed_cb (glTemplateDesigner *dialog)
1637 {
1638         glTemplate *template;
1639
1640         template = build_template (dialog);
1641
1642         gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview),
1643                                            template);
1644
1645         gl_template_free (template);
1646 }
1647
1648 /*--------------------------------------------------------------------------*/
1649 /* PRIVATE.  Print test sheet callback.                                     */
1650 /*--------------------------------------------------------------------------*/
1651 static void
1652 print_test_cb (glTemplateDesigner      *dialog)
1653 {
1654         GObject    *label;
1655         glTemplate *template;
1656         glPrintOp  *print_op;
1657
1658         label = gl_label_new ();
1659
1660         template = build_template (dialog);
1661         gl_label_set_template (GL_LABEL(label), template);
1662
1663         print_op = gl_print_op_new (GL_LABEL(label));
1664         gl_print_op_force_outline_flag (print_op);
1665         gtk_print_operation_run (GTK_PRINT_OPERATION (print_op),
1666                                  GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
1667                                  GTK_WINDOW (dialog),
1668                                  NULL);
1669
1670         gl_template_free (template);
1671         g_object_unref (G_OBJECT(label));
1672 }
1673
1674 /*--------------------------------------------------------------------------*/
1675 /* Build a template based on current assistant settings.                    */
1676 /*--------------------------------------------------------------------------*/
1677 static glTemplate *
1678 build_template (glTemplateDesigner      *dialog)
1679 {
1680         gdouble               upp;
1681         gchar                *brand, *part_num, *name, *desc;
1682         gchar                *page_size_name;
1683         glPaper              *paper;
1684         glTemplateLabelShape  shape;
1685         glTemplateLabelType  *label_type;
1686         gdouble               w, h, r, radius, hole, waste, x_waste, y_waste, margin;
1687         gint                  nlayouts;
1688         gdouble               nx_1, ny_1, x0_1, y0_1, dx_1, dy_1;
1689         gdouble               nx_2, ny_2, x0_2, y0_2, dx_2, dy_2;
1690         glTemplate           *template;
1691
1692         upp = dialog->priv->units_per_point;
1693
1694         brand    = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1);
1695         part_num = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1);
1696         name     = g_strdup_printf ("%s %s", brand, part_num);
1697         desc     = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
1698
1699         page_size_name =
1700                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
1701         paper = gl_paper_from_name (page_size_name);
1702         if ( g_strcasecmp (paper->id, "Other") == 0 ) {
1703                 paper->width =
1704                         gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin))
1705                         / upp;
1706                 paper->height =
1707                         gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin))
1708                          / upp;
1709         }
1710
1711         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
1712                 shape = GL_TEMPLATE_SHAPE_RECT;
1713                 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin));
1714                 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin));
1715                 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin));
1716                 x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
1717                 y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
1718                 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
1719         }
1720
1721         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
1722                 shape = GL_TEMPLATE_SHAPE_ROUND;
1723                 r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
1724                 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
1725                 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin));
1726         }
1727
1728         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
1729                 shape = GL_TEMPLATE_SHAPE_CD;
1730                 radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
1731                 hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin));
1732                 w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin));
1733                 h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin));
1734                 waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin));
1735                 margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin));
1736         }
1737
1738         nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin));
1739         nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin));
1740         ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin));
1741         x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin));
1742         y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin));
1743         dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin));
1744         dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin));
1745         nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin));
1746         ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin));
1747         x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin));
1748         y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin));
1749         dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin));
1750         dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin));
1751
1752
1753         template = gl_template_new (name, desc, paper->id, paper->width, paper->height);
1754
1755         switch (shape) {
1756         case GL_TEMPLATE_SHAPE_RECT:
1757                 label_type =
1758                         gl_template_rect_label_type_new ("0",
1759                                                          w/upp, h/upp, r/upp,
1760                                                          x_waste/upp, y_waste/upp);
1761                 break;
1762         case GL_TEMPLATE_SHAPE_ROUND:
1763                 label_type =
1764                         gl_template_round_label_type_new ("0", r/upp, waste/upp);
1765                 break;
1766         case GL_TEMPLATE_SHAPE_CD:
1767                 label_type =
1768                         gl_template_cd_label_type_new ("0",
1769                                                        radius/upp, hole/upp,
1770                                                        w/upp, h/upp,
1771                                                        waste/upp);
1772                 break;
1773         }
1774         gl_template_add_label_type (template, label_type);
1775
1776         gl_template_add_markup (label_type,
1777                                 gl_template_markup_margin_new (margin/upp));
1778
1779         gl_template_add_layout (label_type,
1780                                 gl_template_layout_new (nx_1, ny_1,
1781                                                         x0_1/upp,
1782                                                         y0_1/upp,
1783                                                         dx_1/upp,
1784                                                         dy_1/upp));
1785         if (nlayouts > 1) {
1786                 gl_template_add_layout (label_type,
1787                                         gl_template_layout_new (nx_2, ny_2,
1788                                                                 x0_2/upp,
1789                                                                 y0_2/upp,
1790                                                                 dx_2/upp,
1791                                                                 dy_2/upp));
1792         }
1793
1794         g_free (brand);
1795         g_free (part_num);
1796         g_free (name);
1797         g_free (desc);
1798
1799         g_free (page_size_name);
1800         gl_paper_free (paper);
1801
1802         return template;
1803 }
1804
1805 /*****************************************************************************/
1806 /* Construct mini preview widget.                                            */
1807 /*****************************************************************************/
1808 GtkWidget *
1809 gl_template_designer_construct_mini_preview (gchar *name,
1810                                              gchar *string1,
1811                                              gchar *string2,
1812                                              gint   int1,
1813                                              gint   int2)
1814 {
1815         gint width  = int1;
1816         gint height = int2;
1817
1818         return gl_wdgt_mini_preview_new (height, width);
1819 }
1820