/* TextAttribute.java --
   Copyright (C) 2003, 2004, 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.font;

import java.io.InvalidObjectException;
import java.text.AttributedCharacterIterator;

/**
 * Attributes (and associated values) that can be used to define an
 * {@link java.text.AttributedString}.
 */
public final class TextAttribute extends AttributedCharacterIterator.Attribute
{
  private static final long serialVersionUID = 7744112784117861702L;

  /** A key for the background paint attribute. */
  public static final TextAttribute BACKGROUND =
    new TextAttribute("background");

  /** A key for the BIDI_EMBEDDING attribute. */
  public static final TextAttribute BIDI_EMBEDDING =
    new TextAttribute("bidi_embedding");

  /** A key for the CHAR_REPLACEMENT attribute. */
  public static final TextAttribute CHAR_REPLACEMENT =
    new TextAttribute("char_replacement");

  /** A key for the FAMILY attribute. */
  public static final TextAttribute FAMILY = new TextAttribute("family");

  /** A key for the font attribute. */
  public static final TextAttribute FONT = new TextAttribute("font");

  /** A key for the foreground paint attribute. */
  public static final TextAttribute FOREGROUND =
    new TextAttribute("foreground");

  /** A key for the INPUT_METHOD_HIGHLIGHT attribute. */
  public static final TextAttribute INPUT_METHOD_HIGHLIGHT =
    new TextAttribute("input method highlight");

  /** A key for the INPUT_METHOD_UNDERLINE attribute. */
  public static final TextAttribute INPUT_METHOD_UNDERLINE =
    new TextAttribute("input method underline");

  /** A key for the text justification attribute. */
  public static final TextAttribute JUSTIFICATION =
    new TextAttribute("justification");

  /**
   * A value that can be used with the {@link #JUSTIFICATION} attribute to
   * indicate full justification of the text.
   */
  public static final Float JUSTIFICATION_FULL = new Float(1.0);

  /**
   * A value that can be used with the {@link #JUSTIFICATION} attribute to
   * indicate no justification of the text.
   */
  public static final Float JUSTIFICATION_NONE = new Float(0.0);

  /** A key for the NUMERIC_SHAPING attribute. */
  public static final TextAttribute NUMERIC_SHAPING =
    new TextAttribute("numeric_shaping");

  /** A key for the POSTURE attribute. */
  public static final TextAttribute POSTURE = new TextAttribute("posture");

  /** A value that can be used with the {@link #POSTURE} attribute. */
  public static final Float POSTURE_OBLIQUE = new Float(0.2);

  /** A value that can be used with the {@link #POSTURE} attribute. */
  public static final Float POSTURE_REGULAR = new Float(0.0);

  /** A key for the RUN_DIRECTION attribute. */
  public static final TextAttribute RUN_DIRECTION =
    new TextAttribute("run_direction");

  /** A value that can be used with the {@link #RUN_DIRECTION} attribute. */
  public static final Boolean RUN_DIRECTION_LTR = Boolean.FALSE;

  /** A value that can be used with the {@link #RUN_DIRECTION} attribute. */
  public static final Boolean RUN_DIRECTION_RTL = Boolean.TRUE;

  /** A key for the text size attribute. */
  public static final TextAttribute SIZE = new TextAttribute("size");

  /** A key for the STRIKETHROUGH attribute. */
  public static final TextAttribute STRIKETHROUGH =
    new TextAttribute("strikethrough");

  /** A value that can be used with the {@link #STRIKETHROUGH} attribute. */
  public static final Boolean STRIKETHROUGH_ON = Boolean.TRUE;

  /** A key for the SUPERSCRIPT attribute. */
  public static final TextAttribute SUPERSCRIPT =
    new TextAttribute("superscript");

  /** A value that can be used with the {@link #SUPERSCRIPT} attribute. */
  public static final Integer SUPERSCRIPT_SUB = new Integer(-1);

  /** A value that can be used with the {@link #SUPERSCRIPT} attribute. */
  public static final Integer SUPERSCRIPT_SUPER = new Integer(1);

  /** A key for the SWAP_COLORS attribute. */
  public static final TextAttribute SWAP_COLORS =
    new TextAttribute("swap_colors");

  /** A value that can be used with the {@link #SWAP_COLORS} attribute. */
  public static final Boolean SWAP_COLORS_ON = Boolean.TRUE;

  /** A key for the TRANFORM attribute. */
  public static final TextAttribute TRANSFORM = new TextAttribute("transform");

  /** A key for the UNDERLINE attribute. */
  public static final TextAttribute UNDERLINE = new TextAttribute("underline");

  /** A value that can be used with the {@link #UNDERLINE} attribute. */
  public static final Integer UNDERLINE_LOW_DASHED = new Integer(5);

  /** A value that can be used with the {@link #UNDERLINE} attribute. */
  public static final Integer UNDERLINE_LOW_DOTTED = new Integer(3);

  /** A value that can be used with the {@link #UNDERLINE} attribute. */
  public static final Integer UNDERLINE_LOW_GRAY = new Integer(4);

  /** A value that can be used with the {@link #UNDERLINE} attribute. */
  public static final Integer UNDERLINE_LOW_ONE_PIXEL = new Integer(1);

  /** A value that can be used with the {@link #UNDERLINE} attribute. */
  public static final Integer UNDERLINE_LOW_TWO_PIXEL = new Integer(2);

  /** A value that can be used with the {@link #UNDERLINE} attribute. */
  public static final Integer UNDERLINE_ON = new Integer(0);

  /** A key for the WEIGHT attribute. */
  public static final TextAttribute WEIGHT = new TextAttribute("weight");

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_BOLD = new Float(2.0);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_DEMIBOLD = new Float(1.75);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_DEMILIGHT = new Float(0.875);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_EXTRA_LIGHT = new Float(0.5);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_EXTRABOLD = new Float(2.5);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_HEAVY = new Float(2.25);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_LIGHT = new Float(0.75);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_MEDIUM = new Float(1.5);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_REGULAR = new Float(1.0);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_SEMIBOLD = new Float(1.25);

  /** A value that can be used with the {@link #WEIGHT} attribute. */
  public static final Float WEIGHT_ULTRABOLD = new Float(2.75);

  /** A key for the WIDTH attribute. */
  public static final TextAttribute WIDTH = new TextAttribute("width");

  /** A value that can be used with the {@link #WIDTH} attribute. */
  public static final Float WIDTH_CONDENSED = new Float(0.75);

  /** A value that can be used with the {@link #WIDTH} attribute. */
  public static final Float WIDTH_EXTENDED = new Float(1.5);

  /** A value that can be used with the {@link #WIDTH} attribute. */
  public static final Float WIDTH_REGULAR = new Float(1.0);

  /** A value that can be used with the {@link #WIDTH} attribute. */
  public static final Float WIDTH_SEMI_CONDENSED = new Float(0.875);

  /** A value that can be used with the {@link #WIDTH} attribute. */
  public static final Float WIDTH_SEMI_EXTENDED = new Float(1.25);

  /**
   * Creates a new attribute.
   *
   * @param name  the name.
   */
  protected TextAttribute(String name)
  {
    super(name);
  }

  /**
   * After deserialization, this method ensures that only one instance of
   * each attribute is used.
   *
   * @return The (single) attribute instance.
   *
   * @throws InvalidObjectException if the attribute is not recognised.
   */
  protected Object readResolve()
    throws InvalidObjectException
  {
    if (this.getName().equals("background"))
      return BACKGROUND;

    if (this.getName().equals("bidi_embedding"))
      return BIDI_EMBEDDING;

    if (this.getName().equals("char_replacement"))
      return CHAR_REPLACEMENT;

    if (this.getName().equals("family"))
      return FAMILY;

    if (this.getName().equals("font"))
      return FONT;

    if (this.getName().equals("foreground"))
      return FOREGROUND;

    if (this.getName().equals("input method highlight"))
      return INPUT_METHOD_HIGHLIGHT;

    if (this.getName().equals("input method underline"))
      return INPUT_METHOD_UNDERLINE;

    if (this.getName().equals("justification"))
      return JUSTIFICATION;

    if (this.getName().equals("numeric_shaping"))
      return NUMERIC_SHAPING;

    if (this.getName().equals("posture"))
      return POSTURE;

    if (this.getName().equals("run_direction"))
      return RUN_DIRECTION;

    if (this.getName().equals("size"))
      return SIZE;

    if (this.getName().equals("strikethrough"))
      return STRIKETHROUGH;

    if (this.getName().equals("superscript"))
      return SUPERSCRIPT;

    if (this.getName().equals("swap_colors"))
      return SWAP_COLORS;

    if (this.getName().equals("transform"))
      return TRANSFORM;

    if (this.getName().equals("underline"))
      return UNDERLINE;

    if (this.getName().equals("weight"))
      return WEIGHT;

    if (this.getName().equals("width"))
      return WIDTH;

    throw new InvalidObjectException("Can't resolve Attribute: " + getName());
  }
}
