]> git.sur5r.net Git - glabels/blob - glabels2/src/print-dialog.c
05bca590a1859f53ea3d2fe754f3b173234c33ff
[glabels] / glabels2 / src / print-dialog.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  print.c:  Print module
5  *
6  *  Copyright (C) 2001  Jim Evins <evins@snaught.com>.
7  *
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.
12  *
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.
17  *
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
21  */
22 #include <config.h>
23
24 #include <math.h>
25 #include <time.h>
26 #include <ctype.h>
27 #include <gtk/gtk.h>
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>
33
34 #include "print-dialog.h"
35 #include "hig.h"
36 #include "print.h"
37 #include "label.h"
38 #include "bc.h"
39 #include "template.h"
40
41 #include "wdgt-print-copies.h"
42 #include "wdgt-print-merge.h"
43
44 #include "debug.h"
45
46 /*===========================================*/
47 /* Private types.                            */
48 /*===========================================*/
49
50 /*===========================================*/
51 /* Private globals.                          */
52 /*===========================================*/
53
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;
59
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);
65
66 static void print_response (GtkDialog *dlg,
67                             gint      response,
68                             glLabel   *label);
69
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);
74
75 static void print_sheets_merge (GnomePrintConfig *config, glLabel * label,
76                                 GList *record_list,
77                                 gboolean preview_flag,
78                                 gint n_copies, gint first,
79                                 gboolean collate_flag,
80                                 gboolean outline_flag, gboolean reverse_flag);
81
82 \f
83 /*****************************************************************************/
84 /* "Print" dialog.                                                           */
85 /*****************************************************************************/
86 void
87 gl_print_dialog (glLabel *label, BonoboWindow *win)
88 {
89         GtkWidget *dlg;
90         GtkWidget *pp_button, *notebook, *page;
91
92         g_return_if_fail (label != NULL);
93         g_return_if_fail (win != NULL);
94
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,
100
101                                            NULL);
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), 
106                                             pp_button, TRUE);
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);
112
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")));
117
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")));
122
123         g_signal_connect (G_OBJECT(dlg), "response",
124                           G_CALLBACK (print_response), label);
125
126         gtk_widget_show_all (GTK_WIDGET (dlg));
127 }
128
129 /*---------------------------------------------------------------------------*/
130 /* PRIVATE.  Create "Job" page.                                              */
131 /*---------------------------------------------------------------------------*/
132 static GtkWidget *
133 job_page_new (GtkWidget *dlg,
134               glLabel   *label)
135 {
136         GtkWidget *vbox;
137         glMerge *merge;
138         GtkWidget *wframe;
139         GtkWidget *copies = NULL, *prmerge = NULL;
140         GtkWidget *wvbox, *outline_check, *reverse_check;
141         GList *record_list;
142         gint n_records;
143
144         vbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
145
146         merge = gl_label_get_merge (label);
147         if (merge->type == GL_MERGE_NONE) {
148
149                 /* ----------- Add simple-copies widget ------------ */
150                 wframe = gl_hig_category_new (_("Copies"));
151                 gl_hig_vbox_add_widget (GL_HIG_VBOX(vbox), wframe);
152
153                 copies = gl_wdgt_print_copies_new (label);
154                 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), copies);
155
156                 if (n_sheets) {
157                         gl_wdgt_print_copies_set_range (GL_WDGT_PRINT_COPIES (copies),
158                                                         n_sheets, first, last);
159                 }
160
161         } else {
162
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);
166
167                 prmerge = gl_wdgt_print_merge_new (label);
168                 gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), prmerge);
169
170                 record_list = gl_merge_read_data (merge->type,
171                                                   merge->field_defs,
172                                                   merge->src);
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,
176                                            collate_flag);
177         }
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);
181
182         /* ----------- Add custom print options area ------------ */
183         wframe = gl_hig_category_new (_("Options"));
184         gl_hig_vbox_add_widget (GL_HIG_VBOX(vbox), wframe);
185
186         /* add Outline check button */
187         outline_check =
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),
192                                       outline_flag);
193         g_object_set_data (G_OBJECT(dlg), "outline_check", outline_check);
194
195         /* add Reverse check button */
196         reverse_check =
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),
201                                       reverse_flag);
202         g_object_set_data (G_OBJECT(dlg), "reverse_check", reverse_check);
203
204         gtk_widget_show_all (wframe);
205
206         return vbox;
207 }
208
209 /*---------------------------------------------------------------------------*/
210 /* PRIVATE.  Create "Printer" page.                                          */
211 /*---------------------------------------------------------------------------*/
212 static GtkWidget *
213 printer_page_new (GtkWidget *dlg,
214                   glLabel   *label)
215 {
216         GtkWidget *vbox;
217         GtkWidget *printer_select;
218
219         vbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
220
221         printer_select =
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);
225
226         g_object_set_data (G_OBJECT(dlg), "printer_select", printer_select);
227
228         return vbox;
229 }
230
231 /*---------------------------------------------------------------------------*/
232 /* PRIVATE.  Print "response" callback.                                      */
233 /*---------------------------------------------------------------------------*/
234 static void
235 print_response (GtkDialog *dlg,
236                 gint      response,
237                 glLabel   *label)
238 {
239         GtkWidget *copies, *prmerge;
240         GtkWidget *outline_check, *reverse_check;
241         GtkWidget *printer_select;
242         GnomePrintConfig *config;
243         glMerge *merge;
244         GList *record_list;
245
246         switch (response) {
247
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),
253                                                     "outline_check");
254                 reverse_check  = g_object_get_data (G_OBJECT(dlg),
255                                                     "reverse_check");
256                 printer_select = g_object_get_data (G_OBJECT(dlg),
257                                                     "printer_select");
258
259                 config = gnome_printer_selection_get_config (GNOME_PRINTER_SELECTION(printer_select));
260
261                 outline_flag =
262                         gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
263                                                       (outline_check));
264                 reverse_flag =
265                         gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
266                                                       (reverse_check));
267
268                 merge = gl_label_get_merge (label);
269
270                 if (merge->type == GL_MERGE_NONE) {
271
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);
278
279                 } else {
280
281                         record_list = gl_merge_read_data (merge->type,
282                                                           merge->field_defs,
283                                                           merge->src);
284                         gl_wdgt_print_merge_get_copies (GL_WDGT_PRINT_MERGE (prmerge),
285                                                         &n_copies, &first,
286                                                         &collate_flag);
287                         print_sheets_merge (config, label, record_list,
288                                             (response == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW),
289                                             n_copies, first,
290                                             collate_flag,
291                                             outline_flag,
292                                             reverse_flag);
293                 }
294
295                 gl_merge_free (&merge);
296                 break;
297
298         default:
299                 break;
300
301         }
302
303         gtk_widget_destroy (GTK_WIDGET (dlg));
304 }
305
306 /*---------------------------------------------------------------------------*/
307 /* PRIVATE.  print the sheets                                                */
308 /*---------------------------------------------------------------------------*/
309 static void
310 print_sheets (GnomePrintConfig *config,
311               glLabel * label,
312               gboolean preview_flag,
313               gint n_sheets,
314               gint first,
315               gint last,
316               gboolean outline_flag,
317               gboolean reverse_flag)
318 {
319         GnomePrintMaster *master;
320
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);
325
326         if (preview_flag) {
327                 GtkWidget *preview_widget =
328                     gnome_print_master_preview_new (master, _("Print preview"));
329                 gtk_widget_show (GTK_WIDGET (preview_widget));
330         } else {
331                 gnome_print_master_print (master);
332         }
333
334         g_object_unref (G_OBJECT (master));
335 }
336
337 /*---------------------------------------------------------------------------*/
338 /* PRIVATE.  print the sheets with merge data                                */
339 /*---------------------------------------------------------------------------*/
340 static void
341 print_sheets_merge (GnomePrintConfig *config,
342                     glLabel * label,
343                     GList * record_list,
344                     gboolean preview_flag,
345                     gint n_copies,
346                     gint first,
347                     gboolean collate_flag,
348                     gboolean outline_flag,
349                     gboolean reverse_flag)
350 {
351         GnomePrintMaster *master;
352
353         master = gnome_print_master_new_from_config (config);
354         if ( collate_flag ) {
355                 gl_print_merge_collated (master, label, record_list,
356                                          n_copies, first,
357                                          outline_flag, reverse_flag);
358         } else {
359                 gl_print_merge_uncollated (master, label, record_list,
360                                            n_copies, first,
361                                            outline_flag, reverse_flag);
362         }
363         gnome_print_master_close (master);
364
365         if (preview_flag) {
366                 GtkWidget *preview_widget =
367                     gnome_print_master_preview_new (master, _("Print preview"));
368                 gtk_widget_show (GTK_WIDGET (preview_widget));
369         } else {
370                 gnome_print_master_print (master);
371         }
372
373         g_object_unref (G_OBJECT (master));
374 }
375