/* PageAttributes.java --
   Copyright (C) 2002, 2005  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 java.awt;

import java.util.Locale;

/**
 * Missing Documentation
 *
 * @author Eric Blake (ebb9@email.byu.edu)
 * @since 1.3
 * @status updated to 1.4, but missing documentation
 */
public final class PageAttributes implements Cloneable
{
  public static final class ColorType extends AttributeValue
  {
    private static final String[] NAMES = { "color", "monochrome" };
    public static final ColorType COLOR = new ColorType(0);
    public static final ColorType MONOCHROME = new ColorType(1);
    private ColorType(int value)
    {
      super(value, NAMES);
    }
  } // class ColorType
  public static final class MediaType extends AttributeValue
  {
    private static final String[] NAMES
      = { "iso-4a0", "iso-2a0", "iso-a0", "iso-a1", "iso-a2", "iso-a3",
          "iso-a4", "iso-a5", "iso-a6", "iso-a7", "iso-a8", "iso-a9",
          "iso-a10", "iso-b0", "iso-b1", "iso-b2", "iso-b3", "iso-b4",
          "iso-b5", "iso-b6", "iso-b7", "iso-b8", "iso-b9", "iso-b10",
          "jis-b0", "jis-b1", "jis-b2", "jis-b3", "jis-b4", "jis-b5",
          "jis-b6", "jis-b7", "jis-b8", "jis-b9", "jis-b10", "iso-c0",
          "iso-c1", "iso-c2", "iso-c3", "iso-c4", "iso-c5", "iso-c6",
          "iso-c7", "iso-c8", "iso-c9", "iso-c10", "iso-designated-long",
          "executive", "folio", "invoice", "ledger", "na-letter", "na-legal",
          "quarto", "a", "b", "c", "d", "e", "na-10x15-envelope",
          "na-10x14-envelope", "na-10x13-envelope", "na-9x12-envelope",
          "na-9x11-envelope", "na-7x9-envelope", "na-6x9-envelope",
          "na-number-9-envelope", "na-number-10-envelope",
          "na-number-11-envelope", "na-number-12-envelope",
          "na-number-14-envelope", "invite-envelope", "italy-envelope",
          "monarch-envelope", "personal-envelope" };
    public static final MediaType ISO_4A0 = new MediaType(0);
    public static final MediaType ISO_2A0 = new MediaType(1);
    public static final MediaType ISO_A0 = new MediaType(2);
    public static final MediaType ISO_A1 = new MediaType(3);
    public static final MediaType ISO_A2 = new MediaType(4);
    public static final MediaType ISO_A3 = new MediaType(5);
    public static final MediaType ISO_A4 = new MediaType(6);
    public static final MediaType ISO_A5 = new MediaType(7);
    public static final MediaType ISO_A6 = new MediaType(8);
    public static final MediaType ISO_A7 = new MediaType(9);
    public static final MediaType ISO_A8 = new MediaType(10);
    public static final MediaType ISO_A9 = new MediaType(11);
    public static final MediaType ISO_A10 = new MediaType(12);
    public static final MediaType ISO_B0 = new MediaType(13);
    public static final MediaType ISO_B1 = new MediaType(14);
    public static final MediaType ISO_B2 = new MediaType(15);
    public static final MediaType ISO_B3 = new MediaType(16);
    public static final MediaType ISO_B4 = new MediaType(17);
    public static final MediaType ISO_B5 = new MediaType(18);
    public static final MediaType ISO_B6 = new MediaType(19);
    public static final MediaType ISO_B7 = new MediaType(20);
    public static final MediaType ISO_B8 = new MediaType(21);
    public static final MediaType ISO_B9 = new MediaType(22);
    public static final MediaType ISO_B10 = new MediaType(23);
    public static final MediaType JIS_B0 = new MediaType(24);
    public static final MediaType JIS_B1 = new MediaType(25);
    public static final MediaType JIS_B2 = new MediaType(26);
    public static final MediaType JIS_B3 = new MediaType(27);
    public static final MediaType JIS_B4 = new MediaType(28);
    public static final MediaType JIS_B5 = new MediaType(29);
    public static final MediaType JIS_B6 = new MediaType(30);
    public static final MediaType JIS_B7 = new MediaType(31);
    public static final MediaType JIS_B8 = new MediaType(32);
    public static final MediaType JIS_B9 = new MediaType(33);
    public static final MediaType JIS_B10 = new MediaType(34);
    public static final MediaType ISO_C0 = new MediaType(35);
    public static final MediaType ISO_C1 = new MediaType(36);
    public static final MediaType ISO_C2 = new MediaType(37);
    public static final MediaType ISO_C3 = new MediaType(38);
    public static final MediaType ISO_C4 = new MediaType(39);
    public static final MediaType ISO_C5 = new MediaType(40);
    public static final MediaType ISO_C6 = new MediaType(41);
    public static final MediaType ISO_C7 = new MediaType(42);
    public static final MediaType ISO_C8 = new MediaType(43);
    public static final MediaType ISO_C9 = new MediaType(44);
    public static final MediaType ISO_C10 = new MediaType(45);
    public static final MediaType ISO_DESIGNATED_LONG = new MediaType(46);
    public static final MediaType EXECUTIVE = new MediaType(47);
    public static final MediaType FOLIO = new MediaType(48);
    public static final MediaType INVOICE = new MediaType(49);
    public static final MediaType LEDGER = new MediaType(50);
    public static final MediaType NA_LETTER = new MediaType(51);
    public static final MediaType NA_LEGAL = new MediaType(52);
    public static final MediaType QUARTO = new MediaType(53);
    public static final MediaType A = new MediaType(54);
    public static final MediaType B = new MediaType(55);
    public static final MediaType C = new MediaType(56);
    public static final MediaType D = new MediaType(57);
    public static final MediaType E = new MediaType(58);
    public static final MediaType NA_10X15_ENVELOPE = new MediaType(59);
    public static final MediaType NA_10X14_ENVELOPE = new MediaType(60);
    public static final MediaType NA_10X13_ENVELOPE = new MediaType(61);
    public static final MediaType NA_9X12_ENVELOPE = new MediaType(62);
    public static final MediaType NA_9X11_ENVELOPE = new MediaType(63);
    public static final MediaType NA_7X9_ENVELOPE = new MediaType(64);
    public static final MediaType NA_6X9_ENVELOPE = new MediaType(65);
    public static final MediaType NA_NUMBER_9_ENVELOPE = new MediaType(66);
    public static final MediaType NA_NUMBER_10_ENVELOPE = new MediaType(67);
    public static final MediaType NA_NUMBER_11_ENVELOPE = new MediaType(68);
    public static final MediaType NA_NUMBER_12_ENVELOPE = new MediaType(69);
    public static final MediaType NA_NUMBER_14_ENVELOPE = new MediaType(70);
    public static final MediaType INVITE_ENVELOPE = new MediaType(71);
    public static final MediaType ITALY_ENVELOPE = new MediaType(72);
    public static final MediaType MONARCH_ENVELOPE = new MediaType(73);
    public static final MediaType PERSONAL_ENVELOPE = new MediaType(74);
    public static final MediaType A0 = ISO_A0;
    public static final MediaType A1 = ISO_A1;
    public static final MediaType A2 = ISO_A2;
    public static final MediaType A3 = ISO_A3;
    public static final MediaType A4 = ISO_A4;
    public static final MediaType A5 = ISO_A5;
    public static final MediaType A6 = ISO_A6;
    public static final MediaType A7 = ISO_A7;
    public static final MediaType A8 = ISO_A8;
    public static final MediaType A9 = ISO_A9;
    public static final MediaType A10 = ISO_A10;
    public static final MediaType B0 = ISO_B0;
    public static final MediaType B1 = ISO_B1;
    public static final MediaType B2 = ISO_B2;
    public static final MediaType B3 = ISO_B3;
    public static final MediaType B4 = ISO_B4;
    public static final MediaType ISO_B4_ENVELOPE = ISO_B4;
    public static final MediaType B5 = ISO_B5;
    public static final MediaType ISO_B5_ENVELOPE = ISO_B4;
    public static final MediaType B6 = ISO_B6;
    public static final MediaType B7 = ISO_B7;
    public static final MediaType B8 = ISO_B8;
    public static final MediaType B9 = ISO_B9;
    public static final MediaType B10 = ISO_B10;
    public static final MediaType C0 = ISO_B0;
    public static final MediaType ISO_C0_ENVELOPE = ISO_C0;
    public static final MediaType C1 = ISO_C1;
    public static final MediaType ISO_C1_ENVELOPE = ISO_C1;
    public static final MediaType C2 = ISO_C2;
    public static final MediaType ISO_C2_ENVELOPE = ISO_C2;
    public static final MediaType C3 = ISO_C3;
    public static final MediaType ISO_C3_ENVELOPE = ISO_C3;
    public static final MediaType C4 = ISO_C4;
    public static final MediaType ISO_C4_ENVELOPE = ISO_C4;
    public static final MediaType C5 = ISO_C5;
    public static final MediaType ISO_C5_ENVELOPE = ISO_C5;
    public static final MediaType C6 = ISO_C6;
    public static final MediaType ISO_C6_ENVELOPE = ISO_C6;
    public static final MediaType C7 = ISO_C7;
    public static final MediaType ISO_C7_ENVELOPE = ISO_C7;
    public static final MediaType C8 = ISO_C8;
    public static final MediaType ISO_C8_ENVELOPE = ISO_C8;
    public static final MediaType C9 = ISO_C9;
    public static final MediaType ISO_C9_ENVELOPE = ISO_C9;
    public static final MediaType C10 = ISO_C10;
    public static final MediaType ISO_C10_ENVELOPE = ISO_C10;
    public static final MediaType ISO_DESIGNATED_LONG_ENVELOPE
      = ISO_DESIGNATED_LONG;
    public static final MediaType STATEMENT = INVOICE;
    public static final MediaType TABLOID = LEDGER;
    public static final MediaType LETTER = NA_LETTER;
    public static final MediaType NOTE = NA_LETTER;
    public static final MediaType LEGAL = NA_LEGAL;
    public static final MediaType ENV_10X15 = NA_10X15_ENVELOPE;
    public static final MediaType ENV_10X14 = NA_10X14_ENVELOPE;
    public static final MediaType ENV_10X13 = NA_10X13_ENVELOPE;
    public static final MediaType ENV_9X12 = NA_9X12_ENVELOPE;
    public static final MediaType ENV_9X11 = NA_9X11_ENVELOPE;
    public static final MediaType ENV_7X9 = NA_7X9_ENVELOPE;
    public static final MediaType ENV_6X9 = NA_6X9_ENVELOPE;
    public static final MediaType ENV_9 = NA_NUMBER_9_ENVELOPE;
    public static final MediaType ENV_10 = NA_NUMBER_10_ENVELOPE;
    public static final MediaType ENV_11 = NA_NUMBER_11_ENVELOPE;
    public static final MediaType ENV_12 = NA_NUMBER_12_ENVELOPE;
    public static final MediaType ENV_14 = NA_NUMBER_14_ENVELOPE;
    public static final MediaType ENV_INVITE = INVITE_ENVELOPE;
    public static final MediaType ENV_ITALY = ITALY_ENVELOPE;
    public static final MediaType ENV_MONARCH = MONARCH_ENVELOPE;
    public static final MediaType ENV_PERSONAL = PERSONAL_ENVELOPE;
    public static final MediaType INVITE = INVITE_ENVELOPE;
    public static final MediaType ITALY = ITALY_ENVELOPE;
    public static final MediaType MONARCH = MONARCH_ENVELOPE;
    public static final MediaType PERSONAL = PERSONAL_ENVELOPE;
    private MediaType(int value)
    {
      super(value, NAMES);
    }
  } // class MediaType
  public static final class OrientationRequestedType extends AttributeValue
  {
    private static final String[] NAMES = { "portrait", "landscape" };
    public static final OrientationRequestedType PORTRAIT
      = new OrientationRequestedType(0);
    public static final OrientationRequestedType LANDSCAPE
      = new OrientationRequestedType(1);
    private OrientationRequestedType(int value)
    {
      super(value, NAMES);
    }
  } // class OrientationRequestedType
  public static final class OriginType extends AttributeValue
  {
    private static final String[] NAMES = { "physical", "printable" };
    public static final OriginType PHYSICAL = new OriginType(0);
    public static final OriginType PRINTABLE = new OriginType(1);
    private OriginType(int value)
    {
      super(value, NAMES);
    }
  } // class OriginType
  public static final class PrintQualityType extends AttributeValue
  {
    private static final String[] NAMES = { "high", "normal", "draft" };
    public static final PrintQualityType HIGH = new PrintQualityType(0);
    public static final PrintQualityType NORMAL = new PrintQualityType(1);
    public static final PrintQualityType DRAFT = new PrintQualityType(2);
    private PrintQualityType(int value)
    {
      super(value, NAMES);
    }
  } // class PrintQualityType


  private ColorType color;
  private MediaType media;
  private OrientationRequestedType orientation;
  private OriginType origin;
  private PrintQualityType quality;
  private int resolutionX;
  private int resolutionY;
  private int resolutionScale;
  public PageAttributes()
  {
    color = ColorType.MONOCHROME;
    setMediaToDefault();
    orientation = OrientationRequestedType.PORTRAIT;
    origin = OriginType.PHYSICAL;
    quality = PrintQualityType.NORMAL;
    setPrinterResolutionToDefault();
  }

  public PageAttributes(PageAttributes attr)
  {
    set(attr);
  }

  public PageAttributes(ColorType color, MediaType media,
                        OrientationRequestedType orientation,
                        OriginType origin, PrintQualityType quality,
                        int[] resolution)
  {
    if (color == null || media == null || orientation == null
        || origin == null || quality == null)
      throw new IllegalArgumentException();
    setPrinterResolution(resolution);
    this.color = color;
    this.media = media;
    this.orientation = orientation;
    this.origin = origin;
    this.quality = quality;
  }

  public Object clone()
  {
    return new PageAttributes(this);
  }

  public void set(PageAttributes attr)
  {
    color = attr.color;
    media = attr.media;
    orientation = attr.orientation;
    origin = attr.origin;
    quality = attr.quality;
    resolutionX = attr.resolutionX;
    resolutionY = attr.resolutionY;
    resolutionScale = attr.resolutionScale;
  }

  public ColorType getColor()
  {
    return color;
  }

  public void setColor(ColorType color)
  {
    if (color == null)
      throw new IllegalArgumentException();
    this.color = color;
  }

  public MediaType getMedia()
  {
    return media;
  }

  public void setMedia(MediaType media)
  {
    if (media == null)
      throw new IllegalArgumentException();
    this.media = media;
  }

  public void setMediaToDefault()
  {
    String country = Locale.getDefault().getCountry();
    media = ("US".equals(country) || "CA".equals(country)) ? MediaType.LETTER
      : MediaType.A4;
  }

  public OrientationRequestedType getOrientationRequested()
  {
    return orientation;
  }

  public void setOrientationRequested(OrientationRequestedType orientation)
  {
    if (orientation == null)
      throw new IllegalArgumentException();
    this.orientation = orientation;
  }

  public void setOrientationRequested(int orientation)
  {
    if (orientation == 3)
      this.orientation = OrientationRequestedType.PORTRAIT;
    else if (orientation == 4)
      this.orientation = OrientationRequestedType.LANDSCAPE;
    else
      throw new IllegalArgumentException();
  }

  public void setOrientationRequestedToDefault()
  {
    orientation = OrientationRequestedType.PORTRAIT;
  }

  public OriginType getOrigin()
  {
    return origin;
  }

  public void setOrigin(OriginType origin)
  {
    if (origin == null)
      throw new IllegalArgumentException();
    this.origin = origin;
  }

  public PrintQualityType getPrintQuality()
  {
    return quality;
  }

  public void setPrintQuality(PrintQualityType quality)
  {
    if (quality == null)
      throw new IllegalArgumentException();
    this.quality = quality;
  }

  public void setPrintQuality(int quality)
  {
    if (quality == 3)
      this.quality = PrintQualityType.DRAFT;
    else if (quality == 4)
      this.quality = PrintQualityType.NORMAL;
    else if (quality == 5)
      this.quality = PrintQualityType.HIGH;
    else
      throw new IllegalArgumentException();
  }

  public void setPrintQualityToDefault()
  {
    quality = PrintQualityType.NORMAL;
  }

  public int[] getPrinterResolution()
  {
    return new int[] { resolutionX, resolutionY, resolutionScale };
  }

  public void setPrinterResolution(int[] resolution)
  {
    if (resolution == null || resolution.length != 3 || resolution[0] <= 0
        || resolution[1] <= 0 || resolution[2] < 3 || resolution[2] > 4)
      throw new IllegalArgumentException();
    resolutionX = resolution[0];
    resolutionY = resolution[1];
    resolutionScale = resolution[2];
  }

  public void setPrinterResolution(int resolution)
  {
    if (resolution <= 0)
      throw new IllegalArgumentException();
    resolutionX = resolution;
    resolutionY = resolution;
    resolutionScale = 3;
  }

  public void setPrinterResolutionToDefault()
  {
    resolutionX = 72;
    resolutionY = 72;
    resolutionScale = 3;
  }

  public boolean equals(Object o)
  {
    if (this == o)
      return true;
    if (! (o instanceof PageAttributes))
      return false;
    PageAttributes pa = (PageAttributes) o;
    return color == pa.color && media == pa.media
      && orientation == pa.orientation && origin == pa.origin
      && quality == pa.quality && resolutionX == pa.resolutionX
      && resolutionY == pa.resolutionY
      && resolutionScale == pa.resolutionScale;
  }
  public int hashCode()
  {
    return (color.value << 31) ^ (media.value << 24)
      ^ (orientation.value << 23) ^ (origin.value << 22)
      ^ (quality.value << 20) ^ (resolutionScale << 19)
      ^ (resolutionY << 10) ^ resolutionX;
  }
  public String toString()
  {
    return "color=" + color + ",media=" + media + ",orientation-requested="
      + orientation + ",origin=" + origin + ",print-quality=" + quality
      + ",printer-resolution=[" + resolutionX + ',' + resolutionY + ','
      + resolutionScale + ']';
  }
} // class PageAttributes
