source: trunk/third/libgnomeprintui/libgnomeprintui/gnome-print-copies.c @ 20964

Revision 20964, 13.7 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20963, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2/*
3 *  gnome-print-copies.c: A system print copies widget
4 *
5 *  This program is free software; you can redistribute it and/or
6 *  modify it under the terms of the GNU Library General Public License
7 *  as published by the Free Software Foundation; either version 2 of
8 *  the License, or (at your option) any later version.
9 *
10 *  This program is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 *  GNU Library General Public License for more details.
14 *
15 *  You should have received a copy of the GNU Library General Public
16 *  License along with this program; if not, write to the Free Software
17 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 *  Authors:
20 *    Michael Zucchi <notzed@ximian.com>
21 *    Andreas J. Guelzow <aguelzow@taliesin.ca>
22 *
23 *  Copyright (C) 2000-2002 Ximian Inc.
24 *  Copyright (C) 2003 Andreas J. Guelzow
25 *
26 */
27
28#include <config.h>
29
30#include <atk/atk.h>
31#include <gtk/gtk.h>
32
33#include "gnome-print-i18n.h"
34#include "gnome-print-copies.h"
35#include "gnome-printui-marshal.h"
36
37enum {COPIES_SET,
38      COLLATE_SET,
39      DUPLEX_SET,
40      TUMBLE_SET,
41      LAST_SIGNAL};
42
43struct _GnomePrintCopiesSelector {
44        GtkVBox vbox;
45 
46        guint changing : 1;
47
48        GtkWidget *copies;
49        GtkWidget *collate;
50        GtkWidget *collate_image;
51};
52
53struct _GnomePrintCopiesSelectorClass {
54        GtkVBoxClass parent_class;
55
56        void (* copies_set) (GnomePrintCopiesSelector * gpc, gint copies);
57        void (* collate_set) (GnomePrintCopiesSelector * gpc, gboolean collate);
58};
59
60static void gnome_print_copies_selector_class_init (GnomePrintCopiesSelectorClass *class);
61static void gnome_print_copies_selector_init       (GnomePrintCopiesSelector *gspaper);
62static void gnome_print_copies_selector_destroy    (GtkObject *object);
63
64/* again, these images may be here temporarily */
65
66/* XPM */
67static const char *collate_xpm[] = {
68"65 35 6 1",
69"       c None",
70".      c #000000",
71"+      c #020202",
72"@      c #FFFFFF",
73"#      c #010101",
74"$      c #070707",
75"           ..++++++++++++++++..              ..++++++++++++++++..",
76"           ..++++++++++++++++..              ..++++++++++++++++..",
77"           ..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..",
78"           ..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..",
79"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
80"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
81"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
82"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
83"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
84"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
85"..+++++++++##++++++$@@@@@@@@@..   ..+++++++++##++++++$@@@@@@@@@..",
86"..+++++++++##+++++#+@@@@@@@@@..   ..+++++++++##+++++#+@@@@@@@@@..",
87"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
88"..@@@@@@@@@@@@@@@@++@@@..@@@@..   ..@@@@@@@@@@@@@@@@++@@@..@@@@..",
89"..@@@@@@@@@@@@@@@@++@@.@@.@@@..   ..@@@@@@@@@@@@@@@@++@@.@@.@@@..",
90"..@@@@@@@@@@@@@@@@++@@@@@.@@@..   ..@@@@@@@@@@@@@@@@++@@@@@.@@@..",
91"..@@@@@@@@@@@@@@@@++@@@@.@@@@..   ..@@@@@@@@@@@@@@@@++@@@@.@@@@..",
92"..@@@@@@@@@@@@@@@@++@@@.@@@@@..   ..@@@@@@@@@@@@@@@@++@@@.@@@@@..",
93"..@@@@@@@@@@@@@@@@++@@.@@@@@@..   ..@@@@@@@@@@@@@@@@++@@.@@@@@@..",
94"..@@@@@@@@@@@@@@@@++@@....@@@..   ..@@@@@@@@@@@@@@@@++@@....@@@..",
95"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
96"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
97"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
98"..@@@@@@@@@@@.@@@@.............   ..@@@@@@@@@@@.@@@@.............",
99"..@@@@@@@@@@..@@@@.............   ..@@@@@@@@@@..@@@@.............",
100"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
101"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
102"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
103"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
104"..@@@@@@@@@@...@@@..              ..@@@@@@@@@@...@@@..           ",
105"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
106"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
107"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
108"....................              ....................           ",
109"....................              ....................           "};
110
111/* XPM */
112static const char *nocollate_xpm[] = {
113"65 35 6 1",
114"       c None",
115".      c #000000",
116"+      c #FFFFFF",
117"@      c #020202",
118"#      c #010101",
119"$      c #070707",
120"           ....................              ....................",
121"           ....................              ....................",
122"           ..++++++++++++++++..              ..++++++++++++++++..",
123"           ..++++++++++++++++..              ..++++++++++++++++..",
124"           @@++++++++++++++++..              @@++++++++++++++++..",
125"           @@++++++++++++++++..              @@++++++++++++++++..",
126"           @@++++++++++++++++..              @@++++++++++++++++..",
127"           @@++++++++++++++++..              @@++++++++++++++++..",
128"           @@++++++++++++++++..              @@++++++++++++++++..",
129"           @@++++++++++++++++..              @@++++++++++++++++..",
130"..@@@@@@@@@##@@@@@@$+++++++++..   ..@@@@@@@@@##@@@@@@$+++++++++..",
131"..@@@@@@@@@##@@@@@#@+++++++++..   ..@@@@@@@@@##@@@@@#@+++++++++..",
132"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
133"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@+++..++++..",
134"..++++++++++++++++@@+++..++++..   ..++++++++++++++++@@++.++.+++..",
135"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@+++++.+++..",
136"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@++++.++++..",
137"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@+++.+++++..",
138"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@++.++++++..",
139"..++++++++++++++++@@+++...+++..   ..++++++++++++++++@@++....+++..",
140"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
141"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
142"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
143"..+++++++++++.++++.............   ..++++++++++..++++.............",
144"..++++++++++..++++.............   ..+++++++++.++.+++.............",
145"..+++++++++++.++++..              ..++++++++++++.+++..           ",
146"..+++++++++++.++++..              ..+++++++++++.++++..           ",
147"..+++++++++++.++++..              ..++++++++++.+++++..           ",
148"..+++++++++++.++++..              ..+++++++++.++++++..           ",
149"..++++++++++...+++..              ..+++++++++....+++..           ",
150"..++++++++++++++++..              ..++++++++++++++++..           ",
151"..++++++++++++++++..              ..++++++++++++++++..           ",
152"..++++++++++++++++..              ..++++++++++++++++..           ",
153"....................              ....................           ",
154"....................              ....................           "};
155
156
157static GtkVBoxClass *parent_class;
158static guint gpc_signals[LAST_SIGNAL] = {0};
159
160GType
161gnome_print_copies_selector_get_type (void)
162{
163        static GType type = 0;
164        if (!type) {
165                static const GTypeInfo info = {
166                        sizeof (GnomePrintCopiesSelectorClass),
167                        NULL, NULL,
168                        (GClassInitFunc) gnome_print_copies_selector_class_init,
169                        NULL, NULL,
170                        sizeof (GnomePrintCopiesSelector),
171                        0,
172                        (GInstanceInitFunc) gnome_print_copies_selector_init,
173                        NULL,
174                };
175                type = g_type_register_static (GTK_TYPE_VBOX, "GnomePrintCopiesSelector", &info, 0);
176        }
177        return type;
178}
179
180static void
181gnome_print_copies_selector_class_init (GnomePrintCopiesSelectorClass *klass)
182{
183        GtkObjectClass *gtk_object_class;
184        GObjectClass *object_class;
185 
186        object_class = (GObjectClass *) klass;
187        gtk_object_class = (GtkObjectClass *) klass;
188
189        parent_class = g_type_class_peek_parent (klass);
190
191        gpc_signals[COPIES_SET] = g_signal_new ("copies_set",
192                                                G_OBJECT_CLASS_TYPE (object_class),
193                                                G_SIGNAL_RUN_FIRST,
194                                                G_STRUCT_OFFSET (GnomePrintCopiesSelectorClass, copies_set),
195                                                NULL, NULL,
196                                                g_cclosure_marshal_VOID__INT,
197                                                G_TYPE_NONE,
198                                                1,
199                                                G_TYPE_INT);
200       
201        gpc_signals[COLLATE_SET] = g_signal_new ("collate_set",
202                                                G_OBJECT_CLASS_TYPE (object_class),
203                                                G_SIGNAL_RUN_FIRST,
204                                                G_STRUCT_OFFSET (GnomePrintCopiesSelectorClass, collate_set),
205                                                NULL, NULL,
206                                                libgnomeprintui_marshal_VOID__BOOLEAN,
207                                                G_TYPE_NONE,
208                                                1,
209                                                G_TYPE_BOOLEAN);
210
211        gtk_object_class->destroy = gnome_print_copies_selector_destroy;
212}
213
214static void
215collate_toggled (GtkWidget *widget, GnomePrintCopiesSelector *gpc)
216{
217        gboolean collate;
218        GdkPixbuf *pb;
219
220        collate = ((GtkToggleButton *) gpc->collate)->active;
221
222        pb = gdk_pixbuf_new_from_xpm_data (collate ? collate_xpm : nocollate_xpm);
223        gtk_image_set_from_pixbuf (GTK_IMAGE (gpc->collate_image), pb);
224        g_object_unref (G_OBJECT (pb));
225
226        if (gpc->changing)
227                return;
228
229        g_signal_emit (G_OBJECT (gpc), gpc_signals[COLLATE_SET], 0, collate);
230}
231
232static void
233copies_changed (GtkAdjustment *adj, GnomePrintCopiesSelector *gpc)
234{
235        gint copies;
236
237        copies = gtk_adjustment_get_value (adj);
238
239        gtk_widget_set_sensitive (gpc->collate, (copies != 1));
240        gtk_widget_set_sensitive (gpc->collate_image, (copies != 1));
241
242        if (gpc->changing)
243                return;
244
245        g_signal_emit (G_OBJECT (gpc), gpc_signals[COPIES_SET], 0, copies);
246}
247
248
249static void
250gnome_print_copies_selector_init (GnomePrintCopiesSelector *gpc)
251{
252        GtkWidget *table, *label, *frame;
253        GtkAdjustment *adj;
254        GdkPixbuf *pb;
255        AtkObject *atko;
256        gchar *text;
257
258        frame = gtk_frame_new ("");
259        gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
260        label = gtk_label_new ("");
261        text = g_strdup_printf ("<b>%s</b>", _("Copies"));
262        gtk_label_set_markup (GTK_LABEL (label), text);
263        g_free (text);
264        gtk_frame_set_label_widget (GTK_FRAME (frame), label);
265        gtk_widget_show (label);
266        gtk_container_add (GTK_CONTAINER (gpc), frame);
267        gtk_widget_show (frame);
268
269        table = gtk_table_new(2, 2, FALSE);
270        gtk_container_set_border_width (GTK_CONTAINER(table), 6);
271        gtk_container_add (GTK_CONTAINER(frame), GTK_WIDGET (table));
272        gtk_widget_show (table);
273
274        label = gtk_label_new_with_mnemonic (_("N_umber of copies:"));
275        gtk_widget_show (label);
276        gtk_table_attach_defaults ((GtkTable *)table, label, 0, 1, 0, 1);
277
278        adj = (GtkAdjustment *) gtk_adjustment_new(1, 1, 1000, 1.0, 10.0, 10.0);
279        gpc->copies = gtk_spin_button_new (adj, 1.0, 0);
280        gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (gpc->copies), TRUE);
281        gtk_widget_show (gpc->copies);
282        gtk_table_attach_defaults ((GtkTable *)table, gpc->copies, 1, 2, 0, 1);
283
284        gtk_label_set_mnemonic_widget ((GtkLabel *) label, gpc->copies);
285
286        pb = gdk_pixbuf_new_from_xpm_data (nocollate_xpm);
287        gpc->collate_image = gtk_image_new_from_pixbuf (pb);
288        g_object_unref (G_OBJECT (pb));
289        gtk_widget_show (gpc->collate_image);
290        gtk_table_attach_defaults ((GtkTable *)table, gpc->collate_image, 0, 1, 1, 2);
291        atko = gtk_widget_get_accessible (gpc->collate_image);
292        atk_image_set_image_description (ATK_IMAGE (atko), _("Image showing the collation sequence when multiple copies of the document are printed"));
293
294        gpc->collate = gtk_check_button_new_with_mnemonic (_("_Collate"));
295        gtk_widget_show(gpc->collate);
296        gtk_table_attach_defaults((GtkTable *)table, gpc->collate, 1, 2, 1, 2);
297
298        atko = gtk_widget_get_accessible (gpc->collate);
299        atk_object_set_description (atko, _("If copies of the document are printed separately, one after another, rather than being interleaved"));
300
301        gtk_widget_set_sensitive (gpc->collate, FALSE);
302        gtk_widget_set_sensitive (gpc->collate_image, FALSE);
303
304        g_signal_connect (G_OBJECT (adj), "value_changed",
305                          (GCallback) copies_changed, gpc);
306        g_signal_connect (G_OBJECT (gpc->collate), "toggled",
307                          (GCallback) collate_toggled, gpc);
308}
309
310/**
311 * gnome_print_copies_selector_new:
312 *
313 * Create a new GnomePrintCopies widget.
314 *
315 * Return value: A new GnomePrintCopies widget.
316 **/
317
318GtkWidget *
319gnome_print_copies_selector_new (void)
320{
321        return GTK_WIDGET (g_object_new (GNOME_TYPE_PRINT_COPIES_SELECTOR, NULL));
322}
323
324static void
325gnome_print_copies_selector_destroy (GtkObject *object)
326{
327        GnomePrintCopiesSelector *gpc;
328       
329        gpc = GNOME_PRINT_COPIES_SELECTOR (object);
330
331        if (GTK_OBJECT_CLASS (parent_class)->destroy)
332                (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
333}
334
335/**
336 * gnome_print_copies_set_copies:
337 * @gpc: An initialised GnomePrintCopies widget.
338 * @copies: New number of copies.
339 * @collate: New collation status.
340 *
341 * Set the number of copies and collation sequence to be displayed.
342 **/
343
344void
345gnome_print_copies_selector_set_copies (GnomePrintCopiesSelector *gpc, gint copies, gboolean collate)
346{
347        g_return_if_fail (gpc != NULL);
348        g_return_if_fail (GNOME_IS_PRINT_COPIES_SELECTOR (gpc));
349
350        gpc->changing = TRUE;
351
352        gtk_toggle_button_set_active ((GtkToggleButton *) gpc->collate, collate);
353        gpc->changing = FALSE;
354
355        gtk_spin_button_set_value ((GtkSpinButton *) gpc->copies, copies);
356
357        gtk_widget_set_sensitive (gpc->collate, (copies != 1));
358        gtk_widget_set_sensitive (gpc->collate_image, (copies != 1));
359}
360
361/**
362 * gnome_print_copies_get_copies:
363 * @gpc: An initialised GnomePrintCopies widget.
364 *
365 * Retrieve the number of copies set
366 *
367 * Return value: Number of copies set
368 **/
369
370gint
371gnome_print_copies_selector_get_copies (GnomePrintCopiesSelector *gpc)
372{
373        g_return_val_if_fail (gpc != NULL, 0);
374        g_return_val_if_fail (GNOME_IS_PRINT_COPIES_SELECTOR (gpc), 0);
375
376        return gtk_spin_button_get_value_as_int ((GtkSpinButton *) gpc->copies);
377}
378
379/**
380 * gnome_print_copies_get_collate:
381 * @gpc: An initialised GnomePrintCopies widget.
382 *
383 * Retrieve the collation status
384 *
385 * Return value: Collation status
386 **/
387
388gboolean
389gnome_print_copies_selector_get_collate (GnomePrintCopiesSelector *gpc)
390{
391        g_return_val_if_fail (gpc != NULL, FALSE);
392        g_return_val_if_fail (GNOME_IS_PRINT_COPIES_SELECTOR (gpc), FALSE);
393
394        return GTK_TOGGLE_BUTTON (gpc->collate)->active?TRUE:FALSE;
395}
396
397
398
Note: See TracBrowser for help on using the repository browser.