]> git.sur5r.net Git - glabels/blobdiff - src/new-label-dialog.c
Imported Upstream version 3.0.0
[glabels] / src / new-label-dialog.c
index b09de7fdebde7a0448ea2066b11c664776834103..be122b5ab7a4f4d833c60f74f4fc42d45b793fff 100644 (file)
@@ -1,50 +1,89 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
 /*
- *  (GLABELS) Label and Business Card Creation program for GNOME
- *
- *  new-label-dialog.c:  New label dialog module
+ *  new-label-dialog.c
+ *  Copyright (C) 2006-2009  Jim Evins <evins@snaught.com>.
  *
- *  Copyright (C) 2006  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 "new-label-dialog.h"
 
 #include <glib/gi18n.h>
-#include <glade/glade-xml.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkstock.h>
+#include <gtk/gtk.h>
 
-#include "hig.h"
-#include "wdgt-media-select.h"
-#include "wdgt-rotate-label.h"
+#include "marshal.h"
+#include "builder-util.h"
+#include "prefs.h"
+#include "media-select.h"
+#include "mini-label-preview.h"
+#include "mini-preview.h"
 
 #include "debug.h"
 
+
+#define LABEL_PREVIEW_WIDTH  96
+#define LABEL_PREVIEW_HEIGHT 96
+
+#define MINI_PREVIEW_MIN_WIDTH  300
+#define MINI_PREVIEW_MIN_HEIGHT 360
+
+
 /*===========================================*/
 /* Private data types                        */
 /*===========================================*/
 
 struct _glNewLabelDialogPrivate {
 
-       GtkWidget *media_select;
-       GtkWidget *rotate_label;
+        GtkBuilder *builder;
+
+        GtkWidget  *template_page_vbox;
+        GtkWidget  *combo_hbox;
+        GtkWidget  *combo;
+
+        GtkWidget  *rotate_page_vbox;
+        GtkWidget  *normal_radio;
+        GtkWidget  *rotated_radio;
+        GtkWidget  *normal_preview_hbox;
+        GtkWidget  *rotated_preview_hbox;
+        GtkWidget  *normal_preview;
+        GtkWidget  *rotated_preview;
+
+        GtkWidget  *confirm_page_vbox;
+        GtkWidget  *preview_vbox;
+        GtkWidget  *preview;
+        GtkWidget  *desc_label;
+        GtkWidget  *page_size_label;
+        GtkWidget  *label_size_label;
+        GtkWidget  *layout_label;
+        GtkWidget  *vendor_label;
+        GtkWidget  *part_label;
+        GtkWidget  *similar_label;
+};
 
+/* Page numbers for traversing GtkAssistant */
+enum {
+        TEMPLATE_PAGE_NUM = 0,
+        ROTATE_PAGE_NUM,
+        CONFIRM_PAGE_NUM
+};
+
+enum {
+        COMPLETE,
+        LAST_SIGNAL
 };
 
 
@@ -52,238 +91,503 @@ struct _glNewLabelDialogPrivate {
 /* Private globals                           */
 /*===========================================*/
 
+static gint signals[LAST_SIGNAL] = { 0 };
+
+
 /*===========================================*/
 /* Local function prototypes                 */
 /*===========================================*/
 
-static void       gl_new_label_dialog_finalize        (GObject               *object);
+static void       gl_new_label_dialog_finalize        (GObject           *object);
+
+static void       cancel_cb                           (glNewLabelDialog  *this);
+static void       apply_cb                            (glNewLabelDialog  *this);
+static void       close_cb                            (glNewLabelDialog  *this);
+
+static gint       forward_page_function               (gint               current_page,
+                                                       glNewLabelDialog  *this);
 
-static void       gl_new_label_dialog_construct       (glNewLabelDialog      *dialog,
-                                                      GtkWindow             *win);
+static void       combo_changed_cb                    (glNewLabelDialog  *this);
+static void       rotate_toggled_cb                   (glNewLabelDialog  *this);
 
-static void       template_changed_cb                 (glWdgtMediaSelect     *select,
-                                                      gpointer               data);
+static void       set_info                            (glNewLabelDialog  *this,
+                                                       const gchar       *name);
 
 
-\f
 /*****************************************************************************/
 /* Boilerplate object stuff.                                                 */
 /*****************************************************************************/
-G_DEFINE_TYPE (glNewLabelDialog, gl_new_label_dialog, GTK_TYPE_DIALOG);
+G_DEFINE_TYPE (glNewLabelDialog, gl_new_label_dialog, GTK_TYPE_ASSISTANT)
 
+
+/*****************************************************************************/
+/* Class Init Function.                                                      */
+/*****************************************************************************/
 static void
 gl_new_label_dialog_class_init (glNewLabelDialogClass *class)
 {
-       GObjectClass *object_class = G_OBJECT_CLASS (class);
+        GObjectClass *object_class = G_OBJECT_CLASS (class);
 
-       gl_debug (DEBUG_FILE, "");
-       
-       gl_new_label_dialog_parent_class = g_type_class_peek_parent (class);
+        gl_debug (DEBUG_FILE, "");
 
-       object_class->finalize = gl_new_label_dialog_finalize;          
-}
+        gl_new_label_dialog_parent_class = g_type_class_peek_parent (class);
 
-static void
-gl_new_label_dialog_init (glNewLabelDialog *dialog)
-{
-       gl_debug (DEBUG_FILE, "START");
+        object_class->finalize = gl_new_label_dialog_finalize;
 
-       g_return_if_fail (GL_IS_NEW_LABEL_DIALOG (dialog));
+        signals[COMPLETE] =
+            g_signal_new ("complete",
+                          G_OBJECT_CLASS_TYPE(object_class),
+                          G_SIGNAL_RUN_LAST,
+                          G_STRUCT_OFFSET (glNewLabelDialogClass, complete),
+                          NULL, NULL,
+                          gl_marshal_VOID__VOID,
+                          G_TYPE_NONE, 0);
 
-       dialog->priv = g_new0 (glNewLabelDialogPrivate, 1);
+}
 
-       gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD1);
 
-       gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
-       gtk_dialog_add_buttons (GTK_DIALOG(dialog),
-                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                               GTK_STOCK_OK, GTK_RESPONSE_OK,
-                               NULL);
-       gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
-       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+/*****************************************************************************/
+/* Object Instance Init Function.                                            */
+/*****************************************************************************/
+static void
+gl_new_label_dialog_init (glNewLabelDialog *this)
+{
+        gchar        *logo_filename;
+        GdkPixbuf    *logo;
+        GtkBuilder   *builder;
+        gchar        *builder_filename;
+        static gchar *object_ids[] = { "template_page_vbox",
+                                       "rotate_page_vbox",
+                                       "confirm_page_vbox",
+                                       NULL };
+        GError       *error = NULL;
+
+        gl_debug (DEBUG_FILE, "START");
+
+        g_return_if_fail (GL_IS_NEW_LABEL_DIALOG (this));
+
+        this->priv = g_new0 (glNewLabelDialogPrivate, 1);
+
+        builder = gtk_builder_new ();
+        builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "new-label-dialog.ui", NULL);
+        gtk_builder_add_objects_from_file (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_FILE, "END");
+        gl_builder_util_get_widgets (builder,
+                                     "template_page_vbox",     &this->priv->template_page_vbox,
+                                     "combo_hbox",             &this->priv->combo_hbox,
+                                     "rotate_page_vbox",       &this->priv->rotate_page_vbox,
+                                     "normal_radio",           &this->priv->normal_radio,
+                                     "rotated_radio",          &this->priv->rotated_radio,
+                                     "normal_preview_hbox",    &this->priv->normal_preview_hbox,
+                                     "rotated_preview_hbox",   &this->priv->rotated_preview_hbox,
+                                     "confirm_page_vbox",      &this->priv->confirm_page_vbox,
+                                     "preview_vbox",           &this->priv->preview_vbox,
+                                     "desc_label",             &this->priv->desc_label,
+                                     "page_size_label",        &this->priv->page_size_label,
+                                     "label_size_label",       &this->priv->label_size_label,
+                                     "layout_label",           &this->priv->layout_label,
+                                     "vendor_label",           &this->priv->vendor_label,
+                                     "part_label",             &this->priv->part_label,
+                                     "similar_label",          &this->priv->similar_label,
+                                     NULL);
+
+        this->priv->builder = builder;
+
+        gtk_assistant_append_page (GTK_ASSISTANT (this), this->priv->template_page_vbox);
+        gtk_assistant_set_page_title (GTK_ASSISTANT (this), this->priv->template_page_vbox, _("Select Product"));
+        gtk_assistant_set_page_type (GTK_ASSISTANT (this), this->priv->template_page_vbox, GTK_ASSISTANT_PAGE_INTRO);
+        logo_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "new-select.png", NULL);
+        logo = gdk_pixbuf_new_from_file (logo_filename, NULL);
+        gtk_assistant_set_page_header_image (GTK_ASSISTANT (this), this->priv->template_page_vbox, logo);
+        g_free (logo_filename);
+        g_object_unref (logo);
+
+        this->priv->combo = gl_media_select_new ();
+        gtk_container_add (GTK_CONTAINER (this->priv->combo_hbox), this->priv->combo);
+
+        gtk_assistant_append_page (GTK_ASSISTANT (this), this->priv->rotate_page_vbox);
+        gtk_assistant_set_page_title (GTK_ASSISTANT (this), this->priv->rotate_page_vbox, _("Choose Orientation"));
+        gtk_assistant_set_page_complete (GTK_ASSISTANT (this), this->priv->rotate_page_vbox, TRUE);
+        logo_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "new-rotate.png", NULL);
+        logo = gdk_pixbuf_new_from_file (logo_filename, NULL);
+        gtk_assistant_set_page_header_image (GTK_ASSISTANT (this), this->priv->rotate_page_vbox, logo);
+        g_free (logo_filename);
+        g_object_unref (logo);
+
+        this->priv->normal_preview = gl_mini_label_preview_new (LABEL_PREVIEW_WIDTH, LABEL_PREVIEW_HEIGHT);
+        gtk_container_add (GTK_CONTAINER (this->priv->normal_preview_hbox), this->priv->normal_preview);
+        this->priv->rotated_preview = gl_mini_label_preview_new (LABEL_PREVIEW_WIDTH, LABEL_PREVIEW_HEIGHT);
+        gtk_container_add (GTK_CONTAINER (this->priv->rotated_preview_hbox), this->priv->rotated_preview);
+
+        gtk_assistant_append_page (GTK_ASSISTANT (this), this->priv->confirm_page_vbox);
+        gtk_assistant_set_page_title (GTK_ASSISTANT (this), this->priv->confirm_page_vbox, _("Review"));
+        gtk_assistant_set_page_type (GTK_ASSISTANT (this), this->priv->confirm_page_vbox, GTK_ASSISTANT_PAGE_CONFIRM);
+        gtk_assistant_set_page_complete (GTK_ASSISTANT (this), this->priv->confirm_page_vbox, TRUE);
+        logo_filename = g_build_filename (GLABELS_DATA_DIR, "pixmaps", "new-confirm.png", NULL);
+        logo = gdk_pixbuf_new_from_file (logo_filename, NULL);
+        gtk_assistant_set_page_header_image (GTK_ASSISTANT (this), this->priv->confirm_page_vbox, logo);
+        g_free (logo_filename);
+        g_object_unref (logo);
+
+        this->priv->preview = gl_mini_preview_new (MINI_PREVIEW_MIN_HEIGHT, MINI_PREVIEW_MIN_WIDTH);
+        gl_mini_preview_set_draw_arrow (GL_MINI_PREVIEW (this->priv->preview), TRUE);
+        gl_mini_preview_set_rotate (GL_MINI_PREVIEW (this->priv->preview), FALSE);
+        gtk_container_add (GTK_CONTAINER (this->priv->preview_vbox), this->priv->preview);
+
+        gtk_assistant_set_forward_page_func (GTK_ASSISTANT (this), (GtkAssistantPageFunc)forward_page_function, this, NULL);
+
+        g_signal_connect_swapped (G_OBJECT(this), "cancel", G_CALLBACK(cancel_cb), this);
+        g_signal_connect_swapped (G_OBJECT(this), "apply",  G_CALLBACK(apply_cb),  this);
+        g_signal_connect_swapped (G_OBJECT(this), "close",  G_CALLBACK(close_cb),  this);
+
+        g_signal_connect_swapped (G_OBJECT (this->priv->combo),         "changed", G_CALLBACK (combo_changed_cb),  this);
+        g_signal_connect_swapped (G_OBJECT (this->priv->normal_radio),  "toggled", G_CALLBACK (rotate_toggled_cb), this);
+        g_signal_connect_swapped (G_OBJECT (this->priv->rotated_radio), "toggled", G_CALLBACK (rotate_toggled_cb), this);
+
+        combo_changed_cb (this);
+
+        gl_debug (DEBUG_FILE, "END");
 }
 
+
+/*****************************************************************************/
+/* Finalize Function.                                                        */
+/*****************************************************************************/
 static void 
 gl_new_label_dialog_finalize (GObject *object)
 {
-       glNewLabelDialog* dialog = GL_NEW_LABEL_DIALOG (object);;
-       
-       gl_debug (DEBUG_FILE, "START");
+        glNewLabelDialog* this = GL_NEW_LABEL_DIALOG (object);;
+
+        gl_debug (DEBUG_FILE, "START");
 
-       g_return_if_fail (object != NULL);
-       g_return_if_fail (GL_IS_NEW_LABEL_DIALOG (dialog));
-       g_return_if_fail (dialog->priv != NULL);
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GL_IS_NEW_LABEL_DIALOG (this));
+        g_return_if_fail (this->priv != NULL);
 
-       g_free (dialog->priv);
+        g_object_unref (G_OBJECT (this->priv->builder));
+        g_free (this->priv);
 
-       G_OBJECT_CLASS (gl_new_label_dialog_parent_class)->finalize (object);
+        G_OBJECT_CLASS (gl_new_label_dialog_parent_class)->finalize (object);
 
-       gl_debug (DEBUG_FILE, "END");
+        gl_debug (DEBUG_FILE, "END");
 
 }
 
+
 /*****************************************************************************/
 /* NEW object properties dialog.                                             */
 /*****************************************************************************/
 GtkWidget *
 gl_new_label_dialog_new (GtkWindow    *win)
 {
-       GtkWidget *dialog;
+        GtkWidget *this;
 
-       gl_debug (DEBUG_FILE, "");
+        gl_debug (DEBUG_FILE, "");
 
-       dialog = GTK_WIDGET (g_object_new (GL_TYPE_NEW_LABEL_DIALOG, NULL));
+        this = GTK_WIDGET (g_object_new (GL_TYPE_NEW_LABEL_DIALOG, NULL));
 
-       gl_new_label_dialog_construct (GL_NEW_LABEL_DIALOG(dialog), win);
+        gtk_window_set_transient_for (GTK_WINDOW (this), win);
 
-       return dialog;
+        return this;
 }
 
+
 /*--------------------------------------------------------------------------*/
-/* PRIVATE.  Construct dialog.                                              */
+/* PRIVATE.  Handle non-linear forward traversal.                           */
+/*--------------------------------------------------------------------------*/
+static gint
+forward_page_function (gint              current_page,
+                       glNewLabelDialog *this)
+{
+        gchar                     *name;
+        lglTemplate               *template;
+        const lglTemplateFrame    *frame;
+        gdouble                    w, h;
+
+        switch (current_page)
+        {
+        case TEMPLATE_PAGE_NUM:
+                name = gl_media_select_get_name (GL_MEDIA_SELECT (this->priv->combo));
+                if ( name != NULL )
+                {
+                        template = lgl_db_lookup_template_from_name (name);
+                        frame    = (lglTemplateFrame *)template->frames->data;
+                        lgl_template_frame_get_size (frame, &w, &h);
+
+                        if ( w == h )
+                        {
+                                /* Skip rotate page for square and circular labels. */
+                                return CONFIRM_PAGE_NUM;
+                        }
+                }
+                return ROTATE_PAGE_NUM;
+
+        case ROTATE_PAGE_NUM:
+                return CONFIRM_PAGE_NUM;
+
+        case CONFIRM_PAGE_NUM:
+        default:
+                return -1;
+        }
+
+        return -1;
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  cancel callback.                                               */
 /*--------------------------------------------------------------------------*/
 static void
-gl_new_label_dialog_construct (glNewLabelDialog   *dialog,
-                              GtkWindow          *win)
+cancel_cb (glNewLabelDialog *this)
 {
-        GladeXML  *gui;
-       GtkWidget *vbox, *media_select_vbox, *rotate_label_vbox;
-       gchar     *name;
+                                                                               
+        gtk_widget_destroy (GTK_WIDGET(this));
 
-       gl_debug (DEBUG_FILE, "START");
+}
 
-       gtk_window_set_transient_for (GTK_WINDOW (dialog), win);
 
-        gui = glade_xml_new (GLABELS_GLADE_DIR "new-label-dialog.glade",
-                             "new_label_dialog_vbox", NULL);
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  apply callback                                                 */
+/*--------------------------------------------------------------------------*/
+static void
+apply_cb (glNewLabelDialog *this)
+{
 
-        if (!gui) {
-                g_critical ("Could not open new-label-dialog.glade. gLabels may not be installed correctly!");
-                return;
-        }
+        g_signal_emit (G_OBJECT (this), signals[COMPLETE], 0);
 
-        vbox = glade_xml_get_widget (gui, "new_label_dialog_vbox");
-       gtk_box_pack_start (GTK_BOX( GTK_DIALOG (dialog)->vbox), vbox, FALSE, FALSE, 0);
+}
 
-        media_select_vbox = glade_xml_get_widget (gui, "media_select_vbox");
-        rotate_label_vbox = glade_xml_get_widget (gui, "rotate_label_vbox");
+                         
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  close callback                                                 */
+/*--------------------------------------------------------------------------*/
+static void
+close_cb (glNewLabelDialog *this)
+{
+                                                                               
+        gtk_widget_destroy (GTK_WIDGET(this));
 
-        g_object_unref (gui);
+}
 
-       dialog->priv->media_select = gl_wdgt_media_select_new ();
-       gtk_box_pack_start (GTK_BOX (media_select_vbox),
-                           dialog->priv->media_select, FALSE, FALSE, 0);
+                         
+/*---------------------------------------------------------------------------*/
+/* PRIVATE.  Template changed callback.                                      */
+/*---------------------------------------------------------------------------*/
+static void
+combo_changed_cb (glNewLabelDialog  *this)
+{
+        gchar             *name;
+
+        gl_debug (DEBUG_FILE, "START");
 
-       dialog->priv->rotate_label = gl_wdgt_rotate_label_new ();
-       gtk_box_pack_start (GTK_BOX (rotate_label_vbox),
-                           dialog->priv->rotate_label, FALSE, FALSE, 0);
+        name = gl_media_select_get_name (GL_MEDIA_SELECT (this->priv->combo));
 
-       /* Sync template name from media select with rotate widget. */
-       name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (dialog->priv->media_select));
-       gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label),
-                                               name);
+        gl_mini_label_preview_set_by_name (GL_MINI_LABEL_PREVIEW (this->priv->normal_preview),  name, FALSE);
+        gl_mini_label_preview_set_by_name (GL_MINI_LABEL_PREVIEW (this->priv->rotated_preview), name, TRUE);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (this->priv->normal_radio), TRUE);
 
-       g_signal_connect (G_OBJECT (dialog->priv->media_select), "changed",
-                         G_CALLBACK (template_changed_cb), dialog);
+        gl_mini_preview_set_by_name (GL_MINI_PREVIEW (this->priv->preview), name);
+        set_info (this, name);
 
-       gl_debug (DEBUG_FILE, "END");
+        gtk_assistant_set_page_complete (GTK_ASSISTANT (this), this->priv->template_page_vbox, (name != NULL));
+
+        g_free (name);
+
+        gl_debug (DEBUG_FILE, "END");
 }
 
+
 /*---------------------------------------------------------------------------*/
-/* PRIVATE.  New template changed callback.                                  */
+/* PRIVATE.  Rotate toggled callback.                                        */
 /*---------------------------------------------------------------------------*/
 static void
-template_changed_cb (glWdgtMediaSelect *select,
-                    gpointer           data)
+rotate_toggled_cb (glNewLabelDialog  *this)
 {
-       glNewLabelDialog  *dialog = GL_NEW_LABEL_DIALOG (data);
-       gchar             *name;
+        gboolean state;
+
+        gl_debug (DEBUG_FILE, "START");
+
+        state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (this->priv->rotated_radio));
+        gl_mini_preview_set_rotate (GL_MINI_PREVIEW (this->priv->preview), state);
 
-       gl_debug (DEBUG_FILE, "START");
+        gl_debug (DEBUG_FILE, "END");
+}
 
-       name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (select));
 
-       gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label),
-                                               name);
+/*---------------------------------------------------------------------------*/
+/* PRIVATE.  Set information labels.                                         */
+/*---------------------------------------------------------------------------*/
+static void
+set_info (glNewLabelDialog  *this,
+          const gchar       *name)
+{
+        lglTemplate          *template;
+        lglTemplateFrame     *frame;
+        lglVendor            *vendor;
+        lglUnits              units;
+        gchar                *page_size_string;
+        gchar                *label_size_string;
+        gchar                *layout_string;
+        GList                *list, *p;
+        GString              *list_string;
+
+        template = lgl_db_lookup_template_from_name (name);
+        frame    = template->frames->data;
+        vendor   = lgl_db_lookup_vendor_from_name (template->brand);
+
+        units    = gl_prefs_model_get_units (gl_prefs);
+
+        page_size_string  = lgl_db_lookup_paper_name_from_id (template->paper_id);
+        label_size_string = lgl_template_frame_get_size_description (frame, units);
+        layout_string     = lgl_template_frame_get_layout_description (frame);
+
+        gtk_label_set_text (GTK_LABEL (this->priv->desc_label),       template->description);
+        gtk_label_set_text (GTK_LABEL (this->priv->page_size_label),  page_size_string);
+        gtk_label_set_text (GTK_LABEL (this->priv->label_size_label), label_size_string);
+        gtk_label_set_text (GTK_LABEL (this->priv->layout_label),     layout_string);
+
+        if ( vendor && vendor->url )
+        {
+                gchar *escaped_url;
+                gchar *markup;
+
+                escaped_url = g_markup_escape_text (vendor->url, -1);
+                markup = g_strdup_printf ("<a href='%s'>%s</a>", escaped_url, vendor->name);
+                gtk_label_set_markup (GTK_LABEL (this->priv->vendor_label), markup);
+                gtk_widget_set_tooltip_text (this->priv->vendor_label, escaped_url);
+                g_free (escaped_url);
+                g_free (markup);
+        }
+        else
+        {
+                /* FIXME: Using set_markup instead of set_text to clear out previous link. */
+                gtk_label_set_markup (GTK_LABEL (this->priv->vendor_label), template->brand);
+                gtk_widget_set_has_tooltip (this->priv->vendor_label, FALSE);
+        }
 
-       gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                                          GTK_RESPONSE_OK,
-                                          (name != NULL));
+        if ( template->product_url )
+        {
+                gchar *escaped_url;
+                gchar *markup;
+
+                escaped_url = g_markup_escape_text (template->product_url, -1);
+                markup = g_strdup_printf ("<a href='%s'>%s</a>", escaped_url, template->part);
+                gtk_label_set_markup (GTK_LABEL (this->priv->part_label), markup);
+                gtk_widget_set_tooltip_text (this->priv->part_label, escaped_url);
+                g_free (escaped_url);
+                g_free (markup);
+        }
+        else
+        {
+                /* FIXME: Using set_markup instead of set_text to clear out previous link. */
+                gtk_label_set_markup (GTK_LABEL (this->priv->part_label), template->part);
+                gtk_widget_set_has_tooltip (this->priv->part_label, FALSE);
+        }
+
+        list = lgl_db_get_similar_template_name_list (name);
+        list_string = g_string_new ("");
+        for ( p = list; p; p = p->next )
+        {
+                g_string_append (list_string, (char *)p->data);
+                if ( p->next )
+                {
+                        g_string_append (list_string, "\n");
+                }
+        }
+        gtk_label_set_text (GTK_LABEL (this->priv->similar_label), list_string->str);
 
-       g_free (name);
+        lgl_db_free_template_name_list (list);
+        g_string_free (list_string, TRUE);
 
-       gl_debug (DEBUG_FILE, "END");
+        g_free (page_size_string);
+        g_free (label_size_string);
+        g_free (layout_string);
 }
 
+
 /*****************************************************************************/
 /* Get template name.                                                        */
 /*****************************************************************************/
 gchar *
-gl_new_label_dialog_get_template_name (glNewLabelDialog *dialog)
+gl_new_label_dialog_get_template_name (glNewLabelDialog *this)
 {
-       gchar *name;
+        gchar *name;
 
-       name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (dialog->priv->media_select));
+        name = gl_media_select_get_name (GL_MEDIA_SELECT (this->priv->combo));
 
-       return name;
+        return name;
 }
 
+
 /*****************************************************************************/
 /* Set template name.                                                        */
 /*****************************************************************************/
 void
-gl_new_label_dialog_set_template_name (glNewLabelDialog *dialog,
-                                      gchar            *name)
+gl_new_label_dialog_set_template_name (glNewLabelDialog *this,
+                                       gchar            *name)
 {
-       gl_wdgt_media_select_set_name (GL_WDGT_MEDIA_SELECT (dialog->priv->media_select), name);
+        gl_mini_preview_set_by_name (GL_MINI_PREVIEW (this->priv->preview), name);
+        gl_media_select_set_name (GL_MEDIA_SELECT (this->priv->combo), name);
+        set_info (this, name);
 }
 
+
 /*****************************************************************************/
 /* Get current filter parameters.                                            */
 /*****************************************************************************/
 void
-gl_new_label_dialog_get_filter_parameters (glNewLabelDialog *dialog,
-                                          gchar           **page_size_id,
-                                          gchar           **category_id)
+gl_new_label_dialog_get_filter_parameters (glNewLabelDialog  *this,
+                                           gchar            **page_size_id,
+                                           gchar            **category_id)
 {
-       gl_wdgt_media_select_get_filter_parameters (
-               GL_WDGT_MEDIA_SELECT (dialog->priv->media_select),
-               page_size_id, category_id);
 }
 
+
 /*****************************************************************************/
 /* Set current filter parameters.                                            */
 /*****************************************************************************/
 void
-gl_new_label_dialog_set_filter_parameters (glNewLabelDialog *dialog,
-                                          const gchar      *page_size_id,
-                                          const gchar      *category_id)
+gl_new_label_dialog_set_filter_parameters (glNewLabelDialog *this,
+                                           const gchar      *page_size_id,
+                                           const gchar      *category_id)
 {
-       gl_wdgt_media_select_set_filter_parameters (
-               GL_WDGT_MEDIA_SELECT (dialog->priv->media_select),
-               page_size_id, category_id);
 }
 
+
 /*****************************************************************************/
 /* Get rotate state.                                                         */
 /*****************************************************************************/
 gboolean
-gl_new_label_dialog_get_rotate_state (glNewLabelDialog *dialog)
+gl_new_label_dialog_get_rotate_state (glNewLabelDialog *this)
 {
-       return gl_wdgt_rotate_label_get_state (
-               GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label));
+        return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (this->priv->rotated_radio));
 }
 
+
 /*****************************************************************************/
 /* Set rotate state.                                                         */
 /*****************************************************************************/
 void
-gl_new_label_dialog_set_rotate_state (glNewLabelDialog *dialog,
-                                     gboolean          state)
+gl_new_label_dialog_set_rotate_state (glNewLabelDialog *this,
+                                      gboolean          state)
 {
-       gl_wdgt_rotate_label_set_state (
-               GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label), state);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (this->priv->rotated_radio), state);
+        gl_mini_preview_set_rotate (GL_MINI_PREVIEW (this->priv->preview), state);
 }
 
+
+
+/*
+ * Local Variables:       -- emacs
+ * mode: C                -- emacs
+ * c-basic-offset: 8      -- emacs
+ * tab-width: 8           -- emacs
+ * indent-tabs-mode: nil  -- emacs
+ * End:                   -- emacs
+ */