/*
*****************************************************************************************
*                                                                                       *
* COPYRIGHT:                                                                            *
*   (C) Copyright Taligent, Inc.,  1997                                                 *
*   (C) Copyright International Business Machines Corporation,  1997-1999               *
*   Licensed Material - Program-Property of IBM - All Rights Reserved.                  *
*   US Government Users Restricted Rights - Use, duplication, or disclosure             *
*   restricted by GSA ADP Schedule Contract with IBM Corp.                              *
*                                                                                       *
*****************************************************************************************
*
* File BRKITER.H
*
* Modification History:
*
*   Date        Name        Description
*   02/18/97    aliu        Added typedef for TextCount.  Made DONE const.
*   05/07/97    aliu        Fixed DLL declaration.
*   07/09/97    jfitz       Renamed BreakIterator and interface synced with JDK
*   08/11/98    helena      Sync-up JDK1.2.
*****************************************************************************************
*/

#ifndef BRKITER_H
#define BRKITER_H


#include "unistr.h"
#include "chariter.h"
#include "locid.h"


//class Locale;

/**
 * The BreakIterator class implements methods for finding the location
 * of boundaries in text. BreakIterator is an abstract base class.
 * Instances of BreakIterator maintain a current position and scan over
 * text returning the index of characters where boundaries occur.
 * <P>
 * Line boundary analysis determines where a text string can be broken
 * when line-wrapping. The mechanism correctly handles punctuation and
 * hyphenated words.
 * <P>
 * Sentence boundary analysis allows selection with correct
 * interpretation of periods within numbers and abbreviations, and
 * trailing punctuation marks such as quotation marks and parentheses.
 * <P>
 * Word boundary analysis is used by search and replace functions, as
 * well as within text editing applications that allow the user to
 * select words with a double click. Word selection provides correct
 * interpretation of punctuation marks within and following
 * words. Characters that are not part of a word, such as symbols or
 * punctuation marks, have word-breaks on both sides.
 * <P>
 * Character boundary analysis allows users to interact with
 * characters as they expect to, for example, when moving the cursor
 * through a text string. Character boundary analysis provides correct
 * navigation of through character strings, regardless of how the
 * character is stored.  For example, an accented character might be
 * stored as a base character and a diacritical mark. What users
 * consider to be a character can differ between languages.
 * <P>
 * This is the interface for all text boundaries.
 * <P>
 * Examples:
 * <P>
 * Helper function to output text
 * <pre>
 * .   void printTextRange( BreakIterator& iterator, UTextOffset start, UTextOffset end )
 * .   {
 * .       UnicodeString textBuffer, temp;
 * .       CharacterIterator *strIter = iterator.createText();
 * .       strIter->getText(temp);
 * .       cout &lt;&lt; " " &lt;&lt; start &lt;&lt; " " &lt;&lt; end &lt;&lt; " |" 
 * .            &lt;&lt; temp.extractBetween(start, end, textBuffer)
 * .            &lt;&lt; "|" &lt;&lt; endl;
 * .       delete strIter;
 * .   }
 * </pre>
 * Print each element in order:
 * <pre>
 * .   void printEachForward( BreakIterator& boundary)
 * .   {
 * .      UTextOffset start = boundary.first();
 * .      for (UTextOffset end = boundary.next();
 * .        end != BreakIterator::DONE;
 * .        start = end, end = boundary.next())
 * .        {
 * .            printTextRange( boundary, start, end );
 * .        }
 * .   }
 * </pre>
 * Print each element in reverse order:
 * <pre>
 * .   void printEachBackward( BreakIterator& boundary)
 * .   {
 * .      UTextOffset end = boundary.last();
 * .      for (UTextOffset start = boundary.previous();
 * .        start != BreakIterator::DONE;
 * .        end = start, start = boundary.previous())
 * .        {
 * .            printTextRange( boundary, start, end );
 * .        }
 * .   }
 * </pre>
 * Print first element
 * <pre>
 * .   void printFirst(BreakIterator& boundary)
 * .   {
 * .       UTextOffset start = boundary.first();
 * .       UTextOffset end = boundary.next();
 * .       printTextRange( boundary, start, end );
 * .   }
 * </pre>
 * Print last element
 * <pre>
 * .   void printLast(BreakIterator& boundary)
 * .   {
 * .       UTextOffset end = boundary.last();
 * .       UTextOffset start = boundary.previous();
 * .       printTextRange( boundary, start, end );
 * .   }
 * </pre>
 * Print the element at a specified position
 * <pre>
 * .   void printAt(BreakIterator &boundary, UTextOffset pos )
 * .   {
 * .       UTextOffset end = boundary.following(pos);
 * .       UTextOffset start = boundary.previous();
 * .       printTextRange( boundary, start, end );
 * .   }
 * </pre>
 * Creating and using text boundaries
 * <pre>
 * .      void BreakIterator_Example( void )
 * .      {
 * .          BreakIterator* boundary;
 * .          UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff.");
 * .          cout &lt;&lt; "Examining: " &lt;&lt; stringToExamine &lt;&lt; endl;
 * .
 * .          //print each sentence in forward and reverse order
 * .          boundary = BreakIterator::createSentenceInstance( Locale::US );
 * .          boundary->setText(&stringToExamine);
 * .          cout &lt;&lt; "----- forward: -----------" &lt;&lt; endl;
 * .          printEachForward(*boundary);
 * .          cout &lt;&lt; "----- backward: ----------" &lt;&lt; endl;
 * .          printEachBackward(*boundary);
 * .          delete boundary;
 * .
 * .          //print each word in order
 * .          boundary = BreakIterator::createWordInstance();
 * .          boundary->setText(&stringToExamine);
 * .          cout &lt;&lt; "----- forward: -----------" &lt;&lt; endl;
 * .          printEachForward(*boundary);
 * .          //print first element
 * .          cout &lt;&lt; "----- first: -------------" &lt;&lt; endl;
 * .          printFirst(*boundary);
 * .          //print last element
 * .          cout &lt;&lt; "----- last: --------------" &lt;&lt; endl;
 * .          printLast(*boundary);
 * .          //print word at charpos 10
 * .          cout &lt;&lt; "----- at pos 10: ---------" &lt;&lt; endl;
 * .          printAt(*boundary, 10 );
 * .
 * .          delete boundary;
 * .      }
 * </pre>
 */
class U_I18N_API BreakIterator {
public:
    virtual ~BreakIterator();

    /**
     * Return true if another object is semantically equal to this
     * one. The other object should be an instance of the same subclass of
     * BreakIterator. Objects of different subclasses are considered
     * unequal.
     * <P>
     * Return true if this BreakIterator is at the same position in the
     * same text, and is the same class and type (word, line, etc.) of
     * BreakIterator, as the argument.  Text is considered the same if
     * it contains the same characters, it need not be the same
     * object, and styles are not considered.
     */
    virtual bool_t operator==(const BreakIterator&) const = 0;

    bool_t operator!=(const BreakIterator& rhs) const { return !operator==(rhs); }

    /**
     * Return a polymorphic copy of this object.  This is an abstract
     * method which subclasses implement.
     */
    virtual BreakIterator* clone(void) const = 0;

    /**
     * Return a polymorphic class ID for this object. Different subclasses
     * will return distinct unequal values.
     */
    virtual ClassID getDynamicClassID(void) const = 0;

    /**
     * Get the text for which this object is finding the boundaries.
     */
    virtual CharacterIterator* createText(void) const = 0;

    /**
     * Change the text over which this operates. The text boundary is
     * reset to the start.
     */
    virtual void  setText(const UnicodeString* it) = 0;

    /**
     * Change the text over which this operates. The text boundary is
     * reset to the start.
     */
    virtual void  adoptText(CharacterIterator* it) = 0;

    /**
     * DONE is returned by previous() and next() after all valid
     * boundaries have been returned.
     */
    static const UTextOffset DONE;

    /**
     * Return the index of the first character in the text being scanned.
     */
    virtual UTextOffset first(void) = 0;

    /**
     * Return the index immediately BEYOND the last character in the text being scanned.
     */
    virtual UTextOffset last(void) = 0;

    /**
     * Return the boundary preceding the current boundary.
     * @return The character index of the previous text boundary or DONE if all
     * boundaries have been returned.
     */
    virtual UTextOffset previous(void) = 0;

    /**
     * Return the boundary following the current boundary.
     * @return The character index of the next text boundary or DONE if all
     * boundaries have been returned.
     */
    virtual UTextOffset next(void) = 0;

    /**
     * Return character index of the text boundary that was most recently
     * returned by next(), previous(), first(), or last()
     * @return The boundary most recently returned.
     */
    virtual UTextOffset current(void) const = 0;

    /**
     * Return the first boundary following the specified offset.
     * The value returned is always greater than the offset or
     * the value BreakIterator.DONE
     * @param offset the offset to begin scanning.
     * @return The first boundary after the specified offset.
     */
    virtual UTextOffset following(UTextOffset offset) = 0;

    /**
     * Return the first boundary preceding the specified offset.
     * The value returned is always smaller than the offset or
     * the value BreakIterator.DONE
     * @param offset the offset to begin scanning.
     * @return The first boundary before the specified offset.
     */
    virtual UTextOffset preceding(UTextOffset offset) = 0;
 
    /**
     * Return true if the specfied position is a boundary position.
     * @param offset the offset to check.
     * @return True if "offset" is a boundary position.
     */
    virtual bool_t isBoundary(UTextOffset offset) = 0;

    /**
     * Return the nth boundary from the current boundary
     * @param n which boundary to return.  A value of 0
     * does nothing.  Negative values move to previous boundaries
     * and positive values move to later boundaries.
     * @return The index of the nth boundary from the current position, or
     * DONE if there are fewer than |n| boundaries in the specfied direction.
     */
    virtual UTextOffset next(int32_t n) = 0;

    /**
     * Create BreakIterator for word-breaks using the given locale.
     * Returns an instance of a BreakIterator implementing word breaks.
     * WordBreak is useful for word selection (ex. double click)
     * @param where the locale. If a specific WordBreak is not
     * avaliable for the specified locale, a default WordBreak is returned.
     * @return A BreakIterator for word-breaks
     */
    static BreakIterator* createWordInstance(const Locale& where = Locale::getDefault());

    /**
     * Create BreakIterator for line-breaks using specified locale.
     * Returns an instance of a BreakIterator implementing line breaks. Line
     * breaks are logically possible line breaks, actual line breaks are
     * usually determined based on display width.
     * LineBreak is useful for word wrapping text.
     * @param where the locale. If a specific LineBreak is not
     * avaliable for the specified locale, a default LineBreak is returned.
     * @return A BreakIterator for line-breaks
     */
    static BreakIterator* createLineInstance(const Locale& where = Locale::getDefault());

    /**
     * Create BreakIterator for character-breaks using specified locale
     * Returns an instance of a BreakIterator implementing character breaks.
     * Character breaks are boundaries of combining character sequences.
     * @param where the locale. If a specific character break is not
     * avaliable for the specified locale, a default character break is returned.
     * @return A BreakIterator for character-breaks
     */
    static BreakIterator* createCharacterInstance(const Locale& where = Locale::getDefault());

    /**
     * Create BreakIterator for sentence-breaks using specified locale
     * Returns an instance of a BreakIterator implementing sentence breaks.
     * @param where the locale. If a specific SentenceBreak is not
     * avaliable for the specified locale, a default SentenceBreak is returned.
     * @return A BreakIterator for sentence-breaks
     */
    static BreakIterator* createSentenceInstance(const Locale& where = Locale::getDefault());

    /**
     * Get the set of Locales for which TextBoundaries are installed
     * @param count the output parameter of number of elements in the locale list
     * @return available locales
     */
    static const Locale* getAvailableLocales(int32_t& count);

    /**
     * Get name of the object for the desired Locale, in the desired langauge.
     * @param objectLocale must be from getAvailableLocales.
     * @param displayLocale specifies the desired locale for output.
     * @param name the fill-in parameter of the return value
     * Uses best match.
     * @return user-displayable name
     */
    static UnicodeString& getDisplayName(const Locale& objectLocale,
                                         const Locale& displayLocale,
                                         UnicodeString& name);

    /**
     * Get name of the object for the desired Locale, in the langauge of the
     * default locale.
     * @param objectLocale must be from getMatchingLocales
     * @param name the fill-in parameter of the return value
     * @return user-displayable name
     */
    static UnicodeString& getDisplayName(const Locale& objectLocale,
                                         UnicodeString& name);



protected:
    BreakIterator();

private:
    /**
     * The copy constructor and assignment operator have no real implementation.
     * They are provided to make the compiler happy. Do not call.
     */
    BreakIterator& operator=(const BreakIterator& other) { return *this; }
    BreakIterator (const BreakIterator& other) {}
};

#endif // _BRKITER
//eof
