1/*
2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.awt;
27
28import java.util.Locale;
29
30/**
31 * A set of attributes which control the output of a printed page.
32 * <p>
33 * Instances of this class control the color state, paper size (media type),
34 * orientation, logical origin, print quality, and resolution of every
35 * page which uses the instance. Attribute names are compliant with the
36 * Internet Printing Protocol (IPP) 1.1 where possible. Attribute values
37 * are partially compliant where possible.
38 * <p>
39 * To use a method which takes an inner class type, pass a reference to
40 * one of the constant fields of the inner class. Client code cannot create
41 * new instances of the inner class types because none of those classes
42 * has a public constructor. For example, to set the color state to
43 * monochrome, use the following code:
44 * <pre>
45 * import java.awt.PageAttributes;
46 *
47 * public class MonochromeExample {
48 *     public void setMonochrome(PageAttributes pageAttributes) {
49 *         pageAttributes.setColor(PageAttributes.ColorType.MONOCHROME);
50 *     }
51 * }
52 * </pre>
53 * <p>
54 * Every IPP attribute which supports an <i>attributeName</i>-default value
55 * has a corresponding <code>set<i>attributeName</i>ToDefault</code> method.
56 * Default value fields are not provided.
57 *
58 * @author      David Mendenhall
59 * @since 1.3
60 */
61public final class PageAttributes implements Cloneable {
62    /**
63     * A type-safe enumeration of possible color states.
64     * @since 1.3
65     */
66    public static final class ColorType extends AttributeValue {
67        private static final int I_COLOR = 0;
68        private static final int I_MONOCHROME = 1;
69
70        private static final String NAMES[] = {
71            "color", "monochrome"
72        };
73
74        /**
75         * The ColorType instance to use for specifying color printing.
76         */
77        public static final ColorType COLOR = new ColorType(I_COLOR);
78        /**
79         * The ColorType instance to use for specifying monochrome printing.
80         */
81        public static final ColorType MONOCHROME = new ColorType(I_MONOCHROME);
82
83        private ColorType(int type) {
84            super(type, NAMES);
85        }
86    }
87
88    /**
89     * A type-safe enumeration of possible paper sizes. These sizes are in
90     * compliance with IPP 1.1.
91     * @since 1.3
92     */
93    public static final class MediaType extends AttributeValue {
94        private static final int I_ISO_4A0 = 0;
95        private static final int I_ISO_2A0 = 1;
96        private static final int I_ISO_A0 = 2;
97        private static final int I_ISO_A1 = 3;
98        private static final int I_ISO_A2 = 4;
99        private static final int I_ISO_A3 = 5;
100        private static final int I_ISO_A4 = 6;
101        private static final int I_ISO_A5 = 7;
102        private static final int I_ISO_A6 = 8;
103        private static final int I_ISO_A7 = 9;
104        private static final int I_ISO_A8 = 10;
105        private static final int I_ISO_A9 = 11;
106        private static final int I_ISO_A10 = 12;
107        private static final int I_ISO_B0 = 13;
108        private static final int I_ISO_B1 = 14;
109        private static final int I_ISO_B2 = 15;
110        private static final int I_ISO_B3 = 16;
111        private static final int I_ISO_B4 = 17;
112        private static final int I_ISO_B5 = 18;
113        private static final int I_ISO_B6 = 19;
114        private static final int I_ISO_B7 = 20;
115        private static final int I_ISO_B8 = 21;
116        private static final int I_ISO_B9 = 22;
117        private static final int I_ISO_B10 = 23;
118        private static final int I_JIS_B0 = 24;
119        private static final int I_JIS_B1 = 25;
120        private static final int I_JIS_B2 = 26;
121        private static final int I_JIS_B3 = 27;
122        private static final int I_JIS_B4 = 28;
123        private static final int I_JIS_B5 = 29;
124        private static final int I_JIS_B6 = 30;
125        private static final int I_JIS_B7 = 31;
126        private static final int I_JIS_B8 = 32;
127        private static final int I_JIS_B9 = 33;
128        private static final int I_JIS_B10 = 34;
129        private static final int I_ISO_C0 = 35;
130        private static final int I_ISO_C1 = 36;
131        private static final int I_ISO_C2 = 37;
132        private static final int I_ISO_C3 = 38;
133        private static final int I_ISO_C4 = 39;
134        private static final int I_ISO_C5 = 40;
135        private static final int I_ISO_C6 = 41;
136        private static final int I_ISO_C7 = 42;
137        private static final int I_ISO_C8 = 43;
138        private static final int I_ISO_C9 = 44;
139        private static final int I_ISO_C10 = 45;
140        private static final int I_ISO_DESIGNATED_LONG = 46;
141        private static final int I_EXECUTIVE = 47;
142        private static final int I_FOLIO = 48;
143        private static final int I_INVOICE = 49;
144        private static final int I_LEDGER = 50;
145        private static final int I_NA_LETTER = 51;
146        private static final int I_NA_LEGAL = 52;
147        private static final int I_QUARTO = 53;
148        private static final int I_A = 54;
149        private static final int I_B = 55;
150        private static final int I_C = 56;
151        private static final int I_D = 57;
152        private static final int I_E = 58;
153        private static final int I_NA_10X15_ENVELOPE = 59;
154        private static final int I_NA_10X14_ENVELOPE = 60;
155        private static final int I_NA_10X13_ENVELOPE = 61;
156        private static final int I_NA_9X12_ENVELOPE = 62;
157        private static final int I_NA_9X11_ENVELOPE = 63;
158        private static final int I_NA_7X9_ENVELOPE = 64;
159        private static final int I_NA_6X9_ENVELOPE = 65;
160        private static final int I_NA_NUMBER_9_ENVELOPE = 66;
161        private static final int I_NA_NUMBER_10_ENVELOPE = 67;
162        private static final int I_NA_NUMBER_11_ENVELOPE = 68;
163        private static final int I_NA_NUMBER_12_ENVELOPE = 69;
164        private static final int I_NA_NUMBER_14_ENVELOPE = 70;
165        private static final int I_INVITE_ENVELOPE = 71;
166        private static final int I_ITALY_ENVELOPE = 72;
167        private static final int I_MONARCH_ENVELOPE = 73;
168        private static final int I_PERSONAL_ENVELOPE = 74;
169
170        private static final String NAMES[] = {
171            "iso-4a0", "iso-2a0", "iso-a0", "iso-a1", "iso-a2", "iso-a3",
172            "iso-a4", "iso-a5", "iso-a6", "iso-a7", "iso-a8", "iso-a9",
173            "iso-a10", "iso-b0", "iso-b1", "iso-b2", "iso-b3", "iso-b4",
174            "iso-b5", "iso-b6", "iso-b7", "iso-b8", "iso-b9", "iso-b10",
175            "jis-b0", "jis-b1", "jis-b2", "jis-b3", "jis-b4", "jis-b5",
176            "jis-b6", "jis-b7", "jis-b8", "jis-b9", "jis-b10", "iso-c0",
177            "iso-c1", "iso-c2", "iso-c3", "iso-c4", "iso-c5", "iso-c6",
178            "iso-c7", "iso-c8", "iso-c9", "iso-c10", "iso-designated-long",
179            "executive", "folio", "invoice", "ledger", "na-letter", "na-legal",
180            "quarto", "a", "b", "c", "d", "e", "na-10x15-envelope",
181            "na-10x14-envelope", "na-10x13-envelope", "na-9x12-envelope",
182            "na-9x11-envelope", "na-7x9-envelope", "na-6x9-envelope",
183            "na-number-9-envelope", "na-number-10-envelope",
184            "na-number-11-envelope", "na-number-12-envelope",
185            "na-number-14-envelope", "invite-envelope", "italy-envelope",
186            "monarch-envelope", "personal-envelope"
187        };
188
189        /**
190         * The MediaType instance for ISO/DIN and JIS 4A0, 1682 x 2378 mm.
191         */
192        public static final MediaType ISO_4A0 = new MediaType(I_ISO_4A0);
193        /**
194         * The MediaType instance for ISO/DIN and JIS 2A0, 1189 x 1682 mm.
195         */
196        public static final MediaType ISO_2A0 = new MediaType(I_ISO_2A0);
197        /**
198         * The MediaType instance for ISO/DIN and JIS A0, 841 x 1189 mm.
199         */
200        public static final MediaType ISO_A0 = new MediaType(I_ISO_A0);
201        /**
202         * The MediaType instance for ISO/DIN and JIS A1, 594 x 841 mm.
203         */
204        public static final MediaType ISO_A1 = new MediaType(I_ISO_A1);
205        /**
206         * The MediaType instance for ISO/DIN and JIS A2, 420 x 594 mm.
207         */
208        public static final MediaType ISO_A2 = new MediaType(I_ISO_A2);
209        /**
210         * The MediaType instance for ISO/DIN and JIS A3, 297 x 420 mm.
211         */
212        public static final MediaType ISO_A3 = new MediaType(I_ISO_A3);
213        /**
214         * The MediaType instance for ISO/DIN and JIS A4, 210 x 297 mm.
215         */
216        public static final MediaType ISO_A4 = new MediaType(I_ISO_A4);
217        /**
218         * The MediaType instance for ISO/DIN and JIS A5, 148 x 210 mm.
219         */
220        public static final MediaType ISO_A5 = new MediaType(I_ISO_A5);
221        /**
222         * The MediaType instance for ISO/DIN and JIS A6, 105 x 148 mm.
223         */
224        public static final MediaType ISO_A6 = new MediaType(I_ISO_A6);
225        /**
226         * The MediaType instance for ISO/DIN and JIS A7, 74 x 105 mm.
227         */
228        public static final MediaType ISO_A7 = new MediaType(I_ISO_A7);
229        /**
230         * The MediaType instance for ISO/DIN and JIS A8, 52 x 74 mm.
231         */
232        public static final MediaType ISO_A8 = new MediaType(I_ISO_A8);
233        /**
234         * The MediaType instance for ISO/DIN and JIS A9, 37 x 52 mm.
235         */
236        public static final MediaType ISO_A9 = new MediaType(I_ISO_A9);
237        /**
238         * The MediaType instance for ISO/DIN and JIS A10, 26 x 37 mm.
239         */
240        public static final MediaType ISO_A10 = new MediaType(I_ISO_A10);
241        /**
242         * The MediaType instance for ISO/DIN B0, 1000 x 1414 mm.
243         */
244        public static final MediaType ISO_B0 = new MediaType(I_ISO_B0);
245        /**
246         * The MediaType instance for ISO/DIN B1, 707 x 1000 mm.
247         */
248        public static final MediaType ISO_B1 = new MediaType(I_ISO_B1);
249        /**
250         * The MediaType instance for ISO/DIN B2, 500 x 707 mm.
251         */
252        public static final MediaType ISO_B2 = new MediaType(I_ISO_B2);
253        /**
254         * The MediaType instance for ISO/DIN B3, 353 x 500 mm.
255         */
256        public static final MediaType ISO_B3 = new MediaType(I_ISO_B3);
257        /**
258         * The MediaType instance for ISO/DIN B4, 250 x 353 mm.
259         */
260        public static final MediaType ISO_B4 = new MediaType(I_ISO_B4);
261        /**
262         * The MediaType instance for ISO/DIN B5, 176 x 250 mm.
263         */
264        public static final MediaType ISO_B5 = new MediaType(I_ISO_B5);
265        /**
266         * The MediaType instance for ISO/DIN B6, 125 x 176 mm.
267         */
268        public static final MediaType ISO_B6 = new MediaType(I_ISO_B6);
269        /**
270         * The MediaType instance for ISO/DIN B7, 88 x 125 mm.
271         */
272        public static final MediaType ISO_B7 = new MediaType(I_ISO_B7);
273        /**
274         * The MediaType instance for ISO/DIN B8, 62 x 88 mm.
275         */
276        public static final MediaType ISO_B8 = new MediaType(I_ISO_B8);
277        /**
278         * The MediaType instance for ISO/DIN B9, 44 x 62 mm.
279         */
280        public static final MediaType ISO_B9 = new MediaType(I_ISO_B9);
281        /**
282         * The MediaType instance for ISO/DIN B10, 31 x 44 mm.
283         */
284        public static final MediaType ISO_B10 = new MediaType(I_ISO_B10);
285        /**
286         * The MediaType instance for JIS B0, 1030 x 1456 mm.
287         */
288        public static final MediaType JIS_B0 = new MediaType(I_JIS_B0);
289        /**
290         * The MediaType instance for JIS B1, 728 x 1030 mm.
291         */
292        public static final MediaType JIS_B1 = new MediaType(I_JIS_B1);
293        /**
294         * The MediaType instance for JIS B2, 515 x 728 mm.
295         */
296        public static final MediaType JIS_B2 = new MediaType(I_JIS_B2);
297        /**
298         * The MediaType instance for JIS B3, 364 x 515 mm.
299         */
300        public static final MediaType JIS_B3 = new MediaType(I_JIS_B3);
301        /**
302         * The MediaType instance for JIS B4, 257 x 364 mm.
303         */
304        public static final MediaType JIS_B4 = new MediaType(I_JIS_B4);
305        /**
306         * The MediaType instance for JIS B5, 182 x 257 mm.
307         */
308        public static final MediaType JIS_B5 = new MediaType(I_JIS_B5);
309        /**
310         * The MediaType instance for JIS B6, 128 x 182 mm.
311         */
312        public static final MediaType JIS_B6 = new MediaType(I_JIS_B6);
313        /**
314         * The MediaType instance for JIS B7, 91 x 128 mm.
315         */
316        public static final MediaType JIS_B7 = new MediaType(I_JIS_B7);
317        /**
318         * The MediaType instance for JIS B8, 64 x 91 mm.
319         */
320        public static final MediaType JIS_B8 = new MediaType(I_JIS_B8);
321        /**
322         * The MediaType instance for JIS B9, 45 x 64 mm.
323         */
324        public static final MediaType JIS_B9 = new MediaType(I_JIS_B9);
325        /**
326         * The MediaType instance for JIS B10, 32 x 45 mm.
327         */
328        public static final MediaType JIS_B10 = new MediaType(I_JIS_B10);
329        /**
330         * The MediaType instance for ISO/DIN C0, 917 x 1297 mm.
331         */
332        public static final MediaType ISO_C0 = new MediaType(I_ISO_C0);
333        /**
334         * The MediaType instance for ISO/DIN C1, 648 x 917 mm.
335         */
336        public static final MediaType ISO_C1 = new MediaType(I_ISO_C1);
337        /**
338         * The MediaType instance for ISO/DIN C2, 458 x 648 mm.
339         */
340        public static final MediaType ISO_C2 = new MediaType(I_ISO_C2);
341        /**
342         * The MediaType instance for ISO/DIN C3, 324 x 458 mm.
343         */
344        public static final MediaType ISO_C3 = new MediaType(I_ISO_C3);
345        /**
346         * The MediaType instance for ISO/DIN C4, 229 x 324 mm.
347         */
348        public static final MediaType ISO_C4 = new MediaType(I_ISO_C4);
349        /**
350         * The MediaType instance for ISO/DIN C5, 162 x 229 mm.
351         */
352        public static final MediaType ISO_C5 = new MediaType(I_ISO_C5);
353        /**
354         * The MediaType instance for ISO/DIN C6, 114 x 162 mm.
355         */
356        public static final MediaType ISO_C6 = new MediaType(I_ISO_C6);
357        /**
358         * The MediaType instance for ISO/DIN C7, 81 x 114 mm.
359         */
360        public static final MediaType ISO_C7 = new MediaType(I_ISO_C7);
361        /**
362         * The MediaType instance for ISO/DIN C8, 57 x 81 mm.
363         */
364        public static final MediaType ISO_C8 = new MediaType(I_ISO_C8);
365        /**
366         * The MediaType instance for ISO/DIN C9, 40 x 57 mm.
367         */
368        public static final MediaType ISO_C9 = new MediaType(I_ISO_C9);
369        /**
370         * The MediaType instance for ISO/DIN C10, 28 x 40 mm.
371         */
372        public static final MediaType ISO_C10 = new MediaType(I_ISO_C10);
373        /**
374         * The MediaType instance for ISO Designated Long, 110 x 220 mm.
375         */
376        public static final MediaType ISO_DESIGNATED_LONG =
377            new MediaType(I_ISO_DESIGNATED_LONG);
378        /**
379         * The MediaType instance for Executive, 7 1/4 x 10 1/2 in.
380         */
381        public static final MediaType EXECUTIVE = new MediaType(I_EXECUTIVE);
382        /**
383         * The MediaType instance for Folio, 8 1/2 x 13 in.
384         */
385        public static final MediaType FOLIO = new MediaType(I_FOLIO);
386        /**
387         * The MediaType instance for Invoice, 5 1/2 x 8 1/2 in.
388         */
389        public static final MediaType INVOICE = new MediaType(I_INVOICE);
390        /**
391         * The MediaType instance for Ledger, 11 x 17 in.
392         */
393        public static final MediaType LEDGER = new MediaType(I_LEDGER);
394        /**
395         * The MediaType instance for North American Letter, 8 1/2 x 11 in.
396         */
397        public static final MediaType NA_LETTER = new MediaType(I_NA_LETTER);
398        /**
399         * The MediaType instance for North American Legal, 8 1/2 x 14 in.
400         */
401        public static final MediaType NA_LEGAL = new MediaType(I_NA_LEGAL);
402        /**
403         * The MediaType instance for Quarto, 215 x 275 mm.
404         */
405        public static final MediaType QUARTO = new MediaType(I_QUARTO);
406        /**
407         * The MediaType instance for Engineering A, 8 1/2 x 11 in.
408         */
409        public static final MediaType A = new MediaType(I_A);
410        /**
411         * The MediaType instance for Engineering B, 11 x 17 in.
412         */
413        public static final MediaType B = new MediaType(I_B);
414        /**
415         * The MediaType instance for Engineering C, 17 x 22 in.
416         */
417        public static final MediaType C = new MediaType(I_C);
418        /**
419         * The MediaType instance for Engineering D, 22 x 34 in.
420         */
421        public static final MediaType D = new MediaType(I_D);
422        /**
423         * The MediaType instance for Engineering E, 34 x 44 in.
424         */
425        public static final MediaType E = new MediaType(I_E);
426        /**
427         * The MediaType instance for North American 10 x 15 in.
428         */
429        public static final MediaType NA_10X15_ENVELOPE =
430            new MediaType(I_NA_10X15_ENVELOPE);
431        /**
432         * The MediaType instance for North American 10 x 14 in.
433         */
434        public static final MediaType NA_10X14_ENVELOPE =
435            new MediaType(I_NA_10X14_ENVELOPE);
436        /**
437         * The MediaType instance for North American 10 x 13 in.
438         */
439        public static final MediaType NA_10X13_ENVELOPE =
440            new MediaType(I_NA_10X13_ENVELOPE);
441        /**
442         * The MediaType instance for North American 9 x 12 in.
443         */
444        public static final MediaType NA_9X12_ENVELOPE =
445            new MediaType(I_NA_9X12_ENVELOPE);
446        /**
447         * The MediaType instance for North American 9 x 11 in.
448         */
449        public static final MediaType NA_9X11_ENVELOPE =
450            new MediaType(I_NA_9X11_ENVELOPE);
451        /**
452         * The MediaType instance for North American 7 x 9 in.
453         */
454        public static final MediaType NA_7X9_ENVELOPE =
455            new MediaType(I_NA_7X9_ENVELOPE);
456        /**
457         * The MediaType instance for North American 6 x 9 in.
458         */
459        public static final MediaType NA_6X9_ENVELOPE =
460            new MediaType(I_NA_6X9_ENVELOPE);
461        /**
462         * The MediaType instance for North American #9 Business Envelope,
463         * 3 7/8 x 8 7/8 in.
464         */
465        public static final MediaType NA_NUMBER_9_ENVELOPE =
466            new MediaType(I_NA_NUMBER_9_ENVELOPE);
467        /**
468         * The MediaType instance for North American #10 Business Envelope,
469         * 4 1/8 x 9 1/2 in.
470         */
471        public static final MediaType NA_NUMBER_10_ENVELOPE =
472            new MediaType(I_NA_NUMBER_10_ENVELOPE);
473        /**
474         * The MediaType instance for North American #11 Business Envelope,
475         * 4 1/2 x 10 3/8 in.
476         */
477        public static final MediaType NA_NUMBER_11_ENVELOPE =
478            new MediaType(I_NA_NUMBER_11_ENVELOPE);
479        /**
480         * The MediaType instance for North American #12 Business Envelope,
481         * 4 3/4 x 11 in.
482         */
483        public static final MediaType NA_NUMBER_12_ENVELOPE =
484            new MediaType(I_NA_NUMBER_12_ENVELOPE);
485        /**
486         * The MediaType instance for North American #14 Business Envelope,
487         * 5 x 11 1/2 in.
488         */
489        public static final MediaType NA_NUMBER_14_ENVELOPE =
490            new MediaType(I_NA_NUMBER_14_ENVELOPE);
491        /**
492         * The MediaType instance for Invitation Envelope, 220 x 220 mm.
493         */
494        public static final MediaType INVITE_ENVELOPE =
495            new MediaType(I_INVITE_ENVELOPE);
496        /**
497         * The MediaType instance for Italy Envelope, 110 x 230 mm.
498         */
499        public static final MediaType ITALY_ENVELOPE =
500            new MediaType(I_ITALY_ENVELOPE);
501        /**
502         * The MediaType instance for Monarch Envelope, 3 7/8 x 7 1/2 in.
503         */
504        public static final MediaType MONARCH_ENVELOPE =
505            new MediaType(I_MONARCH_ENVELOPE);
506        /**
507         * The MediaType instance for 6 3/4 envelope, 3 5/8 x 6 1/2 in.
508         */
509        public static final MediaType PERSONAL_ENVELOPE =
510            new MediaType(I_PERSONAL_ENVELOPE);
511        /**
512         * An alias for ISO_A0.
513         */
514        public static final MediaType A0 = ISO_A0;
515        /**
516         * An alias for ISO_A1.
517         */
518        public static final MediaType A1 = ISO_A1;
519        /**
520         * An alias for ISO_A2.
521         */
522        public static final MediaType A2 = ISO_A2;
523        /**
524         * An alias for ISO_A3.
525         */
526        public static final MediaType A3 = ISO_A3;
527        /**
528         * An alias for ISO_A4.
529         */
530        public static final MediaType A4 = ISO_A4;
531        /**
532         * An alias for ISO_A5.
533         */
534        public static final MediaType A5 = ISO_A5;
535        /**
536         * An alias for ISO_A6.
537         */
538        public static final MediaType A6 = ISO_A6;
539        /**
540         * An alias for ISO_A7.
541         */
542        public static final MediaType A7 = ISO_A7;
543        /**
544         * An alias for ISO_A8.
545         */
546        public static final MediaType A8 = ISO_A8;
547        /**
548         * An alias for ISO_A9.
549         */
550        public static final MediaType A9 = ISO_A9;
551        /**
552         * An alias for ISO_A10.
553         */
554        public static final MediaType A10 = ISO_A10;
555        /**
556         * An alias for ISO_B0.
557         */
558        public static final MediaType B0 = ISO_B0;
559        /**
560         * An alias for ISO_B1.
561         */
562        public static final MediaType B1 = ISO_B1;
563        /**
564         * An alias for ISO_B2.
565         */
566        public static final MediaType B2 = ISO_B2;
567        /**
568         * An alias for ISO_B3.
569         */
570        public static final MediaType B3 = ISO_B3;
571        /**
572         * An alias for ISO_B4.
573         */
574        public static final MediaType B4 = ISO_B4;
575        /**
576         * An alias for ISO_B4.
577         */
578        public static final MediaType ISO_B4_ENVELOPE = ISO_B4;
579        /**
580         * An alias for ISO_B5.
581         */
582        public static final MediaType B5 = ISO_B5;
583        /**
584         * An alias for ISO_B5.
585         */
586        public static final MediaType ISO_B5_ENVELOPE = ISO_B5;
587        /**
588         * An alias for ISO_B6.
589         */
590        public static final MediaType B6 = ISO_B6;
591        /**
592         * An alias for ISO_B7.
593         */
594        public static final MediaType B7 = ISO_B7;
595        /**
596         * An alias for ISO_B8.
597         */
598        public static final MediaType B8 = ISO_B8;
599        /**
600         * An alias for ISO_B9.
601         */
602        public static final MediaType B9 = ISO_B9;
603        /**
604         * An alias for ISO_B10.
605         */
606        public static final MediaType B10 = ISO_B10;
607        /**
608         * An alias for ISO_C0.
609         */
610        public static final MediaType C0 = ISO_C0;
611        /**
612         * An alias for ISO_C0.
613         */
614        public static final MediaType ISO_C0_ENVELOPE = ISO_C0;
615        /**
616         * An alias for ISO_C1.
617         */
618        public static final MediaType C1 = ISO_C1;
619        /**
620         * An alias for ISO_C1.
621         */
622        public static final MediaType ISO_C1_ENVELOPE = ISO_C1;
623        /**
624         * An alias for ISO_C2.
625         */
626        public static final MediaType C2 = ISO_C2;
627        /**
628         * An alias for ISO_C2.
629         */
630        public static final MediaType ISO_C2_ENVELOPE = ISO_C2;
631        /**
632         * An alias for ISO_C3.
633         */
634        public static final MediaType C3 = ISO_C3;
635        /**
636         * An alias for ISO_C3.
637         */
638        public static final MediaType ISO_C3_ENVELOPE = ISO_C3;
639        /**
640         * An alias for ISO_C4.
641         */
642        public static final MediaType C4 = ISO_C4;
643        /**
644         * An alias for ISO_C4.
645         */
646        public static final MediaType ISO_C4_ENVELOPE = ISO_C4;
647        /**
648         * An alias for ISO_C5.
649         */
650        public static final MediaType C5 = ISO_C5;
651        /**
652         * An alias for ISO_C5.
653         */
654        public static final MediaType ISO_C5_ENVELOPE = ISO_C5;
655        /**
656         * An alias for ISO_C6.
657         */
658        public static final MediaType C6 = ISO_C6;
659        /**
660         * An alias for ISO_C6.
661         */
662        public static final MediaType ISO_C6_ENVELOPE = ISO_C6;
663        /**
664         * An alias for ISO_C7.
665         */
666        public static final MediaType C7 = ISO_C7;
667        /**
668         * An alias for ISO_C7.
669         */
670        public static final MediaType ISO_C7_ENVELOPE = ISO_C7;
671        /**
672         * An alias for ISO_C8.
673         */
674        public static final MediaType C8 = ISO_C8;
675        /**
676         * An alias for ISO_C8.
677         */
678        public static final MediaType ISO_C8_ENVELOPE = ISO_C8;
679        /**
680         * An alias for ISO_C9.
681         */
682        public static final MediaType C9 = ISO_C9;
683        /**
684         * An alias for ISO_C9.
685         */
686        public static final MediaType ISO_C9_ENVELOPE = ISO_C9;
687        /**
688         * An alias for ISO_C10.
689         */
690        public static final MediaType C10 = ISO_C10;
691        /**
692         * An alias for ISO_C10.
693         */
694        public static final MediaType ISO_C10_ENVELOPE = ISO_C10;
695        /**
696         * An alias for ISO_DESIGNATED_LONG.
697         */
698        public static final MediaType ISO_DESIGNATED_LONG_ENVELOPE =
699                ISO_DESIGNATED_LONG;
700        /**
701         * An alias for INVOICE.
702         */
703        public static final MediaType STATEMENT = INVOICE;
704        /**
705         * An alias for LEDGER.
706         */
707        public static final MediaType TABLOID = LEDGER;
708        /**
709         * An alias for NA_LETTER.
710         */
711        public static final MediaType LETTER = NA_LETTER;
712        /**
713         * An alias for NA_LETTER.
714         */
715        public static final MediaType NOTE = NA_LETTER;
716        /**
717         * An alias for NA_LEGAL.
718         */
719        public static final MediaType LEGAL = NA_LEGAL;
720        /**
721         * An alias for NA_10X15_ENVELOPE.
722         */
723        public static final MediaType ENV_10X15 = NA_10X15_ENVELOPE;
724        /**
725         * An alias for NA_10X14_ENVELOPE.
726         */
727        public static final MediaType ENV_10X14 = NA_10X14_ENVELOPE;
728        /**
729         * An alias for NA_10X13_ENVELOPE.
730         */
731        public static final MediaType ENV_10X13 = NA_10X13_ENVELOPE;
732        /**
733         * An alias for NA_9X12_ENVELOPE.
734         */
735        public static final MediaType ENV_9X12 = NA_9X12_ENVELOPE;
736        /**
737         * An alias for NA_9X11_ENVELOPE.
738         */
739        public static final MediaType ENV_9X11 = NA_9X11_ENVELOPE;
740        /**
741         * An alias for NA_7X9_ENVELOPE.
742         */
743        public static final MediaType ENV_7X9 = NA_7X9_ENVELOPE;
744        /**
745         * An alias for NA_6X9_ENVELOPE.
746         */
747        public static final MediaType ENV_6X9 = NA_6X9_ENVELOPE;
748        /**
749         * An alias for NA_NUMBER_9_ENVELOPE.
750         */
751        public static final MediaType ENV_9 = NA_NUMBER_9_ENVELOPE;
752        /**
753         * An alias for NA_NUMBER_10_ENVELOPE.
754         */
755        public static final MediaType ENV_10 = NA_NUMBER_10_ENVELOPE;
756        /**
757         * An alias for NA_NUMBER_11_ENVELOPE.
758         */
759        public static final MediaType ENV_11 = NA_NUMBER_11_ENVELOPE;
760        /**
761         * An alias for NA_NUMBER_12_ENVELOPE.
762         */
763        public static final MediaType ENV_12 = NA_NUMBER_12_ENVELOPE;
764        /**
765         * An alias for NA_NUMBER_14_ENVELOPE.
766         */
767        public static final MediaType ENV_14 = NA_NUMBER_14_ENVELOPE;
768        /**
769         * An alias for INVITE_ENVELOPE.
770         */
771        public static final MediaType ENV_INVITE = INVITE_ENVELOPE;
772        /**
773         * An alias for ITALY_ENVELOPE.
774         */
775        public static final MediaType ENV_ITALY = ITALY_ENVELOPE;
776        /**
777         * An alias for MONARCH_ENVELOPE.
778         */
779        public static final MediaType ENV_MONARCH = MONARCH_ENVELOPE;
780        /**
781         * An alias for PERSONAL_ENVELOPE.
782         */
783        public static final MediaType ENV_PERSONAL = PERSONAL_ENVELOPE;
784        /**
785         * An alias for INVITE_ENVELOPE.
786         */
787        public static final MediaType INVITE = INVITE_ENVELOPE;
788        /**
789         * An alias for ITALY_ENVELOPE.
790         */
791        public static final MediaType ITALY = ITALY_ENVELOPE;
792        /**
793         * An alias for MONARCH_ENVELOPE.
794         */
795        public static final MediaType MONARCH = MONARCH_ENVELOPE;
796        /**
797         * An alias for PERSONAL_ENVELOPE.
798         */
799        public static final MediaType PERSONAL = PERSONAL_ENVELOPE;
800
801        private MediaType(int type) {
802            super(type, NAMES);
803        }
804    }
805
806    /**
807     * A type-safe enumeration of possible orientations. These orientations
808     * are in partial compliance with IPP 1.1.
809     * @since 1.3
810     */
811    public static final class OrientationRequestedType extends AttributeValue {
812        private static final int I_PORTRAIT = 0;
813        private static final int I_LANDSCAPE = 1;
814
815        private static final String NAMES[] = {
816            "portrait", "landscape"
817        };
818
819        /**
820         * The OrientationRequestedType instance to use for specifying a
821         * portrait orientation.
822         */
823        public static final OrientationRequestedType PORTRAIT =
824            new OrientationRequestedType(I_PORTRAIT);
825        /**
826         * The OrientationRequestedType instance to use for specifying a
827         * landscape orientation.
828         */
829        public static final OrientationRequestedType LANDSCAPE =
830            new OrientationRequestedType(I_LANDSCAPE);
831
832        private OrientationRequestedType(int type) {
833            super(type, NAMES);
834        }
835    }
836
837    /**
838     * A type-safe enumeration of possible origins.
839     * @since 1.3
840     */
841    public static final class OriginType extends AttributeValue {
842        private static final int I_PHYSICAL = 0;
843        private static final int I_PRINTABLE = 1;
844
845        private static final String NAMES[] = {
846            "physical", "printable"
847        };
848
849        /**
850         * The OriginType instance to use for specifying a physical origin.
851         */
852        public static final OriginType PHYSICAL = new OriginType(I_PHYSICAL);
853        /**
854         * The OriginType instance to use for specifying a printable origin.
855         */
856        public static final OriginType PRINTABLE = new OriginType(I_PRINTABLE);
857
858        private OriginType(int type) {
859            super(type, NAMES);
860        }
861    }
862
863    /**
864     * A type-safe enumeration of possible print qualities. These print
865     * qualities are in compliance with IPP 1.1.
866     * @since 1.3
867     */
868    public static final class PrintQualityType extends AttributeValue {
869        private static final int I_HIGH = 0;
870        private static final int I_NORMAL = 1;
871        private static final int I_DRAFT = 2;
872
873        private static final String NAMES[] = {
874            "high", "normal", "draft"
875        };
876
877        /**
878         * The PrintQualityType instance to use for specifying a high print
879         * quality.
880         */
881        public static final PrintQualityType HIGH =
882            new PrintQualityType(I_HIGH);
883        /**
884         * The PrintQualityType instance to use for specifying a normal print
885         * quality.
886         */
887        public static final PrintQualityType NORMAL =
888            new PrintQualityType(I_NORMAL);
889        /**
890         * The PrintQualityType instance to use for specifying a draft print
891         * quality.
892         */
893        public static final PrintQualityType DRAFT =
894            new PrintQualityType(I_DRAFT);
895
896        private PrintQualityType(int type) {
897            super(type, NAMES);
898        }
899    }
900
901    private ColorType color;
902    private MediaType media;
903    private OrientationRequestedType orientationRequested;
904    private OriginType origin;
905    private PrintQualityType printQuality;
906    private int[] printerResolution;
907
908    /**
909     * Constructs a PageAttributes instance with default values for every
910     * attribute.
911     */
912    public PageAttributes() {
913        setColor(ColorType.MONOCHROME);
914        setMediaToDefault();
915        setOrientationRequestedToDefault();
916        setOrigin(OriginType.PHYSICAL);
917        setPrintQualityToDefault();
918        setPrinterResolutionToDefault();
919    }
920
921    /**
922     * Constructs a PageAttributes instance which is a copy of the supplied
923     * PageAttributes.
924     *
925     * @param   obj the PageAttributes to copy.
926     */
927    public PageAttributes(PageAttributes obj) {
928        set(obj);
929    }
930
931    /**
932     * Constructs a PageAttributes instance with the specified values for
933     * every attribute.
934     *
935     * @param   color ColorType.COLOR or ColorType.MONOCHROME.
936     * @param   media one of the constant fields of the MediaType class.
937     * @param   orientationRequested OrientationRequestedType.PORTRAIT or
938     *          OrientationRequestedType.LANDSCAPE.
939     * @param   origin OriginType.PHYSICAL or OriginType.PRINTABLE
940     * @param   printQuality PrintQualityType.DRAFT, PrintQualityType.NORMAL,
941     *          or PrintQualityType.HIGH
942     * @param   printerResolution an integer array of 3 elements. The first
943     *          element must be greater than 0. The second element must be
944     *          must be greater than 0. The third element must be either
945     *          {@code 3} or {@code 4}.
946     * @throws  IllegalArgumentException if one or more of the above
947     *          conditions is violated.
948     */
949    public PageAttributes(ColorType color, MediaType media,
950                          OrientationRequestedType orientationRequested,
951                          OriginType origin, PrintQualityType printQuality,
952                          int[] printerResolution) {
953        setColor(color);
954        setMedia(media);
955        setOrientationRequested(orientationRequested);
956        setOrigin(origin);
957        setPrintQuality(printQuality);
958        setPrinterResolution(printerResolution);
959    }
960
961    /**
962     * Creates and returns a copy of this PageAttributes.
963     *
964     * @return  the newly created copy. It is safe to cast this Object into
965     *          a PageAttributes.
966     */
967    public Object clone() {
968        try {
969            return super.clone();
970        } catch (CloneNotSupportedException e) {
971            // Since we implement Cloneable, this should never happen
972            throw new InternalError(e);
973        }
974    }
975
976    /**
977     * Sets all of the attributes of this PageAttributes to the same values as
978     * the attributes of obj.
979     *
980     * @param   obj the PageAttributes to copy.
981     */
982    public void set(PageAttributes obj) {
983        color = obj.color;
984        media = obj.media;
985        orientationRequested = obj.orientationRequested;
986        origin = obj.origin;
987        printQuality = obj.printQuality;
988        // okay because we never modify the contents of printerResolution
989        printerResolution = obj.printerResolution;
990    }
991
992    /**
993     * Returns whether pages using these attributes will be rendered in
994     * color or monochrome. This attribute is updated to the value chosen
995     * by the user.
996     *
997     * @return  ColorType.COLOR or ColorType.MONOCHROME.
998     */
999    public ColorType getColor() {
1000        return color;
1001    }
1002
1003    /**
1004     * Specifies whether pages using these attributes will be rendered in
1005     * color or monochrome. Not specifying this attribute is equivalent to
1006     * specifying ColorType.MONOCHROME.
1007     *
1008     * @param   color ColorType.COLOR or ColorType.MONOCHROME.
1009     * @throws  IllegalArgumentException if color is null.
1010     */
1011    public void setColor(ColorType color) {
1012        if (color == null) {
1013            throw new IllegalArgumentException("Invalid value for attribute "+
1014                                               "color");
1015        }
1016        this.color = color;
1017    }
1018
1019    /**
1020     * Returns the paper size for pages using these attributes. This
1021     * attribute is updated to the value chosen by the user.
1022     *
1023     * @return  one of the constant fields of the MediaType class.
1024     */
1025    public MediaType getMedia() {
1026        return media;
1027    }
1028
1029    /**
1030     * Specifies the desired paper size for pages using these attributes. The
1031     * actual paper size will be determined by the limitations of the target
1032     * printer. If an exact match cannot be found, an implementation will
1033     * choose the closest possible match. Not specifying this attribute is
1034     * equivalent to specifying the default size for the default locale. The
1035     * default size for locales in the United States and Canada is
1036     * MediaType.NA_LETTER. The default size for all other locales is
1037     * MediaType.ISO_A4.
1038     *
1039     * @param   media one of the constant fields of the MediaType class.
1040     * @throws  IllegalArgumentException if media is null.
1041     */
1042    public void setMedia(MediaType media) {
1043        if (media == null) {
1044            throw new IllegalArgumentException("Invalid value for attribute "+
1045                                               "media");
1046        }
1047        this.media = media;
1048    }
1049
1050    /**
1051     * Sets the paper size for pages using these attributes to the default
1052     * size for the default locale. The default size for locales in the
1053     * United States and Canada is MediaType.NA_LETTER. The default size for
1054     * all other locales is MediaType.ISO_A4.
1055     */
1056    public void setMediaToDefault(){
1057        String defaultCountry = Locale.getDefault().getCountry();
1058        if (defaultCountry != null &&
1059            (defaultCountry.equals(Locale.US.getCountry()) ||
1060             defaultCountry.equals(Locale.CANADA.getCountry()))) {
1061            setMedia(MediaType.NA_LETTER);
1062        } else {
1063            setMedia(MediaType.ISO_A4);
1064        }
1065    }
1066
1067    /**
1068     * Returns the print orientation for pages using these attributes. This
1069     * attribute is updated to the value chosen by the user.
1070     *
1071     * @return  OrientationRequestedType.PORTRAIT or
1072     *          OrientationRequestedType.LANDSCAPE.
1073     */
1074    public OrientationRequestedType getOrientationRequested() {
1075        return orientationRequested;
1076    }
1077
1078    /**
1079     * Specifies the print orientation for pages using these attributes. Not
1080     * specifying the property is equivalent to specifying
1081     * OrientationRequestedType.PORTRAIT.
1082     *
1083     * @param   orientationRequested OrientationRequestedType.PORTRAIT or
1084     *          OrientationRequestedType.LANDSCAPE.
1085     * @throws  IllegalArgumentException if orientationRequested is null.
1086     */
1087    public void setOrientationRequested(OrientationRequestedType
1088                                        orientationRequested) {
1089        if (orientationRequested == null) {
1090            throw new IllegalArgumentException("Invalid value for attribute "+
1091                                               "orientationRequested");
1092        }
1093        this.orientationRequested = orientationRequested;
1094    }
1095
1096    /**
1097     * Specifies the print orientation for pages using these attributes.
1098     * Specifying {@code 3} denotes portrait. Specifying {@code 4}
1099     * denotes landscape. Specifying any other value will generate an
1100     * IllegalArgumentException. Not specifying the property is equivalent
1101     * to calling setOrientationRequested(OrientationRequestedType.PORTRAIT).
1102     *
1103     * @param   orientationRequested {@code 3} or {@code 4}
1104     * @throws  IllegalArgumentException if orientationRequested is not
1105     *          {@code 3} or {@code 4}
1106     */
1107    public void setOrientationRequested(int orientationRequested) {
1108        switch (orientationRequested) {
1109          case 3:
1110            setOrientationRequested(OrientationRequestedType.PORTRAIT);
1111            break;
1112          case 4:
1113            setOrientationRequested(OrientationRequestedType.LANDSCAPE);
1114            break;
1115          default:
1116            // This will throw an IllegalArgumentException
1117            setOrientationRequested(null);
1118            break;
1119        }
1120    }
1121
1122    /**
1123     * Sets the print orientation for pages using these attributes to the
1124     * default. The default orientation is portrait.
1125     */
1126    public void setOrientationRequestedToDefault() {
1127        setOrientationRequested(OrientationRequestedType.PORTRAIT);
1128    }
1129
1130    /**
1131     * Returns whether drawing at (0, 0) to pages using these attributes
1132     * draws at the upper-left corner of the physical page, or at the
1133     * upper-left corner of the printable area. (Note that these locations
1134     * could be equivalent.) This attribute cannot be modified by,
1135     * and is not subject to any limitations of, the implementation or the
1136     * target printer.
1137     *
1138     * @return  OriginType.PHYSICAL or OriginType.PRINTABLE
1139     */
1140    public OriginType getOrigin() {
1141        return origin;
1142    }
1143
1144    /**
1145     * Specifies whether drawing at (0, 0) to pages using these attributes
1146     * draws at the upper-left corner of the physical page, or at the
1147     * upper-left corner of the printable area. (Note that these locations
1148     * could be equivalent.) Not specifying the property is equivalent to
1149     * specifying OriginType.PHYSICAL.
1150     *
1151     * @param   origin OriginType.PHYSICAL or OriginType.PRINTABLE
1152     * @throws  IllegalArgumentException if origin is null.
1153     */
1154    public void setOrigin(OriginType origin) {
1155        if (origin == null) {
1156            throw new IllegalArgumentException("Invalid value for attribute "+
1157                                               "origin");
1158        }
1159        this.origin = origin;
1160    }
1161
1162    /**
1163     * Returns the print quality for pages using these attributes. This
1164     * attribute is updated to the value chosen by the user.
1165     *
1166     * @return  PrintQualityType.DRAFT, PrintQualityType.NORMAL, or
1167     *          PrintQualityType.HIGH
1168     */
1169    public PrintQualityType getPrintQuality() {
1170        return printQuality;
1171    }
1172
1173    /**
1174     * Specifies the print quality for pages using these attributes. Not
1175     * specifying the property is equivalent to specifying
1176     * PrintQualityType.NORMAL.
1177     *
1178     * @param   printQuality PrintQualityType.DRAFT, PrintQualityType.NORMAL,
1179     *          or PrintQualityType.HIGH
1180     * @throws  IllegalArgumentException if printQuality is null.
1181     */
1182    public void setPrintQuality(PrintQualityType printQuality) {
1183        if (printQuality == null) {
1184            throw new IllegalArgumentException("Invalid value for attribute "+
1185                                               "printQuality");
1186        }
1187        this.printQuality = printQuality;
1188    }
1189
1190    /**
1191     * Specifies the print quality for pages using these attributes.
1192     * Specifying {@code 3} denotes draft. Specifying {@code 4}
1193     * denotes normal. Specifying {@code 5} denotes high. Specifying
1194     * any other value will generate an IllegalArgumentException. Not
1195     * specifying the property is equivalent to calling
1196     * setPrintQuality(PrintQualityType.NORMAL).
1197     *
1198     * @param   printQuality {@code 3}, {@code 4}, or {@code 5}
1199     * @throws  IllegalArgumentException if printQuality is not
1200     *          {@code 3}, {@code 4}, or {@code 5}
1201     */
1202    public void setPrintQuality(int printQuality) {
1203        switch (printQuality) {
1204          case 3:
1205            setPrintQuality(PrintQualityType.DRAFT);
1206            break;
1207          case 4:
1208            setPrintQuality(PrintQualityType.NORMAL);
1209            break;
1210          case 5:
1211            setPrintQuality(PrintQualityType.HIGH);
1212            break;
1213          default:
1214            // This will throw an IllegalArgumentException
1215            setPrintQuality(null);
1216            break;
1217        }
1218    }
1219
1220    /**
1221     * Sets the print quality for pages using these attributes to the default.
1222     * The default print quality is normal.
1223     */
1224    public void setPrintQualityToDefault() {
1225        setPrintQuality(PrintQualityType.NORMAL);
1226    }
1227
1228    /**
1229     * Returns the print resolution for pages using these attributes.
1230     * Index 0 of the array specifies the cross feed direction resolution
1231     * (typically the horizontal resolution). Index 1 of the array specifies
1232     * the feed direction resolution (typically the vertical resolution).
1233     * Index 2 of the array specifies whether the resolutions are in dots per
1234     * inch or dots per centimeter. {@code 3} denotes dots per inch.
1235     * {@code 4} denotes dots per centimeter.
1236     *
1237     * @return  an integer array of 3 elements. The first
1238     *          element must be greater than 0. The second element must be
1239     *          must be greater than 0. The third element must be either
1240     *          {@code 3} or {@code 4}.
1241     */
1242    public int[] getPrinterResolution() {
1243        // Return a copy because otherwise client code could circumvent the
1244        // the checks made in setPrinterResolution by modifying the
1245        // returned array.
1246        int[] copy = new int[3];
1247        copy[0] = printerResolution[0];
1248        copy[1] = printerResolution[1];
1249        copy[2] = printerResolution[2];
1250        return copy;
1251    }
1252
1253    /**
1254     * Specifies the desired print resolution for pages using these attributes.
1255     * The actual resolution will be determined by the limitations of the
1256     * implementation and the target printer. Index 0 of the array specifies
1257     * the cross feed direction resolution (typically the horizontal
1258     * resolution). Index 1 of the array specifies the feed direction
1259     * resolution (typically the vertical resolution). Index 2 of the array
1260     * specifies whether the resolutions are in dots per inch or dots per
1261     * centimeter. {@code 3} denotes dots per inch. {@code 4}
1262     * denotes dots per centimeter. Note that the 1.1 printing implementation
1263     * (Toolkit.getPrintJob) requires that the feed and cross feed resolutions
1264     * be the same. Not specifying the property is equivalent to calling
1265     * setPrinterResolution(72).
1266     *
1267     * @param   printerResolution an integer array of 3 elements. The first
1268     *          element must be greater than 0. The second element must be
1269     *          must be greater than 0. The third element must be either
1270     *          {@code 3} or {@code 4}.
1271     * @throws  IllegalArgumentException if one or more of the above
1272     *          conditions is violated.
1273     */
1274    public void setPrinterResolution(int[] printerResolution) {
1275        if (printerResolution == null ||
1276            printerResolution.length != 3 ||
1277            printerResolution[0] <= 0 ||
1278            printerResolution[1] <= 0 ||
1279            (printerResolution[2] != 3 && printerResolution[2] != 4)) {
1280            throw new IllegalArgumentException("Invalid value for attribute "+
1281                                               "printerResolution");
1282        }
1283        // Store a copy because otherwise client code could circumvent the
1284        // the checks made above by holding a reference to the array and
1285        // modifying it after calling setPrinterResolution.
1286        int[] copy = new int[3];
1287        copy[0] = printerResolution[0];
1288        copy[1] = printerResolution[1];
1289        copy[2] = printerResolution[2];
1290        this.printerResolution = copy;
1291    }
1292
1293    /**
1294     * Specifies the desired cross feed and feed print resolutions in dots per
1295     * inch for pages using these attributes. The same value is used for both
1296     * resolutions. The actual resolutions will be determined by the
1297     * limitations of the implementation and the target printer. Not
1298     * specifying the property is equivalent to specifying {@code 72}.
1299     *
1300     * @param   printerResolution an integer greater than 0.
1301     * @throws  IllegalArgumentException if printerResolution is less than or
1302     *          equal to 0.
1303     */
1304    public void setPrinterResolution(int printerResolution) {
1305        setPrinterResolution(new int[] { printerResolution, printerResolution,
1306                                         3 } );
1307    }
1308
1309    /**
1310     * Sets the printer resolution for pages using these attributes to the
1311     * default. The default is 72 dpi for both the feed and cross feed
1312     * resolutions.
1313     */
1314    public void setPrinterResolutionToDefault() {
1315        setPrinterResolution(72);
1316    }
1317
1318    /**
1319     * Determines whether two PageAttributes are equal to each other.
1320     * <p>
1321     * Two PageAttributes are equal if and only if each of their attributes are
1322     * equal. Attributes of enumeration type are equal if and only if the
1323     * fields refer to the same unique enumeration object. This means that
1324     * an aliased media is equal to its underlying unique media. Printer
1325     * resolutions are equal if and only if the feed resolution, cross feed
1326     * resolution, and units are equal.
1327     *
1328     * @param   obj the object whose equality will be checked.
1329     * @return  whether obj is equal to this PageAttribute according to the
1330     *          above criteria.
1331     */
1332    public boolean equals(Object obj) {
1333        if (!(obj instanceof PageAttributes)) {
1334            return false;
1335        }
1336
1337        PageAttributes rhs = (PageAttributes)obj;
1338
1339        return (color == rhs.color &&
1340                media == rhs.media &&
1341                orientationRequested == rhs.orientationRequested &&
1342                origin == rhs.origin &&
1343                printQuality == rhs.printQuality &&
1344                printerResolution[0] == rhs.printerResolution[0] &&
1345                printerResolution[1] == rhs.printerResolution[1] &&
1346                printerResolution[2] == rhs.printerResolution[2]);
1347    }
1348
1349    /**
1350     * Returns a hash code value for this PageAttributes.
1351     *
1352     * @return  the hash code.
1353     */
1354    public int hashCode() {
1355        return (color.hashCode() << 31 ^
1356                media.hashCode() << 24 ^
1357                orientationRequested.hashCode() << 23 ^
1358                origin.hashCode() << 22 ^
1359                printQuality.hashCode() << 20 ^
1360                printerResolution[2] >> 2 << 19 ^
1361                printerResolution[1] << 10 ^
1362                printerResolution[0]);
1363    }
1364
1365    /**
1366     * Returns a string representation of this PageAttributes.
1367     *
1368     * @return  the string representation.
1369     */
1370    public String toString() {
1371        // int[] printerResolution = getPrinterResolution();
1372        return "color=" + getColor() + ",media=" + getMedia() +
1373            ",orientation-requested=" + getOrientationRequested() +
1374            ",origin=" + getOrigin() + ",print-quality=" + getPrintQuality() +
1375            ",printer-resolution=[" + printerResolution[0] + "," +
1376            printerResolution[1] + "," + printerResolution[2] + "]";
1377    }
1378}
1379