/* AttributedCharacterIterator.java -- Iterate over attributes
   Copyright (C) 1998, 1999 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.

As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */


package java.text;

import java.io.Serializable;
import java.io.InvalidObjectException;
import java.util.Set;
import java.util.Map;

/**
  * This interface extends the <code>CharacterIterator</code> interface
  * in order to support iteration over character attributes as well as
  * over the characters themselves.
  * <p>
  * In addition to attributes of specific characters, this interface
  * supports the concept of the "attribute run", which is an attribute
  * that is defined for a particular value across an entire range of
  * characters or which is undefined over a range of characters.
  *
  * @version 0.0
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  */
public interface AttributedCharacterIterator extends CharacterIterator
{

/*
 * Inner Classes
 */

/**
  * This class defines attribute keys that are used as text attributes.
  */
public static class Attribute implements Serializable
{

/*************************************************************************/

/*
 * Static Variables
 */

/**
  * This is the attribute for the language of the text.  The value of
  * attributes of this key type are instances of <code>Locale</code>.
  */
public static final Attribute LANGUAGE = new Attribute("LANGUAGE");

/**
  * This is the attribute for the reading form of text.  This is used
  * for storing pronunciation along with the written text for languages
  * which need it.  The value of attributes of this key type are
  * instances of <code>Annotation</code> which wrappers a <code>String</code>.
  */
public static final Attribute READING = new Attribute("READING");

/**
  * This is the attribute for input method segments.  The value of attributes
  * of this key type are instances of <code>Annotation</code> which wrapper
  * a <code>String</code>.
  */
public static final Attribute INPUT_METHOD_SEGMENT =    
                                  new Attribute("INPUT_METHOD_SEGMENT");

/*************************************************************************/

/*
 * Instance Variables
 */

/**
  * This is the name of the attribute key
  * @serial
  */
private String name;

/*************************************************************************/

/*
 * Constructors
 */

/**
  * This method initializes a new instance of this class with the specified
  * name.
  *
  * @param name The name of this attribute key.
  */
protected
Attribute(String name)
{
  this.name = name;
}

/*************************************************************************/

/*
 * Instance Methods
 */

/**
  * This method returns the name of this attribute.
  *
  * @return The attribute name
  */
protected String
getName()
{
  return(name);
}

/*************************************************************************/

/**
  * This method resolves an instance of <code>AttributedCharacterIterator.Attribute</code>
  * that is being deserialized to one of the three pre-defined attribute
  * constants.  It does this by comparing the names of the attributes.  The
  * constant that the deserialized object resolves to is returned.
  *
  * @return The resolved contant value
  *
  * @exception InvalidObjectException If the object being deserialized cannot be resolved.
  */
protected Object
readResolve() throws InvalidObjectException
{
  if (this.equals(READING))
    return(READING);

  if (this.equals(LANGUAGE))
    return(LANGUAGE);

  if (this.equals(INPUT_METHOD_SEGMENT))
    return(INPUT_METHOD_SEGMENT);

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

/*************************************************************************/

/**
  * This method tests this object for equality against the specified object.
  * The two objects will be considered equal if and only if:
  * <ul>
  * <li>The specified object is not <code>null</code>.
  * <li>The specified object is an instance of <code>AttributedCharacterIterator.Attribute</code>.
  * <li>The specified object has the same attribute name as this object.
  * </ul>
  *
  * @param The <code>Object</code> to test for equality against this object.
  *
  * @return <code>true</code> if the specified object is equal to this one, <code>false</code> otherwise.
  */
public final boolean
equals(Object obj)
{
  if (obj == this)
    return(true);
  else 
    return(false);
}

/*************************************************************************/

/**
  * This method returns a hash value for this object.
  *
  * @return A hash value for this object.
  */
public final int
hashCode()
{
  return(super.hashCode());
}

/*************************************************************************/

/**
  * This method returns a <code>String</code> representation of this object.
  *
  * @return A <code>String</code> representation of this object.
  */
public String
toString()
{
  return(getClass().getName() + "(" + getName() + ")");
}

} // Inner class Attribute

/*************************************************************************/

/*
 * Instance Methods
 */

/**
  * This method returns a list of all keys that are defined for the 
  * text range.  This can be an empty list if no attributes are defined.
  *
  * @return A list of keys 
  */
public abstract Set
getAllAttributeKeys();

/*************************************************************************/

/**
  * This method returns a <code>Map</code> of the attributed defined for
  * the current character.
  *
  * @return A <code>Map</code> of the attributes for the current character.
  */
public abstract Map
getAttributes();

/*************************************************************************/

/**
  * This method returns the value of the specified attribute for the
  * current character.  If the attribute is not defined for the current
  * character, <code>null</code> is returned.
  *
  * @param attrib The attribute to retrieve the value of.
  *
  * @return The value of the specified attribute
  */
public abstract Object
getAttribute(AttributedCharacterIterator.Attribute attrib);

/*************************************************************************/

/**
  * This method returns the index of the first character in the run that
  * contains all attributes defined for the current character.
  *
  * @return The start index of the run
  */
public abstract int
getRunStart();

/*************************************************************************/

/**
  * This method returns the index of the first character in the run that
  * contains all attributes in the specified <code>Set</code> defined for
  * the current character.
  *
  * @param attribs The <code>Set</code> of attributes.
  *
  * @return The start index of the run.
  */
public abstract int
getRunStart(Set attribs);

/*************************************************************************/

/**
  * This method returns the index of the first character in the run that
  * contains the specified attribute defined for the current character.
  *
  * @param attrib The attribute.
  *
  * @return The start index of the run.
  */
public abstract int
getRunStart(AttributedCharacterIterator.Attribute attrib);

/*************************************************************************/

/**
  * This method returns the index of the character after the end of the run
  * that contains all attributed defined for the current character.
  *
  * @return The end index of the run.
  */
public abstract int
getRunLimit();

/*************************************************************************/

/**
  * This method returns the index of the character after the end of the run
  * that contains all attributes in the specified <code>Set</code> defined
  * for the current character.
  *
  * @param attribs The <code>Set</code> of attributes.
  *
  * @return The end index of the run.
  */
public abstract int
getRunLimit(Set attribs);

/*************************************************************************/

/**
  * This methods returns the index of the character after the end of the run
  * that contains the specified attribute defined for the current character.
  *
  * @param attrib The attribute.
  * 
  * @return The end index of the run.
  */
public abstract int
getRunLimit(AttributedCharacterIterator.Attribute attrib);

} // interface AttributedCharacterIterator

