2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * print.c: Print module
6 * Copyright (C) 2001 Jim Evins <evins@snaught.com>.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include <libgnomeprint/gnome-print-paper.h>
29 #include <libgnomeprintui/gnome-printer-dialog.h>
30 #include <libgnomeprintui/gnome-print-dialog.h>
31 #include <libgnomeprint/gnome-print-master.h>
32 #include <libgnomeprintui/gnome-print-master-preview.h>
34 #include "print-dialog.h"
41 #include "wdgt-print-copies.h"
42 #include "wdgt-print-merge.h"
46 /*===========================================*/
48 /*===========================================*/
50 /*===========================================*/
51 /* Private globals. */
52 /*===========================================*/
54 /* remember state of dialog. */
55 static gboolean outline_flag = FALSE;
56 static gboolean reverse_flag = FALSE;
57 static gboolean collate_flag = FALSE;
58 static gint first = 1, last = 1, n_sheets = 0, n_copies = 1;
60 /*===========================================*/
61 /* Private function prototypes. */
62 /*===========================================*/
63 static GtkWidget *job_page_new (GtkWidget *dlg, glLabel *label);
64 static GtkWidget *printer_page_new (GtkWidget *dlg, glLabel *label);
66 static void print_response (GtkDialog *dlg,
70 static void print_sheets (GnomePrintConfig *config, glLabel * label,
71 gboolean preview_flag,
72 gint n_sheets, gint first, gint last,
73 gboolean outline_flag, gboolean reverse_flag);
75 static void print_sheets_merge (GnomePrintConfig *config, glLabel * label,
77 gboolean preview_flag,
78 gint n_copies, gint first,
79 gboolean collate_flag,
80 gboolean outline_flag, gboolean reverse_flag);
83 /*****************************************************************************/
85 /*****************************************************************************/
87 gl_print_dialog (glLabel *label, BonoboWindow *win)
90 GtkWidget *pp_button, *notebook, *page;
92 g_return_if_fail (label != NULL);
93 g_return_if_fail (win != NULL);
95 /* ----- Contstruct basic print dialog with notebook ----- */
96 dlg = gl_hig_dialog_new_with_buttons (_("Print"), GTK_WINDOW(win),
97 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
98 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
99 GTK_STOCK_PRINT, GNOME_PRINT_DIALOG_RESPONSE_PRINT,
102 pp_button = gtk_dialog_add_button (GTK_DIALOG (dlg),
103 GTK_STOCK_PRINT_PREVIEW,
104 GNOME_PRINT_DIALOG_RESPONSE_PREVIEW);
105 gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (GTK_DIALOG (dlg)->action_area),
107 gtk_dialog_set_default_response (GTK_DIALOG (dlg),
108 GNOME_PRINT_DIALOG_RESPONSE_PRINT);
109 notebook = gtk_notebook_new ();
110 gtk_widget_show (notebook);
111 gl_hig_dialog_add_widget (GL_HIG_DIALOG(dlg), notebook);
113 /* ----- Create Job notebook page ----- */
114 page = job_page_new (dlg, label);
115 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), page,
116 gtk_label_new_with_mnemonic (_("_Job")));
118 /* ----- Create Printer notebook page ----- */
119 page = printer_page_new (dlg, label);
120 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), page,
121 gtk_label_new_with_mnemonic (_("P_rinter")));
123 g_signal_connect (G_OBJECT(dlg), "response",
124 G_CALLBACK (print_response), label);
126 gtk_widget_show_all (GTK_WIDGET (dlg));
129 /*---------------------------------------------------------------------------*/
130 /* PRIVATE. Create "Job" page. */
131 /*---------------------------------------------------------------------------*/
133 job_page_new (GtkWidget *dlg,
139 GtkWidget *copies = NULL, *prmerge = NULL;
140 GtkWidget *wvbox, *outline_check, *reverse_check;
144 vbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
146 merge = gl_label_get_merge (label);
147 if (merge->type == GL_MERGE_NONE) {
149 /* ----------- Add simple-copies widget ------------ */
150 wframe = gl_hig_category_new (_("Copies"));
151 gl_hig_vbox_add_widget (GL_HIG_VBOX(vbox), wframe);
153 copies = gl_wdgt_print_copies_new (label);
154 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), copies);
157 gl_wdgt_print_copies_set_range (GL_WDGT_PRINT_COPIES (copies),
158 n_sheets, first, last);
163 /* ------- Otherwise add merge control widget ------------ */
164 wframe = gl_hig_category_new (_("Document merge control"));
165 gl_hig_vbox_add_widget (GL_HIG_VBOX(vbox), wframe);
167 prmerge = gl_wdgt_print_merge_new (label);
168 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), prmerge);
170 record_list = gl_merge_read_data (merge->type,
173 n_records = gl_merge_count_records( record_list );
174 gl_wdgt_print_merge_set_copies (GL_WDGT_PRINT_MERGE(prmerge),
175 n_copies, first, n_records,
178 gtk_widget_show_all (wframe);
179 g_object_set_data (G_OBJECT(dlg), "copies", copies);
180 g_object_set_data (G_OBJECT(dlg), "prmerge", prmerge);
182 /* ----------- Add custom print options area ------------ */
183 wframe = gl_hig_category_new (_("Options"));
184 gl_hig_vbox_add_widget (GL_HIG_VBOX(vbox), wframe);
186 /* add Outline check button */
188 gtk_check_button_new_with_label (
189 _("print outlines (to test printer alignment)"));
190 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), outline_check);
191 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (outline_check),
193 g_object_set_data (G_OBJECT(dlg), "outline_check", outline_check);
195 /* add Reverse check button */
197 gtk_check_button_new_with_label (
198 _("print in reverse (i.e. a mirror image)"));
199 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), reverse_check);
200 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (reverse_check),
202 g_object_set_data (G_OBJECT(dlg), "reverse_check", reverse_check);
204 gtk_widget_show_all (wframe);
209 /*---------------------------------------------------------------------------*/
210 /* PRIVATE. Create "Printer" page. */
211 /*---------------------------------------------------------------------------*/
213 printer_page_new (GtkWidget *dlg,
217 GtkWidget *printer_select;
219 vbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
222 gnome_printer_selection_new (gnome_print_config_default ());
223 gtk_widget_show (printer_select);
224 gl_hig_vbox_add_widget (GL_HIG_VBOX(vbox), printer_select);
226 g_object_set_data (G_OBJECT(dlg), "printer_select", printer_select);
231 /*---------------------------------------------------------------------------*/
232 /* PRIVATE. Print "response" callback. */
233 /*---------------------------------------------------------------------------*/
235 print_response (GtkDialog *dlg,
239 GtkWidget *copies, *prmerge;
240 GtkWidget *outline_check, *reverse_check;
241 GtkWidget *printer_select;
242 GnomePrintConfig *config;
248 case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
249 case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
250 copies = g_object_get_data (G_OBJECT(dlg), "copies");
251 prmerge = g_object_get_data (G_OBJECT(dlg), "prmerge");
252 outline_check = g_object_get_data (G_OBJECT(dlg),
254 reverse_check = g_object_get_data (G_OBJECT(dlg),
256 printer_select = g_object_get_data (G_OBJECT(dlg),
259 config = gnome_printer_selection_get_config (GNOME_PRINTER_SELECTION(printer_select));
262 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
265 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
268 merge = gl_label_get_merge (label);
270 if (merge->type == GL_MERGE_NONE) {
272 gl_wdgt_print_copies_get_range (GL_WDGT_PRINT_COPIES (copies),
273 &n_sheets, &first, &last);
274 print_sheets (config, label,
275 (response == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW),
276 n_sheets, first, last,
277 outline_flag, reverse_flag);
281 record_list = gl_merge_read_data (merge->type,
284 gl_wdgt_print_merge_get_copies (GL_WDGT_PRINT_MERGE (prmerge),
287 print_sheets_merge (config, label, record_list,
288 (response == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW),
295 gl_merge_free (&merge);
303 gtk_widget_destroy (GTK_WIDGET (dlg));
306 /*---------------------------------------------------------------------------*/
307 /* PRIVATE. print the sheets */
308 /*---------------------------------------------------------------------------*/
310 print_sheets (GnomePrintConfig *config,
312 gboolean preview_flag,
316 gboolean outline_flag,
317 gboolean reverse_flag)
319 GnomePrintMaster *master;
321 master = gnome_print_master_new_from_config (config);
322 gl_print_simple (master, label, n_sheets, first, last,
323 outline_flag, reverse_flag);
324 gnome_print_master_close (master);
327 GtkWidget *preview_widget =
328 gnome_print_master_preview_new (master, _("Print preview"));
329 gtk_widget_show (GTK_WIDGET (preview_widget));
331 gnome_print_master_print (master);
334 g_object_unref (G_OBJECT (master));
337 /*---------------------------------------------------------------------------*/
338 /* PRIVATE. print the sheets with merge data */
339 /*---------------------------------------------------------------------------*/
341 print_sheets_merge (GnomePrintConfig *config,
344 gboolean preview_flag,
347 gboolean collate_flag,
348 gboolean outline_flag,
349 gboolean reverse_flag)
351 GnomePrintMaster *master;
353 master = gnome_print_master_new_from_config (config);
354 if ( collate_flag ) {
355 gl_print_merge_collated (master, label, record_list,
357 outline_flag, reverse_flag);
359 gl_print_merge_uncollated (master, label, record_list,
361 outline_flag, reverse_flag);
363 gnome_print_master_close (master);
366 GtkWidget *preview_widget =
367 gnome_print_master_preview_new (master, _("Print preview"));
368 gtk_widget_show (GTK_WIDGET (preview_widget));
370 gnome_print_master_print (master);
373 g_object_unref (G_OBJECT (master));