/* Finishings.java --
   Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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 for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version.  */


package javax.print.attribute.standard;

import javax.print.attribute.DocAttribute;
import javax.print.attribute.EnumSyntax;
import javax.print.attribute.PrintJobAttribute;
import javax.print.attribute.PrintRequestAttribute;


/**
 * The <code>Finishings</code> attribute specifies the finishing operations
 * that the Printer applies to every copy of each printed document in the Job.
 * <p>
 * Standard enum values are: <code>NONE</code>, <code>STAPLE</code>, 
 * <code>COVER</code>, <code>BIND</code>, <code>SADDLE_STITCH</code>,
 * <code>EDGE_STITCH</code>.
 * <br><br>
 * The following values are more specific: 
 * <code>STAPLE_TOP_LEFT</code>, <code>STAPLE_BOTTOM_LEFT</code>, 
 * <code>STAPLE_TOP_RIGHT</code>, <code>STAPLE_BOTTOM_RIGHT</code>, 
 * <code>EDGE_STITCH_LEFT</code>, <code>EDGE_STITCH_TOP</code>, 
 * <code>EDGE_STITCH_RIGHT</code>, <code>EDGE_STITCH_BOTTOM</code>, 
 * <code>STAPLE_DUAL_LEFT</code>, <code>STAPLE_DUAL_TOP</code>, 
 * <code>STAPLE_DUAL_RIGHT</code>, <code>STAPLE_DUAL_BOTTOM</code>.
 * </p> 
 * <p>
 * <b>Note:</b> The effect of this attribute on jobs with multiple documents 
 * is controlled by the job attribute 
 * {@link javax.print.attribute.standard.MultipleDocumentHandling}.
 * </p>
 * <p>
 * <b>IPP Compatibility:</b> Finishings is an IPP 1.1 attribute. Differences 
 * to the IPP specification are that in the Java Print Service API only one 
 * enum value is supported (in IPP a set of enums). Further the enum 
 * <code>punch</code> is not supported.
 * </p>
 * 
 * @author Michael Koch (konqueror@gmx.de)
 * @author Wolfgang Baer (WBaer@gmx.de)
 */
public class Finishings extends EnumSyntax
  implements DocAttribute, PrintJobAttribute, PrintRequestAttribute
{
  private static final long serialVersionUID = -627840419548391754L;

  /** 
   * Perform no finishings of the documents.
   */
  public static final Finishings NONE = new Finishings(3);
  
  /** 
   * Selects binding of the documents with one or more staples.  
   */
  public static final Finishings STAPLE = new Finishings(4);
  
  /**
   * Selects the use of a non-printed (or pre-printed) cover for 
   * the document.
   */
  public static final Finishings COVER = new Finishings(6);
  
  /**
   * Selects that a binding is to be applied to the document.
   * The type and placement of the binding is site-defined.
   */
  public static final Finishings BIND = new Finishings(7);
  
  /**
   * Selects binding of the documents with one or more staples
   * along the middle fold.  
   */
  public static final Finishings SADDLE_STITCH = new Finishings(8);
  
  /**
   * Selects binding of the documents with one or more staples 
   * along one edge. 
   */
  public static final Finishings EDGE_STITCH = new Finishings(9);
  
  /** 
   * Selects binding of the documents with one or more staples 
   * in the top left corner. 
   */
  public static final Finishings STAPLE_TOP_LEFT = new Finishings(20);
  
  /** 
   * Selects binding of the documents with one or more staples in the bottom 
   * left corner. 
   */
  public static final Finishings STAPLE_BOTTOM_LEFT = new Finishings(21);
  
  /**
   * Selects binding of the documents with one or more staples in 
   * the top right corner.
   */
  public static final Finishings STAPLE_TOP_RIGHT = new Finishings(22);
  
  /**
   * Selects binding of the documents with one or more staples in 
   * the bottom right corner.
   */
  public static final Finishings STAPLE_BOTTOM_RIGHT = new Finishings(23);
  
  /**
   * Selects binding of the documents with one or more staples
   * along the left edge.
   */
  public static final Finishings EDGE_STITCH_LEFT = new Finishings(24);
  
  /**
   * Selects binding of the documents with one or more staples along 
   * the top edge.
   */
  public static final Finishings EDGE_STITCH_TOP = new Finishings(25);
  
  /**
   * Selects binding of the documents with one or more staples along 
   * the right edge.
   */
  public static final Finishings EDGE_STITCH_RIGHT = new Finishings(26);
  
  /**
   * Selects binding of the documents with one or more staples along
   * the bottom edge. 
   */
  public static final Finishings EDGE_STITCH_BOTTOM = new Finishings(27);
  
  /**
   * Selects binding of the documents with two staples along the 
   * left edge assuming a portrait document.
   */
  public static final Finishings STAPLE_DUAL_LEFT = new Finishings(28);
  
  /**
   * Selects binding of the documents with two staples along the 
   * top edge assuming a portrait document.
   */
  public static final Finishings STAPLE_DUAL_TOP = new Finishings(29);
  
  /**
   * Selects binding of the documents with two staples along the 
   * right edge assuming a portrait document.
   */
  public static final Finishings STAPLE_DUAL_RIGHT = new Finishings(30);
  
  /**
   * Selects binding of the documents with two staples along the 
   * bottom edge assuming a portrait document.
   */
  public static final Finishings STAPLE_DUAL_BOTTOM = new Finishings(31);

  private static final String[] stringTable = { "none", "staple", null, 
                                                "cover", "bind", "saddle-stitch",
                                                "edge-stitch", null, null, null,
                                                null, null, null, null, null,
                                                null, null, "staple-top-left",
                                                "staple-bottom-left", 
                                                "staple-top-right", 
                                                "staple-bottom-right",
                                                "edge-stitch-left",
                                                "edge-stitch-top",
                                                "edge-stitch-right",
                                                "edge-stitch-bottom",
                                                "staple-dual-left",
                                                "staple-dual-top",
                                                "staple-dual-right",
                                                "staple-dual-bottom" };
  
  private static final Finishings[] enumValueTable = { NONE, STAPLE, null, 
                                                       COVER, BIND, 
                                                       SADDLE_STITCH,
                                                       EDGE_STITCH, null, 
                                                       null, null, null, 
                                                       null, null, null, 
                                                       null, null, null, 
                                                       STAPLE_TOP_LEFT,
                                                       STAPLE_BOTTOM_LEFT,
                                                       STAPLE_TOP_RIGHT,
                                                       STAPLE_BOTTOM_RIGHT,
                                                       EDGE_STITCH_LEFT,
                                                       EDGE_STITCH_TOP,
                                                       EDGE_STITCH_RIGHT,
                                                       EDGE_STITCH_BOTTOM,
                                                       STAPLE_DUAL_LEFT,
                                                       STAPLE_DUAL_TOP,
                                                       STAPLE_DUAL_RIGHT,
                                                       STAPLE_DUAL_BOTTOM };
  
  /**
   * Constructs a <code>Finishings</code> object.
   * 
   * @param value the value
   */
  protected Finishings(int value)
  {
    super(value);
  }

  /**
   * Returns category of this class.
   *
   * @return the class <code>Finishings</code> itself
   */
  public final Class getCategory()
  {
    return Finishings.class;
  }

  /**
   * Returns the name of this attribute.
   *
   * @return The name "finishings".
   */
  public final String getName()
  {
    return "finishings";
  }
  
  /**
   * Returns a table with the enumeration values represented as strings
   * for this object.
   *
   * @return The enumeration values as strings.
   */
  protected String[] getStringTable()
  {
    return stringTable;
  }

  /**
   * Returns a table with the enumeration values for this object.
   *
   * @return The enumeration values.
   */
  protected EnumSyntax[] getEnumValueTable()
  {
    return enumValueTable;
  }

  /**
   * Returns the lowest used value by the enumerations of this class.
   * .
   * @return The lowest value used.
   */
  protected int getOffset()
  {
    return 3;
  }  
}
