/* 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
