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