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