+2009-09-13 Jim Evins <evins@snaught.com>
+
+ Refactored print operation subsystem.
+
+ * src/print-op.c:
+ * src/print-op.h:
+ Basic GtkPrintOperation based class. Does not instantiate
+ custom widgets, so it can be used by glabels-batch without
+ the additional overhead.
+ * src/print-op-dialog.c:
+ * src/print-op-dialog.h:
+ New object derived from glPrintOp. This one is intended
+ to be used as a dialog and installs custom widgets.
+ glWdgtPrintCopies and glWdgtPrintMerge have been merged
+ into this object.
+ * src/wdgt-print-copies.c:
+ * src/wdgt-print-copies.h:
+ * src/wdgt-print-merge.c:
+ * src/wdgt-print-merge.h:
+ Deleted.
+ * src/Makefile.am:
+ Modified to reflect above additions and deletions.
+ * src/mini-preview.c: (gl_mini_preview_construct),
+ (gl_mini_preview_set_template), (set_transform_and_get_scale),
+ (button_press_event_cb), (motion_notify_event_cb), (draw):
+ Now scales with allocation.
+ * src/glabels-batch.c: (main):
+ * src/template-designer.c: (print_test_cb):
+ * src/ui-commands.c: (gl_ui_cmd_file_print):
+ Use above modifications.
+ * data/builder/print-op-dialog-custom-widget.builder:
+ New builder file for glPrintOpDialog custom widgets.
+ * data/builder/print-custom-widget.builder:
+ Deleted.
+ * data/builder/Makefile.am:
+ Modified to reflect above addition and deletion.
+
2009-09-10 Jim Evins <evins@snaught.com>
* src/Makefile.am:
builder_DATA = \
property-bar.builder \
- print-custom-widget.builder \
+ print-op-dialog-custom-widget.builder \
wdgt-media-select.builder \
merge-properties-dialog.builder \
new-label-dialog.builder \
+++ /dev/null
-<?xml version="1.0"?>
-<interface>
- <requires lib="gtk+" version="2.16"/>
- <!-- interface-naming-policy toplevel-contextual -->
- <object class="GtkWindow" id="window1">
- <property name="visible">True</property>
- <property name="title" translatable="yes">window1</property>
- <child>
- <object class="GtkVBox" id="print_custom_widget_vbox">
- <property name="visible">True</property>
- <property name="border_width">12</property>
- <property name="spacing">12</property>
- <child>
- <object class="GtkVBox" id="vbox3">
- <property name="visible">True</property>
- <child>
- <object class="GtkFrame" id="simple_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkVBox" id="copies_vbox">
- <property name="visible">True</property>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Print control (Simple)</b></property>
- <property name="use_markup">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="merge_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkVBox" id="prmerge_vbox">
- <property name="visible">True</property>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Print control (Merge)</b></property>
- <property name="use_markup">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="frame3">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkVBox" id="vbox2">
- <property name="visible">True</property>
- <child>
- <object class="GtkCheckButton" id="outline_check">
- <property name="label" translatable="yes">print outlines (to test printer alignment)</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="reverse_check">
- <property name="label" translatable="yes">print in reverse (i.e. a mirror image)</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="crop_marks_check">
- <property name="label" translatable="yes">print crop marks</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Options</b></property>
- <property name="use_markup">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
-</interface>
--- /dev/null
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkWindow" id="window1">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">window1</property>
+ <child>
+ <object class="GtkHBox" id="print_custom_widget_hbox">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="spacing">3</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="simple_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="copies_vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="simple_sheets_radio">
+ <property name="label" translatable="yes">Sheets:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="simple_sheets_spin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="simple_labels_radio">
+ <property name="label" translatable="yes">Labels</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">simple_sheets_radio</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">from:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="simple_first_spin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="adjustment">adjustment2</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">3</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">to:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="simple_last_spin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="adjustment">adjustment3</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">3</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Copies</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="merge_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="prmerge_vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Start on label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="merge_first_spin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="adjustment">adjustment4</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">on 1st sheet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox6">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Copies:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="merge_copies_spin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="adjustment">adjustment5</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="merge_collate_hbox">
+ <property name="visible">True</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="merge_collate_check">
+ <property name="label" translatable="yes">Collate</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="merge_collate_image">
+ <property name="visible">True</property>
+ <property name="stock">gtk-missing-image</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">12</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Merge Control</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="outline_check">
+ <property name="label" translatable="yes">print outlines (to test printer alignment)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="reverse_check">
+ <property name="label" translatable="yes">print in reverse (i.e. a mirror image)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="crop_marks_check">
+ <property name="label" translatable="yes">print crop marks</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Options</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="value">1</property>
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="value">1</property>
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="value">1</property>
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="value">1</property>
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment5">
+ <property name="value">1</property>
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+</interface>
print.h \
print-op.c \
print-op.h \
+ print-op-dialog.c \
+ print-op-dialog.h \
template-designer.c \
template-designer.h \
bc.c \
mini-preview-pixbuf.h \
mini-preview-pixbuf-cache.c \
mini-preview-pixbuf-cache.h \
- wdgt-print-copies.c \
- wdgt-print-copies.h \
- wdgt-print-merge.c \
- wdgt-print-merge.h \
wdgt-media-select.c \
wdgt-media-select.h \
mini-preview.c \
color.h \
debug.c \
debug.h \
- wdgt-print-copies.c \
- wdgt-print-copies.h \
- wdgt-print-merge.c \
- wdgt-print-merge.h \
- mini-preview.c \
- mini-preview.h \
hig.h \
cairo-label-path.c \
cairo-label-path.h \
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
/*
- * (GLABELS) Label and Business Card Creation program for GNOME
- *
- * glabels.c: main program module
+ * glabels-batch.c
+ * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
*
- * Copyright (C) 2001 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 "print-op.h"
#include <libglabels/db.h>
#include "util.h"
+#include <math.h>
#include "prefs.h"
#include "debug.h"
gchar *abs_fn;
glLabel *label = NULL;
glMerge *merge = NULL;
+ lglTemplateFrame *frame;
glXMLLabelStatus status;
glPrintOp *print_op;
gchar *utf8_filename;
if ( status == XML_LABEL_OK ) {
+ merge = gl_label_get_merge (label);
if (input != NULL) {
- merge = gl_label_get_merge (label);
if (merge != NULL) {
gl_merge_set_src(merge, input);
gl_label_set_merge(label, merge);
}
}
abs_fn = gl_util_make_absolute ( output );
- print_op = gl_print_op_new_batch (label,
- abs_fn,
- n_sheets,
- n_copies,
- first,
- outline_flag,
- reverse_flag,
- crop_marks_flag);
-
+ frame = (lglTemplateFrame *)label->template->frames->data;
+
+ print_op = gl_print_op_new (label);
+ gl_print_op_set_filename (print_op, abs_fn);
+ gl_print_op_set_n_copies (print_op, n_copies);
+ gl_print_op_set_first (print_op, first);
+ gl_print_op_set_outline_flag (print_op, outline_flag);
+ gl_print_op_set_reverse_flag (print_op, reverse_flag);
+ gl_print_op_set_crop_marks_flag (print_op, crop_marks_flag);
+ if (merge)
+ {
+ gl_print_op_set_n_sheets (print_op,
+ ceil ((double)(first-1 + n_copies * gl_merge_get_record_count(merge))
+ / lgl_template_frame_get_n_labels (frame)));
+ }
+ else
+ {
+ gl_print_op_set_n_sheets (print_op, n_sheets);
+ gl_print_op_set_last (print_op,
+ lgl_template_frame_get_n_labels (frame));
+ }
gtk_print_operation_run (GTK_PRINT_OPERATION (print_op),
GTK_PRINT_OPERATION_ACTION_EXPORT,
NULL,
return 0;
}
+
+
+
+/*
+ * Local Variables: -- emacs
+ * mode: C -- emacs
+ * c-basic-offset: 8 -- emacs
+ * tab-width: 8 -- emacs
+ * indent-tabs-mode: nil -- emacs
+ * End: -- emacs
+ */
/* Private macros and constants. */
/*===========================================*/
-#define MARGIN
+#define MARGIN 2
#define SHADOW_OFFSET 3
GtkWidget *canvas;
- gint height;
- gint width;
-
lglTemplate *template;
- gdouble scale;
- gdouble offset_x;
- gdouble offset_y;
gint labels_per_sheet;
LabelCenter *centers;
gdouble x,
gdouble y);
+static gdouble set_transform_and_get_scale (glMiniPreview *this,
+ cairo_t *cr);
+
/****************************************************************************/
/* Object infrastructure. */
{
gl_debug (DEBUG_MINI_PREVIEW, "START");
- this->priv->height = height;
- this->priv->width = width;
-
gtk_widget_set_size_request (GTK_WIDGET (this->priv->canvas), width, height);
gl_debug (DEBUG_MINI_PREVIEW, "END");
lgl_template_free (this->priv->template);
this->priv->template = lgl_template_dup (template);
- /*
- * Set scale and offsets
- */
- w = this->priv->width - 2*MARGIN - 2*SHADOW_OFFSET;
- h = this->priv->height - 2*MARGIN - 2*SHADOW_OFFSET;
- if ( (w/template->page_width) > (h/template->page_height) ) {
- this->priv->scale = h / template->page_height;
- } else {
- this->priv->scale = w / template->page_width;
- }
- this->priv->offset_x = (this->priv->width/this->priv->scale - template->page_width) / 2.0;
- this->priv->offset_y = (this->priv->height/this->priv->scale - template->page_height) / 2.0;
-
/*
* Set labels per sheet
*/
}
+/*--------------------------------------------------------------------------*/
+/* Set transformation and return scale. */
+/*--------------------------------------------------------------------------*/
+static gdouble
+set_transform_and_get_scale (glMiniPreview *this,
+ cairo_t *cr)
+{
+ lglTemplate *template = this->priv->template;
+ gdouble w, h;
+ gdouble w1, h1;
+ gdouble scale;
+ gdouble offset_x, offset_y;
+
+ /* Establish scale and origin. */
+ w = GTK_WIDGET (this)->allocation.width;
+ h = GTK_WIDGET (this)->allocation.height;
+
+ /* establish scale. */
+ scale = MIN( (w - 2*MARGIN - 2*SHADOW_OFFSET)/template->page_width,
+ (h - 2*MARGIN - 2*SHADOW_OFFSET)/template->page_height );
+
+ /* Find offset to center preview. */
+ offset_x = (w/scale - template->page_width) / 2.0;
+ offset_y = (h/scale - template->page_height) / 2.0;
+
+ /* Set transformation. */
+ cairo_scale (cr, scale, scale);
+ cairo_translate (cr, offset_x, offset_y);
+
+ return scale;
+}
+
+
/*--------------------------------------------------------------------------*/
/* Button press event handler */
/*--------------------------------------------------------------------------*/
{
glMiniPreview *this = GL_MINI_PREVIEW (widget);
cairo_t *cr;
+ gdouble scale;
gdouble x, y;
gint i;
{
cr = gdk_cairo_create (GTK_WIDGET (this->priv->canvas)->window);
- /* Set transformation. */
- cairo_scale (cr, this->priv->scale, this->priv->scale);
- cairo_translate (cr, this->priv->offset_x, this->priv->offset_y);
+ scale = set_transform_and_get_scale (this, cr);
x = event->x;
y = event->y;
{
glMiniPreview *this = GL_MINI_PREVIEW (widget);
cairo_t *cr;
+ gdouble scale;
gdouble x, y;
gint i;
{
cr = gdk_cairo_create (GTK_WIDGET (this->priv->canvas)->window);
- /* Set transformation. */
- cairo_scale (cr, this->priv->scale, this->priv->scale);
- cairo_translate (cr, this->priv->offset_x, this->priv->offset_y);
+ scale = set_transform_and_get_scale (this, cr);
x = event->x;
y = event->y;
cairo_t *cr)
{
lglTemplate *template = this->priv->template;
+ gdouble scale;
gdouble shadow_x, shadow_y;
+
gl_debug (DEBUG_MINI_PREVIEW, "START");
if (template)
{
- /* Set transformation. */
- cairo_scale (cr, this->priv->scale, this->priv->scale);
- cairo_translate (cr, this->priv->offset_x, this->priv->offset_y);
-
+ scale = set_transform_and_get_scale (this, cr);
/* update shadow */
- shadow_x = SHADOW_OFFSET/this->priv->scale;
- shadow_y = SHADOW_OFFSET/this->priv->scale;
+ shadow_x = SHADOW_OFFSET/scale;
+ shadow_y = SHADOW_OFFSET/scale;
draw_shadow (this, cr,
shadow_x, shadow_y,
draw_paper (this, cr,
template->page_width, template->page_height,
- 1.0/this->priv->scale);
+ 1.0/scale);
- draw_labels (this, cr, template, 1.0/this->priv->scale);
+ draw_labels (this, cr, template, 1.0/scale);
}
--- /dev/null
+/*
+ * print-op-dialog.c
+ * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
+ *
+ * This file is part of gLabels.
+ *
+ * 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 gLabels. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "print-op-dialog.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtkbuilder.h>
+#include <math.h>
+#include <time.h>
+#include <ctype.h>
+#include <gtk/gtktogglebutton.h>
+#include <gtk/gtkspinbutton.h>
+
+#include "mini-preview.h"
+#include "label.h"
+#include "util.h"
+
+#include "pixmaps/collate.xpm"
+#include "pixmaps/nocollate.xpm"
+
+#include "debug.h"
+
+
+#define MINI_PREVIEW_MIN_HEIGHT 175
+#define MINI_PREVIEW_MIN_WIDTH 150
+
+
+/*===========================================*/
+/* Private data types */
+/*===========================================*/
+
+struct _glPrintOpDialogPrivate {
+
+ GtkBuilder *builder;
+
+ GtkWidget *simple_frame;
+ GtkWidget *simple_sheets_radio;
+ GtkWidget *simple_sheets_spin;
+ GtkWidget *simple_labels_radio;
+ GtkWidget *simple_first_spin;
+ GtkWidget *simple_last_spin;
+
+ GtkWidget *merge_frame;
+ GtkWidget *merge_first_spin;
+ GtkWidget *merge_copies_spin;
+ GtkWidget *merge_collate_check;
+ GtkWidget *merge_collate_image;
+
+ GtkWidget *outline_check;
+ GtkWidget *reverse_check;
+ GtkWidget *crop_marks_check;
+
+ GtkWidget *preview;
+
+ gboolean force_outline_flag;
+
+ gint labels_per_sheet;
+ gboolean merge_flag;
+ gint n_records;
+
+};
+
+
+/*===========================================*/
+/* Private globals */
+/*===========================================*/
+
+
+/*===========================================*/
+/* Local function prototypes */
+/*===========================================*/
+
+static void gl_print_op_dialog_finalize (GObject *object);
+
+static void gl_print_op_dialog_construct (glPrintOpDialog *op,
+ glLabel *label);
+
+static GObject *create_custom_widget_cb (GtkPrintOperation *operation,
+ glLabel *label);
+
+static void custom_widget_apply_cb (GtkPrintOperation *operation,
+ GtkWidget *widget,
+ glLabel *label);
+
+static void simple_sheets_radio_cb (GtkToggleButton *togglebutton,
+ glPrintOpDialog *op);
+
+static void simple_first_spin_cb (GtkSpinButton *spinbutton,
+ glPrintOpDialog *op);
+
+static void simple_last_spin_cb (GtkSpinButton *spinbutton,
+ glPrintOpDialog *op);
+
+static void preview_pressed_cb (glMiniPreview *preview,
+ gint first,
+ gint last,
+ glPrintOpDialog *op);
+
+static void merge_spin_cb (GtkSpinButton *spinbutton,
+ glPrintOpDialog *op);
+
+static void merge_collate_check_cb (GtkToggleButton *togglebutton,
+ glPrintOpDialog *op);
+
+static void preview_clicked_cb (glMiniPreview *preview,
+ gint first,
+ glPrintOpDialog *op);
+
+
+/*****************************************************************************/
+/* Boilerplate object stuff. */
+/*****************************************************************************/
+G_DEFINE_TYPE (glPrintOpDialog, gl_print_op_dialog, GL_TYPE_PRINT_OP);
+
+
+static void
+gl_print_op_dialog_class_init (glPrintOpDialogClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ gl_debug (DEBUG_PRINT, "");
+
+ gl_print_op_dialog_parent_class = g_type_class_peek_parent (class);
+
+ object_class->finalize = gl_print_op_dialog_finalize;
+}
+
+
+static void
+gl_print_op_dialog_init (glPrintOpDialog *op)
+{
+ gl_debug (DEBUG_PRINT, "");
+
+ gtk_print_operation_set_use_full_page (GTK_PRINT_OPERATION (op), TRUE);
+
+ gtk_print_operation_set_unit (GTK_PRINT_OPERATION (op), GTK_UNIT_POINTS);
+
+ op->priv = g_new0 (glPrintOpDialogPrivate, 1);
+
+}
+
+
+static void
+gl_print_op_dialog_finalize (GObject *object)
+{
+ glPrintOpDialog *op = GL_PRINT_OP_DIALOG (object);
+
+ gl_debug (DEBUG_PRINT, "");
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GL_IS_PRINT_OP (op));
+ g_return_if_fail (op->priv != NULL);
+
+ g_object_unref (G_OBJECT(op->priv->builder));
+ g_free (op->priv);
+
+ G_OBJECT_CLASS (gl_print_op_dialog_parent_class)->finalize (object);
+
+ g_free (op->priv);
+}
+
+
+/*****************************************************************************/
+/* NEW print op. */
+/*****************************************************************************/
+glPrintOpDialog *
+gl_print_op_dialog_new (glLabel *label)
+{
+ glPrintOpDialog *op;
+
+ gl_debug (DEBUG_PRINT, "");
+
+ op = GL_PRINT_OP_DIALOG (g_object_new (GL_TYPE_PRINT_OP_DIALOG, NULL));
+
+ gl_print_op_dialog_construct (GL_PRINT_OP_DIALOG(op), label);
+
+ return op;
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Construct op. */
+/*--------------------------------------------------------------------------*/
+static void
+gl_print_op_dialog_construct (glPrintOpDialog *op,
+ glLabel *label)
+{
+
+ gl_print_op_construct(GL_PRINT_OP (op), label);
+
+ gtk_print_operation_set_custom_tab_label ( GTK_PRINT_OPERATION (op),
+ _("Labels"));
+
+ g_signal_connect (G_OBJECT (op), "create-custom-widget",
+ G_CALLBACK (create_custom_widget_cb), label);
+
+ g_signal_connect (G_OBJECT (op), "custom-widget-apply",
+ G_CALLBACK (custom_widget_apply_cb), label);
+
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. "Create custom widget" callback */
+/*--------------------------------------------------------------------------*/
+static GObject *
+create_custom_widget_cb (GtkPrintOperation *operation,
+ glLabel *label)
+{
+ GtkBuilder *builder;
+ static gchar *object_ids[] = { "print_custom_widget_hbox",
+ "adjustment1", "adjustment2",
+ "adjustment3", "adjustment4",
+ "adjustment5",
+ NULL };
+ GError *error = NULL;
+ glPrintOpDialog *op = GL_PRINT_OP_DIALOG (operation);
+ const lglTemplateFrame *frame;
+ GtkWidget *hbox;
+ glMerge *merge = NULL;
+ GdkPixbuf *pixbuf;
+
+
+ frame = (lglTemplateFrame *)label->template->frames->data;
+ op->priv->labels_per_sheet = lgl_template_frame_get_n_labels (frame);
+
+ builder = gtk_builder_new ();
+ gtk_builder_add_objects_from_file (builder,
+ GLABELS_BUILDER_DIR "print-op-dialog-custom-widget.builder",
+ object_ids,
+ &error);
+ if (error) {
+ g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ gl_util_get_builder_widgets (builder,
+ "print_custom_widget_hbox", &hbox,
+ "simple_frame", &op->priv->simple_frame,
+ "simple_sheets_radio", &op->priv->simple_sheets_radio,
+ "simple_sheets_spin", &op->priv->simple_sheets_spin,
+ "simple_labels_radio", &op->priv->simple_labels_radio,
+ "simple_first_spin", &op->priv->simple_first_spin,
+ "simple_last_spin", &op->priv->simple_last_spin,
+ "merge_frame", &op->priv->merge_frame,
+ "merge_first_spin", &op->priv->merge_first_spin,
+ "merge_copies_spin", &op->priv->merge_copies_spin,
+ "merge_collate_check", &op->priv->merge_collate_check,
+ "merge_collate_image", &op->priv->merge_collate_image,
+ "outline_check", &op->priv->outline_check,
+ "reverse_check", &op->priv->reverse_check,
+ "crop_marks_check", &op->priv->crop_marks_check,
+ NULL);
+
+ op->priv->builder = builder;
+
+ /* ---- Install preview. ---- */
+ op->priv->preview = gl_mini_preview_new (MINI_PREVIEW_MIN_HEIGHT, MINI_PREVIEW_MIN_WIDTH);
+ gl_mini_preview_set_template (GL_MINI_PREVIEW(op->priv->preview), label->template);
+ gtk_box_pack_start (GTK_BOX(hbox), op->priv->preview, TRUE, TRUE, 0);
+ gtk_widget_show_all (op->priv->preview);
+
+
+ /* ---- Activate either simple or merge print control widgets. ---- */
+ merge = gl_label_get_merge (label);
+ op->priv->merge_flag = (merge != NULL);
+ if (!op->priv->merge_flag) {
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_sheets_radio),
+ TRUE);
+ gtk_widget_set_sensitive (op->priv->simple_first_spin, FALSE);
+ gtk_widget_set_sensitive (op->priv->simple_last_spin, FALSE);
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin),
+ gl_print_op_get_n_sheets (GL_PRINT_OP(op)));
+
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
+ 1, op->priv->labels_per_sheet);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
+ 1);
+
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
+ 1, op->priv->labels_per_sheet);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
+ op->priv->labels_per_sheet);
+
+ /* Update preview. */
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview),
+ 1, op->priv->labels_per_sheet);
+
+ gtk_widget_show_all (op->priv->simple_frame);
+ gtk_widget_hide_all (op->priv->merge_frame);
+
+ g_signal_connect (G_OBJECT (op->priv->simple_sheets_radio), "toggled",
+ G_CALLBACK (simple_sheets_radio_cb), op);
+ g_signal_connect (G_OBJECT (op->priv->simple_first_spin), "changed",
+ G_CALLBACK (simple_first_spin_cb), op);
+ g_signal_connect (G_OBJECT (op->priv->simple_last_spin), "changed",
+ G_CALLBACK (simple_last_spin_cb), op);
+ g_signal_connect (G_OBJECT (op->priv->preview), "pressed",
+ G_CALLBACK (preview_pressed_cb), op);
+
+ } else {
+
+ op->priv->n_records = gl_merge_get_record_count (merge);
+
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->merge_first_spin),
+ 1, op->priv->labels_per_sheet);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->merge_first_spin),
+ gl_print_op_get_first (GL_PRINT_OP(op)));
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->merge_copies_spin),
+ gl_print_op_get_n_copies (GL_PRINT_OP(op)));
+
+ gtk_widget_set_sensitive (op->priv->merge_collate_check,
+ (gl_print_op_get_n_copies (GL_PRINT_OP(op)) > 1));
+ gtk_widget_set_sensitive (op->priv->merge_collate_image,
+ (gl_print_op_get_n_copies (GL_PRINT_OP(op)) > 1));
+
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_sheets_radio),
+ gl_print_op_get_collate_flag (GL_PRINT_OP(op)));
+
+ if ( gl_print_op_get_collate_flag (GL_PRINT_OP(op)) )
+ {
+ pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
+ }
+ else
+ {
+ pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
+ }
+
+ gtk_image_set_from_pixbuf (GTK_IMAGE (op->priv->merge_collate_image), pixbuf);
+
+ /* Update preview. */
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview),
+ gl_print_op_get_first (GL_PRINT_OP(op)),
+ gl_print_op_get_first (GL_PRINT_OP(op)) + op->priv->n_records - 1);
+
+ gtk_widget_hide_all (op->priv->simple_frame);
+ gtk_widget_show_all (op->priv->merge_frame);
+
+ g_signal_connect (G_OBJECT (op->priv->merge_first_spin), "changed",
+ G_CALLBACK (merge_spin_cb), op);
+ g_signal_connect (G_OBJECT (op->priv->merge_copies_spin), "changed",
+ G_CALLBACK (merge_spin_cb), op);
+ g_signal_connect (G_OBJECT (op->priv->merge_collate_check), "toggled",
+ G_CALLBACK (merge_collate_check_cb), op);
+ g_signal_connect (G_OBJECT (op->priv->preview), "clicked",
+ G_CALLBACK (preview_clicked_cb), op);
+
+ g_object_unref (G_OBJECT(merge));
+
+ }
+
+ /* --- Set options --- */
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->outline_check),
+ gl_print_op_get_outline_flag (GL_PRINT_OP(op)));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->reverse_check),
+ gl_print_op_get_reverse_flag (GL_PRINT_OP(op)));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->crop_marks_check),
+ gl_print_op_get_crop_marks_flag (GL_PRINT_OP(op)));
+
+ /* --- Do we need to force the outline flag --- */
+ if (gl_print_op_is_outline_forced (GL_PRINT_OP (op)))
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(op->priv->outline_check),
+ TRUE);
+
+ gtk_widget_set_sensitive (op->priv->outline_check, FALSE);
+ gtk_widget_set_sensitive (op->priv->reverse_check, FALSE);
+ gtk_widget_set_sensitive (op->priv->crop_marks_check, FALSE);
+ }
+
+ return G_OBJECT (hbox);
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. "Custom widget apply" callback */
+/*--------------------------------------------------------------------------*/
+static void
+custom_widget_apply_cb (GtkPrintOperation *operation,
+ GtkWidget *widget,
+ glLabel *label)
+{
+ glPrintOpDialog *op = GL_PRINT_OP_DIALOG (operation);
+ glMerge *merge = NULL;
+ gint n_records;
+ gint n_sheets, first, last, n_copies;
+ gboolean collate_flag;
+
+ gl_print_op_set_outline_flag (GL_PRINT_OP (op),
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+ (op->priv->outline_check)));
+ gl_print_op_set_reverse_flag (GL_PRINT_OP (op),
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+ (op->priv->reverse_check)));
+ gl_print_op_set_crop_marks_flag (GL_PRINT_OP (op),
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+ (op->priv->crop_marks_check)));
+
+
+ if (!op->priv->merge_flag)
+ {
+
+ n_sheets = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin));
+ gl_print_op_set_n_sheets (GL_PRINT_OP (op), n_sheets);
+
+ first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
+ gl_print_op_set_first (GL_PRINT_OP (op), first);
+
+ last = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
+ gl_print_op_set_last (GL_PRINT_OP (op), last);
+
+ }
+ else
+ {
+
+ merge = gl_label_get_merge (label);
+
+ n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
+ gl_print_op_set_n_copies (GL_PRINT_OP (op), n_copies);
+
+ first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_first_spin));
+ gl_print_op_set_first (GL_PRINT_OP (op), first);
+
+ collate_flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->merge_collate_check));
+ gl_print_op_set_collate_flag (GL_PRINT_OP (op), collate_flag);
+
+ n_records = gl_merge_get_record_count (merge);
+ n_sheets = ceil (first - 1 + (n_copies * n_records)/(double)op->priv->labels_per_sheet);
+ gl_print_op_set_n_sheets (GL_PRINT_OP (op), n_sheets);
+
+ g_object_unref (G_OBJECT(merge));
+
+ }
+
+
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Simple sheets radio "toggled" callback */
+/*--------------------------------------------------------------------------*/
+static void
+simple_sheets_radio_cb (GtkToggleButton *togglebutton,
+ glPrintOpDialog *op)
+{
+ gint first, last;
+
+ if (gtk_toggle_button_get_active (togglebutton)) {
+
+ gtk_widget_set_sensitive (op->priv->simple_sheets_spin, TRUE);
+ gtk_widget_set_sensitive (op->priv->simple_first_spin, FALSE);
+ gtk_widget_set_sensitive (op->priv->simple_last_spin, FALSE);
+
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
+ 1, op->priv->labels_per_sheet);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
+ 1);
+
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
+ 1, op->priv->labels_per_sheet);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
+ op->priv->labels_per_sheet);
+
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview),
+ 1, op->priv->labels_per_sheet);
+
+ } else {
+
+ gtk_widget_set_sensitive (op->priv->simple_sheets_spin, FALSE);
+ gtk_widget_set_sensitive (op->priv->simple_first_spin, TRUE);
+ gtk_widget_set_sensitive (op->priv->simple_last_spin, TRUE);
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin), 1);
+
+ first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
+ last = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
+
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), first, last);
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Simple first label spinbutton "changed" callback */
+/*--------------------------------------------------------------------------*/
+static void
+simple_first_spin_cb (GtkSpinButton *spinbutton,
+ glPrintOpDialog *op)
+{
+ gint first, last;
+
+ first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
+ last = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
+
+ /* Adjust range of last spin button. */
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_last_spin),
+ first, op->priv->labels_per_sheet);
+
+ /* Update preview. */
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), first, last);
+
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Simple last label spinbutton "changed" callback */
+/*--------------------------------------------------------------------------*/
+static void
+simple_last_spin_cb (GtkSpinButton *spinbutton,
+ glPrintOpDialog *op)
+{
+ gint first, last;
+
+ first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
+ last = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_last_spin));
+
+ /* Adjust range of first spin button. */
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (op->priv->simple_first_spin),
+ 1, last);
+
+ /* Update preview. */
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), first, last);
+
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Preview "pressed" callback */
+/*--------------------------------------------------------------------------*/
+static void
+preview_pressed_cb (glMiniPreview *preview,
+ gint first,
+ gint last,
+ glPrintOpDialog *op)
+{
+ gint old_first;
+
+ if ( !op->priv->merge_flag )
+ {
+
+ /* Update controls. */
+ old_first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->simple_first_spin));
+ if ( first > old_first )
+ {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin), last);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin), first);
+ }
+ else
+ {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_first_spin), first);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_last_spin), last);
+ }
+ if ( (first == 1) && (last == op->priv->labels_per_sheet) )
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_sheets_radio), TRUE);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->simple_sheets_spin), 1);
+ }
+ else
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->simple_labels_radio), TRUE);
+ }
+
+ /* Update preview. */
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), first, last);
+
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. "changed" callback for merge first and copies spin buttons. */
+/*--------------------------------------------------------------------------*/
+static void
+merge_spin_cb (GtkSpinButton *spinbutton,
+ glPrintOpDialog *op)
+{
+ gint first, last, n_copies;
+
+ first = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_first_spin));
+
+ n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
+ last = first + (n_copies * op->priv->n_records) - 1;
+
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW(op->priv->preview), first, last );
+
+ gtk_widget_set_sensitive (op->priv->merge_collate_check, (n_copies > 1));
+ gtk_widget_set_sensitive (op->priv->merge_collate_image, (n_copies > 1));
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Merge first collate check "toggled" callback */
+/*--------------------------------------------------------------------------*/
+static void
+merge_collate_check_cb (GtkToggleButton *togglebutton,
+ glPrintOpDialog *op)
+{
+ GdkPixbuf *pixbuf;
+
+ if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (op->priv->merge_collate_check)) )
+ {
+ pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
+ }
+ else
+ {
+ pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
+ }
+
+ gtk_image_set_from_pixbuf (GTK_IMAGE (op->priv->merge_collate_image), pixbuf);
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Preview "clicked" callback */
+/*--------------------------------------------------------------------------*/
+static void
+preview_clicked_cb (glMiniPreview *preview,
+ gint first,
+ glPrintOpDialog *op)
+{
+ gint n_copies;
+ gint last;
+
+ if ( op->priv->merge_flag )
+ {
+
+ /* Update controls. */
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (op->priv->merge_first_spin), first);
+
+ n_copies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (op->priv->merge_copies_spin));
+ gtk_widget_set_sensitive (op->priv->merge_collate_check, (n_copies > 1));
+ gtk_widget_set_sensitive (op->priv->merge_collate_image, (n_copies > 1));
+
+
+ /* Update preview. */
+ last = first + (n_copies * op->priv->n_records) - 1;
+ gl_mini_preview_highlight_range (GL_MINI_PREVIEW (op->priv->preview), first, last);
+
+ }
+}
+
+
+
+
+/*
+ * Local Variables: -- emacs
+ * mode: C -- emacs
+ * c-basic-offset: 8 -- emacs
+ * tab-width: 8 -- emacs
+ * indent-tabs-mode: nil -- emacs
+ * End: -- emacs
+ */
--- /dev/null
+/*
+ * print-op-dialog.h
+ * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
+ *
+ * This file is part of gLabels.
+ *
+ * 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 gLabels. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __PRINT_OP_DIALOG_H__
+#define __PRINT_OP_DIALOG_H__
+
+#include "print-op.h"
+
+G_BEGIN_DECLS
+
+#define GL_TYPE_PRINT_OP_DIALOG (gl_print_op_dialog_get_type ())
+#define GL_PRINT_OP_DIALOG(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_PRINT_OP_DIALOG, glPrintOpDialog))
+#define GL_PRINT_OP_DIALOG_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_PRINT_OP_DIALOG, glPrintOpDialogClass))
+#define GL_IS_PRINT_OP_DIALOG(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_PRINT_OP_DIALOG))
+#define GL_IS_PRINT_OP_DIALOG_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_PRINT_OP_DIALOG))
+#define GL_PRINT_OP_DIALOG_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GL_TYPE_PRINT_OP_DIALOG, glPrintOpDialogClass))
+
+
+typedef struct _glPrintOpDialog glPrintOpDialog;
+typedef struct _glPrintOpDialogClass glPrintOpDialogClass;
+
+typedef struct _glPrintOpDialogPrivate glPrintOpDialogPrivate;
+
+struct _glPrintOpDialog
+{
+ glPrintOp parent_instance;
+
+ glPrintOpDialogPrivate *priv;
+
+};
+
+struct _glPrintOpDialogClass
+{
+ glPrintOpClass parent_class;
+};
+
+
+typedef struct _glPrintOpDialogSettings glPrintOpDialogSettings;
+
+
+
+GType gl_print_op_dialog_get_type (void) G_GNUC_CONST;
+
+glPrintOpDialog *gl_print_op_dialog_new (glLabel *label);
+
+
+
+G_END_DECLS
+
+#endif
+
+
+
+/*
+ * Local Variables: -- emacs
+ * mode: C -- emacs
+ * c-basic-offset: 8 -- emacs
+ * tab-width: 8 -- emacs
+ * indent-tabs-mode: nil -- emacs
+ * End: -- emacs
+ */
#include "print-op.h"
#include <glib/gi18n.h>
-#include <gtk/gtkbuilder.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <libglabels/db.h>
#include "print.h"
#include "label.h"
-#include "util.h"
-
-#include "wdgt-print-copies.h"
-#include "wdgt-print-merge.h"
#include "debug.h"
glLabel *label;
- GtkBuilder *builder;
-
- GtkWidget *simple_frame;
- GtkWidget *copies_vbox;
- GtkWidget *copies;
-
- GtkWidget *merge_frame;
- GtkWidget *prmerge_vbox;
- GtkWidget *prmerge;
-
- GtkWidget *outline_check;
- GtkWidget *reverse_check;
- GtkWidget *crop_marks_check;
-
gboolean force_outline_flag;
gchar *filename;
/* Local function prototypes */
/*===========================================*/
-static void gl_print_op_finalize (GObject *object);
-
-static void gl_print_op_construct (glPrintOp *op,
- glLabel *label);
-
-static void gl_print_op_construct_batch (glPrintOp *op,
- glLabel *label,
- gchar *filename,
- gint n_sheets,
- gint n_copies,
- gint first,
- gboolean outline_flag,
- gboolean reverse_flag,
- gboolean crop_marks_flag);
-
+static void gl_print_op_finalize (GObject *object);
static void set_page_size (glPrintOp *op,
glLabel *label);
-static GObject *create_custom_widget_cb (GtkPrintOperation *operation,
- gpointer user_data);
-
-static void custom_widget_apply_cb (GtkPrintOperation *operation,
- GtkWidget *widget,
- gpointer user_data);
-
static void begin_print_cb (GtkPrintOperation *operation,
GtkPrintContext *context,
gpointer user_data);
g_return_if_fail (GL_IS_PRINT_OP (op));
g_return_if_fail (op->priv != NULL);
- if (op->priv->label) {
- g_object_unref (G_OBJECT(op->priv->label));
- }
- if (op->priv->builder) {
- g_object_unref (G_OBJECT(op->priv->builder));
- }
+ g_object_unref (G_OBJECT(op->priv->label));
g_free (op->priv->filename);
g_free (op->priv);
}
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Construct op. */
-/*--------------------------------------------------------------------------*/
-static void
+/*****************************************************************************/
+/* Construct print op. */
+/*****************************************************************************/
+void
gl_print_op_construct (glPrintOp *op,
glLabel *label)
{
+ glMerge *merge = NULL;
const lglTemplateFrame *frame;
op->priv->label = label;
op->priv->force_outline_flag = FALSE;
+ merge = gl_label_get_merge (label);
frame = (lglTemplateFrame *)label->template->frames->data;
+ op->priv->merge_flag = (merge != NULL);
op->priv->n_sheets = 1;
op->priv->first = 1;
op->priv->last = lgl_template_frame_get_n_labels (frame);
gtk_print_operation_set_custom_tab_label ( GTK_PRINT_OPERATION (op),
_("Labels"));
- g_signal_connect (G_OBJECT (op), "create-custom-widget",
- G_CALLBACK (create_custom_widget_cb), label);
-
- g_signal_connect (G_OBJECT (op), "custom-widget-apply",
- G_CALLBACK (custom_widget_apply_cb), label);
-
g_signal_connect (G_OBJECT (op), "begin-print",
G_CALLBACK (begin_print_cb), label);
/*****************************************************************************/
-/* NEW batch print operation. */
+/* Set outline flag/checkbox. */
/*****************************************************************************/
-glPrintOp *
-gl_print_op_new_batch (glLabel *label,
- gchar *filename,
- gint n_sheets,
- gint n_copies,
- gint first,
- gboolean outline_flag,
- gboolean reverse_flag,
- gboolean crop_marks_flag)
+void
+gl_print_op_force_outline (glPrintOp *op)
{
- glPrintOp *op;
-
- gl_debug (DEBUG_PRINT, "");
-
- op = GL_PRINT_OP (g_object_new (GL_TYPE_PRINT_OP, NULL));
+ op->priv->force_outline_flag = TRUE;
+}
- gl_print_op_construct_batch (GL_PRINT_OP(op),
- label,
- filename,
- n_sheets,
- n_copies,
- first,
- outline_flag,
- reverse_flag,
- crop_marks_flag);
- return op;
+/*****************************************************************************/
+/* Set outline flag/checkbox. */
+/*****************************************************************************/
+gboolean
+gl_print_op_is_outline_forced (glPrintOp *op)
+{
+ return op->priv->force_outline_flag;
}
/*****************************************************************************/
-/* Get print operation settings. */
+/* Set job parameters. */
/*****************************************************************************/
-glPrintOpSettings *
-gl_print_op_get_settings (glPrintOp *print_op)
+void
+gl_print_op_set_filename (glPrintOp *op,
+ gchar *filename)
{
- glPrintOpSettings *settings;
+ gtk_print_operation_set_export_filename (GTK_PRINT_OPERATION (op),
+ filename);
+}
- settings = g_new0 (glPrintOpSettings, 1);
- if ( settings )
- {
- settings->gtk_settings =
- gtk_print_operation_get_print_settings (GTK_PRINT_OPERATION (print_op));
+void
+gl_print_op_set_n_sheets (glPrintOp *op,
+ gint n_sheets)
+{
+ op->priv->n_sheets = n_sheets;
+}
- settings->outline_flag = print_op->priv->outline_flag;
- settings->reverse_flag = print_op->priv->reverse_flag;
- settings->crop_marks_flag = print_op->priv->crop_marks_flag;
- settings->collate_flag = print_op->priv->collate_flag;
- settings->first = print_op->priv->first;
- settings->last = print_op->priv->last;
- settings->n_sheets = print_op->priv->n_sheets;
- settings->n_copies = print_op->priv->n_copies;
- }
+void
+gl_print_op_set_n_copies (glPrintOp *op,
+ gint n_copies)
+{
+ op->priv->n_copies = n_copies;
+}
- return settings;
+
+void
+gl_print_op_set_first (glPrintOp *op,
+ gint first)
+{
+ op->priv->first = first;
}
-/*****************************************************************************/
-/* Set print operation settings. */
-/*****************************************************************************/
void
-gl_print_op_set_settings (glPrintOp *print_op,
- glPrintOpSettings *settings)
+gl_print_op_set_last (glPrintOp *op,
+ gint last)
{
+ op->priv->last = last;
+}
- if ( settings )
- {
- gtk_print_operation_set_print_settings (GTK_PRINT_OPERATION (print_op),
- settings->gtk_settings);
- print_op->priv->outline_flag = settings->outline_flag;
- print_op->priv->reverse_flag = settings->reverse_flag;
- print_op->priv->crop_marks_flag = settings->crop_marks_flag;
- print_op->priv->collate_flag = settings->collate_flag;
+void
+gl_print_op_set_collate_flag (glPrintOp *op,
+ gboolean collate_flag)
+{
+ op->priv->collate_flag = collate_flag;
+}
+
+
+void
+gl_print_op_set_outline_flag (glPrintOp *op,
+ gboolean outline_flag)
+{
+ op->priv->outline_flag = outline_flag;
+}
+
+
+void
+gl_print_op_set_reverse_flag (glPrintOp *op,
+ gboolean reverse_flag)
+{
+ op->priv->reverse_flag = reverse_flag;
+}
- print_op->priv->first = settings->first;
- print_op->priv->last = settings->last;
- print_op->priv->n_sheets = settings->n_sheets;
- print_op->priv->n_copies = settings->n_copies;
- }
+void
+gl_print_op_set_crop_marks_flag (glPrintOp *op,
+ gboolean crop_marks_flag)
+{
+ op->priv->crop_marks_flag = crop_marks_flag;
}
/*****************************************************************************/
-/* Free print operation settings structure. */
+/* Get job parameters. */
/*****************************************************************************/
-void
-gl_print_op_free_settings(glPrintOpSettings *settings)
+gchar *
+gl_print_op_get_filename (glPrintOp *op)
{
-
- if ( settings )
- {
- if ( settings->gtk_settings )
- {
- g_object_unref (settings->gtk_settings);
- }
+ gchar *filename;
- g_free (settings);
- }
+ g_object_get (G_OBJECT (op),
+ "export_filename", filename,
+ NULL);
+
+ return filename;
}
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Construct op. */
-/*--------------------------------------------------------------------------*/
-static void
-gl_print_op_construct_batch (glPrintOp *op,
- glLabel *label,
- gchar *filename,
- gint n_sheets,
- gint n_copies,
- gint first,
- gboolean outline_flag,
- gboolean reverse_flag,
- gboolean crop_marks_flag)
+gint
+gl_print_op_get_n_sheets (glPrintOp *op)
+{
+ return op->priv->n_sheets;
+}
+
+gint
+gl_print_op_get_n_copies (glPrintOp *op)
{
- glMerge *merge = NULL;
- const lglTemplateFrame *frame = NULL;
+ return op->priv->n_copies;
+}
- op->priv->label = label;
- op->priv->force_outline_flag = FALSE;
- op->priv->filename = g_strdup (filename);
- op->priv->n_sheets = n_sheets;
- op->priv->n_copies = n_copies;
- op->priv->first = first;
- op->priv->outline_flag = outline_flag;
- op->priv->reverse_flag = reverse_flag;
- op->priv->crop_marks_flag = crop_marks_flag;
- merge = gl_label_get_merge (label);
+gint
+gl_print_op_get_first (glPrintOp *op)
+{
+ return op->priv->first;
+}
- frame = (lglTemplateFrame *)label->template->frames->data;
- if (merge == NULL)
- {
- op->priv->merge_flag = FALSE;
- op->priv->last = lgl_template_frame_get_n_labels (frame);
+gint
+gl_print_op_get_last (glPrintOp *op)
+{
+ return op->priv->last;
+}
- }
- else
- {
- op->priv->merge_flag = TRUE;
- op->priv->n_sheets =
- ceil ((double)(first-1 + n_copies * gl_merge_get_record_count(merge))
- / lgl_template_frame_get_n_labels (frame));;
+gboolean
+gl_print_op_get_collate_flag (glPrintOp *op)
+{
+ return op->priv->collate_flag;
+}
- g_object_unref (G_OBJECT(merge));
- }
+gboolean
+gl_print_op_get_outline_flag (glPrintOp *op)
+{
+ return op->priv->outline_flag;
+}
- set_page_size (op, label);
- gtk_print_operation_set_export_filename (GTK_PRINT_OPERATION (op),
- filename);
+gboolean
+gl_print_op_get_reverse_flag (glPrintOp *op)
+{
+ return op->priv->reverse_flag;
+}
- g_signal_connect (G_OBJECT (op), "begin-print",
- G_CALLBACK (begin_print_cb), label);
- g_signal_connect (G_OBJECT (op), "draw-page",
- G_CALLBACK (draw_page_cb), label);
+gboolean
+gl_print_op_get_crop_marks_flag (glPrintOp *op)
+{
+ return op->priv->crop_marks_flag;
}
}
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. "Create custom widget" callback */
-/*--------------------------------------------------------------------------*/
-static GObject *
-create_custom_widget_cb (GtkPrintOperation *operation,
- gpointer user_data)
-{
- GtkBuilder *builder;
- static gchar *object_ids[] = { "print_custom_widget_vbox", NULL };
- GError *error = NULL;
- glPrintOp *op = GL_PRINT_OP (operation);
- glLabel *label = GL_LABEL (user_data);
- GtkWidget *vbox;
- glMerge *merge = NULL;
-
- builder = gtk_builder_new ();
- gtk_builder_add_objects_from_file (builder,
- GLABELS_BUILDER_DIR "print-custom-widget.builder",
- object_ids,
- &error);
- if (error) {
- g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
- g_error_free (error);
- return NULL;
- }
-
- gl_util_get_builder_widgets (builder,
- "print_custom_widget_vbox", &vbox,
- "simple_frame", &op->priv->simple_frame,
- "copies_vbox", &op->priv->copies_vbox,
- "merge_frame", &op->priv->merge_frame,
- "prmerge_vbox", &op->priv->prmerge_vbox,
- "outline_check", &op->priv->outline_check,
- "reverse_check", &op->priv->reverse_check,
- "crop_marks_check", &op->priv->crop_marks_check,
- NULL);
-
- /* ----- Simple print control ----- */
- op->priv->copies = gl_wdgt_print_copies_new (label);
- gtk_box_pack_start (GTK_BOX(op->priv->copies_vbox),
- op->priv->copies, FALSE, FALSE, 0);
-
- /* ----- Merge print control ----- */
- op->priv->prmerge = gl_wdgt_print_merge_new (label);
- gtk_box_pack_start (GTK_BOX(op->priv->prmerge_vbox),
- op->priv->prmerge, FALSE, FALSE, 0);
-
-
- op->priv->builder = builder;
+/*****************************************************************************/
+/* Get print operation settings. */
+/*****************************************************************************/
+glPrintOpSettings *
+gl_print_op_get_settings (glPrintOp *print_op)
+{
+ glPrintOpSettings *settings;
-
- /* ---- Activate either simple or merge print control widgets. ---- */
- merge = gl_label_get_merge (op->priv->label);
- if (merge == NULL) {
-
- gl_wdgt_print_copies_set_range (GL_WDGT_PRINT_COPIES (op->priv->copies),
- op->priv->n_sheets,
- op->priv->first,
- op->priv->last);
-
- gtk_widget_show_all (op->priv->simple_frame);
- gtk_widget_hide_all (op->priv->merge_frame);
-
- } else {
-
- gint n_records = gl_merge_get_record_count( merge );
- gl_wdgt_print_merge_set_copies (GL_WDGT_PRINT_MERGE (op->priv->prmerge),
- op->priv->n_copies,
- op->priv->first,
- n_records,
- op->priv->collate_flag);
- g_object_unref (G_OBJECT(merge));
-
- gtk_widget_hide_all (op->priv->simple_frame);
- gtk_widget_show_all (op->priv->merge_frame);
- }
-
- /* --- Set options --- */
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->outline_check),
- op->priv->outline_flag);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->reverse_check),
- op->priv->reverse_flag);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->crop_marks_check),
- op->priv->crop_marks_flag);
-
- /* --- Do we need to force the outline flag --- */
- if (op->priv->force_outline_flag)
+ settings = g_new0 (glPrintOpSettings, 1);
+
+ if ( settings )
{
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(op->priv->outline_check),
- TRUE);
+ settings->gtk_settings =
+ gtk_print_operation_get_print_settings (GTK_PRINT_OPERATION (print_op));
- gtk_widget_set_sensitive (op->priv->outline_check, FALSE);
- gtk_widget_set_sensitive (op->priv->reverse_check, FALSE);
- gtk_widget_set_sensitive (op->priv->crop_marks_check, FALSE);
+ settings->outline_flag = print_op->priv->outline_flag;
+ settings->reverse_flag = print_op->priv->reverse_flag;
+ settings->crop_marks_flag = print_op->priv->crop_marks_flag;
+ settings->collate_flag = print_op->priv->collate_flag;
+
+ settings->first = print_op->priv->first;
+ settings->last = print_op->priv->last;
+ settings->n_sheets = print_op->priv->n_sheets;
+ settings->n_copies = print_op->priv->n_copies;
}
- return G_OBJECT (vbox);
+ return settings;
}
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. "Custom widget apply" callback */
-/*--------------------------------------------------------------------------*/
-static void
-custom_widget_apply_cb (GtkPrintOperation *operation,
- GtkWidget *widget,
- gpointer user_data)
+/*****************************************************************************/
+/* Set print operation settings. */
+/*****************************************************************************/
+void
+gl_print_op_set_settings (glPrintOp *print_op,
+ glPrintOpSettings *settings)
{
- glPrintOp *op = GL_PRINT_OP (operation);
- glMerge *merge = NULL;
+ if ( settings )
+ {
+ gtk_print_operation_set_print_settings (GTK_PRINT_OPERATION (print_op),
+ settings->gtk_settings);
+
+ print_op->priv->outline_flag = settings->outline_flag;
+ print_op->priv->reverse_flag = settings->reverse_flag;
+ print_op->priv->crop_marks_flag = settings->crop_marks_flag;
+ print_op->priv->collate_flag = settings->collate_flag;
- op->priv->outline_flag =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (op->priv->outline_check));
- op->priv->reverse_flag =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (op->priv->reverse_check));
- op->priv->crop_marks_flag =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (op->priv->crop_marks_check));
+ print_op->priv->first = settings->first;
+ print_op->priv->last = settings->last;
+ print_op->priv->n_sheets = settings->n_sheets;
+ print_op->priv->n_copies = settings->n_copies;
+ }
- merge = gl_label_get_merge (op->priv->label);
+}
- if (merge == NULL)
- {
- op->priv->merge_flag = FALSE;
- gl_wdgt_print_copies_get_range (GL_WDGT_PRINT_COPIES (op->priv->copies),
- &op->priv->n_sheets,
- &op->priv->first,
- &op->priv->last);
- }
- else
+/*****************************************************************************/
+/* Free print operation settings structure. */
+/*****************************************************************************/
+void
+gl_print_op_free_settings(glPrintOpSettings *settings)
+{
+
+ if ( settings )
{
+ if ( settings->gtk_settings )
+ {
+ g_object_unref (settings->gtk_settings);
+ }
- op->priv->merge_flag = TRUE;
- gl_wdgt_print_merge_get_copies (GL_WDGT_PRINT_MERGE (op->priv->prmerge),
- &op->priv->n_copies,
- &op->priv->first,
- &op->priv->collate_flag,
- &op->priv->n_sheets);
- g_object_unref (G_OBJECT(merge));
+ g_free (settings);
}
-
}
}
-/*****************************************************************************/
-/* Set outline flag/checkbox. */
-/*****************************************************************************/
-void
-gl_print_op_force_outline_flag (glPrintOp *op)
-{
- op->priv->force_outline_flag = TRUE;
-}
-
/*
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
/*
- * (GLABELS) Label and Business Card Creation program for GNOME
- *
- * print-op.h: Print operation module header file
+ * print-op.h
+ * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
*
- * Copyright (C) 2001-2007 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/>.
*/
+
#ifndef __PRINT_OP_H__
#define __PRINT_OP_H__
-GType gl_print_op_get_type (void) G_GNUC_CONST;
-
-glPrintOp *gl_print_op_new (glLabel *label);
-
-void gl_print_op_force_outline_flag (glPrintOp *print_op);
-
-glPrintOpSettings *gl_print_op_get_settings (glPrintOp *print_op);
-void gl_print_op_set_settings (glPrintOp *print_op,
- glPrintOpSettings *settings);
-void gl_print_op_free_settings (glPrintOpSettings *settings);
+GType gl_print_op_get_type (void) G_GNUC_CONST;
+
+glPrintOp *gl_print_op_new (glLabel *label);
+
+void gl_print_op_construct (glPrintOp *print_op,
+ glLabel *label);
+
+void gl_print_op_set_filename (glPrintOp *print_op,
+ gchar *filename);
+void gl_print_op_set_n_sheets (glPrintOp *print_op,
+ gint n_sheets);
+void gl_print_op_set_n_copies (glPrintOp *print_op,
+ gint n_copies);
+void gl_print_op_set_first (glPrintOp *print_op,
+ gint first);
+void gl_print_op_set_last (glPrintOp *print_op,
+ gint last);
+void gl_print_op_set_collate_flag (glPrintOp *print_op,
+ gboolean collate_flag);
+void gl_print_op_set_outline_flag (glPrintOp *print_op,
+ gboolean outline_flag);
+void gl_print_op_set_reverse_flag (glPrintOp *print_op,
+ gboolean reverse_flag);
+void gl_print_op_set_crop_marks_flag (glPrintOp *print_op,
+ gboolean crop_marks_flag);
+
+gchar *gl_print_op_get_filename (glPrintOp *print_op);
+gint gl_print_op_get_n_sheets (glPrintOp *print_op);
+gint gl_print_op_get_n_copies (glPrintOp *print_op);
+gint gl_print_op_get_first (glPrintOp *print_op);
+gint gl_print_op_get_last (glPrintOp *print_op);
+gboolean gl_print_op_get_collate_flag (glPrintOp *print_op);
+gboolean gl_print_op_get_outline_flag (glPrintOp *print_op);
+gboolean gl_print_op_get_reverse_flag (glPrintOp *print_op);
+gboolean gl_print_op_get_crop_marks_flag (glPrintOp *print_op);
+
+void gl_print_op_force_outline (glPrintOp *print_op);
+gboolean gl_print_op_is_outline_forced (glPrintOp *print_op);
+
+glPrintOpSettings *gl_print_op_get_settings (glPrintOp *print_op);
+void gl_print_op_set_settings (glPrintOp *print_op,
+ glPrintOpSettings *settings);
+void gl_print_op_free_settings (glPrintOpSettings *settings);
-/*
- * Batch print operation
- */
-glPrintOp *gl_print_op_new_batch (glLabel *label,
- gchar *filename,
- gint n_sheets,
- gint n_copies,
- gint first,
- gboolean outline_flag,
- gboolean reverse_flag,
- gboolean crop_marks_flag);
G_END_DECLS
#endif
+
+
+
+/*
+ * Local Variables: -- emacs
+ * mode: C -- emacs
+ * c-basic-offset: 8 -- emacs
+ * tab-width: 8 -- emacs
+ * indent-tabs-mode: nil -- emacs
+ * End: -- emacs
+ */
#include <libglabels/db.h>
#include "mini-preview.h"
#include "mini-preview-pixbuf-cache.h"
-#include "print-op.h"
+#include "print-op-dialog.h"
#include "util.h"
#include "debug.h"
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);
- 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),
#include "view.h"
#include "file.h"
#include "template-designer.h"
-#include "print-op.h"
+#include "print-op-dialog.h"
#include "prefs.h"
#include "prefs-dialog.h"
#include "recent.h"
gl_ui_cmd_file_print (GtkAction *action,
glWindow *window)
{
- glPrintOp *op;
+ glPrintOpDialog *op;
GtkPrintOperationResult result;
gl_debug (DEBUG_COMMANDS, "START");
g_return_if_fail (action && GTK_IS_ACTION(action));
g_return_if_fail (window && GL_IS_WINDOW(window));
- op = gl_print_op_new (GL_VIEW(window->view)->label);
+ op = gl_print_op_dialog_new (GL_VIEW(window->view)->label);
if (window->print_settings)
{
- gl_print_op_set_settings (op, window->print_settings);
+ gl_print_op_set_settings (GL_PRINT_OP (op), window->print_settings);
}
result = gtk_print_operation_run (GTK_PRINT_OPERATION (op),
if ( result == GTK_PRINT_OPERATION_RESULT_APPLY )
{
gl_print_op_free_settings (window->print_settings);
- window->print_settings = gl_print_op_get_settings (op);
+ window->print_settings = gl_print_op_get_settings (GL_PRINT_OP (op));
}
gl_debug (DEBUG_COMMANDS, "END");
+++ /dev/null
-/* -*- 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 "mini-preview.h"
-#include "marshal.h"
-
-#include "debug.h"
-
-#define MINI_PREVIEW_HEIGHT 175
-#define 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 (glMiniPreview *mini_preview,
- gint first, gint last, gpointer user_data);
-
-\f
-/****************************************************************************/
-/* 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_mini_preview_new (MINI_PREVIEW_HEIGHT,
- MINI_PREVIEW_WIDTH);
- gl_mini_preview_set_template (GL_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, 0.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_mini_preview_highlight_range (GL_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, 0.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, 0.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_mini_preview_highlight_range (GL_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_mini_preview_highlight_range (GL_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_mini_preview_highlight_range (GL_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_mini_preview_highlight_range (GL_MINI_PREVIEW(copies->mini_preview),
- first, last);
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Canvas event handler, select first and last items. */
-/*--------------------------------------------------------------------------*/
-static void
-preview_pressed (glMiniPreview *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);
- }
-}
+++ /dev/null
-/* -*- 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.h: custom print copies widget module header file
- *
- * Copyright (C) 2001-2002 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
- */
-
-#ifndef __WDGT_PRINT_COPIES_H__
-#define __WDGT_PRINT_COPIES_H__
-
-#include "label.h"
-#include <gtk/gtkhbox.h>
-
-G_BEGIN_DECLS
-
-#define GL_TYPE_WDGT_PRINT_COPIES (gl_wdgt_print_copies_get_type ())
-#define GL_WDGT_PRINT_COPIES(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj), GL_TYPE_WDGT_PRINT_COPIES, glWdgtPrintCopies ))
-#define GL_WDGT_PRINT_COPIES_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_WDGT_PRINT_COPIES, glWdgtPrintCopiesClass))
-#define GL_IS_WDGT_PRINT_COPIES(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_WDGT_PRINT_COPIES))
-#define GL_IS_WDGT_PRINT_COPIES_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_WDGT_PRINT_COPIES))
-
-typedef struct _glWdgtPrintCopies glWdgtPrintCopies;
-typedef struct _glWdgtPrintCopiesClass glWdgtPrintCopiesClass;
-
-struct _glWdgtPrintCopies {
- GtkHBox parent_widget;
-
- gint labels_per_sheet;
-
- GtkWidget *mini_preview;
-
- GtkWidget *sheets_radio;
- GtkWidget *sheets_spin;
-
- GtkWidget *labels_radio;
- GtkWidget *first_spin;
- GtkWidget *last_spin;
-};
-
-struct _glWdgtPrintCopiesClass {
- GtkHBoxClass parent_class;
-};
-
-GType gl_wdgt_print_copies_get_type (void) G_GNUC_CONST;
-
-GtkWidget *gl_wdgt_print_copies_new (glLabel *label);
-
-void gl_wdgt_print_copies_get_range (glWdgtPrintCopies *copies,
- gint *n_sheets,
- gint *first_label,
- gint *last_label);
-
-void gl_wdgt_print_copies_set_range (glWdgtPrintCopies *copies,
- gint n_sheets,
- gint first_label,
- gint last_label);
-
-G_END_DECLS
-
-#endif
+++ /dev/null
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
-/*
- * (GLABELS) Label and Business Card Creation program for GNOME
- *
- * wdgt_print_merge.c: print merge 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-merge.h"
-
-#include <math.h>
-#include <glib/gi18n.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkspinbutton.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkvbox.h>
-
-#include "hig.h"
-#include "mini-preview.h"
-#include "marshal.h"
-
-#include "pixmaps/collate.xpm"
-#include "pixmaps/nocollate.xpm"
-
-#include "debug.h"
-
-#define MINI_PREVIEW_HEIGHT 175
-#define MINI_PREVIEW_WIDTH 150
-
-/*===========================================*/
-/* Private globals */
-/*===========================================*/
-
-/*===========================================*/
-/* Local function prototypes */
-/*===========================================*/
-
-static void gl_wdgt_print_merge_finalize (GObject * object);
-
-static void gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge,
- glLabel * label);
-
-static void preview_clicked (glMiniPreview *mini_preview,
- gint i_label,
- gpointer user_data);
-
-static void collate_check_cb (GtkToggleButton * togglebutton,
- gpointer user_data);
-static void spin_cb (GtkSpinButton * spinbutton,
- gpointer user_data);
-
-\f
-/****************************************************************************/
-/* Boilerplate Object stuff. */
-/****************************************************************************/
-G_DEFINE_TYPE (glWdgtPrintMerge, gl_wdgt_print_merge, GTK_TYPE_HBOX);
-
-
-static void
-gl_wdgt_print_merge_class_init (glWdgtPrintMergeClass * class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
- gl_wdgt_print_merge_parent_class = g_type_class_peek_parent (class);
-
- object_class->finalize = gl_wdgt_print_merge_finalize;
-}
-
-static void
-gl_wdgt_print_merge_init (glWdgtPrintMerge * merge)
-{
- merge->mini_preview = NULL;
-
- merge->copies_spin = NULL;
- merge->first_spin = NULL;
- merge->collate_image = NULL;
- merge->collate_check = NULL;
-}
-
-static void
-gl_wdgt_print_merge_finalize (GObject * object)
-{
- g_return_if_fail (object != NULL);
- g_return_if_fail (GL_IS_WDGT_PRINT_MERGE (object));
-
- G_OBJECT_CLASS (gl_wdgt_print_merge_parent_class)->finalize (object);
-}
-
-GtkWidget *
-gl_wdgt_print_merge_new (glLabel * label)
-{
- glWdgtPrintMerge *merge;
-
- merge = g_object_new (gl_wdgt_print_merge_get_type (), NULL);
-
- gl_wdgt_print_merge_construct (merge, label);
-
- return GTK_WIDGET (merge);
-}
-\f
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Construct composite widget. */
-/*--------------------------------------------------------------------------*/
-static void
-gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge,
- glLabel * label)
-{
- const lglTemplateFrame *frame;
- GtkWidget *whbox, *wvbox, *whbox1;
- GtkObject *adjust;
- GdkPixbuf *pixbuf;
-
- whbox = GTK_WIDGET (merge);
-
- frame = (lglTemplateFrame *)label->template->frames->data;
-
- merge->labels_per_sheet = lgl_template_frame_get_n_labels (frame);
-
- /* mini_preview canvas */
- merge->mini_preview = gl_mini_preview_new (MINI_PREVIEW_HEIGHT,
- MINI_PREVIEW_WIDTH);
- gl_mini_preview_set_template( GL_MINI_PREVIEW (merge->mini_preview),
- label->template );
- gtk_box_pack_start (GTK_BOX(whbox), merge->mini_preview, FALSE, FALSE, 0);
- gl_mini_preview_highlight_range (GL_MINI_PREVIEW(merge->mini_preview),
- 1, 1);
-
- wvbox = gtk_vbox_new (FALSE, GL_HIG_PAD1);
- gtk_box_pack_start (GTK_BOX(whbox), wvbox, FALSE, FALSE, 0);
-
- /* First Label controls */
- whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2);
- gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX(whbox1),
- gtk_label_new (_("Start on label")), FALSE, FALSE, 0);
- adjust =
- gtk_adjustment_new (1, 1.0, merge->labels_per_sheet, 1.0, 10.0, 0.0);
- merge->first_spin =
- gtk_spin_button_new (GTK_ADJUSTMENT (adjust), 1.0, 0);
- gtk_box_pack_start (GTK_BOX(whbox1), merge->first_spin, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX(whbox1),
- gtk_label_new (_("on 1st sheet")), FALSE, FALSE, 0);
-
- /* Blank line */
- gtk_box_pack_start (GTK_BOX(wvbox), gtk_label_new (""), FALSE, FALSE, 0);
-
- /* Copy & collate controls*/
- whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2);
- gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX(whbox1),
- gtk_label_new (_("Copies:")), FALSE, FALSE, 0);
- adjust = gtk_adjustment_new (1, 1.0, 10.0, 1.0, 10.0, 0.0);
- merge->copies_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust),
- 1.0, 0);
- gtk_box_pack_start (GTK_BOX(whbox1), merge->copies_spin, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX(whbox1), gtk_label_new (" "), FALSE, FALSE, 0);
- merge->collate_check = gtk_check_button_new_with_label (_("Collate"));
- gtk_box_pack_start (GTK_BOX(whbox1), merge->collate_check, FALSE, FALSE, 0);
- pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
- merge->collate_image = gtk_image_new_from_pixbuf(pixbuf);
- gtk_widget_set_sensitive (merge->collate_check, FALSE);
- gtk_widget_set_sensitive (merge->collate_image, FALSE);
-
- gtk_box_pack_start (GTK_BOX(whbox1), merge->collate_image, FALSE, FALSE, 0);
-
- /* Connect signals to controls */
- g_signal_connect (G_OBJECT (merge->mini_preview), "clicked",
- G_CALLBACK (preview_clicked), merge);
- g_signal_connect (G_OBJECT (merge->collate_check), "toggled",
- G_CALLBACK (collate_check_cb), merge);
- g_signal_connect (G_OBJECT (merge->copies_spin), "changed",
- G_CALLBACK (spin_cb), merge);
- g_signal_connect (G_OBJECT (merge->first_spin), "changed",
- G_CALLBACK (spin_cb), merge);
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Enable/Disable appropriate controls due to radio button toggle.*/
-/*--------------------------------------------------------------------------*/
-static void
-collate_check_cb (GtkToggleButton * togglebutton,
- gpointer user_data)
-{
- glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
- GdkPixbuf *pixbuf;
-
- if (gtk_toggle_button_get_active (togglebutton)) {
-
- pixbuf =
- gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm);
-
- } else {
-
- pixbuf =
- gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm);
-
- }
- gtk_image_set_from_pixbuf (GTK_IMAGE (merge->collate_image),
- pixbuf);
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. modify widget due to change of first spin button */
-/*--------------------------------------------------------------------------*/
-static void
-spin_cb (GtkSpinButton * spinbutton,
- gpointer user_data)
-{
- glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
- gint first, last, n_copies;
-
- first =
- gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
- (merge->first_spin));
-
- n_copies =
- gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
- (merge->copies_spin));
- last = first + (n_copies * merge->n_records) - 1;
- gl_mini_preview_highlight_range (GL_MINI_PREVIEW(merge->mini_preview),
- first, last );
-
- gtk_widget_set_sensitive (merge->collate_check, (n_copies > 1));
- gtk_widget_set_sensitive (merge->collate_image, (n_copies > 1));
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE. Canvas event handler, select first and last items. */
-/*--------------------------------------------------------------------------*/
-static void
-preview_clicked (glMiniPreview *mini_preview,
- gint first,
- gpointer user_data)
-{
- glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data);
- gint n_copies, last;
-
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
- first);
-
- n_copies =
- gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
- (merge->copies_spin));
- last = first + (n_copies * merge->n_records) - 1;
- gl_mini_preview_highlight_range (GL_MINI_PREVIEW (merge->mini_preview),
- first, last);
-
-}
-
-/****************************************************************************/
-/* query selected range of labels within sheet or number of sheets. */
-/****************************************************************************/
-void
-gl_wdgt_print_merge_get_copies (glWdgtPrintMerge *merge,
- gint *n_copies,
- gint *first_label,
- gboolean *collate_flag,
- gint *n_sheets)
-{
- *n_copies =
- gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
- (merge->copies_spin));
- *first_label =
- gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON
- (merge->first_spin));
- *collate_flag =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (merge->collate_check));
-
- *n_sheets = ceil ( (double)(*first_label - 1 + (*n_copies * merge->n_records))/ (double)merge->labels_per_sheet );
-}
-
-/****************************************************************************/
-/* set range of labels within sheet or number of sheets */
-/****************************************************************************/
-void
-gl_wdgt_print_merge_set_copies (glWdgtPrintMerge * merge,
- gint n_copies,
- gint first_label,
- gint n_records,
- gboolean collate_flag)
-{
- gint last_label;
-
- merge->n_records = n_records;
-
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->copies_spin),
- n_copies);
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin),
- first_label);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (merge->collate_check),
- collate_flag);
-
- last_label = first_label + (n_copies * n_records) - 1;
- gl_mini_preview_highlight_range (GL_MINI_PREVIEW (merge->mini_preview),
- first_label, last_label );
-}
+++ /dev/null
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
-/*
- * (GLABELS) Label and Business Card Creation program for GNOME
- *
- * wdgt_print_merge.h: print merge widget module header file
- *
- * Copyright (C) 2001-2002 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
- */
-
-#ifndef __WDGT_PRINT_MERGE_H__
-#define __WDGT_PRINT_MERGE_H__
-
-#include "label.h"
-#include <gtk/gtkhbox.h>
-
-G_BEGIN_DECLS
-
-#define GL_TYPE_WDGT_PRINT_MERGE (gl_wdgt_print_merge_get_type ())
-#define GL_WDGT_PRINT_MERGE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj), GL_TYPE_WDGT_PRINT_MERGE, glWdgtPrintMerge ))
-#define GL_WDGT_PRINT_MERGE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_WDGT_PRINT_MERGE, glWdgtPrintMergeClass))
-#define GL_IS_WDGT_PRINT_MERGE(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_WDGT_PRINT_MERGE))
-#define GL_IS_WDGT_PRINT_MERGE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_WDGT_PRINT_MERGE))
-
-typedef struct _glWdgtPrintMerge glWdgtPrintMerge;
-typedef struct _glWdgtPrintMergeClass glWdgtPrintMergeClass;
-
-struct _glWdgtPrintMerge {
- GtkHBox parent_widget;
-
- gint labels_per_sheet;
- GtkWidget *mini_preview;
-
- gint n_records;
-
- GtkWidget *copies_spin;
- GtkWidget *first_spin;
- GtkWidget *collate_image;
- GtkWidget *collate_check;
-};
-
-struct _glWdgtPrintMergeClass {
- GtkHBoxClass parent_class;
-};
-
-GType gl_wdgt_print_merge_get_type (void) G_GNUC_CONST;
-
-GtkWidget *gl_wdgt_print_merge_new (glLabel *label);
-
-void gl_wdgt_print_merge_get_copies (glWdgtPrintMerge *merge,
- gint *n_copies,
- gint *first_label,
- gboolean *collate_flag,
- gint *n_sheets);
-
-void gl_wdgt_print_merge_set_copies (glWdgtPrintMerge *merge,
- gint n_copies,
- gint first_label,
- gint n_records,
- gboolean collate_flag);
-
-G_END_DECLS
-
-#endif