/* 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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 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
