/* 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());
  }
}
