| /* |
| * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package java.awt; |
| |
| /** |
| * A set of attributes which control a print job. |
| * <p> |
| * Instances of this class control the number of copies, default selection, |
| * destination, print dialog, file and printer names, page ranges, multiple |
| * document handling (including collation), and multi-page imposition (such |
| * as duplex) of every print job which uses the instance. Attribute names are |
| * compliant with the Internet Printing Protocol (IPP) 1.1 where possible. |
| * Attribute values are partially compliant where possible. |
| * <p> |
| * To use a method which takes an inner class type, pass a reference to |
| * one of the constant fields of the inner class. Client code cannot create |
| * new instances of the inner class types because none of those classes |
| * has a public constructor. For example, to set the print dialog type to |
| * the cross-platform, pure Java print dialog, use the following code: |
| * <pre> |
| * import java.awt.JobAttributes; |
| * |
| * public class PureJavaPrintDialogExample { |
| * public void setPureJavaPrintDialog(JobAttributes jobAttributes) { |
| * jobAttributes.setDialog(JobAttributes.DialogType.COMMON); |
| * } |
| * } |
| * </pre> |
| * <p> |
| * Every IPP attribute which supports an <i>attributeName</i>-default value |
| * has a corresponding <code>set<i>attributeName</i>ToDefault</code> method. |
| * Default value fields are not provided. |
| * |
| * @author David Mendenhall |
| * @since 1.3 |
| */ |
| public final class JobAttributes implements Cloneable { |
| /** |
| * A type-safe enumeration of possible default selection states. |
| * @since 1.3 |
| */ |
| public static final class DefaultSelectionType extends AttributeValue { |
| private static final int I_ALL = 0; |
| private static final int I_RANGE = 1; |
| private static final int I_SELECTION = 2; |
| |
| private static final String NAMES[] = { |
| "all", "range", "selection" |
| }; |
| |
| /** |
| * The <code>DefaultSelectionType</code> instance to use for |
| * specifying that all pages of the job should be printed. |
| */ |
| public static final DefaultSelectionType ALL = |
| new DefaultSelectionType(I_ALL); |
| /** |
| * The <code>DefaultSelectionType</code> instance to use for |
| * specifying that a range of pages of the job should be printed. |
| */ |
| public static final DefaultSelectionType RANGE = |
| new DefaultSelectionType(I_RANGE); |
| /** |
| * The <code>DefaultSelectionType</code> instance to use for |
| * specifying that the current selection should be printed. |
| */ |
| public static final DefaultSelectionType SELECTION = |
| new DefaultSelectionType(I_SELECTION); |
| |
| private DefaultSelectionType(int type) { |
| super(type, NAMES); |
| } |
| } |
| |
| /** |
| * A type-safe enumeration of possible job destinations. |
| * @since 1.3 |
| */ |
| public static final class DestinationType extends AttributeValue { |
| private static final int I_FILE = 0; |
| private static final int I_PRINTER = 1; |
| |
| private static final String NAMES[] = { |
| "file", "printer" |
| }; |
| |
| /** |
| * The <code>DestinationType</code> instance to use for |
| * specifying print to file. |
| */ |
| public static final DestinationType FILE = |
| new DestinationType(I_FILE); |
| /** |
| * The <code>DestinationType</code> instance to use for |
| * specifying print to printer. |
| */ |
| public static final DestinationType PRINTER = |
| new DestinationType(I_PRINTER); |
| |
| private DestinationType(int type) { |
| super(type, NAMES); |
| } |
| } |
| |
| /** |
| * A type-safe enumeration of possible dialogs to display to the user. |
| * @since 1.3 |
| */ |
| public static final class DialogType extends AttributeValue { |
| private static final int I_COMMON = 0; |
| private static final int I_NATIVE = 1; |
| private static final int I_NONE = 2; |
| |
| private static final String NAMES[] = { |
| "common", "native", "none" |
| }; |
| |
| /** |
| * The <code>DialogType</code> instance to use for |
| * specifying the cross-platform, pure Java print dialog. |
| */ |
| public static final DialogType COMMON = new DialogType(I_COMMON); |
| /** |
| * The <code>DialogType</code> instance to use for |
| * specifying the platform's native print dialog. |
| */ |
| public static final DialogType NATIVE = new DialogType(I_NATIVE); |
| /** |
| * The <code>DialogType</code> instance to use for |
| * specifying no print dialog. |
| */ |
| public static final DialogType NONE = new DialogType(I_NONE); |
| |
| private DialogType(int type) { |
| super(type, NAMES); |
| } |
| } |
| |
| /** |
| * A type-safe enumeration of possible multiple copy handling states. |
| * It is used to control how the sheets of multiple copies of a single |
| * document are collated. |
| * @since 1.3 |
| */ |
| public static final class MultipleDocumentHandlingType extends |
| AttributeValue { |
| private static final int I_SEPARATE_DOCUMENTS_COLLATED_COPIES = 0; |
| private static final int I_SEPARATE_DOCUMENTS_UNCOLLATED_COPIES = 1; |
| |
| private static final String NAMES[] = { |
| "separate-documents-collated-copies", |
| "separate-documents-uncollated-copies" |
| }; |
| |
| /** |
| * The <code>MultipleDocumentHandlingType</code> instance to use for specifying |
| * that the job should be divided into separate, collated copies. |
| */ |
| public static final MultipleDocumentHandlingType |
| SEPARATE_DOCUMENTS_COLLATED_COPIES = |
| new MultipleDocumentHandlingType( |
| I_SEPARATE_DOCUMENTS_COLLATED_COPIES); |
| /** |
| * The <code>MultipleDocumentHandlingType</code> instance to use for specifying |
| * that the job should be divided into separate, uncollated copies. |
| */ |
| public static final MultipleDocumentHandlingType |
| SEPARATE_DOCUMENTS_UNCOLLATED_COPIES = |
| new MultipleDocumentHandlingType( |
| I_SEPARATE_DOCUMENTS_UNCOLLATED_COPIES); |
| |
| private MultipleDocumentHandlingType(int type) { |
| super(type, NAMES); |
| } |
| } |
| |
| /** |
| * A type-safe enumeration of possible multi-page impositions. These |
| * impositions are in compliance with IPP 1.1. |
| * @since 1.3 |
| */ |
| public static final class SidesType extends AttributeValue { |
| private static final int I_ONE_SIDED = 0; |
| private static final int I_TWO_SIDED_LONG_EDGE = 1; |
| private static final int I_TWO_SIDED_SHORT_EDGE = 2; |
| |
| private static final String NAMES[] = { |
| "one-sided", "two-sided-long-edge", "two-sided-short-edge" |
| }; |
| |
| /** |
| * The <code>SidesType</code> instance to use for specifying that |
| * consecutive job pages should be printed upon the same side of |
| * consecutive media sheets. |
| */ |
| public static final SidesType ONE_SIDED = new SidesType(I_ONE_SIDED); |
| /** |
| * The <code>SidesType</code> instance to use for specifying that |
| * consecutive job pages should be printed upon front and back sides |
| * of consecutive media sheets, such that the orientation of each pair |
| * of pages on the medium would be correct for the reader as if for |
| * binding on the long edge. |
| */ |
| public static final SidesType TWO_SIDED_LONG_EDGE = |
| new SidesType(I_TWO_SIDED_LONG_EDGE); |
| /** |
| * The <code>SidesType</code> instance to use for specifying that |
| * consecutive job pages should be printed upon front and back sides |
| * of consecutive media sheets, such that the orientation of each pair |
| * of pages on the medium would be correct for the reader as if for |
| * binding on the short edge. |
| */ |
| public static final SidesType TWO_SIDED_SHORT_EDGE = |
| new SidesType(I_TWO_SIDED_SHORT_EDGE); |
| |
| private SidesType(int type) { |
| super(type, NAMES); |
| } |
| } |
| |
| private int copies; |
| private DefaultSelectionType defaultSelection; |
| private DestinationType destination; |
| private DialogType dialog; |
| private String fileName; |
| private int fromPage; |
| private int maxPage; |
| private int minPage; |
| private MultipleDocumentHandlingType multipleDocumentHandling; |
| private int[][] pageRanges; |
| private int prFirst; |
| private int prLast; |
| private String printer; |
| private SidesType sides; |
| private int toPage; |
| |
| /** |
| * Constructs a <code>JobAttributes</code> instance with default |
| * values for every attribute. The dialog defaults to |
| * <code>DialogType.NATIVE</code>. Min page defaults to |
| * <code>1</code>. Max page defaults to <code>Integer.MAX_VALUE</code>. |
| * Destination defaults to <code>DestinationType.PRINTER</code>. |
| * Selection defaults to <code>DefaultSelectionType.ALL</code>. |
| * Number of copies defaults to <code>1</code>. Multiple document handling defaults |
| * to <code>MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES</code>. |
| * Sides defaults to <code>SidesType.ONE_SIDED</code>. File name defaults |
| * to <code>null</code>. |
| */ |
| public JobAttributes() { |
| setCopiesToDefault(); |
| setDefaultSelection(DefaultSelectionType.ALL); |
| setDestination(DestinationType.PRINTER); |
| setDialog(DialogType.NATIVE); |
| setMaxPage(Integer.MAX_VALUE); |
| setMinPage(1); |
| setMultipleDocumentHandlingToDefault(); |
| setSidesToDefault(); |
| } |
| |
| /** |
| * Constructs a <code>JobAttributes</code> instance which is a copy |
| * of the supplied <code>JobAttributes</code>. |
| * |
| * @param obj the <code>JobAttributes</code> to copy |
| */ |
| public JobAttributes(JobAttributes obj) { |
| set(obj); |
| } |
| |
| /** |
| * Constructs a <code>JobAttributes</code> instance with the |
| * specified values for every attribute. |
| * |
| * @param copies an integer greater than 0 |
| * @param defaultSelection <code>DefaultSelectionType.ALL</code>, |
| * <code>DefaultSelectionType.RANGE</code>, or |
| * <code>DefaultSelectionType.SELECTION</code> |
| * @param destination <code>DesintationType.FILE</code> or |
| * <code>DesintationType.PRINTER</code> |
| * @param dialog <code>DialogType.COMMON</code>, |
| * <code>DialogType.NATIVE</code>, or |
| * <code>DialogType.NONE</code> |
| * @param fileName the possibly <code>null</code> file name |
| * @param maxPage an integer greater than zero and greater than or equal |
| * to <i>minPage</i> |
| * @param minPage an integer greater than zero and less than or equal |
| * to <i>maxPage</i> |
| * @param multipleDocumentHandling |
| * <code>MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_COLLATED_COPIES</code> or |
| * <code>MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES</code> |
| * @param pageRanges an array of integer arrays of two elements; an array |
| * is interpreted as a range spanning all pages including and |
| * between the specified pages; ranges must be in ascending |
| * order and must not overlap; specified page numbers cannot be |
| * less than <i>minPage</i> nor greater than <i>maxPage</i>; |
| * for example: |
| * <pre> |
| * (new int[][] { new int[] { 1, 3 }, new int[] { 5, 5 }, |
| * new int[] { 15, 19 } }), |
| * </pre> |
| * specifies pages 1, 2, 3, 5, 15, 16, 17, 18, and 19. Note that |
| * (<code>new int[][] { new int[] { 1, 1 }, new int[] { 1, 2 } }</code>), |
| * is an invalid set of page ranges because the two ranges |
| * overlap |
| * @param printer the possibly <code>null</code> printer name |
| * @param sides <code>SidesType.ONE_SIDED</code>, |
| * <code>SidesType.TWO_SIDED_LONG_EDGE</code>, or |
| * <code>SidesType.TWO_SIDED_SHORT_EDGE</code> |
| * @throws IllegalArgumentException if one or more of the above |
| * conditions is violated |
| */ |
| public JobAttributes(int copies, DefaultSelectionType defaultSelection, |
| DestinationType destination, DialogType dialog, |
| String fileName, int maxPage, int minPage, |
| MultipleDocumentHandlingType multipleDocumentHandling, |
| int[][] pageRanges, String printer, SidesType sides) { |
| setCopies(copies); |
| setDefaultSelection(defaultSelection); |
| setDestination(destination); |
| setDialog(dialog); |
| setFileName(fileName); |
| setMaxPage(maxPage); |
| setMinPage(minPage); |
| setMultipleDocumentHandling(multipleDocumentHandling); |
| setPageRanges(pageRanges); |
| setPrinter(printer); |
| setSides(sides); |
| } |
| |
| /** |
| * Creates and returns a copy of this <code>JobAttributes</code>. |
| * |
| * @return the newly created copy; it is safe to cast this Object into |
| * a <code>JobAttributes</code> |
| */ |
| public Object clone() { |
| try { |
| return super.clone(); |
| } catch (CloneNotSupportedException e) { |
| // Since we implement Cloneable, this should never happen |
| throw new InternalError(); |
| } |
| } |
| |
| /** |
| * Sets all of the attributes of this <code>JobAttributes</code> to |
| * the same values as the attributes of obj. |
| * |
| * @param obj the <code>JobAttributes</code> to copy |
| */ |
| public void set(JobAttributes obj) { |
| copies = obj.copies; |
| defaultSelection = obj.defaultSelection; |
| destination = obj.destination; |
| dialog = obj.dialog; |
| fileName = obj.fileName; |
| fromPage = obj.fromPage; |
| maxPage = obj.maxPage; |
| minPage = obj.minPage; |
| multipleDocumentHandling = obj.multipleDocumentHandling; |
| // okay because we never modify the contents of pageRanges |
| pageRanges = obj.pageRanges; |
| prFirst = obj.prFirst; |
| prLast = obj.prLast; |
| printer = obj.printer; |
| sides = obj.sides; |
| toPage = obj.toPage; |
| } |
| |
| /** |
| * Returns the number of copies the application should render for jobs |
| * using these attributes. This attribute is updated to the value chosen |
| * by the user. |
| * |
| * @return an integer greater than 0. |
| */ |
| public int getCopies() { |
| return copies; |
| } |
| |
| /** |
| * Specifies the number of copies the application should render for jobs |
| * using these attributes. Not specifying this attribute is equivalent to |
| * specifying <code>1</code>. |
| * |
| * @param copies an integer greater than 0 |
| * @throws IllegalArgumentException if <code>copies</code> is less than |
| * or equal to 0 |
| */ |
| public void setCopies(int copies) { |
| if (copies <= 0) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "copies"); |
| } |
| this.copies = copies; |
| } |
| |
| /** |
| * Sets the number of copies the application should render for jobs using |
| * these attributes to the default. The default number of copies is 1. |
| */ |
| public void setCopiesToDefault() { |
| setCopies(1); |
| } |
| |
| /** |
| * Specifies whether, for jobs using these attributes, the application |
| * should print all pages, the range specified by the return value of |
| * <code>getPageRanges</code>, or the current selection. This attribute |
| * is updated to the value chosen by the user. |
| * |
| * @return DefaultSelectionType.ALL, DefaultSelectionType.RANGE, or |
| * DefaultSelectionType.SELECTION |
| */ |
| public DefaultSelectionType getDefaultSelection() { |
| return defaultSelection; |
| } |
| |
| /** |
| * Specifies whether, for jobs using these attributes, the application |
| * should print all pages, the range specified by the return value of |
| * <code>getPageRanges</code>, or the current selection. Not specifying |
| * this attribute is equivalent to specifying DefaultSelectionType.ALL. |
| * |
| * @param defaultSelection DefaultSelectionType.ALL, |
| * DefaultSelectionType.RANGE, or DefaultSelectionType.SELECTION. |
| * @throws IllegalArgumentException if defaultSelection is <code>null</code> |
| */ |
| public void setDefaultSelection(DefaultSelectionType defaultSelection) { |
| if (defaultSelection == null) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "defaultSelection"); |
| } |
| this.defaultSelection = defaultSelection; |
| } |
| |
| /** |
| * Specifies whether output will be to a printer or a file for jobs using |
| * these attributes. This attribute is updated to the value chosen by the |
| * user. |
| * |
| * @return DesintationType.FILE or DesintationType.PRINTER |
| */ |
| public DestinationType getDestination() { |
| return destination; |
| } |
| |
| /** |
| * Specifies whether output will be to a printer or a file for jobs using |
| * these attributes. Not specifying this attribute is equivalent to |
| * specifying DesintationType.PRINTER. |
| * |
| * @param destination DesintationType.FILE or DesintationType.PRINTER. |
| * @throws IllegalArgumentException if destination is null. |
| */ |
| public void setDestination(DestinationType destination) { |
| if (destination == null) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "destination"); |
| } |
| this.destination = destination; |
| } |
| |
| /** |
| * Returns whether, for jobs using these attributes, the user should see |
| * a print dialog in which to modify the print settings, and which type of |
| * print dialog should be displayed. DialogType.COMMON denotes a cross- |
| * platform, pure Java print dialog. DialogType.NATIVE denotes the |
| * platform's native print dialog. If a platform does not support a native |
| * print dialog, the pure Java print dialog is displayed instead. |
| * DialogType.NONE specifies no print dialog (i.e., background printing). |
| * This attribute cannot be modified by, and is not subject to any |
| * limitations of, the implementation or the target printer. |
| * |
| * @return <code>DialogType.COMMON</code>, <code>DialogType.NATIVE</code>, or |
| * <code>DialogType.NONE</code> |
| */ |
| public DialogType getDialog() { |
| return dialog; |
| } |
| |
| /** |
| * Specifies whether, for jobs using these attributes, the user should see |
| * a print dialog in which to modify the print settings, and which type of |
| * print dialog should be displayed. DialogType.COMMON denotes a cross- |
| * platform, pure Java print dialog. DialogType.NATIVE denotes the |
| * platform's native print dialog. If a platform does not support a native |
| * print dialog, the pure Java print dialog is displayed instead. |
| * DialogType.NONE specifies no print dialog (i.e., background printing). |
| * Not specifying this attribute is equivalent to specifying |
| * DialogType.NATIVE. |
| * |
| * @param dialog DialogType.COMMON, DialogType.NATIVE, or |
| * DialogType.NONE. |
| * @throws IllegalArgumentException if dialog is null. |
| */ |
| public void setDialog(DialogType dialog) { |
| if (dialog == null) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "dialog"); |
| } |
| this.dialog = dialog; |
| } |
| |
| /** |
| * Specifies the file name for the output file for jobs using these |
| * attributes. This attribute is updated to the value chosen by the user. |
| * |
| * @return the possibly <code>null</code> file name |
| */ |
| public String getFileName() { |
| return fileName; |
| } |
| |
| /** |
| * Specifies the file name for the output file for jobs using these |
| * attributes. Default is platform-dependent and implementation-defined. |
| * |
| * @param fileName the possibly null file name. |
| */ |
| public void setFileName(String fileName) { |
| this.fileName = fileName; |
| } |
| |
| /** |
| * Returns, for jobs using these attributes, the first page to be |
| * printed, if a range of pages is to be printed. This attribute is |
| * updated to the value chosen by the user. An application should ignore |
| * this attribute on output, unless the return value of the <code> |
| * getDefaultSelection</code> method is DefaultSelectionType.RANGE. An |
| * application should honor the return value of <code>getPageRanges</code> |
| * over the return value of this method, if possible. |
| * |
| * @return an integer greater than zero and less than or equal to |
| * <i>toPage</i> and greater than or equal to <i>minPage</i> and |
| * less than or equal to <i>maxPage</i>. |
| */ |
| public int getFromPage() { |
| if (fromPage != 0) { |
| return fromPage; |
| } else if (toPage != 0) { |
| return getMinPage(); |
| } else if (pageRanges != null) { |
| return prFirst; |
| } else { |
| return getMinPage(); |
| } |
| } |
| |
| /** |
| * Specifies, for jobs using these attributes, the first page to be |
| * printed, if a range of pages is to be printed. If this attribute is not |
| * specified, then the values from the pageRanges attribute are used. If |
| * pageRanges and either or both of fromPage and toPage are specified, |
| * pageRanges takes precedence. Specifying none of pageRanges, fromPage, |
| * or toPage is equivalent to calling |
| * setPageRanges(new int[][] { new int[] { <i>minPage</i> } }); |
| * |
| * @param fromPage an integer greater than zero and less than or equal to |
| * <i>toPage</i> and greater than or equal to <i>minPage</i> and |
| * less than or equal to <i>maxPage</i>. |
| * @throws IllegalArgumentException if one or more of the above |
| * conditions is violated. |
| */ |
| public void setFromPage(int fromPage) { |
| if (fromPage <= 0 || |
| (toPage != 0 && fromPage > toPage) || |
| fromPage < minPage || |
| fromPage > maxPage) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "fromPage"); |
| } |
| this.fromPage = fromPage; |
| } |
| |
| /** |
| * Specifies the maximum value the user can specify as the last page to |
| * be printed for jobs using these attributes. This attribute cannot be |
| * modified by, and is not subject to any limitations of, the |
| * implementation or the target printer. |
| * |
| * @return an integer greater than zero and greater than or equal |
| * to <i>minPage</i>. |
| */ |
| public int getMaxPage() { |
| return maxPage; |
| } |
| |
| /** |
| * Specifies the maximum value the user can specify as the last page to |
| * be printed for jobs using these attributes. Not specifying this |
| * attribute is equivalent to specifying <code>Integer.MAX_VALUE</code>. |
| * |
| * @param maxPage an integer greater than zero and greater than or equal |
| * to <i>minPage</i> |
| * @throws IllegalArgumentException if one or more of the above |
| * conditions is violated |
| */ |
| public void setMaxPage(int maxPage) { |
| if (maxPage <= 0 || maxPage < minPage) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "maxPage"); |
| } |
| this.maxPage = maxPage; |
| } |
| |
| /** |
| * Specifies the minimum value the user can specify as the first page to |
| * be printed for jobs using these attributes. This attribute cannot be |
| * modified by, and is not subject to any limitations of, the |
| * implementation or the target printer. |
| * |
| * @return an integer greater than zero and less than or equal |
| * to <i>maxPage</i>. |
| */ |
| public int getMinPage() { |
| return minPage; |
| } |
| |
| /** |
| * Specifies the minimum value the user can specify as the first page to |
| * be printed for jobs using these attributes. Not specifying this |
| * attribute is equivalent to specifying <code>1</code>. |
| * |
| * @param minPage an integer greater than zero and less than or equal |
| * to <i>maxPage</i>. |
| * @throws IllegalArgumentException if one or more of the above |
| * conditions is violated. |
| */ |
| public void setMinPage(int minPage) { |
| if (minPage <= 0 || minPage > maxPage) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "minPage"); |
| } |
| this.minPage = minPage; |
| } |
| |
| /** |
| * Specifies the handling of multiple copies, including collation, for |
| * jobs using these attributes. This attribute is updated to the value |
| * chosen by the user. |
| * |
| * @return |
| * MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_COLLATED_COPIES or |
| * MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES. |
| */ |
| public MultipleDocumentHandlingType getMultipleDocumentHandling() { |
| return multipleDocumentHandling; |
| } |
| |
| /** |
| * Specifies the handling of multiple copies, including collation, for |
| * jobs using these attributes. Not specifying this attribute is equivalent |
| * to specifying |
| * MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES. |
| * |
| * @param multipleDocumentHandling |
| * MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_COLLATED_COPIES or |
| * MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES. |
| * @throws IllegalArgumentException if multipleDocumentHandling is null. |
| */ |
| public void setMultipleDocumentHandling(MultipleDocumentHandlingType |
| multipleDocumentHandling) { |
| if (multipleDocumentHandling == null) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "multipleDocumentHandling"); |
| } |
| this.multipleDocumentHandling = multipleDocumentHandling; |
| } |
| |
| /** |
| * Sets the handling of multiple copies, including collation, for jobs |
| * using these attributes to the default. The default handling is |
| * MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES. |
| */ |
| public void setMultipleDocumentHandlingToDefault() { |
| setMultipleDocumentHandling( |
| MultipleDocumentHandlingType.SEPARATE_DOCUMENTS_UNCOLLATED_COPIES); |
| } |
| |
| /** |
| * Specifies, for jobs using these attributes, the ranges of pages to be |
| * printed, if a range of pages is to be printed. All range numbers are |
| * inclusive. This attribute is updated to the value chosen by the user. |
| * An application should ignore this attribute on output, unless the |
| * return value of the <code>getDefaultSelection</code> method is |
| * DefaultSelectionType.RANGE. |
| * |
| * @return an array of integer arrays of 2 elements. An array |
| * is interpreted as a range spanning all pages including and |
| * between the specified pages. Ranges must be in ascending |
| * order and must not overlap. Specified page numbers cannot be |
| * less than <i>minPage</i> nor greater than <i>maxPage</i>. |
| * For example: |
| * (new int[][] { new int[] { 1, 3 }, new int[] { 5, 5 }, |
| * new int[] { 15, 19 } }), |
| * specifies pages 1, 2, 3, 5, 15, 16, 17, 18, and 19. |
| */ |
| public int[][] getPageRanges() { |
| if (pageRanges != null) { |
| // Return a copy because otherwise client code could circumvent the |
| // the checks made in setPageRanges by modifying the returned |
| // array. |
| int[][] copy = new int[pageRanges.length][2]; |
| for (int i = 0; i < pageRanges.length; i++) { |
| copy[i][0] = pageRanges[i][0]; |
| copy[i][1] = pageRanges[i][1]; |
| } |
| return copy; |
| } else if (fromPage != 0 || toPage != 0) { |
| int fromPage = getFromPage(); |
| int toPage = getToPage(); |
| return new int[][] { new int[] { fromPage, toPage } }; |
| } else { |
| int minPage = getMinPage(); |
| return new int[][] { new int[] { minPage, minPage } }; |
| } |
| } |
| |
| /** |
| * Specifies, for jobs using these attributes, the ranges of pages to be |
| * printed, if a range of pages is to be printed. All range numbers are |
| * inclusive. If this attribute is not specified, then the values from the |
| * fromPage and toPages attributes are used. If pageRanges and either or |
| * both of fromPage and toPage are specified, pageRanges takes precedence. |
| * Specifying none of pageRanges, fromPage, or toPage is equivalent to |
| * calling setPageRanges(new int[][] { new int[] { <i>minPage</i>, |
| * <i>minPage</i> } }); |
| * |
| * @param pageRanges an array of integer arrays of 2 elements. An array |
| * is interpreted as a range spanning all pages including and |
| * between the specified pages. Ranges must be in ascending |
| * order and must not overlap. Specified page numbers cannot be |
| * less than <i>minPage</i> nor greater than <i>maxPage</i>. |
| * For example: |
| * (new int[][] { new int[] { 1, 3 }, new int[] { 5, 5 }, |
| * new int[] { 15, 19 } }), |
| * specifies pages 1, 2, 3, 5, 15, 16, 17, 18, and 19. Note that |
| * (new int[][] { new int[] { 1, 1 }, new int[] { 1, 2 } }), |
| * is an invalid set of page ranges because the two ranges |
| * overlap. |
| * @throws IllegalArgumentException if one or more of the above |
| * conditions is violated. |
| */ |
| public void setPageRanges(int[][] pageRanges) { |
| String xcp = "Invalid value for attribute pageRanges"; |
| int first = 0; |
| int last = 0; |
| |
| if (pageRanges == null) { |
| throw new IllegalArgumentException(xcp); |
| } |
| |
| for (int i = 0; i < pageRanges.length; i++) { |
| if (pageRanges[i] == null || |
| pageRanges[i].length != 2 || |
| pageRanges[i][0] <= last || |
| pageRanges[i][1] < pageRanges[i][0]) { |
| throw new IllegalArgumentException(xcp); |
| } |
| last = pageRanges[i][1]; |
| if (first == 0) { |
| first = pageRanges[i][0]; |
| } |
| } |
| |
| if (first < minPage || last > maxPage) { |
| throw new IllegalArgumentException(xcp); |
| } |
| |
| // Store a copy because otherwise client code could circumvent the |
| // the checks made above by holding a reference to the array and |
| // modifying it after calling setPageRanges. |
| int[][] copy = new int[pageRanges.length][2]; |
| for (int i = 0; i < pageRanges.length; i++) { |
| copy[i][0] = pageRanges[i][0]; |
| copy[i][1] = pageRanges[i][1]; |
| } |
| this.pageRanges = copy; |
| this.prFirst = first; |
| this.prLast = last; |
| } |
| |
| /** |
| * Returns the destination printer for jobs using these attributes. This |
| * attribute is updated to the value chosen by the user. |
| * |
| * @return the possibly null printer name. |
| */ |
| public String getPrinter() { |
| return printer; |
| } |
| |
| /** |
| * Specifies the destination printer for jobs using these attributes. |
| * Default is platform-dependent and implementation-defined. |
| * |
| * @param printer the possibly null printer name. |
| */ |
| public void setPrinter(String printer) { |
| this.printer = printer; |
| } |
| |
| /** |
| * Returns how consecutive pages should be imposed upon the sides of the |
| * print medium for jobs using these attributes. SidesType.ONE_SIDED |
| * imposes each consecutive page upon the same side of consecutive media |
| * sheets. This imposition is sometimes called <i>simplex</i>. |
| * SidesType.TWO_SIDED_LONG_EDGE imposes each consecutive pair of pages |
| * upon front and back sides of consecutive media sheets, such that the |
| * orientation of each pair of pages on the medium would be correct for |
| * the reader as if for binding on the long edge. This imposition is |
| * sometimes called <i>duplex</i>. SidesType.TWO_SIDED_SHORT_EDGE imposes |
| * each consecutive pair of pages upon front and back sides of consecutive |
| * media sheets, such that the orientation of each pair of pages on the |
| * medium would be correct for the reader as if for binding on the short |
| * edge. This imposition is sometimes called <i>tumble</i>. This attribute |
| * is updated to the value chosen by the user. |
| * |
| * @return SidesType.ONE_SIDED, SidesType.TWO_SIDED_LONG_EDGE, or |
| * SidesType.TWO_SIDED_SHORT_EDGE. |
| */ |
| public SidesType getSides() { |
| return sides; |
| } |
| |
| /** |
| * Specifies how consecutive pages should be imposed upon the sides of the |
| * print medium for jobs using these attributes. SidesType.ONE_SIDED |
| * imposes each consecutive page upon the same side of consecutive media |
| * sheets. This imposition is sometimes called <i>simplex</i>. |
| * SidesType.TWO_SIDED_LONG_EDGE imposes each consecutive pair of pages |
| * upon front and back sides of consecutive media sheets, such that the |
| * orientation of each pair of pages on the medium would be correct for |
| * the reader as if for binding on the long edge. This imposition is |
| * sometimes called <i>duplex</i>. SidesType.TWO_SIDED_SHORT_EDGE imposes |
| * each consecutive pair of pages upon front and back sides of consecutive |
| * media sheets, such that the orientation of each pair of pages on the |
| * medium would be correct for the reader as if for binding on the short |
| * edge. This imposition is sometimes called <i>tumble</i>. Not specifying |
| * this attribute is equivalent to specifying SidesType.ONE_SIDED. |
| * |
| * @param sides SidesType.ONE_SIDED, SidesType.TWO_SIDED_LONG_EDGE, or |
| * SidesType.TWO_SIDED_SHORT_EDGE. |
| * @throws IllegalArgumentException if sides is null. |
| */ |
| public void setSides(SidesType sides) { |
| if (sides == null) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "sides"); |
| } |
| this.sides = sides; |
| } |
| |
| /** |
| * Sets how consecutive pages should be imposed upon the sides of the |
| * print medium for jobs using these attributes to the default. The |
| * default imposition is SidesType.ONE_SIDED. |
| */ |
| public void setSidesToDefault() { |
| setSides(SidesType.ONE_SIDED); |
| } |
| |
| /** |
| * Returns, for jobs using these attributes, the last page (inclusive) |
| * to be printed, if a range of pages is to be printed. This attribute is |
| * updated to the value chosen by the user. An application should ignore |
| * this attribute on output, unless the return value of the <code> |
| * getDefaultSelection</code> method is DefaultSelectionType.RANGE. An |
| * application should honor the return value of <code>getPageRanges</code> |
| * over the return value of this method, if possible. |
| * |
| * @return an integer greater than zero and greater than or equal |
| * to <i>toPage</i> and greater than or equal to <i>minPage</i> |
| * and less than or equal to <i>maxPage</i>. |
| */ |
| public int getToPage() { |
| if (toPage != 0) { |
| return toPage; |
| } else if (fromPage != 0) { |
| return fromPage; |
| } else if (pageRanges != null) { |
| return prLast; |
| } else { |
| return getMinPage(); |
| } |
| } |
| |
| /** |
| * Specifies, for jobs using these attributes, the last page (inclusive) |
| * to be printed, if a range of pages is to be printed. |
| * If this attribute is not specified, then the values from the pageRanges |
| * attribute are used. If pageRanges and either or both of fromPage and |
| * toPage are specified, pageRanges takes precedence. Specifying none of |
| * pageRanges, fromPage, or toPage is equivalent to calling |
| * setPageRanges(new int[][] { new int[] { <i>minPage</i> } }); |
| * |
| * @param toPage an integer greater than zero and greater than or equal |
| * to <i>fromPage</i> and greater than or equal to <i>minPage</i> |
| * and less than or equal to <i>maxPage</i>. |
| * @throws IllegalArgumentException if one or more of the above |
| * conditions is violated. |
| */ |
| public void setToPage(int toPage) { |
| if (toPage <= 0 || |
| (fromPage != 0 && toPage < fromPage) || |
| toPage < minPage || |
| toPage > maxPage) { |
| throw new IllegalArgumentException("Invalid value for attribute "+ |
| "toPage"); |
| } |
| this.toPage = toPage; |
| } |
| |
| /** |
| * Determines whether two JobAttributes are equal to each other. |
| * <p> |
| * Two JobAttributes are equal if and only if each of their attributes are |
| * equal. Attributes of enumeration type are equal if and only if the |
| * fields refer to the same unique enumeration object. A set of page |
| * ranges is equal if and only if the sets are of equal length, each range |
| * enumerates the same pages, and the ranges are in the same order. |
| * |
| * @param obj the object whose equality will be checked. |
| * @return whether obj is equal to this JobAttribute according to the |
| * above criteria. |
| */ |
| public boolean equals(Object obj) { |
| if (!(obj instanceof JobAttributes)) { |
| return false; |
| } |
| JobAttributes rhs = (JobAttributes)obj; |
| |
| if (fileName == null) { |
| if (rhs.fileName != null) { |
| return false; |
| } |
| } else { |
| if (!fileName.equals(rhs.fileName)) { |
| return false; |
| } |
| } |
| |
| if (pageRanges == null) { |
| if (rhs.pageRanges != null) { |
| return false; |
| } |
| } else { |
| if (rhs.pageRanges == null || |
| pageRanges.length != rhs.pageRanges.length) { |
| return false; |
| } |
| for (int i = 0; i < pageRanges.length; i++) { |
| if (pageRanges[i][0] != rhs.pageRanges[i][0] || |
| pageRanges[i][1] != rhs.pageRanges[i][1]) { |
| return false; |
| } |
| } |
| } |
| |
| if (printer == null) { |
| if (rhs.printer != null) { |
| return false; |
| } |
| } else { |
| if (!printer.equals(rhs.printer)) { |
| return false; |
| } |
| } |
| |
| return (copies == rhs.copies && |
| defaultSelection == rhs.defaultSelection && |
| destination == rhs.destination && |
| dialog == rhs.dialog && |
| fromPage == rhs.fromPage && |
| maxPage == rhs.maxPage && |
| minPage == rhs.minPage && |
| multipleDocumentHandling == rhs.multipleDocumentHandling && |
| prFirst == rhs.prFirst && |
| prLast == rhs.prLast && |
| sides == rhs.sides && |
| toPage == rhs.toPage); |
| } |
| |
| /** |
| * Returns a hash code value for this JobAttributes. |
| * |
| * @return the hash code. |
| */ |
| public int hashCode() { |
| int rest = ((copies + fromPage + maxPage + minPage + prFirst + prLast + |
| toPage) * 31) << 21; |
| if (pageRanges != null) { |
| int sum = 0; |
| for (int i = 0; i < pageRanges.length; i++) { |
| sum += pageRanges[i][0] + pageRanges[i][1]; |
| } |
| rest ^= (sum * 31) << 11; |
| } |
| if (fileName != null) { |
| rest ^= fileName.hashCode(); |
| } |
| if (printer != null) { |
| rest ^= printer.hashCode(); |
| } |
| return (defaultSelection.hashCode() << 6 ^ |
| destination.hashCode() << 5 ^ |
| dialog.hashCode() << 3 ^ |
| multipleDocumentHandling.hashCode() << 2 ^ |
| sides.hashCode() ^ |
| rest); |
| } |
| |
| /** |
| * Returns a string representation of this JobAttributes. |
| * |
| * @return the string representation. |
| */ |
| public String toString() { |
| int[][] pageRanges = getPageRanges(); |
| String prStr = "["; |
| boolean first = true; |
| for (int i = 0; i < pageRanges.length; i++) { |
| if (first) { |
| first = false; |
| } else { |
| prStr += ","; |
| } |
| prStr += pageRanges[i][0] + ":" + pageRanges[i][1]; |
| } |
| prStr += "]"; |
| |
| return "copies=" + getCopies() + ",defaultSelection=" + |
| getDefaultSelection() + ",destination=" + getDestination() + |
| ",dialog=" + getDialog() + ",fileName=" + getFileName() + |
| ",fromPage=" + getFromPage() + ",maxPage=" + getMaxPage() + |
| ",minPage=" + getMinPage() + ",multiple-document-handling=" + |
| getMultipleDocumentHandling() + ",page-ranges=" + prStr + |
| ",printer=" + getPrinter() + ",sides=" + getSides() + ",toPage=" + |
| getToPage(); |
| } |
| } |