]> git.sur5r.net Git - glabels/blobdiff - src/template-designer.c
Imported Upstream version 3.0.0
[glabels] / src / template-designer.c
index 60ffe576f71fd8322b64e36c7eb45c2981d1f031..2719958eca2fbfd8890e11aee58dd701b1010256 100644 (file)
@@ -1,59 +1,47 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
 /*
- *  (GLABELS) Label and Business Card Creation program for GNOME
- *
- *  template-designer.c:  Template designer module
+ *  template-designer.c
+ *  Copyright (C) 2003-2009  Jim Evins <evins@snaught.com>.
  *
- *  Copyright (C) 2003  Jim Evins <evins@snaught.com>.
+ *  This file is part of gLabels.
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  gLabels is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
- *  This program is distributed in the hope that it will be useful,
+ *  gLabels is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
  */
+
 #include <config.h>
 
 #include "template-designer.h"
 
 #include <glib/gi18n.h>
-#include <glade/glade-xml.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkcombobox.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtklabel.h>
+#include <gtk/gtk.h>
 #include <string.h>
 #include <math.h>
 
+#include <libglabels.h>
 #include "prefs.h"
-#include <libglabels/db.h>
-#include "wdgt-mini-preview.h"
+#include "mini-preview.h"
 #include "mini-preview-pixbuf-cache.h"
-#include "print-op.h"
-#include "util.h"
+#include "print-op-dialog.h"
+#include "combo-util.h"
+#include "builder-util.h"
+#include "units-util.h"
 
 #include "debug.h"
 
+
 /*========================================================*/
 /* Private macros and constants.                          */
 /*========================================================*/
-#define ICON_PIXMAP        (GLABELS_ICON_DIR "glabels.png")
-
-#define EX_RECT_IMAGE      (GLABELS_PIXMAP_DIR "ex-rect-size.png")
-#define EX_ROUND_IMAGE     (GLABELS_PIXMAP_DIR "ex-round-size.png")
-#define EX_CD_IMAGE        (GLABELS_PIXMAP_DIR "ex-cd-size.png")
-#define EX_NLAYOUTS_IMAGE1 (GLABELS_PIXMAP_DIR "ex-1layout.png")
-#define EX_NLAYOUTS_IMAGE2 (GLABELS_PIXMAP_DIR "ex-2layouts.png")
-
 #define DEFAULT_MARGIN 9.0
 
 #define DEFAULT_RECT_W      252.0
 #define DEFAULT_RECT_R        0.0
 #define DEFAULT_RECT_WASTE    0.0 /* Should never exceed 1/2 the distance between items. */
 
+#define DEFAULT_ELLIPSE_W      252.0
+#define DEFAULT_ELLIPSE_H      144.0
+#define DEFAULT_ELLIPSE_WASTE    0.0 /* Should never exceed 1/2 the distance between items. */
+
 #define DEFAULT_ROUND_R      72.0
 #define DEFAULT_ROUND_WASTE   0.0 /* Should never exceed 1/2 the distance between items. */
 
 #define DELTA 0.01
 #define MAX_PAGE_DIM_POINTS 5000.0
 
+
 /*========================================================*/
 /* Private types.                                         */
 /*========================================================*/
 
 struct _glTemplateDesignerPrivate
 {
+        gboolean         edit_flag;
+        gchar           *edit_brand;
+        gchar           *edit_part;
+
+        GtkBuilder      *builder;
+
        /* Assistant pages */
        GtkWidget       *start_page;
        GtkWidget       *name_page;
        GtkWidget       *pg_size_page;
        GtkWidget       *shape_page;
        GtkWidget       *rect_size_page;
+       GtkWidget       *ellipse_size_page;
        GtkWidget       *round_size_page;
        GtkWidget       *cd_size_page;
        GtkWidget       *nlayouts_page;
@@ -97,6 +97,7 @@ struct _glTemplateDesignerPrivate
        GtkWidget       *description_entry;
 
        /* Page size page controls */
+       GtkWidget       *pg_size_combo_hbox;
        GtkWidget       *pg_size_combo;
        GtkWidget       *pg_w_spin;
        GtkWidget       *pg_h_spin;
@@ -105,6 +106,7 @@ struct _glTemplateDesignerPrivate
 
        /* Shape page controls */
        GtkWidget       *shape_rect_radio;
+       GtkWidget       *shape_ellipse_radio;
        GtkWidget       *shape_round_radio;
        GtkWidget       *shape_cd_radio;
 
@@ -123,6 +125,17 @@ struct _glTemplateDesignerPrivate
        GtkWidget       *rect_y_waste_units_label;
        GtkWidget       *rect_margin_units_label;
 
+       /* Label size (elliptical) page controls */
+       GtkWidget       *ellipse_image;
+       GtkWidget       *ellipse_w_spin;
+       GtkWidget       *ellipse_h_spin;
+       GtkWidget       *ellipse_waste_spin;
+       GtkWidget       *ellipse_margin_spin;
+       GtkWidget       *ellipse_w_units_label;
+       GtkWidget       *ellipse_h_units_label;
+       GtkWidget       *ellipse_waste_units_label;
+       GtkWidget       *ellipse_margin_units_label;
+
        /* Label size (round) page controls */
        GtkWidget       *round_image;
        GtkWidget       *round_r_spin;
@@ -171,6 +184,7 @@ struct _glTemplateDesignerPrivate
        GtkWidget       *layout_y0_units_label;
        GtkWidget       *layout_dx_units_label;
        GtkWidget       *layout_dy_units_label;
+       GtkWidget       *mini_preview_vbox;
        GtkWidget       *layout_mini_preview;
        GtkWidget       *layout_test_button;
 
@@ -191,6 +205,7 @@ enum {
         PG_SIZE_PAGE_NUM,
         SHAPE_PAGE_NUM,
         RECT_SIZE_PAGE_NUM,
+        ELLIPSE_SIZE_PAGE_NUM,
         ROUND_SIZE_PAGE_NUM,
         CD_SIZE_PAGE_NUM,
         NLAYOUTS_PAGE_NUM,
@@ -198,6 +213,7 @@ enum {
         FINISH_PAGE_NUM
 };
 
+
 /*========================================================*/
 /* Private globals.                                       */
 /*========================================================*/
@@ -225,6 +241,9 @@ static void     construct_shape_page              (glTemplateDesigner      *dial
 static void     construct_rect_size_page          (glTemplateDesigner      *dialog,
                                                   GdkPixbuf               *logo);
 
+static void     construct_ellipse_size_page       (glTemplateDesigner      *dialog,
+                                                  GdkPixbuf               *logo);
+
 static void     construct_round_size_page         (glTemplateDesigner      *dialog,
                                                   GdkPixbuf               *logo);
 
@@ -255,6 +274,8 @@ static void     pg_size_page_changed_cb           (glTemplateDesigner      *dial
 
 static void     rect_size_page_prepare_cb         (glTemplateDesigner      *dialog);
 
+static void     ellipse_size_page_prepare_cb      (glTemplateDesigner      *dialog);
+
 static void     round_size_page_prepare_cb        (glTemplateDesigner      *dialog);
 
 static void     cd_size_page_prepare_cb           (glTemplateDesigner      *dialog);
@@ -267,36 +288,72 @@ static void     print_test_cb                     (glTemplateDesigner      *dial
 
 static lglTemplate *build_template                (glTemplateDesigner      *dialog);
 
-\f
+
 /*****************************************************************************/
 /* Boilerplate object stuff.                                                 */
 /*****************************************************************************/
-G_DEFINE_TYPE (glTemplateDesigner, gl_template_designer, GTK_TYPE_ASSISTANT);
+G_DEFINE_TYPE (glTemplateDesigner, gl_template_designer, GTK_TYPE_ASSISTANT)
+
 
 static void
 gl_template_designer_class_init (glTemplateDesignerClass *class)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (class);
 
-       gl_debug (DEBUG_TEMPLATE, "");
-       
        gl_template_designer_parent_class = g_type_class_peek_parent (class);
 
        object_class->finalize = gl_template_designer_finalize;         
 }
 
+
 static void
 gl_template_designer_init (glTemplateDesigner *dialog)
 {
+        gchar             *builder_filename;
+        static gchar      *object_ids[] = { "start_page",
+                                            "name_page",
+                                            "pg_size_page",
+                                            "shape_page",
+                                            "rect_size_page",
+                                            "ellipse_size_page",
+                                            "round_size_page",
+                                            "cd_size_page",
+                                            "nlayouts_page",
+                                            "layout_page",
+                                            "finish_page",
+                                            "adjustment1",  "adjustment2",  "adjustment3",
+                                            "adjustment4",  "adjustment5",  "adjustment6",
+                                            "adjustment7",  "adjustment8",  "adjustment9",
+                                            "adjustment10", "adjustment11", "adjustment12",
+                                            "adjustment13", "adjustment14", "adjustment15",
+                                            "adjustment16", "adjustment17", "adjustment18",
+                                            "adjustment19", "adjustment20", "adjustment21",
+                                            "adjustment22", "adjustment23", "adjustment24",
+                                            "adjustment25", "adjustment26", "adjustment27",
+                                            "adjustment28", "adjustment29", "adjustment30",
+                                            NULL };
+        GError            *error = NULL;
+
        gl_debug (DEBUG_TEMPLATE, "START");
 
        dialog->priv = g_new0 (glTemplateDesignerPrivate, 1);
 
+        dialog->priv->builder = gtk_builder_new ();
+        builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "template-designer.ui", NULL);
+        gtk_builder_add_objects_from_file (dialog->priv->builder, builder_filename, object_ids, &error);
+        g_free (builder_filename);
+       if (error) {
+               g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
+                g_error_free (error);
+               return;
+       }
+
        gl_debug (DEBUG_TEMPLATE, "END");
 
         return;
 }
 
+
 static void 
 gl_template_designer_finalize (GObject *object)
 {
@@ -308,6 +365,13 @@ gl_template_designer_finalize (GObject *object)
        g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog));
        g_return_if_fail (dialog->priv != NULL);
 
+        g_free (dialog->priv->edit_brand);
+        g_free (dialog->priv->edit_part);
+
+        if (dialog->priv->builder)
+        {
+                g_object_unref (dialog->priv->builder);
+        }
        g_free (dialog->priv);
 
        G_OBJECT_CLASS (gl_template_designer_parent_class)->finalize (object);
@@ -315,6 +379,7 @@ gl_template_designer_finalize (GObject *object)
        gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*****************************************************************************/
 /* NEW preferences dialog.                                                   */
 /*****************************************************************************/
@@ -338,33 +403,42 @@ gl_template_designer_new (GtkWindow *parent)
        return dialog;
 }
 
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Construct composite widget.                                     */
 /*---------------------------------------------------------------------------*/
 static void
 gl_template_designer_construct (glTemplateDesigner *dialog)
 {
+        lglUnits    units;
+        gchar      *logo_filename;
        GdkPixbuf  *logo;
 
+       gl_debug (DEBUG_TEMPLATE, "START");
+
        g_return_if_fail (dialog && GL_IS_TEMPLATE_DESIGNER (dialog));
        g_return_if_fail (dialog->priv != NULL);
 
        /* Initialize units stuff from prefs */
-       dialog->priv->units_string    = gl_prefs_get_units_string ();
-        dialog->priv->units_per_point = gl_prefs_get_units_per_point ();
-        dialog->priv->climb_rate      = gl_prefs_get_units_step_size ();
-        dialog->priv->digits          = gl_prefs_get_units_precision ();
+        units = gl_prefs_model_get_units (gl_prefs);
+       dialog->priv->units_string    = lgl_units_get_name (units);
+        dialog->priv->units_per_point = lgl_units_get_units_per_point (units);
+        dialog->priv->climb_rate      = gl_units_util_get_step_size (units);
+        dialog->priv->digits          = gl_units_util_get_precision (units);
 
-       gtk_window_set_title (GTK_WINDOW(dialog), _("gLabels Template Designer"));
+       gtk_window_set_title (GTK_WINDOW(dialog), _("New gLabels Template"));
 
-       logo = gdk_pixbuf_new_from_file (ICON_PIXMAP, NULL);
+        logo_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "template-designer.png", NULL);
+       logo = gdk_pixbuf_new_from_file (logo_filename, NULL);
+        g_free (logo_filename);
 
-        /* Costruct and append pages (must be same order as PAGE_NUM enums. */
+        /* Construct and append pages (must be same order as PAGE_NUM enums. */
        construct_start_page (dialog, logo);
        construct_name_page (dialog, logo);
        construct_pg_size_page (dialog, logo);
        construct_shape_page (dialog, logo);
        construct_rect_size_page (dialog, logo);
+       construct_ellipse_size_page (dialog, logo);
        construct_round_size_page (dialog, logo);
        construct_cd_size_page (dialog, logo);
        construct_nlayouts_page (dialog, logo);
@@ -387,8 +461,11 @@ gl_template_designer_construct (glTemplateDesigner *dialog)
                           G_CALLBACK(prepare_cb), NULL);
 
         gtk_widget_show_all (GTK_WIDGET(dialog));   
+
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct start page.                                          */
 /*--------------------------------------------------------------------------*/
@@ -396,20 +473,11 @@ static void
 construct_start_page (glTemplateDesigner      *dialog,
                      GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
-
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "start_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->start_page = glade_xml_get_widget (gui, "start_page");
-
-        g_object_unref (gui);
+       gl_debug (DEBUG_TEMPLATE, "START");
 
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "start_page", &dialog->priv->start_page,
+                                     NULL);
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
                                    dialog->priv->start_page);
@@ -426,8 +494,11 @@ construct_start_page (glTemplateDesigner      *dialog,
         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
                                          dialog->priv->start_page,
                                          TRUE);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct name page.                                           */
 /*--------------------------------------------------------------------------*/
@@ -435,24 +506,16 @@ static void
 construct_name_page (glTemplateDesigner      *dialog,
                     GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
-
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "name_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->name_page          = glade_xml_get_widget (gui, "name_page");
-       dialog->priv->brand_entry        = glade_xml_get_widget (gui, "brand_entry");
-       dialog->priv->part_num_entry     = glade_xml_get_widget (gui, "part_num_entry");
-       dialog->priv->name_warning_image = glade_xml_get_widget (gui, "name_warning_image");
-       dialog->priv->name_warning_label = glade_xml_get_widget (gui, "name_warning_label");
-       dialog->priv->description_entry  = glade_xml_get_widget (gui, "description_entry");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "name_page",          &dialog->priv->name_page,
+                                     "brand_entry",        &dialog->priv->brand_entry,
+                                     "part_num_entry",     &dialog->priv->part_num_entry,
+                                     "name_warning_image", &dialog->priv->name_warning_image,
+                                     "name_warning_label", &dialog->priv->name_warning_label,
+                                     "description_entry",  &dialog->priv->description_entry,
+                                     NULL);
 
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
@@ -474,8 +537,10 @@ construct_name_page (glTemplateDesigner      *dialog,
        g_signal_connect_swapped (G_OBJECT(dialog->priv->description_entry), "changed",
                                  G_CALLBACK(name_page_changed_cb), dialog);
 
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE. Construct page size page.                                       */
 /*--------------------------------------------------------------------------*/
@@ -483,30 +548,24 @@ static void
 construct_pg_size_page (glTemplateDesigner      *dialog,
                        GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
        GList           *page_sizes;
        const gchar     *default_page_size_id;
        gchar           *default_page_size_name;
 
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "pg_size_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->pg_size_page     = glade_xml_get_widget (gui, "pg_size_page");
-       dialog->priv->pg_size_combo    = glade_xml_get_widget (gui, "pg_size_combo");
-       dialog->priv->pg_w_spin        = glade_xml_get_widget (gui, "pg_w_spin");
-       dialog->priv->pg_h_spin        = glade_xml_get_widget (gui, "pg_h_spin");
-       dialog->priv->pg_w_units_label = glade_xml_get_widget (gui, "pg_w_units_label");
-       dialog->priv->pg_h_units_label = glade_xml_get_widget (gui, "pg_h_units_label");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "pg_size_page",        &dialog->priv->pg_size_page,
+                                     "pg_size_combo_hbox",  &dialog->priv->pg_size_combo_hbox,
+                                     "pg_w_spin",           &dialog->priv->pg_w_spin,
+                                     "pg_h_spin",           &dialog->priv->pg_h_spin,
+                                     "pg_w_units_label",    &dialog->priv->pg_w_units_label,
+                                     "pg_h_units_label",    &dialog->priv->pg_h_units_label,
+                                     NULL);
 
 
-       gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
+        dialog->priv->pg_size_combo = gtk_combo_box_text_new ();
+        gtk_box_pack_start (GTK_BOX (dialog->priv->pg_size_combo_hbox), dialog->priv->pg_size_combo, FALSE, FALSE, 0);
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
                                    dialog->priv->pg_size_page);
@@ -523,11 +582,11 @@ construct_pg_size_page (glTemplateDesigner      *dialog,
 
        /* Load page size combo */
        page_sizes = lgl_db_get_paper_name_list ();
-       gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->pg_size_combo), page_sizes);
+       gl_combo_util_set_strings (GTK_COMBO_BOX_TEXT (dialog->priv->pg_size_combo), page_sizes);
        lgl_db_free_paper_name_list (page_sizes);
-       default_page_size_id = gl_prefs_get_page_size ();
+       default_page_size_id = gl_prefs_model_get_default_page_size (gl_prefs);
        default_page_size_name = lgl_db_lookup_paper_name_from_id (default_page_size_id);
-       gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name);
+       gl_combo_util_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name);
        g_free (default_page_size_name);
 
        /* Apply units to spinbuttons and units labels. */
@@ -552,8 +611,11 @@ construct_pg_size_page (glTemplateDesigner      *dialog,
        /* This controls sensitivity of related widgets. */
        g_signal_connect_swapped (G_OBJECT(dialog->priv->pg_size_combo), "changed",
                                  G_CALLBACK(pg_size_page_changed_cb), dialog);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct shape page.                                          */
 /*--------------------------------------------------------------------------*/
@@ -561,22 +623,15 @@ static void
 construct_shape_page (glTemplateDesigner      *dialog,
                      GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
-
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "shape_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->shape_page        = glade_xml_get_widget (gui, "shape_page");
-       dialog->priv->shape_rect_radio  = glade_xml_get_widget (gui, "shape_rect_radio");
-       dialog->priv->shape_round_radio = glade_xml_get_widget (gui, "shape_round_radio");
-       dialog->priv->shape_cd_radio    = glade_xml_get_widget (gui, "shape_cd_radio");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "shape_page",          &dialog->priv->shape_page,
+                                     "shape_rect_radio",    &dialog->priv->shape_rect_radio,
+                                     "shape_ellipse_radio", &dialog->priv->shape_ellipse_radio,
+                                     "shape_round_radio",   &dialog->priv->shape_round_radio,
+                                     "shape_cd_radio",      &dialog->priv->shape_cd_radio,
+                                     NULL);
 
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
@@ -591,8 +646,11 @@ construct_shape_page (glTemplateDesigner      *dialog,
         gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
                                          dialog->priv->shape_page,
                                          TRUE);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct rect size page.                                      */
 /*--------------------------------------------------------------------------*/
@@ -600,33 +658,27 @@ static void
 construct_rect_size_page (glTemplateDesigner      *dialog,
                          GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
+        gchar           *pixbuf_filename;
        GdkPixbuf       *pixbuf;
 
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "rect_size_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->rect_size_page           = glade_xml_get_widget (gui, "rect_size_page");
-       dialog->priv->rect_image               = glade_xml_get_widget (gui, "rect_image");
-       dialog->priv->rect_w_spin              = glade_xml_get_widget (gui, "rect_w_spin");
-       dialog->priv->rect_h_spin              = glade_xml_get_widget (gui, "rect_h_spin");
-       dialog->priv->rect_r_spin              = glade_xml_get_widget (gui, "rect_r_spin");
-       dialog->priv->rect_x_waste_spin        = glade_xml_get_widget (gui, "rect_x_waste_spin");
-       dialog->priv->rect_y_waste_spin        = glade_xml_get_widget (gui, "rect_y_waste_spin");
-       dialog->priv->rect_margin_spin         = glade_xml_get_widget (gui, "rect_margin_spin");
-       dialog->priv->rect_w_units_label       = glade_xml_get_widget (gui, "rect_w_units_label");
-       dialog->priv->rect_h_units_label       = glade_xml_get_widget (gui, "rect_h_units_label");
-       dialog->priv->rect_r_units_label       = glade_xml_get_widget (gui, "rect_r_units_label");
-       dialog->priv->rect_x_waste_units_label = glade_xml_get_widget (gui, "rect_x_waste_units_label");
-       dialog->priv->rect_y_waste_units_label = glade_xml_get_widget (gui, "rect_y_waste_units_label");
-       dialog->priv->rect_margin_units_label  = glade_xml_get_widget (gui, "rect_margin_units_label");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "rect_size_page",           &dialog->priv->rect_size_page,
+                                     "rect_image",               &dialog->priv->rect_image,
+                                     "rect_w_spin",              &dialog->priv->rect_w_spin,
+                                     "rect_h_spin",              &dialog->priv->rect_h_spin,
+                                     "rect_r_spin",              &dialog->priv->rect_r_spin,
+                                     "rect_x_waste_spin",        &dialog->priv->rect_x_waste_spin,
+                                     "rect_y_waste_spin",        &dialog->priv->rect_y_waste_spin,
+                                     "rect_margin_spin",         &dialog->priv->rect_margin_spin,
+                                     "rect_w_units_label",       &dialog->priv->rect_w_units_label,
+                                     "rect_h_units_label",       &dialog->priv->rect_h_units_label,
+                                     "rect_r_units_label",       &dialog->priv->rect_r_units_label,
+                                     "rect_x_waste_units_label", &dialog->priv->rect_x_waste_units_label,
+                                     "rect_y_waste_units_label", &dialog->priv->rect_y_waste_units_label,
+                                     "rect_margin_units_label",  &dialog->priv->rect_margin_units_label,
+                                     NULL);
 
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
@@ -643,7 +695,9 @@ construct_rect_size_page (glTemplateDesigner      *dialog,
                                          TRUE);
 
        /* Initialize illustration. */
-       pixbuf = gdk_pixbuf_new_from_file (EX_RECT_IMAGE, NULL);
+        pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-rect-size.png", NULL);
+       pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
+        g_free (pixbuf_filename);
        gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->rect_image), pixbuf);
 
        /* Apply units to spinbuttons and units labels. */
@@ -697,8 +751,96 @@ construct_rect_size_page (glTemplateDesigner      *dialog,
                                   DEFAULT_RECT_WASTE * dialog->priv->units_per_point);
        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),
                                   DEFAULT_MARGIN * dialog->priv->units_per_point);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Construct ellipse size page.                                   */
+/*--------------------------------------------------------------------------*/
+static void
+construct_ellipse_size_page (glTemplateDesigner      *dialog,
+                             GdkPixbuf               *logo)
+{
+        gchar           *pixbuf_filename;
+       GdkPixbuf       *pixbuf;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "ellipse_size_page",           &dialog->priv->ellipse_size_page,
+                                     "ellipse_image",               &dialog->priv->ellipse_image,
+                                     "ellipse_w_spin",              &dialog->priv->ellipse_w_spin,
+                                     "ellipse_h_spin",              &dialog->priv->ellipse_h_spin,
+                                     "ellipse_waste_spin",          &dialog->priv->ellipse_waste_spin,
+                                     "ellipse_margin_spin",         &dialog->priv->ellipse_margin_spin,
+                                     "ellipse_w_units_label",       &dialog->priv->ellipse_w_units_label,
+                                     "ellipse_h_units_label",       &dialog->priv->ellipse_h_units_label,
+                                     "ellipse_waste_units_label",   &dialog->priv->ellipse_waste_units_label,
+                                     "ellipse_margin_units_label",  &dialog->priv->ellipse_margin_units_label,
+                                     NULL);
+
+
+        gtk_assistant_append_page (GTK_ASSISTANT (dialog),
+                                   dialog->priv->ellipse_size_page);
+
+        gtk_assistant_set_page_title (GTK_ASSISTANT (dialog),
+                                      dialog->priv->ellipse_size_page,
+                                      _("Label or Card Size"));
+        gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog),
+                                             dialog->priv->ellipse_size_page,
+                                             logo);
+        gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
+                                         dialog->priv->ellipse_size_page,
+                                         TRUE);
+
+       /* Initialize illustration. */
+        pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-ellipse-size.png", NULL);
+       pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
+        g_free (pixbuf_filename);
+       gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->ellipse_image), pixbuf);
+
+       /* Apply units to spinbuttons and units labels. */
+        gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin),
+                                   dialog->priv->digits);
+        gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin),
+                                        dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
+        gtk_label_set_text (GTK_LABEL(dialog->priv->ellipse_w_units_label),
+                           dialog->priv->units_string);
+        gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin),
+                                   dialog->priv->digits);
+        gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin),
+                                        dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
+        gtk_label_set_text (GTK_LABEL(dialog->priv->ellipse_h_units_label),
+                           dialog->priv->units_string);
+        gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin),
+                                   dialog->priv->digits);
+        gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin),
+                                        dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
+        gtk_label_set_text (GTK_LABEL(dialog->priv->ellipse_waste_units_label),
+                           dialog->priv->units_string);
+        gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->ellipse_margin_spin),
+                                   dialog->priv->digits);
+        gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->ellipse_margin_spin),
+                                        dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate);
+        gtk_label_set_text (GTK_LABEL(dialog->priv->ellipse_margin_units_label),
+                           dialog->priv->units_string);
+
+       /* Load some realistic defaults. */
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin),
+                                  DEFAULT_ELLIPSE_W * dialog->priv->units_per_point);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin),
+                                  DEFAULT_ELLIPSE_H * dialog->priv->units_per_point);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin),
+                                  DEFAULT_ELLIPSE_WASTE * dialog->priv->units_per_point);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_margin_spin),
+                                  DEFAULT_MARGIN * dialog->priv->units_per_point);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct round size page.                                     */
 /*--------------------------------------------------------------------------*/
@@ -706,27 +848,21 @@ static void
 construct_round_size_page (glTemplateDesigner      *dialog,
                           GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
+        gchar           *pixbuf_filename;
        GdkPixbuf       *pixbuf;
 
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "round_size_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->round_size_page          = glade_xml_get_widget (gui, "round_size_page");
-       dialog->priv->round_image              = glade_xml_get_widget (gui, "round_image");
-       dialog->priv->round_r_spin             = glade_xml_get_widget (gui, "round_r_spin");
-       dialog->priv->round_waste_spin         = glade_xml_get_widget (gui, "round_waste_spin");
-       dialog->priv->round_margin_spin        = glade_xml_get_widget (gui, "round_margin_spin");
-       dialog->priv->round_r_units_label      = glade_xml_get_widget (gui, "round_r_units_label");
-       dialog->priv->round_waste_units_label  = glade_xml_get_widget (gui, "round_waste_units_label");
-       dialog->priv->round_margin_units_label = glade_xml_get_widget (gui, "round_margin_units_label");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "round_size_page",          &dialog->priv->round_size_page,
+                                     "round_image",              &dialog->priv->round_image,
+                                     "round_r_spin",             &dialog->priv->round_r_spin,
+                                     "round_waste_spin",         &dialog->priv->round_waste_spin,
+                                     "round_margin_spin",        &dialog->priv->round_margin_spin,
+                                     "round_r_units_label",      &dialog->priv->round_r_units_label,
+                                     "round_waste_units_label",  &dialog->priv->round_waste_units_label,
+                                     "round_margin_units_label", &dialog->priv->round_margin_units_label,
+                                     NULL);
 
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
@@ -743,7 +879,9 @@ construct_round_size_page (glTemplateDesigner      *dialog,
                                          TRUE);
 
        /* Initialize illustration. */
-       pixbuf = gdk_pixbuf_new_from_file (EX_ROUND_IMAGE, NULL);
+        pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-round-size.png", NULL);
+       pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
+        g_free (pixbuf_filename);
        gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->round_image), pixbuf);
 
        /* Apply units to spinbuttons and units labels. */
@@ -774,8 +912,10 @@ construct_round_size_page (glTemplateDesigner      *dialog,
        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin),
                                   DEFAULT_MARGIN * dialog->priv->units_per_point);
 
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct CD/DVD size page.                                    */
 /*--------------------------------------------------------------------------*/
@@ -783,33 +923,27 @@ static void
 construct_cd_size_page (glTemplateDesigner      *dialog,
                        GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
+        gchar           *pixbuf_filename;
        GdkPixbuf       *pixbuf;
 
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "cd_size_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->cd_size_page = glade_xml_get_widget (gui, "cd_size_page");
-       dialog->priv->cd_image     = glade_xml_get_widget (gui, "cd_image");
-       dialog->priv->cd_radius_spin = glade_xml_get_widget (gui, "cd_radius_spin");
-       dialog->priv->cd_hole_spin   = glade_xml_get_widget (gui, "cd_hole_spin");
-       dialog->priv->cd_w_spin      = glade_xml_get_widget (gui, "cd_w_spin");
-       dialog->priv->cd_h_spin      = glade_xml_get_widget (gui, "cd_h_spin");
-       dialog->priv->cd_waste_spin  = glade_xml_get_widget (gui, "cd_waste_spin");
-       dialog->priv->cd_margin_spin = glade_xml_get_widget (gui, "cd_margin_spin");
-       dialog->priv->cd_radius_units_label = glade_xml_get_widget (gui, "cd_radius_units_label");
-       dialog->priv->cd_hole_units_label   = glade_xml_get_widget (gui, "cd_hole_units_label");
-       dialog->priv->cd_w_units_label      = glade_xml_get_widget (gui, "cd_w_units_label");
-       dialog->priv->cd_h_units_label      = glade_xml_get_widget (gui, "cd_h_units_label");
-       dialog->priv->cd_waste_units_label  = glade_xml_get_widget (gui, "cd_waste_units_label");
-       dialog->priv->cd_margin_units_label = glade_xml_get_widget (gui, "cd_margin_units_label");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "cd_size_page",          &dialog->priv->cd_size_page,
+                                     "cd_image",              &dialog->priv->cd_image,
+                                     "cd_radius_spin",        &dialog->priv->cd_radius_spin,
+                                     "cd_hole_spin",          &dialog->priv->cd_hole_spin,
+                                     "cd_w_spin",             &dialog->priv->cd_w_spin,
+                                     "cd_h_spin",             &dialog->priv->cd_h_spin,
+                                     "cd_waste_spin",         &dialog->priv->cd_waste_spin,
+                                     "cd_margin_spin",        &dialog->priv->cd_margin_spin,
+                                     "cd_radius_units_label", &dialog->priv->cd_radius_units_label,
+                                     "cd_hole_units_label",   &dialog->priv->cd_hole_units_label,
+                                     "cd_w_units_label",      &dialog->priv->cd_w_units_label,
+                                     "cd_h_units_label",      &dialog->priv->cd_h_units_label,
+                                     "cd_waste_units_label",  &dialog->priv->cd_waste_units_label,
+                                     "cd_margin_units_label", &dialog->priv->cd_margin_units_label,
+                                     NULL);
 
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
@@ -826,7 +960,9 @@ construct_cd_size_page (glTemplateDesigner      *dialog,
                                          TRUE);
 
        /* Initialize illustration. */
-       pixbuf = gdk_pixbuf_new_from_file (EX_CD_IMAGE, NULL);
+        pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-cd-size.png", NULL);
+       pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
+        g_free (pixbuf_filename);
        gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->cd_image), pixbuf);
 
        /* Apply units to spinbuttons and units labels. */
@@ -877,8 +1013,10 @@ construct_cd_size_page (glTemplateDesigner      *dialog,
        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),
                                   DEFAULT_MARGIN * dialog->priv->units_per_point);
 
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct number of layouts page.                              */
 /*--------------------------------------------------------------------------*/
@@ -886,23 +1024,17 @@ static void
 construct_nlayouts_page (glTemplateDesigner      *dialog,
                         GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
+        gchar           *pixbuf_filename;
        GdkPixbuf       *pixbuf;
 
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "nlayouts_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->nlayouts_page   = glade_xml_get_widget (gui, "nlayouts_page");
-       dialog->priv->nlayouts_image1 = glade_xml_get_widget (gui, "nlayouts_image1");
-       dialog->priv->nlayouts_image2 = glade_xml_get_widget (gui, "nlayouts_image2");
-       dialog->priv->nlayouts_spin   = glade_xml_get_widget (gui, "nlayouts_spin");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "nlayouts_page",   &dialog->priv->nlayouts_page,
+                                     "nlayouts_image1", &dialog->priv->nlayouts_image1,
+                                     "nlayouts_image2", &dialog->priv->nlayouts_image2,
+                                     "nlayouts_spin",   &dialog->priv->nlayouts_spin,
+                                     NULL);
 
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
@@ -918,14 +1050,24 @@ construct_nlayouts_page (glTemplateDesigner      *dialog,
                                          dialog->priv->nlayouts_page,
                                          TRUE);
 
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin),
+                                   1, 2);
+
+
        /* Initialize illustrations. */
-       pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE1, NULL);
+        pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-1layout.png", NULL);
+       pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
+        g_free (pixbuf_filename);
        gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image1), pixbuf);
-       pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE2, NULL);
+        pixbuf_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "ex-2layouts.png", NULL);
+       pixbuf = gdk_pixbuf_new_from_file (pixbuf_filename, NULL);
+        g_free (pixbuf_filename);
        gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image2), pixbuf);
 
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct layout page.                                         */
 /*--------------------------------------------------------------------------*/
@@ -933,40 +1075,35 @@ static void
 construct_layout_page (glTemplateDesigner      *dialog,
                       GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
-
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "layout_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->layout_page           = glade_xml_get_widget (gui, "layout_page");
-       dialog->priv->layout1_head_label    = glade_xml_get_widget (gui, "layout1_head_label");
-       dialog->priv->layout1_nx_spin       = glade_xml_get_widget (gui, "layout1_nx_spin");
-       dialog->priv->layout1_ny_spin       = glade_xml_get_widget (gui, "layout1_ny_spin");
-       dialog->priv->layout1_x0_spin       = glade_xml_get_widget (gui, "layout1_x0_spin");
-       dialog->priv->layout1_y0_spin       = glade_xml_get_widget (gui, "layout1_y0_spin");
-       dialog->priv->layout1_dx_spin       = glade_xml_get_widget (gui, "layout1_dx_spin");
-       dialog->priv->layout1_dy_spin       = glade_xml_get_widget (gui, "layout1_dy_spin");
-       dialog->priv->layout2_head_label    = glade_xml_get_widget (gui, "layout2_head_label");
-       dialog->priv->layout2_nx_spin       = glade_xml_get_widget (gui, "layout2_nx_spin");
-       dialog->priv->layout2_ny_spin       = glade_xml_get_widget (gui, "layout2_ny_spin");
-       dialog->priv->layout2_x0_spin       = glade_xml_get_widget (gui, "layout2_x0_spin");
-       dialog->priv->layout2_y0_spin       = glade_xml_get_widget (gui, "layout2_y0_spin");
-       dialog->priv->layout2_dx_spin       = glade_xml_get_widget (gui, "layout2_dx_spin");
-       dialog->priv->layout2_dy_spin       = glade_xml_get_widget (gui, "layout2_dy_spin");
-       dialog->priv->layout_x0_units_label = glade_xml_get_widget (gui, "layout_x0_units_label");
-       dialog->priv->layout_y0_units_label = glade_xml_get_widget (gui, "layout_y0_units_label");
-       dialog->priv->layout_dx_units_label = glade_xml_get_widget (gui, "layout_dx_units_label");
-       dialog->priv->layout_dy_units_label = glade_xml_get_widget (gui, "layout_dy_units_label");
-       dialog->priv->layout_mini_preview   = glade_xml_get_widget (gui, "layout_mini_preview");
-       dialog->priv->layout_test_button    = glade_xml_get_widget (gui, "layout_test_button");
-
-        g_object_unref (gui);
+       gl_debug (DEBUG_TEMPLATE, "START");
 
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "layout_page",           &dialog->priv->layout_page,
+                                     "layout1_head_label",    &dialog->priv->layout1_head_label,
+                                     "layout1_nx_spin",       &dialog->priv->layout1_nx_spin,
+                                     "layout1_ny_spin",       &dialog->priv->layout1_ny_spin,
+                                     "layout1_x0_spin",       &dialog->priv->layout1_x0_spin,
+                                     "layout1_y0_spin",       &dialog->priv->layout1_y0_spin,
+                                     "layout1_dx_spin",       &dialog->priv->layout1_dx_spin,
+                                     "layout1_dy_spin",       &dialog->priv->layout1_dy_spin,
+                                     "layout2_head_label",    &dialog->priv->layout2_head_label,
+                                     "layout2_nx_spin",       &dialog->priv->layout2_nx_spin,
+                                     "layout2_ny_spin",       &dialog->priv->layout2_ny_spin,
+                                     "layout2_x0_spin",       &dialog->priv->layout2_x0_spin,
+                                     "layout2_y0_spin",       &dialog->priv->layout2_y0_spin,
+                                     "layout2_dx_spin",       &dialog->priv->layout2_dx_spin,
+                                     "layout2_dy_spin",       &dialog->priv->layout2_dy_spin,
+                                     "layout_x0_units_label", &dialog->priv->layout_x0_units_label,
+                                     "layout_y0_units_label", &dialog->priv->layout_y0_units_label,
+                                     "layout_dx_units_label", &dialog->priv->layout_dx_units_label,
+                                     "layout_dy_units_label", &dialog->priv->layout_dy_units_label,
+                                     "mini_preview_vbox",     &dialog->priv->mini_preview_vbox,
+                                     "layout_test_button",    &dialog->priv->layout_test_button,
+                                     NULL);
+
+        dialog->priv->layout_mini_preview = gl_mini_preview_new (175, 200);
+        gtk_container_add (GTK_CONTAINER (dialog->priv->mini_preview_vbox),
+                           dialog->priv->layout_mini_preview);
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
                                    dialog->priv->layout_page);
@@ -1055,8 +1192,10 @@ construct_layout_page (glTemplateDesigner      *dialog,
        g_signal_connect_swapped (G_OBJECT(dialog->priv->layout_test_button), "clicked",
                                  G_CALLBACK(print_test_cb), dialog);
 
+       gl_debug (DEBUG_TEMPLATE, "END");
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Construct finish page.                                         */
 /*--------------------------------------------------------------------------*/
@@ -1064,19 +1203,11 @@ static void
 construct_finish_page (glTemplateDesigner      *dialog,
                       GdkPixbuf               *logo)
 {
-       GladeXML        *gui;
-
-       gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade",
-                             "finish_page", NULL);
-       if (!gui)
-        {
-                g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!");
-                return;
-        }
-
-       dialog->priv->finish_page = glade_xml_get_widget (gui, "finish_page");
+       gl_debug (DEBUG_TEMPLATE, "START");
 
-        g_object_unref (gui);
+        gl_builder_util_get_widgets (dialog->priv->builder,
+                                     "finish_page", &dialog->priv->finish_page,
+                                     NULL);
 
 
         gtk_assistant_append_page (GTK_ASSISTANT (dialog),
@@ -1095,8 +1226,132 @@ construct_finish_page (glTemplateDesigner      *dialog,
                                          dialog->priv->finish_page,
                                          TRUE);
 
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+
+/*****************************************************************************/
+/* Initialize dialog from existing template.                                 */
+/*****************************************************************************/
+void
+gl_template_designer_set_from_name (glTemplateDesigner *dialog,
+                                    const gchar        *name)
+{
+        lglTemplate      *template;
+        gdouble           upp;
+        lglTemplateFrame *frame;
+        gchar            *paper_name;
+        GList            *p, *p_layout1, *p_layout2;
+
+       gtk_window_set_title (GTK_WINDOW(dialog), _("Edit gLabels Template"));
+
+        template = lgl_db_lookup_template_from_name (name);
+        if ( lgl_template_does_category_match (template, "user-defined") )
+        {
+
+                dialog->priv->stop_signals = TRUE;
+
+                dialog->priv->edit_flag  = TRUE;
+                dialog->priv->edit_brand = g_strdup (template->brand);
+                dialog->priv->edit_part  = g_strdup (template->part);
+
+                upp = dialog->priv->units_per_point;
+
+                gtk_entry_set_text (GTK_ENTRY (dialog->priv->brand_entry),       template->brand);
+                gtk_entry_set_text (GTK_ENTRY (dialog->priv->part_num_entry),    template->part);
+                gtk_entry_set_text (GTK_ENTRY (dialog->priv->description_entry), template->description);
+
+
+                paper_name = lgl_db_lookup_paper_name_from_id (template->paper_id);
+                gl_combo_util_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), paper_name);
+                gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin), template->page_width*upp);
+                gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin), template->page_height*upp);
+                g_free (paper_name);
+
+
+                frame = (lglTemplateFrame *)template->frames->data;
+                switch (frame->shape)
+                {
+                case LGL_TEMPLATE_FRAME_SHAPE_RECT:
+                default:
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_rect_radio), TRUE);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin),       frame->rect.w*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin),       frame->rect.h*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin),       frame->rect.r*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), frame->rect.x_waste*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), frame->rect.y_waste*upp);
+                        break;
+
+                case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_ellipse_radio), TRUE);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin),     frame->rect.w*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin),     frame->rect.h*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin), frame->rect.y_waste*upp);
+                        break;
+
+                case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_round_radio), TRUE);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin),      frame->round.r*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),  frame->round.waste*upp);
+                        break;
+
+                case LGL_TEMPLATE_FRAME_SHAPE_CD:
+                        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_cd_radio), TRUE);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin),    frame->cd.r1*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin),      frame->cd.r2*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin),         frame->cd.w*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin),         frame->cd.h*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin),  frame->round.waste*upp);
+                        break;
+
+                }
+                for ( p = frame->all.markups; p != NULL; p=p->next )
+                {
+                        lglTemplateMarkup *markup = (lglTemplateMarkup *)p->data;
+
+                        if ( markup->type == LGL_TEMPLATE_MARKUP_MARGIN )
+                        {
+                                gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin),  markup->margin.size*upp);
+                                gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_margin_spin),  markup->margin.size*upp);
+                                gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), markup->margin.size*upp);
+                                gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin),    markup->margin.size*upp);
+                        }
+                }
+
+
+                p_layout1 = g_list_nth (frame->all.layouts, 0);
+                p_layout2 = g_list_nth (frame->all.layouts, 1);
+                gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->nlayouts_spin), p_layout2 ? 2 : 1 );
+                if ( p_layout1 )
+                {
+                        lglTemplateLayout *layout1 = (lglTemplateLayout *)p_layout1->data;
+
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), layout1->nx);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), layout1->ny);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), layout1->x0*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), layout1->y0*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), layout1->dx*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), layout1->dy*upp);
+                }
+                if ( p_layout2 )
+                {
+                        lglTemplateLayout *layout2 = (lglTemplateLayout *)p_layout2->data;
+
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), layout2->nx);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), layout2->ny);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), layout2->x0*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), layout2->y0*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), layout2->dx*upp);
+                        gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), layout2->dy*upp);
+                }
+
+
+                dialog->priv->stop_signals = FALSE;
+
+        }
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  cancel callback.                                               */
 /*--------------------------------------------------------------------------*/
@@ -1108,14 +1363,28 @@ cancel_cb (glTemplateDesigner *dialog)
 
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  apply callback                                                 */
 /*--------------------------------------------------------------------------*/
 static void
 apply_cb (glTemplateDesigner *dialog)
 {
+        lglUnits     units;
        lglTemplate *template;
         gchar       *name;
+
+        units = gl_prefs_model_get_units (gl_prefs);
+        lgl_xml_set_default_units (units);
+
+        if (dialog->priv->edit_flag)
+        {
+                lgl_db_delete_template_by_brand_part (dialog->priv->edit_brand, dialog->priv->edit_part);
+
+                name = g_strdup_printf ("%s %s", dialog->priv->edit_brand, dialog->priv->edit_part);
+                gl_mini_preview_pixbuf_cache_delete_by_name (name);
+                g_free (name);
+        }
        
        template = build_template (dialog);
        lgl_db_register_template (template);
@@ -1123,6 +1392,7 @@ apply_cb (glTemplateDesigner *dialog)
         gl_mini_preview_pixbuf_cache_add_by_name (name);
         g_free (name);
 }
+
                          
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  close callback                                                 */
@@ -1134,6 +1404,7 @@ close_cb (glTemplateDesigner *dialog)
        gtk_widget_destroy (GTK_WIDGET(dialog));
 
 }
+
                          
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  prepare page callback                                          */
@@ -1161,6 +1432,10 @@ prepare_cb (glTemplateDesigner      *dialog,
                 rect_size_page_prepare_cb (dialog);
                 break;
 
+        case ELLIPSE_SIZE_PAGE_NUM:
+                ellipse_size_page_prepare_cb (dialog);
+                break;
+
         case ROUND_SIZE_PAGE_NUM:
                 round_size_page_prepare_cb (dialog);
                 break;
@@ -1180,6 +1455,7 @@ prepare_cb (glTemplateDesigner      *dialog,
         }
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Handle non-linear forward traversal.                           */
 /*--------------------------------------------------------------------------*/
@@ -1204,6 +1480,9 @@ forward_page_function (gint     current_page,
                if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) {
                         return RECT_SIZE_PAGE_NUM;
                }
+               if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_ellipse_radio))) {
+                        return ELLIPSE_SIZE_PAGE_NUM;
+               }
                if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
                         return ROUND_SIZE_PAGE_NUM;
                }
@@ -1213,6 +1492,7 @@ forward_page_function (gint     current_page,
                 break;
 
         case RECT_SIZE_PAGE_NUM:
+        case ELLIPSE_SIZE_PAGE_NUM:
         case ROUND_SIZE_PAGE_NUM:
         case CD_SIZE_PAGE_NUM:
                 return NLAYOUTS_PAGE_NUM;
@@ -1231,6 +1511,7 @@ forward_page_function (gint     current_page,
         return -1;
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Widget on name page "changed" callback.                        */
 /*--------------------------------------------------------------------------*/
@@ -1238,47 +1519,56 @@ static void
 name_page_changed_cb (glTemplateDesigner *dialog)
 {
        gchar *brand, *part_num, *desc;
+        gchar *string;
 
        brand    = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1));
        part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1));
        desc     = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
 
+        gtk_image_clear (GTK_IMAGE (dialog->priv->name_warning_image));
+        gtk_label_set_text (GTK_LABEL (dialog->priv->name_warning_label), "");
 
-       if (brand && brand[0] && part_num && part_num[0] &&
-            lgl_db_does_template_exist (brand, part_num))
+       if (brand && brand[0] && part_num && part_num[0])
         {
-                gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->name_warning_image),
-                                          GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON);
-                gtk_label_set_markup (GTK_LABEL (dialog->priv->name_warning_label),
-                                    _("<span foreground='red' weight='bold'>Brand and part# match an existing template!</span>"));
-        }
-        else
-        {
-                gtk_image_clear (GTK_IMAGE (dialog->priv->name_warning_image));
-                gtk_label_set_text (GTK_LABEL (dialog->priv->name_warning_label), "");
-        }
 
-       if (brand && brand[0] && part_num && part_num[0] && desc && desc[0] &&
-            !lgl_db_does_template_exist (brand, part_num))
-        {
+                if (lgl_db_does_template_exist (brand, part_num))
+                {
+                        /* Make exception for currently edited template. */
+                        if ( dialog->priv->edit_brand && !lgl_str_utf8_casecmp (brand, dialog->priv->edit_brand) &&
+                             dialog->priv->edit_part  && !lgl_str_utf8_casecmp (part_num, dialog->priv->edit_part) )
+                        {
+                                gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, TRUE);
+                        }
+                        else
+                        {
+                                gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, FALSE);
+
+                                gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->name_warning_image),
+                                                          GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON);
+                                string = g_strdup_printf ("<span foreground='red' weight='bold'>%s</span>",
+                                                          _("Brand and part# match an existing template!"));
+                                gtk_label_set_markup (GTK_LABEL (dialog->priv->name_warning_label), string);
+                                g_free (string);
+
+                        }
+                }
+                else
+                {
+                        gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, TRUE);
+                }
 
-                gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
-                                                 dialog->priv->name_page,
-                                                 TRUE);
-       }
+        }
         else
         {
-
-                gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
-                                                 dialog->priv->name_page,
-                                                 FALSE);
-       }
+                gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, FALSE);
+        }
 
        g_free (brand);
        g_free (part_num);
        g_free (desc);
 }
                                                                                
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Widget on page size page "changed" callback.                   */
 /*--------------------------------------------------------------------------*/
@@ -1290,14 +1580,14 @@ pg_size_page_changed_cb (glTemplateDesigner *dialog)
        
 
        page_size_name =
-               gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
+               gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dialog->priv->pg_size_combo));
 
        if (page_size_name && strlen(page_size_name)) {
 
                paper = lgl_db_lookup_paper_from_name (page_size_name);
        
 
-               if ( g_strcasecmp (paper->id, "Other") == 0 ) {
+               if ( g_ascii_strcasecmp (paper->id, "Other") == 0 ) {
                        gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), TRUE);
                        gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), TRUE);
                        gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label),
@@ -1326,6 +1616,7 @@ pg_size_page_changed_cb (glTemplateDesigner *dialog)
 
 }
                                                                                
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Prepare rectangular size page.                                 */
 /*--------------------------------------------------------------------------*/
@@ -1368,6 +1659,42 @@ rect_size_page_prepare_cb (glTemplateDesigner *dialog)
 
 }
 
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Prepare ellipse size page.                                     */
+/*--------------------------------------------------------------------------*/
+static void
+ellipse_size_page_prepare_cb (glTemplateDesigner *dialog)
+{
+       gdouble max_w, max_h;
+       gdouble w, h, waste, margin;
+
+       /* Limit label size based on already chosen page size. */
+       max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin));
+       max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin));
+
+       w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin));
+       h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin));
+       waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin));
+       margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_margin_spin));
+
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->ellipse_w_spin),
+                                   dialog->priv->climb_rate, max_w);
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->ellipse_h_spin),
+                                   dialog->priv->climb_rate, max_h);
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->ellipse_waste_spin),
+                                   0.0, MIN(max_w, max_h)/4.0);
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->ellipse_margin_spin),
+                                   0.0, MIN(max_w, max_h)/4.0);
+
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin), w);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin), h);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin), waste);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_margin_spin), margin);
+
+}
+
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Prepare round size page.                                       */
 /*--------------------------------------------------------------------------*/
@@ -1398,6 +1725,7 @@ round_size_page_prepare_cb (glTemplateDesigner *dialog)
 
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Prepare cd/dvd size page.                                      */
 /*--------------------------------------------------------------------------*/
@@ -1440,6 +1768,7 @@ cd_size_page_prepare_cb (glTemplateDesigner *dialog)
 
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Prepare Layout page cb.                                        */
 /*--------------------------------------------------------------------------*/
@@ -1467,11 +1796,16 @@ layout_page_prepare_cb (glTemplateDesigner *dialog)
                x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin));
                y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin));
        }
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_ellipse_radio))) {
+               w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin));
+               h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin));
+               y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin));
+               y_waste = x_waste;
+       }
        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
                w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
                h = w;
                x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin));
-               y_waste = x_waste;
        }
        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) {
                w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin));
@@ -1559,14 +1893,15 @@ layout_page_prepare_cb (glTemplateDesigner *dialog)
        }
 
        template = build_template (dialog);
-       gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview),
-                                          template);
+       gl_mini_preview_set_template (GL_MINI_PREVIEW(dialog->priv->layout_mini_preview),
+                                      template);
        lgl_template_free (template);
 
 
        dialog->priv->stop_signals = FALSE;
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Layout page widget changed cb.                                 */
 /*--------------------------------------------------------------------------*/
@@ -1580,31 +1915,32 @@ layout_page_changed_cb (glTemplateDesigner *dialog)
 
        template = build_template (dialog);
 
-       gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview),
-                                          template);
+       gl_mini_preview_set_template (GL_MINI_PREVIEW(dialog->priv->layout_mini_preview),
+                                      template);
 
        lgl_template_free (template);
 
        dialog->priv->stop_signals = FALSE;
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Print test sheet callback.                                     */
 /*--------------------------------------------------------------------------*/
 static void
 print_test_cb (glTemplateDesigner      *dialog)
 {
-       GObject     *label;
-       lglTemplate *template;
-       glPrintOp   *print_op;
+       GObject           *label;
+       lglTemplate       *template;
+       glPrintOpDialog   *print_op;
 
        label = gl_label_new ();
 
        template = build_template (dialog);
-       gl_label_set_template (GL_LABEL(label), template);
+       gl_label_set_template (GL_LABEL(label), template, FALSE);
 
-       print_op = gl_print_op_new (GL_LABEL(label));
-       gl_print_op_force_outline_flag (print_op);
+       print_op = gl_print_op_dialog_new (GL_LABEL(label));
+       gl_print_op_force_outline (GL_PRINT_OP (print_op));
         gtk_print_operation_run (GTK_PRINT_OPERATION (print_op),
                                  GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
                                  GTK_WINDOW (dialog),
@@ -1614,6 +1950,7 @@ print_test_cb (glTemplateDesigner      *dialog)
        g_object_unref (G_OBJECT(label));
 }
 
+
 /*--------------------------------------------------------------------------*/
 /* Build a template based on current assistant settings.                    */
 /*--------------------------------------------------------------------------*/
@@ -1639,9 +1976,9 @@ build_template (glTemplateDesigner      *dialog)
        desc     = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
 
        page_size_name =
-               gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo));
+               gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dialog->priv->pg_size_combo));
        paper = lgl_db_lookup_paper_from_name (page_size_name);
-       if ( g_strcasecmp (paper->id, "Other") == 0 ) {
+       if ( g_ascii_strcasecmp (paper->id, "Other") == 0 ) {
                paper->width =
                        gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin))
                        / upp;
@@ -1660,6 +1997,14 @@ build_template (glTemplateDesigner      *dialog)
                margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin));
        }
 
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_ellipse_radio))) {
+               shape = LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE;
+               w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_w_spin));
+               h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_h_spin));
+               waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_waste_spin));
+               margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->ellipse_margin_spin));
+       }
+
        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) {
                shape = LGL_TEMPLATE_FRAME_SHAPE_ROUND;
                r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin));
@@ -1696,18 +2041,19 @@ build_template (glTemplateDesigner      *dialog)
 
        switch (shape) {
        case LGL_TEMPLATE_FRAME_SHAPE_RECT:
-               frame = lgl_template_frame_rect_new ("0",
-                                                    w/upp, h/upp, r/upp,
-                                                    x_waste/upp, y_waste/upp);
+               frame = lgl_template_frame_rect_new ("0", w/upp, h/upp, r/upp, x_waste/upp, y_waste/upp);
+               break;
+       case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+               frame = lgl_template_frame_ellipse_new ("0", w/upp, h/upp, waste/upp);
                break;
        case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
                frame = lgl_template_frame_round_new ("0", r/upp, waste/upp);
                break;
        case LGL_TEMPLATE_FRAME_SHAPE_CD:
-               frame = lgl_template_frame_cd_new ("0",
-                                                  radius/upp, hole/upp,
-                                                  w/upp, h/upp,
-                                                  waste/upp);
+               frame = lgl_template_frame_cd_new ("0", radius/upp, hole/upp, w/upp, h/upp, waste/upp);
+               break;
+        default:
+                g_assert_not_reached ();
                break;
        }
        lgl_template_add_frame (template, frame);
@@ -1740,19 +2086,13 @@ build_template (glTemplateDesigner      *dialog)
        return template;
 }
 
-/*****************************************************************************/
-/* Construct mini preview widget.                                            */
-/*****************************************************************************/
-GtkWidget *
-gl_template_designer_construct_mini_preview (gchar *name,
-                                            gchar *string1,
-                                            gchar *string2,
-                                            gint   int1,
-                                            gint   int2)
-{
-       gint width  = int1;
-       gint height = int2;
 
-       return gl_wdgt_mini_preview_new (height, width);
-}
 
+/*
+ * Local Variables:       -- emacs
+ * mode: C                -- emacs
+ * c-basic-offset: 8      -- emacs
+ * tab-width: 8           -- emacs
+ * indent-tabs-mode: nil  -- emacs
+ * End:                   -- emacs
+ */