OSDN Git Service

libjava/
[pf3gnuchains/gcc-fork.git] / libjava / classpath / java / awt / JobAttributes.java
1 /* JobAttributes.java -- 
2    Copyright (C) 2002, 2005  Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37
38
39 package java.awt;
40
41 /**
42  * Needs documentation...
43  *
44  * @author Eric Blake (ebb9@email.byu.edu)
45  * @since 1.3
46  * @status updated to 1.4, lacks documentation
47  */
48 public final class JobAttributes implements Cloneable
49 {
50   public static final class DefaultSelectionType extends AttributeValue
51   {
52     private static final String[] NAMES = { "all", "range", "selection" };
53     public static final DefaultSelectionType ALL
54       = new DefaultSelectionType(0);
55     public static final DefaultSelectionType RANGE
56       = new DefaultSelectionType(1);
57     public static final DefaultSelectionType SELECTION
58       = new DefaultSelectionType(2);
59     private DefaultSelectionType(int value)
60     {
61       super(value, NAMES);
62     }
63   } // class DefaultSelectionType
64
65   public static final class DestinationType extends AttributeValue
66   {
67     private static final String[] NAMES = { "file", "printer" };
68     public static final DestinationType FILE = new DestinationType(0);
69     public static final DestinationType PRINTER = new DestinationType(1);
70     private DestinationType(int value)
71     {
72       super(value, NAMES);
73     }
74   } // class DestinationType
75
76   public static final class DialogType extends AttributeValue
77   {
78     private static final String[] NAMES = { "common", "native", "none" };
79     public static final DialogType COMMON = new DialogType(0);
80     public static final DialogType NATIVE = new DialogType(1);
81     public static final DialogType NONE = new DialogType(2);
82     private DialogType(int value)
83     {
84       super(value, NAMES);
85     }
86   } // class DialogType
87
88   public static final class MultipleDocumentHandlingType
89     extends AttributeValue
90   {
91     private static final String[] NAMES = {
92       "separate-documents-collated-copies",
93       "separate-documents-uncollated-copies"
94     };
95     public static final MultipleDocumentHandlingType
96       SEPARATE_DOCUMENTS_COLLATED_COPIES
97       = new MultipleDocumentHandlingType(0);
98     public static final MultipleDocumentHandlingType
99       SEPARATE_DOCUMENTS_UNCOLLATED_COPIES
100       = new MultipleDocumentHandlingType(1);
101     private MultipleDocumentHandlingType(int value)
102     {
103       super(value, NAMES);
104     }
105   } // class MultipleDocumentHandlingType
106
107   public static final class SidesType extends AttributeValue
108   {
109     private static final String[] NAMES
110       = { "one-sided", "two-sided-long-edge", "two-sided-short-edge" };
111     public static final SidesType ONE_SIDED = new SidesType(0);
112     public static final SidesType TWO_SIDED_LONG_EDGE = new SidesType(1);
113     public static final SidesType TWO_SIDED_SHORT_EDGE = new SidesType(2);
114     private SidesType(int value)
115     {
116       super(value, NAMES);
117     }
118   } // class SidesType
119
120   private int copies;
121   private DefaultSelectionType selection;
122   private DestinationType destination;
123   private DialogType dialog;
124   private String filename;
125   private int maxPage;
126   private int minPage;
127   private MultipleDocumentHandlingType multiple;
128   private int[][] pageRanges; // null for default value
129   private int fromPage; // 0 for default value
130   private int toPage; // 0 for default value
131   private String printer;
132   private SidesType sides;
133
134   public JobAttributes()
135   {
136     copies = 1;
137     selection = DefaultSelectionType.ALL;
138     destination = DestinationType.PRINTER;
139     dialog = DialogType.NATIVE;
140     maxPage = Integer.MAX_VALUE;
141     minPage = 1;
142     multiple
143       = MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES;
144     sides = SidesType.ONE_SIDED;
145   }
146
147   public JobAttributes(JobAttributes attr)
148   {
149     set(attr);
150   }
151
152   public JobAttributes(int copies, DefaultSelectionType selection,
153                        DestinationType destination, DialogType dialog,
154                        String filename, int max, int min,
155                        MultipleDocumentHandlingType multiple,
156                        int[][] pageRanges, String printer, SidesType sides)
157   {
158     if (copies <= 0 || selection == null || destination == null
159         || dialog == null || max < min || min <= 0 || multiple == null
160         || sides == null)
161       throw new IllegalArgumentException();
162     this.copies = copies;
163     this.selection = selection;
164     this.destination = destination;
165     this.dialog = dialog;
166     this.filename = filename;
167     maxPage = max;
168     minPage = min;
169     this.multiple = multiple;
170     setPageRanges(pageRanges);
171     this.printer = printer;
172     this.sides = sides;
173   }
174
175   public Object clone()
176   {
177     return new JobAttributes(this);
178   }
179
180   public void set(JobAttributes attr)
181   {
182     copies = attr.copies;
183     selection = attr.selection;
184     destination = attr.destination;
185     dialog = attr.dialog;
186     filename = attr.filename;
187     maxPage = attr.maxPage;
188     minPage = attr.minPage;
189     multiple = attr.multiple;
190     pageRanges = (int[][]) attr.pageRanges.clone();
191     printer = attr.printer;
192     sides = attr.sides;
193     fromPage = attr.fromPage;
194     toPage = attr.toPage;
195   }
196
197   public int getCopies()
198   {
199     return copies;
200   }
201
202   public void setCopies(int copies)
203   {
204     if (copies <= 0)
205       throw new IllegalArgumentException();
206     this.copies = copies;
207   }
208
209   public void setCopiesToDefault()
210   {
211     copies = 1;
212   }
213
214   public DefaultSelectionType getDefaultSelection()
215   {
216     return selection;
217   }
218
219   public void setDefaultSelection(DefaultSelectionType selection)
220   {
221     if (selection == null)
222       throw new IllegalArgumentException();
223     this.selection = selection;
224   }
225
226   public DestinationType getDestination()
227   {
228     return destination;
229   }
230
231   public void setDestination(DestinationType destination)
232   {
233     if (destination == null)
234       throw new IllegalArgumentException();
235     this.destination = destination;
236   }
237
238   public DialogType getDialog()
239   {
240     return dialog;
241   }
242
243   public void setDialog(DialogType dialog)
244   {
245     if (dialog == null)
246       throw new IllegalArgumentException();
247     this.dialog = dialog;
248   }
249
250   public String getFileName()
251   {
252     return filename;
253   }
254
255   public void setFileName(String filename)
256   {
257     this.filename = filename;
258   }
259
260   public int getFromPage()
261   {
262     return fromPage != 0 ? fromPage
263       : pageRanges != null ? pageRanges[0][0]
264       : toPage != 0 ? toPage : minPage;
265   }
266
267   public void setFromPage(int fromPage)
268   {
269     if (fromPage < minPage || (fromPage > toPage && toPage != 0)
270         || fromPage > maxPage)
271       throw new IllegalArgumentException();
272     if (pageRanges == null)
273       this.fromPage = fromPage;
274   }
275
276   public int getMaxPage()
277   {
278     return maxPage;
279   }
280
281   public void setMaxPage(int maxPage)
282   {
283     if (maxPage < minPage)
284       throw new IllegalArgumentException();
285     this.maxPage = maxPage;
286     if (maxPage < fromPage)
287       fromPage = maxPage;
288     if (maxPage < toPage)
289       toPage = maxPage;
290     if (pageRanges != null)
291       {
292         int i = pageRanges.length - 1;
293         while (i >= 0 && maxPage < pageRanges[i][1])
294           i--;
295         if (maxPage >= pageRanges[++i][0])
296           pageRanges[i++][1] = maxPage;
297         if (i == 0)
298           pageRanges = null;
299         else if (i < pageRanges.length)
300           {
301             int[][] tmp = new int[i][];
302             System.arraycopy(pageRanges, 0, tmp, 0, i);
303             pageRanges = tmp;
304           }
305       }
306   }
307
308   public int getMinPage()
309   {
310     return minPage;
311   }
312
313   public void setMinPage(int minPage)
314   {
315     if (minPage <= 0 || minPage > maxPage)
316       throw new IllegalArgumentException();
317     this.minPage = minPage;
318     if (minPage > toPage)
319       toPage = minPage;
320     if (minPage > fromPage)
321       fromPage = minPage;
322     if (pageRanges != null)
323       {
324         int size = pageRanges.length;
325         int i = 0;
326         while (i < size && minPage > pageRanges[i][0])
327           i++;
328         if (minPage <= pageRanges[i - 1][1])
329           pageRanges[--i][0] = minPage;
330         if (i == size)
331           pageRanges = null;
332         else if (i > 0)
333           {
334             int[][] tmp = new int[size - i][];
335             System.arraycopy(pageRanges, i, tmp, 0, size - i);
336             pageRanges = tmp;
337           }
338       }
339   }
340
341   public MultipleDocumentHandlingType getMultipleDocumentHandling()
342   {
343     return multiple;
344   }
345
346   public void setMultipleDocumentHandling
347     (MultipleDocumentHandlingType multiple)
348   {
349     if (multiple == null)
350       throw new IllegalArgumentException();
351     this.multiple = multiple;
352   }
353
354   public void setMultipleDocumentHandlingToDefault()
355   {
356     multiple
357       = MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES;
358   }
359
360   public int[][] getPageRanges()
361   {
362     if (pageRanges == null)
363       return new int[][] { { getFromPage(), getToPage() } };
364     // Perform a deep clone, so user code cannot affect original arrays.
365     int i = pageRanges.length;
366     int[][] result = new int[i][];
367     while (--i >= 0)
368       result[i] = (int[]) pageRanges[i].clone();
369     return result;
370   }
371
372   public void setPageRanges(int[][] pageRanges)
373   {
374     int size = pageRanges == null ? 0 : pageRanges.length;
375     if (size == 0)
376       throw new IllegalArgumentException();
377     while (--size >= 0)
378       {
379         int[] range = pageRanges[size];
380         if (range == null || range.length != 2
381             || range[0] < minPage || range[1] < range[0] || range[1] > maxPage
382             || (size != 0 && range[0] <= pageRanges[size - 1][1]))
383           throw new IllegalArgumentException();
384       }
385     size = pageRanges.length;
386     if (fromPage > 0 && pageRanges[0][0] > fromPage)
387       fromPage = pageRanges[0][0];
388     if (toPage > 0 && pageRanges[size - 1][1] < toPage)
389       toPage = pageRanges[size - 1][1];
390     this.pageRanges = new int[size][];
391     while (--size >= 0)
392       this.pageRanges[size] = (int[]) pageRanges[size].clone();
393   }
394
395   public String getPrinter()
396   {
397     return printer;
398   }
399
400   public void setPrinter(String printer)
401   {
402     this.printer = printer;
403   }
404
405   public SidesType getSides()
406   {
407     return sides;
408   }
409
410   public void setSides(SidesType sides)
411   {
412     if (sides == null)
413       throw new IllegalArgumentException();
414     this.sides = sides;
415   }
416
417   public void setSidesToDefault()
418   {
419     sides = SidesType.ONE_SIDED;
420   }
421
422   public int getToPage()
423   {
424     return toPage != 0 ? toPage
425       : pageRanges != null ? pageRanges[pageRanges.length - 1][1]
426       : fromPage != 0 ? fromPage : maxPage;
427   }
428
429   public void setToPage(int toPage)
430   {
431     if (toPage < minPage || (fromPage > toPage && fromPage != 0)
432         || toPage > maxPage)
433       throw new IllegalArgumentException();
434     if (pageRanges == null)
435       this.toPage = toPage;
436   }
437
438   public boolean equals(Object o)
439   {
440     if (this == o)
441       return true;
442     if (! (o instanceof JobAttributes))
443       return false;
444     JobAttributes ja = (JobAttributes) o;
445     if (copies != ja.copies || selection != ja.selection
446         || destination != ja.destination || dialog != ja.dialog
447         || ! filename.equals(ja.filename) || maxPage != ja.maxPage
448         || minPage != ja.minPage || multiple != ja.multiple
449         || fromPage != ja.fromPage || toPage != ja.toPage
450         || ! printer.equals(ja.printer) || sides != ja.sides
451         || (pageRanges == null) != (ja.pageRanges == null))
452       return false;
453     if (pageRanges != ja.pageRanges)
454       for (int i = pageRanges.length; --i >= 0; )
455         if (pageRanges[i][0] != ja.pageRanges[i][0]
456             || pageRanges[i][1] != ja.pageRanges[i][1])
457           return false;
458     return true;
459   }
460
461   public int hashCode()
462   {
463     int hash = (selection.value << 6) ^ (destination.value << 5)
464       ^ (dialog.value << 3) ^ (multiple.value << 2) ^ sides.value
465       ^ (filename == null ? 0 : filename.hashCode())
466       ^ (printer == null ? 0 : printer.hashCode());
467     // The effect of the above fields on the hashcode match the JDK. However,
468     // I am unable to reverse engineer the effect of the fields listed below,
469     // so I am using my own implementation. Note that this still satisfies
470     // the general contract of hashcode, it just doesn't match the JDK.
471     hash ^= (copies << 27) ^ (maxPage << 22) ^ (minPage << 17);
472     if (pageRanges == null)
473       hash ^= (getFromPage() << 13) ^ (getToPage() << 8);
474     else
475       for (int i = pageRanges.length; --i >= 0; )
476         hash ^= (pageRanges[i][0] << 13) ^ (pageRanges[i][1] << 8);
477     return hash;
478   }
479
480   public String toString()
481   {
482     StringBuffer s = new StringBuffer("copies=").append(copies)
483       .append(",defaultSelection=").append(selection).append(",destination=")
484       .append(destination).append(",dialog=").append(dialog)
485       .append(",fileName=").append(filename).append(",fromPage=")
486       .append(getFromPage()).append(",maxPage=").append(maxPage)
487       .append(",minPage=").append(minPage)
488       .append(",multiple-document-handling=").append(multiple)
489       .append(",page-ranges=[");
490     if (pageRanges == null)
491       s.append(minPage).append(':').append(minPage).append(']');
492     else
493       for (int i = 0; i < pageRanges.length; i++)
494         s.append(pageRanges[i][0]).append(':').append(pageRanges[i][1])
495           .append(',');
496     s.setLength(s.length() - 1);
497     return s.append("],printer=").append(printer).append(",sides=")
498       .append(sides).append(",toPage=").append(getToPage()).toString();
499   }
500 } // class JobAttributes