summaryrefslogtreecommitdiff
path: root/glabels2/src/wdgt-print-copies.c
diff options
context:
space:
mode:
Diffstat (limited to 'glabels2/src/wdgt-print-copies.c')
-rw-r--r--glabels2/src/wdgt-print-copies.c368
1 files changed, 368 insertions, 0 deletions
diff --git a/glabels2/src/wdgt-print-copies.c b/glabels2/src/wdgt-print-copies.c
new file mode 100644
index 0000000..f09522a
--- /dev/null
+++ b/glabels2/src/wdgt-print-copies.c
@@ -0,0 +1,368 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+
+/*
+ * (GLABELS) Label and Business Card Creation program for GNOME
+ *
+ * wdgt_print_copies.c: custom print copies widget module
+ *
+ * Copyright (C) 2001 Jim Evins <evins@snaught.com>.
+ *
+ * This program 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
+ * (at your option) any later version.
+ *
+ * This program 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
+ */
+
+#include <config.h>
+
+#include "wdgt-print-copies.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtktogglebutton.h>
+#include <gtk/gtkspinbutton.h>
+#include <gtk/gtkradiobutton.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkvbox.h>
+
+#include "hig.h"
+#include "wdgt-mini-preview.h"
+#include "marshal.h"
+
+#include "debug.h"
+
+#define WDGT_MINI_PREVIEW_HEIGHT 175
+#define WDGT_MINI_PREVIEW_WIDTH 150
+
+/*===========================================*/
+/* Private globals */
+/*===========================================*/
+
+/*===========================================*/
+/* Local function prototypes */
+/*===========================================*/
+
+static void gl_wdgt_print_copies_finalize (GObject * object);
+
+static void gl_wdgt_print_copies_construct (glWdgtPrintCopies * copies,
+ glLabel * label);
+
+static void sheets_radio_cb (GtkToggleButton * togglebutton,
+ gpointer user_data);
+static void first_spin_cb (GtkSpinButton * spinbutton,
+ gpointer user_data);
+static void last_spin_cb (GtkSpinButton * spinbutton,
+ gpointer user_data);
+
+static void
+preview_pressed (glWdgtMiniPreview *mini_preview,
+ gint first, gint last, gpointer user_data);
+
+
+/****************************************************************************/
+/* Boilerplate Object stuff. */
+/****************************************************************************/
+G_DEFINE_TYPE (glWdgtPrintCopies, gl_wdgt_print_copies, GTK_TYPE_HBOX);
+
+static void
+gl_wdgt_print_copies_class_init (glWdgtPrintCopiesClass * class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ gl_wdgt_print_copies_parent_class = g_type_class_peek_parent (class);
+
+ object_class->finalize = gl_wdgt_print_copies_finalize;
+}
+
+static void
+gl_wdgt_print_copies_init (glWdgtPrintCopies * copies)
+{
+ copies->labels_per_sheet = 0;
+
+ copies->mini_preview = NULL;
+
+ copies->sheets_radio = NULL;
+ copies->sheets_spin = NULL;
+
+ copies->labels_radio = NULL;
+ copies->first_spin = NULL;
+ copies->last_spin = NULL;
+}
+
+static void
+gl_wdgt_print_copies_finalize (GObject * object)
+{
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GL_IS_WDGT_PRINT_COPIES (object));
+
+ G_OBJECT_CLASS (gl_wdgt_print_copies_parent_class)->finalize (object);
+}
+
+GtkWidget *
+gl_wdgt_print_copies_new (glLabel * label)
+{
+ glWdgtPrintCopies *copies;
+
+ copies = g_object_new (gl_wdgt_print_copies_get_type (), NULL);
+
+ gl_wdgt_print_copies_construct (copies, label);
+
+ return GTK_WIDGET (copies);
+}
+
+/*--------------------------------------------------------------------------*/
+/* Construct composite widget. */
+/*--------------------------------------------------------------------------*/
+static void
+gl_wdgt_print_copies_construct (glWdgtPrintCopies *copies,
+ glLabel *label)
+{
+ const lglTemplateFrame *frame;
+ GtkWidget *whbox, *wvbox, *whbox1;
+ GSList *radio_group = NULL;
+ GtkObject *adjust;
+
+ whbox = GTK_WIDGET (copies);
+
+ frame = (lglTemplateFrame *)label->template->frames->data;
+
+ copies->labels_per_sheet = lgl_template_frame_get_n_labels (frame);
+
+ /* mini_preview canvas */
+ copies->mini_preview = gl_wdgt_mini_preview_new (WDGT_MINI_PREVIEW_HEIGHT,
+ WDGT_MINI_PREVIEW_WIDTH);
+ gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(copies->mini_preview),
+ label->template);
+ gtk_box_pack_start (GTK_BOX(whbox), copies->mini_preview, FALSE, FALSE, 0);
+
+ wvbox = gtk_vbox_new (FALSE, GL_HIG_PAD1);
+ gtk_box_pack_start (GTK_BOX(whbox), wvbox, FALSE, FALSE, 0);
+
+ /* Sheet controls */
+ whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2);
+ gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0);
+ copies->sheets_radio =
+ gtk_radio_button_new_with_label (radio_group, _("Sheets:"));
+ gtk_box_pack_start (GTK_BOX(whbox1), copies->sheets_radio, FALSE, FALSE, 0);
+ adjust = gtk_adjustment_new (1, 1.0, 10.0, 1.0, 10.0, 10.0);
+ copies->sheets_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust),
+ 1.0, 0);
+ gtk_box_pack_start (GTK_BOX(whbox1), copies->sheets_spin, FALSE, FALSE, 0);
+ gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview),
+ 1, copies->labels_per_sheet);
+
+ /* Blank line */
+ gtk_box_pack_start (GTK_BOX(wvbox), gtk_label_new (""), FALSE, FALSE, 0);
+
+ /* Label controls */
+ whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2);
+ gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0);
+ radio_group =
+ gtk_radio_button_get_group (GTK_RADIO_BUTTON (copies->sheets_radio));
+ copies->labels_radio =
+ gtk_radio_button_new_with_label (radio_group, _("Labels"));
+ gtk_box_pack_start (GTK_BOX(whbox1), copies->labels_radio, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(whbox1), gtk_label_new (_("from:")), FALSE, FALSE, 0);
+ adjust = gtk_adjustment_new (1, 1.0, copies->labels_per_sheet,
+ 1.0, 10.0, 10.0);
+ copies->first_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust),
+ 1.0, 0);
+ gtk_box_pack_start (GTK_BOX(whbox1), copies->first_spin, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(whbox1), gtk_label_new (_("to:")), FALSE, FALSE, 0);
+ adjust = gtk_adjustment_new (copies->labels_per_sheet,
+ 1.0, copies->labels_per_sheet,
+ 1.0, 10.0, 10.0);
+ copies->last_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust),
+ 1.0, 0);
+ gtk_box_pack_start (GTK_BOX(whbox1), copies->last_spin, FALSE, FALSE, 0);
+ gtk_widget_set_sensitive (copies->first_spin, FALSE);
+ gtk_widget_set_sensitive (copies->last_spin, FALSE);
+
+ /* Connect signals to controls */
+ g_signal_connect (G_OBJECT (copies->mini_preview), "pressed",
+ G_CALLBACK (preview_pressed), copies);
+ g_signal_connect (G_OBJECT (copies->sheets_radio), "toggled",
+ G_CALLBACK (sheets_radio_cb), copies);
+ g_signal_connect (G_OBJECT (copies->first_spin), "changed",
+ G_CALLBACK (first_spin_cb), copies);
+ g_signal_connect (G_OBJECT (copies->last_spin), "changed",
+ G_CALLBACK (last_spin_cb), copies);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Enable/Disable appropriate controls due to radio button toggle.*/
+/*--------------------------------------------------------------------------*/
+static void
+sheets_radio_cb (GtkToggleButton * togglebutton,
+ gpointer user_data)
+{
+ glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data);
+ gint first, last;
+
+ if (gtk_toggle_button_get_active (togglebutton)) {
+
+ gtk_widget_set_sensitive (copies->sheets_spin, TRUE);
+ gtk_widget_set_sensitive (copies->first_spin, FALSE);
+ gtk_widget_set_sensitive (copies->last_spin, FALSE);
+
+ gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview),
+ 1, copies->labels_per_sheet);
+
+ } else {
+
+ gtk_widget_set_sensitive (copies->sheets_spin, FALSE);
+ gtk_widget_set_sensitive (copies->first_spin, TRUE);
+ gtk_widget_set_sensitive (copies->last_spin, TRUE);
+
+ first =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->first_spin));
+ last =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->last_spin));
+ gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview),
+ first, last);
+
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. modify widget due to change of first spin button */
+/*--------------------------------------------------------------------------*/
+static void
+first_spin_cb (GtkSpinButton * spinbutton,
+ gpointer user_data)
+{
+ glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data);
+ gint first, last;
+
+ first =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->first_spin));
+ last =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->last_spin));
+
+ gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (copies->last_spin))->
+ lower = first;
+
+ gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview),
+ first, last);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. modify widget due to change of last spin button */
+/*--------------------------------------------------------------------------*/
+static void
+last_spin_cb (GtkSpinButton * spinbutton,
+ gpointer user_data)
+{
+ glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data);
+ gint first, last;
+
+ first =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->first_spin));
+ last =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->last_spin));
+
+ gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (copies->first_spin))->
+ upper = last;
+
+ gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview),
+ first, last);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Canvas event handler, select first and last items. */
+/*--------------------------------------------------------------------------*/
+static void
+preview_pressed (glWdgtMiniPreview *mini_preview,
+ gint first,
+ gint last,
+ gpointer user_data)
+{
+ glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data);
+
+ gl_wdgt_print_copies_set_range (copies, 1, first, last);
+}
+
+/****************************************************************************/
+/* query selected range of labels within sheet or number of sheets. */
+/****************************************************************************/
+void
+gl_wdgt_print_copies_get_range (glWdgtPrintCopies * copies,
+ gint * n_sheets,
+ gint * first_label,
+ gint * last_label)
+{
+ gboolean sheets_active;
+
+ sheets_active =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+ (copies->sheets_radio));
+
+ if (sheets_active) {
+ *n_sheets =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->sheets_spin));
+ *first_label = 1;
+ *last_label = copies->labels_per_sheet;
+ } else {
+ *n_sheets = 1;
+ *first_label =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->first_spin));
+ *last_label =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->last_spin));
+ }
+}
+
+/****************************************************************************/
+/* set range of labels within sheet or number of sheets */
+/****************************************************************************/
+void
+gl_wdgt_print_copies_set_range (glWdgtPrintCopies * copies,
+ gint n_sheets,
+ gint first_label,
+ gint last_label)
+{
+ gint old_first_label;
+
+ old_first_label =
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
+ (copies->first_spin));
+
+ if (first_label > old_first_label) {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->last_spin),
+ last_label);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->first_spin),
+ first_label);
+ } else {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->first_spin),
+ first_label);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->last_spin),
+ last_label);
+ }
+ if ((first_label == 1) && (last_label == copies->labels_per_sheet)) {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+ (copies->sheets_radio), TRUE);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON
+ (copies->sheets_spin), n_sheets);
+ } else {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+ (copies->labels_radio), TRUE);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON
+ (copies->sheets_spin), 1.0);
+ }
+}