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 import gnu.java.lang.CPStringBuilder; 42 43 /** 44 * Needs documentation... 45 * 46 * @author Eric Blake (ebb9@email.byu.edu) 47 * @since 1.3 48 * @status updated to 1.4, lacks documentation 49 */ 50 public final class JobAttributes implements Cloneable 51 { 52 public static final class DefaultSelectionType extends AttributeValue 53 { 54 private static final String[] NAMES = { "all", "range", "selection" }; 55 public static final DefaultSelectionType ALL 56 = new DefaultSelectionType(0); 57 public static final DefaultSelectionType RANGE 58 = new DefaultSelectionType(1); 59 public static final DefaultSelectionType SELECTION 60 = new DefaultSelectionType(2); DefaultSelectionType(int value)61 private DefaultSelectionType(int value) 62 { 63 super(value, NAMES); 64 } 65 } // class DefaultSelectionType 66 67 public static final class DestinationType extends AttributeValue 68 { 69 private static final String[] NAMES = { "file", "printer" }; 70 public static final DestinationType FILE = new DestinationType(0); 71 public static final DestinationType PRINTER = new DestinationType(1); DestinationType(int value)72 private DestinationType(int value) 73 { 74 super(value, NAMES); 75 } 76 } // class DestinationType 77 78 public static final class DialogType extends AttributeValue 79 { 80 private static final String[] NAMES = { "common", "native", "none" }; 81 public static final DialogType COMMON = new DialogType(0); 82 public static final DialogType NATIVE = new DialogType(1); 83 public static final DialogType NONE = new DialogType(2); DialogType(int value)84 private DialogType(int value) 85 { 86 super(value, NAMES); 87 } 88 } // class DialogType 89 90 public static final class MultipleDocumentHandlingType 91 extends AttributeValue 92 { 93 private static final String[] NAMES = { 94 "separate-documents-collated-copies", 95 "separate-documents-uncollated-copies" 96 }; 97 public static final MultipleDocumentHandlingType 98 SEPARATE_DOCUMENTS_COLLATED_COPIES 99 = new MultipleDocumentHandlingType(0); 100 public static final MultipleDocumentHandlingType 101 SEPARATE_DOCUMENTS_UNCOLLATED_COPIES 102 = new MultipleDocumentHandlingType(1); MultipleDocumentHandlingType(int value)103 private MultipleDocumentHandlingType(int value) 104 { 105 super(value, NAMES); 106 } 107 } // class MultipleDocumentHandlingType 108 109 public static final class SidesType extends AttributeValue 110 { 111 private static final String[] NAMES 112 = { "one-sided", "two-sided-long-edge", "two-sided-short-edge" }; 113 public static final SidesType ONE_SIDED = new SidesType(0); 114 public static final SidesType TWO_SIDED_LONG_EDGE = new SidesType(1); 115 public static final SidesType TWO_SIDED_SHORT_EDGE = new SidesType(2); SidesType(int value)116 private SidesType(int value) 117 { 118 super(value, NAMES); 119 } 120 } // class SidesType 121 122 private int copies; 123 private DefaultSelectionType selection; 124 private DestinationType destination; 125 private DialogType dialog; 126 private String filename; 127 private int maxPage; 128 private int minPage; 129 private MultipleDocumentHandlingType multiple; 130 private int[][] pageRanges; // null for default value 131 private int fromPage; // 0 for default value 132 private int toPage; // 0 for default value 133 private String printer; 134 private SidesType sides; 135 JobAttributes()136 public JobAttributes() 137 { 138 copies = 1; 139 selection = DefaultSelectionType.ALL; 140 destination = DestinationType.PRINTER; 141 dialog = DialogType.NATIVE; 142 maxPage = Integer.MAX_VALUE; 143 minPage = 1; 144 multiple 145 = MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES; 146 sides = SidesType.ONE_SIDED; 147 } 148 JobAttributes(JobAttributes attr)149 public JobAttributes(JobAttributes attr) 150 { 151 set(attr); 152 } 153 JobAttributes(int copies, DefaultSelectionType selection, DestinationType destination, DialogType dialog, String filename, int max, int min, MultipleDocumentHandlingType multiple, int[][] pageRanges, String printer, SidesType sides)154 public JobAttributes(int copies, DefaultSelectionType selection, 155 DestinationType destination, DialogType dialog, 156 String filename, int max, int min, 157 MultipleDocumentHandlingType multiple, 158 int[][] pageRanges, String printer, SidesType sides) 159 { 160 if (copies <= 0 || selection == null || destination == null 161 || dialog == null || max < min || min <= 0 || multiple == null 162 || sides == null) 163 throw new IllegalArgumentException(); 164 this.copies = copies; 165 this.selection = selection; 166 this.destination = destination; 167 this.dialog = dialog; 168 this.filename = filename; 169 maxPage = max; 170 minPage = min; 171 this.multiple = multiple; 172 setPageRanges(pageRanges); 173 this.printer = printer; 174 this.sides = sides; 175 } 176 clone()177 public Object clone() 178 { 179 return new JobAttributes(this); 180 } 181 set(JobAttributes attr)182 public void set(JobAttributes attr) 183 { 184 copies = attr.copies; 185 selection = attr.selection; 186 destination = attr.destination; 187 dialog = attr.dialog; 188 filename = attr.filename; 189 maxPage = attr.maxPage; 190 minPage = attr.minPage; 191 multiple = attr.multiple; 192 pageRanges = (int[][]) attr.pageRanges.clone(); 193 printer = attr.printer; 194 sides = attr.sides; 195 fromPage = attr.fromPage; 196 toPage = attr.toPage; 197 } 198 getCopies()199 public int getCopies() 200 { 201 return copies; 202 } 203 setCopies(int copies)204 public void setCopies(int copies) 205 { 206 if (copies <= 0) 207 throw new IllegalArgumentException(); 208 this.copies = copies; 209 } 210 setCopiesToDefault()211 public void setCopiesToDefault() 212 { 213 copies = 1; 214 } 215 getDefaultSelection()216 public DefaultSelectionType getDefaultSelection() 217 { 218 return selection; 219 } 220 setDefaultSelection(DefaultSelectionType selection)221 public void setDefaultSelection(DefaultSelectionType selection) 222 { 223 if (selection == null) 224 throw new IllegalArgumentException(); 225 this.selection = selection; 226 } 227 getDestination()228 public DestinationType getDestination() 229 { 230 return destination; 231 } 232 setDestination(DestinationType destination)233 public void setDestination(DestinationType destination) 234 { 235 if (destination == null) 236 throw new IllegalArgumentException(); 237 this.destination = destination; 238 } 239 getDialog()240 public DialogType getDialog() 241 { 242 return dialog; 243 } 244 setDialog(DialogType dialog)245 public void setDialog(DialogType dialog) 246 { 247 if (dialog == null) 248 throw new IllegalArgumentException(); 249 this.dialog = dialog; 250 } 251 getFileName()252 public String getFileName() 253 { 254 return filename; 255 } 256 setFileName(String filename)257 public void setFileName(String filename) 258 { 259 this.filename = filename; 260 } 261 getFromPage()262 public int getFromPage() 263 { 264 return fromPage != 0 ? fromPage 265 : pageRanges != null ? pageRanges[0][0] 266 : toPage != 0 ? toPage : minPage; 267 } 268 setFromPage(int fromPage)269 public void setFromPage(int fromPage) 270 { 271 if (fromPage < minPage || (fromPage > toPage && toPage != 0) 272 || fromPage > maxPage) 273 throw new IllegalArgumentException(); 274 if (pageRanges == null) 275 this.fromPage = fromPage; 276 } 277 getMaxPage()278 public int getMaxPage() 279 { 280 return maxPage; 281 } 282 setMaxPage(int maxPage)283 public void setMaxPage(int maxPage) 284 { 285 if (maxPage < minPage) 286 throw new IllegalArgumentException(); 287 this.maxPage = maxPage; 288 if (maxPage < fromPage) 289 fromPage = maxPage; 290 if (maxPage < toPage) 291 toPage = maxPage; 292 if (pageRanges != null) 293 { 294 int i = pageRanges.length - 1; 295 while (i >= 0 && maxPage < pageRanges[i][1]) 296 i--; 297 if (maxPage >= pageRanges[++i][0]) 298 pageRanges[i++][1] = maxPage; 299 if (i == 0) 300 pageRanges = null; 301 else if (i < pageRanges.length) 302 { 303 int[][] tmp = new int[i][]; 304 System.arraycopy(pageRanges, 0, tmp, 0, i); 305 pageRanges = tmp; 306 } 307 } 308 } 309 getMinPage()310 public int getMinPage() 311 { 312 return minPage; 313 } 314 setMinPage(int minPage)315 public void setMinPage(int minPage) 316 { 317 if (minPage <= 0 || minPage > maxPage) 318 throw new IllegalArgumentException(); 319 this.minPage = minPage; 320 if (minPage > toPage) 321 toPage = minPage; 322 if (minPage > fromPage) 323 fromPage = minPage; 324 if (pageRanges != null) 325 { 326 int size = pageRanges.length; 327 int i = 0; 328 while (i < size && minPage > pageRanges[i][0]) 329 i++; 330 if (minPage <= pageRanges[i - 1][1]) 331 pageRanges[--i][0] = minPage; 332 if (i == size) 333 pageRanges = null; 334 else if (i > 0) 335 { 336 int[][] tmp = new int[size - i][]; 337 System.arraycopy(pageRanges, i, tmp, 0, size - i); 338 pageRanges = tmp; 339 } 340 } 341 } 342 getMultipleDocumentHandling()343 public MultipleDocumentHandlingType getMultipleDocumentHandling() 344 { 345 return multiple; 346 } 347 setMultipleDocumentHandling(MultipleDocumentHandlingType multiple)348 public void setMultipleDocumentHandling 349 (MultipleDocumentHandlingType multiple) 350 { 351 if (multiple == null) 352 throw new IllegalArgumentException(); 353 this.multiple = multiple; 354 } 355 setMultipleDocumentHandlingToDefault()356 public void setMultipleDocumentHandlingToDefault() 357 { 358 multiple 359 = MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES; 360 } 361 getPageRanges()362 public int[][] getPageRanges() 363 { 364 if (pageRanges == null) 365 return new int[][] { { getFromPage(), getToPage() } }; 366 // Perform a deep clone, so user code cannot affect original arrays. 367 int i = pageRanges.length; 368 int[][] result = new int[i][]; 369 while (--i >= 0) 370 result[i] = (int[]) pageRanges[i].clone(); 371 return result; 372 } 373 setPageRanges(int[][] pageRanges)374 public void setPageRanges(int[][] pageRanges) 375 { 376 int size = pageRanges == null ? 0 : pageRanges.length; 377 if (size == 0) 378 throw new IllegalArgumentException(); 379 while (--size >= 0) 380 { 381 int[] range = pageRanges[size]; 382 if (range == null || range.length != 2 383 || range[0] < minPage || range[1] < range[0] || range[1] > maxPage 384 || (size != 0 && range[0] <= pageRanges[size - 1][1])) 385 throw new IllegalArgumentException(); 386 } 387 size = pageRanges.length; 388 if (fromPage > 0 && pageRanges[0][0] > fromPage) 389 fromPage = pageRanges[0][0]; 390 if (toPage > 0 && pageRanges[size - 1][1] < toPage) 391 toPage = pageRanges[size - 1][1]; 392 this.pageRanges = new int[size][]; 393 while (--size >= 0) 394 this.pageRanges[size] = (int[]) pageRanges[size].clone(); 395 } 396 getPrinter()397 public String getPrinter() 398 { 399 return printer; 400 } 401 setPrinter(String printer)402 public void setPrinter(String printer) 403 { 404 this.printer = printer; 405 } 406 getSides()407 public SidesType getSides() 408 { 409 return sides; 410 } 411 setSides(SidesType sides)412 public void setSides(SidesType sides) 413 { 414 if (sides == null) 415 throw new IllegalArgumentException(); 416 this.sides = sides; 417 } 418 setSidesToDefault()419 public void setSidesToDefault() 420 { 421 sides = SidesType.ONE_SIDED; 422 } 423 getToPage()424 public int getToPage() 425 { 426 return toPage != 0 ? toPage 427 : pageRanges != null ? pageRanges[pageRanges.length - 1][1] 428 : fromPage != 0 ? fromPage : maxPage; 429 } 430 setToPage(int toPage)431 public void setToPage(int toPage) 432 { 433 if (toPage < minPage || (fromPage > toPage && fromPage != 0) 434 || toPage > maxPage) 435 throw new IllegalArgumentException(); 436 if (pageRanges == null) 437 this.toPage = toPage; 438 } 439 equals(Object o)440 public boolean equals(Object o) 441 { 442 if (this == o) 443 return true; 444 if (! (o instanceof JobAttributes)) 445 return false; 446 JobAttributes ja = (JobAttributes) o; 447 if (copies != ja.copies || selection != ja.selection 448 || destination != ja.destination || dialog != ja.dialog 449 || ! filename.equals(ja.filename) || maxPage != ja.maxPage 450 || minPage != ja.minPage || multiple != ja.multiple 451 || fromPage != ja.fromPage || toPage != ja.toPage 452 || ! printer.equals(ja.printer) || sides != ja.sides 453 || (pageRanges == null) != (ja.pageRanges == null)) 454 return false; 455 if (pageRanges != ja.pageRanges) 456 for (int i = pageRanges.length; --i >= 0; ) 457 if (pageRanges[i][0] != ja.pageRanges[i][0] 458 || pageRanges[i][1] != ja.pageRanges[i][1]) 459 return false; 460 return true; 461 } 462 hashCode()463 public int hashCode() 464 { 465 int hash = (selection.value << 6) ^ (destination.value << 5) 466 ^ (dialog.value << 3) ^ (multiple.value << 2) ^ sides.value 467 ^ (filename == null ? 0 : filename.hashCode()) 468 ^ (printer == null ? 0 : printer.hashCode()); 469 // The effect of the above fields on the hashcode match the JDK. However, 470 // I am unable to reverse engineer the effect of the fields listed below, 471 // so I am using my own implementation. Note that this still satisfies 472 // the general contract of hashcode, it just doesn't match the JDK. 473 hash ^= (copies << 27) ^ (maxPage << 22) ^ (minPage << 17); 474 if (pageRanges == null) 475 hash ^= (getFromPage() << 13) ^ (getToPage() << 8); 476 else 477 for (int i = pageRanges.length; --i >= 0; ) 478 hash ^= (pageRanges[i][0] << 13) ^ (pageRanges[i][1] << 8); 479 return hash; 480 } 481 toString()482 public String toString() 483 { 484 CPStringBuilder s = new CPStringBuilder("copies=").append(copies) 485 .append(",defaultSelection=").append(selection).append(",destination=") 486 .append(destination).append(",dialog=").append(dialog) 487 .append(",fileName=").append(filename).append(",fromPage=") 488 .append(getFromPage()).append(",maxPage=").append(maxPage) 489 .append(",minPage=").append(minPage) 490 .append(",multiple-document-handling=").append(multiple) 491 .append(",page-ranges=["); 492 if (pageRanges == null) 493 s.append(minPage).append(':').append(minPage).append(']'); 494 else 495 for (int i = 0; i < pageRanges.length; i++) 496 s.append(pageRanges[i][0]).append(':').append(pageRanges[i][1]) 497 .append(','); 498 s.setLength(s.length() - 1); 499 return s.append("],printer=").append(printer).append(",sides=") 500 .append(sides).append(",toPage=").append(getToPage()).toString(); 501 } 502 } // class JobAttributes 503