12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
3bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert/*
4bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *******************************************************************************
5bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Copyright (C) 1996-2012, International Business Machines Corporation and    *
6bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * others. All Rights Reserved.                                                *
7bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *******************************************************************************
8bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */
9bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertpackage com.ibm.icu.text;
11bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.text.CharacterIterator;
13bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.text.StringCharacterIterator;
14bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.util.Locale;
15bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
16bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport com.ibm.icu.util.ULocale;
17bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
18bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert/**
19bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * {@icuenhanced java.text.BreakIterator}.{@icu _usage_}
20bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
21bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <p>A class that locates boundaries in text.  This class defines a protocol for
22bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * objects that break up a piece of natural-language text according to a set
23bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * of criteria.  Instances or subclasses of BreakIterator can be provided, for
24bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * example, to break a piece of text into words, sentences, or logical characters
25bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * according to the conventions of some language or group of languages.
26bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
27bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * We provide five built-in types of BreakIterator:
28bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul><li>getTitleInstance() returns a BreakIterator that locates boundaries
29bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * between title breaks.
30bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>getSentenceInstance() returns a BreakIterator that locates boundaries
31bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * between sentences.  This is useful for triple-click selection, for example.
32bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>getWordInstance() returns a BreakIterator that locates boundaries between
33bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * words.  This is useful for double-click selection or "find whole words" searches.
34bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * This type of BreakIterator makes sure there is a boundary position at the
35bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * beginning and end of each legal word.  (Numbers count as words, too.)  Whitespace
36bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * and punctuation are kept separate from real words.
37bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>getLineInstance() returns a BreakIterator that locates positions where it is
38bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * legal for a text editor to wrap lines.  This is similar to word breaking, but
39bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * not the same: punctuation and whitespace are generally kept with words (you don't
40bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * want a line to start with whitespace, for example), and some special characters
41bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * can force a position to be considered a line-break position or prevent a position
42bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * from being a line-break position.
43bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>getCharacterInstance() returns a BreakIterator that locates boundaries between
44bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * logical characters.  Because of the structure of the Unicode encoding, a logical
45bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * character may be stored internally as more than one Unicode code point.  (A with an
46bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * umlaut may be stored as an a followed by a separate combining umlaut character,
47bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * for example, but the user still thinks of it as one character.)  This iterator allows
48bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * various processes (especially text editors) to treat as characters the units of text
49bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * that a user would think of as characters, rather than the units of text that the
50bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * computer sees as "characters".</ul>
51bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
52bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * BreakIterator's interface follows an "iterator" model (hence the name), meaning it
53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * has a concept of a "current position" and methods like first(), last(), next(),
54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * and previous() that update the current position.  All BreakIterators uphold the
55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * following invariants:
56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <ul><li>The beginning and end of the text are always treated as boundary positions.
57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>The current position of the iterator is always a boundary position (random-
58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * access methods move the iterator to the nearest boundary position before or
59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * after the specified position, not _to_ the specified position).
60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>DONE is used as a flag to indicate when iteration has stopped.  DONE is only
61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * returned when the current position is the end of the text and the user calls next(),
62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * or when the current position is the beginning of the text and the user calls
63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * previous().
64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>Break positions are numbered by the positions of the characters that follow
65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * them.  Thus, under normal circumstances, the position before the first character
66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * is 0, the position after the first character is 1, and the position after the
67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * last character is 1 plus the length of the string.
68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <li>The client can change the position of an iterator, or the text it analyzes,
69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * at will, but cannot change the behavior.  If the user wants different behavior, he
70bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * must instantiate a new iterator.</ul>
71bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
72bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * BreakIterator accesses the text it analyzes through a CharacterIterator, which makes
73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * it possible to use BreakIterator to analyze text in any text-storage vehicle that
74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * provides a CharacterIterator interface.
75bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <b>Note:</b>  Some types of BreakIterator can take a long time to create, and
77bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * instances of BreakIterator are not currently cached by the system.  For
78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * optimal performance, keep instances of BreakIterator around as long as makes
79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * sense.  For example, when word-wrapping a document, don't create and destroy a
80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * new BreakIterator for each line.  Create one break iterator for the whole document
81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * (or whatever stretch of text you're wrapping) and use it to do the whole job of
82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * wrapping the text.
83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert  * <P>
85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <strong>Examples</strong>:<P>
86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Creating and using text boundaries
87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
88bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * public static void main(String args[]) {
90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *      if (args.length == 1) {
91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          String stringToExamine = args[0];
92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          //print each word in order
93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          BreakIterator boundary = BreakIterator.getWordInstance();
94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          boundary.setText(stringToExamine);
95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          printEachForward(boundary, stringToExamine);
96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          //print each sentence in reverse order
97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          boundary = BreakIterator.getSentenceInstance(Locale.US);
98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          boundary.setText(stringToExamine);
99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          printEachBackward(boundary, stringToExamine);
100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          printFirst(boundary, stringToExamine);
101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          printLast(boundary, stringToExamine);
102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *      }
103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * }
104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </pre>
105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Print each element in order
108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * public static void printEachForward(BreakIterator boundary, String source) {
111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int start = boundary.first();
112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     for (int end = boundary.next();
113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          end != BreakIterator.DONE;
114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          start = end, end = boundary.next()) {
115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          System.out.println(source.substring(start,end));
116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     }
117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * }
118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </pre>
119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Print each element in reverse order
122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * public static void printEachBackward(BreakIterator boundary, String source) {
125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int end = boundary.last();
126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     for (int start = boundary.previous();
127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          start != BreakIterator.DONE;
128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *          end = start, start = boundary.previous()) {
129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *         System.out.println(source.substring(start,end));
130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     }
131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * }
132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </pre>
133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Print first element
136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * public static void printFirst(BreakIterator boundary, String source) {
139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int start = boundary.first();
140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int end = boundary.next();
141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     System.out.println(source.substring(start,end));
142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * }
143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </pre>
144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Print last element
147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * public static void printLast(BreakIterator boundary, String source) {
150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int end = boundary.last();
151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int start = boundary.previous();
152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     System.out.println(source.substring(start,end));
153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * }
154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </pre>
155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Print the element at a specified position
158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * public static void printAt(BreakIterator boundary, int pos, String source) {
161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int end = boundary.following(pos);
162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int start = boundary.previous();
163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     System.out.println(source.substring(start,end));
164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * }
165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </pre>
166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Find the next word
169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <blockquote>
170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * <pre>
171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * public static int nextWordStartAfter(int pos, String text) {
172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     BreakIterator wb = BreakIterator.getWordInstance();
173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     wb.setText(text);
174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int last = wb.following(pos);
175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     int current = wb.next();
176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     while (current != BreakIterator.DONE) {
177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *         for (int p = last; p < current; p++) {
178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *             if (Character.isLetter(text.charAt(p)))
179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *                 return last;
180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *         }
181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *         last = current;
182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *         current = wb.next();
183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     }
184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *     return BreakIterator.DONE;
185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * }
186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </pre>
187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * (The iterator returned by BreakIterator.getWordInstance() is unique in that
188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * the break positions it returns don't represent both the start and end of the
189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * thing being iterated over.  That is, a sentence-break iterator returns breaks
190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * that each represent the end of one sentence and the beginning of the next.
191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * With the word-break iterator, the characters between two boundaries might be a
192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * word, or they might be the punctuation or whitespace between two words.  The
193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * above code uses a simple heuristic to determine which boundary is the beginning
194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * of a word: If the characters between this boundary and the next boundary
195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * include at least one letter (this can be an alphabetical letter, a CJK ideograph,
196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * a Hangul syllable, a Kana character, etc.), then the text between this boundary
197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * and the next is a word; otherwise, it's the material between words.)
198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * </blockquote>
199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @see CharacterIterator
201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @stable ICU 2.0
202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */
204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertpublic abstract class BreakIterator implements Cloneable
206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert{
207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Default constructor.  There is no state that is carried by this abstract
210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * base class.
211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    protected BreakIterator()
214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Clone method.  Creates another BreakIterator with the same behavior and
219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * current state as this one.
220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The clone.
221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public Object clone()
224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        try {
226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return super.clone();
227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        catch (CloneNotSupportedException e) {
229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            ///CLOVER:OFF
230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            throw new IllegalStateException();
231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            ///CLOVER:ON
232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * DONE is returned by previous() and next() after all valid
237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundaries have been returned.
238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int DONE = -1;
241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Return the first boundary position.  This is always the beginning
244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * index of the text this iterator iterates over.  For example, if
245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the iterator iterates over a whole string, this function will
246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * always return 0.  This function also updates the iteration position
247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to point to the beginning of the text.
248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The character offset of the beginning of the stretch of text
249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * being broken.
250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract int first();
253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Return the last boundary position.  This is always the "past-the-end"
256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * index of the text this iterator iterates over.  For example, if the
257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * iterator iterates over a whole string (call it "text"), this function
258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * will always return text.length().  This function also updated the
259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * iteration position to point to the end of the text.
260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The character offset of the end of the stretch of text
261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * being broken.
262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract int last();
265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Advances the specified number of steps forward in the text (a negative
268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * number, therefore, advances backwards).  If this causes the iterator
269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to advance off either end of the text, this function returns DONE;
270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * otherwise, this function returns the position of the appropriate
271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundary.  Calling this function is equivalent to calling next() or
272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * previous() n times.
273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param n The number of boundaries to advance over (if positive, moves
274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * forward; if negative, moves backwards).
275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The position of the boundary n boundaries from the current
276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * iteration position, or DONE if moving n boundaries causes the iterator
277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to advance off either end of the text.
278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract int next(int n);
281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Advances the iterator forward one boundary.  The current iteration
284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * position is updated to point to the next boundary position after the
285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * current position, and this is also the value that is returned.  If
286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the current position is equal to the value returned by last(), or to
287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * DONE, this function returns DONE and sets the current position to
288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * DONE.
289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The position of the first boundary position following the
290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * iteration position.
291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract int next();
294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Advances the iterator backward one boundary.  The current iteration
297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * position is updated to point to the last boundary position before
298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the current position, and this is also the value that is returned.  If
299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * the current position is equal to the value returned by first(), or to
300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * DONE, this function returns DONE and sets the current position to
301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * DONE.
302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The position of the last boundary position preceding the
303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * iteration position.
304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract int previous();
307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the iterator's current iteration position to be the first
310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundary position following the specified position.  (Whether the
311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * specified position is itself a boundary position or not doesn't
312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * matter-- this function always moves the iteration position to the
313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * first boundary after the specified position.)  If the specified
314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * position is the past-the-end position, returns DONE.
315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param offset The character position to start searching from.
316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The position of the first boundary position following
317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * "offset" (whether or not "offset" itself is a boundary position),
318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * or DONE if "offset" is the past-the-end offset.
319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract int following(int offset);
322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the iterator's current iteration position to be the last
325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundary position preceding the specified position.  (Whether the
326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * specified position is itself a boundary position or not doesn't
327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * matter-- this function always moves the iteration position to the
328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * last boundary before the specified position.)  If the specified
329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * position is the starting position, returns DONE.
330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param offset The character position to start searching from.
331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The position of the last boundary position preceding
332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * "offset" (whether of not "offset" itself is a boundary position),
333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * or DONE if "offset" is the starting offset of the iterator.
334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int preceding(int offset) {
337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // NOTE:  This implementation is here solely because we can't add new
338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // abstract methods to an existing class.  There is almost ALWAYS a
339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // better, faster way to do this.
340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int pos = following(offset);
341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        while (pos >= offset && pos != DONE)
342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            pos = previous();
343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return pos;
344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Return true if the specfied position is a boundary position.  If the
348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * function returns true, the current iteration position is set to the
349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * specified position; if the function returns false, the current
350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * iteration position is set as though following() had been called.
351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param offset the offset to check.
352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return True if "offset" is a boundary position.
353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public boolean isBoundary(int offset) {
356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // Again, this is the default implementation, which is provided solely because
357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // we couldn't add a new abstract method to an existing class.  The real
358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // implementations will usually need to do a little more work.
359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (offset == 0) {
360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return true;
361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        else
363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return following(offset - 1) == offset;
364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Return the iterator's current position.
368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return The iterator's current position.
369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract int current();
372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a CharacterIterator over the text being analyzed.
375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For at least some subclasses of BreakIterator, this is a reference
376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to the <b>actual iterator being used</b> by the BreakIterator,
377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * and therefore, this function's return value should be treated as
378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * <tt>const</tt>.  No guarantees are made about the current position
379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * of this iterator when it is returned.  If you need to move that
380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * position to examine the text, clone this function's return value first.
381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A CharacterIterator over the text being analyzed.
382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract CharacterIterator getText();
385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the iterator to analyze a new piece of text.  The new
388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * piece of text is passed in as a String, and the current
389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * iteration position is reset to the beginning of the string.
390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * (The old text is dropped.)
391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param newText A String containing the text to analyze with
392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * this BreakIterator.
393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void setText(String newText)
396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        setText(new StringCharacterIterator(newText));
398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the iterator to analyze a new piece of text.  The
402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * BreakIterator is passed a CharacterIterator through which
403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * it will access the text itself.  The current iteration
404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * position is reset to the CharacterIterator's start index.
405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * (The old iterator is dropped.)
406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param newText A CharacterIterator referring to the text
407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * to analyze with this BreakIterator (the iterator's current
408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * position is ignored, but its other state is significant).
409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public abstract void setText(CharacterIterator newText);
412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}
415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.4
416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int KIND_CHARACTER = 0;
418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}
420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.4
421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int KIND_WORD = 1;
423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}
425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.4
426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int KIND_LINE = 2;
428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu}
430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.4
431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static final int KIND_SENTENCE = 3;
433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu}
435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.4
436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static final int KIND_TITLE = 4;
438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
440bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates word boundaries.
441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * This function assumes that the text being analyzed is in the default
442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * locale's language.
443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return An instance of BreakIterator that locates word boundaries.
444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getWordInstance()
447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getWordInstance(Locale.getDefault());
449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
450bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
451bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
452bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates word boundaries.
453bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A locale specifying the language of the text to be
454bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * analyzed.
455bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return An instance of BreakIterator that locates word boundaries.
456bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
457bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
458bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getWordInstance(Locale where)
459bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
460bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where, KIND_WORD);
461bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
462bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
463bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
464bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns a new instance of BreakIterator that locates word boundaries.
465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A locale specifying the language of the text to be
466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * analyzed.
467bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return An instance of BreakIterator that locates word boundaries.
468bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
469bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
470bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getWordInstance(ULocale where)
471bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
472bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where.toLocale(), KIND_WORD);
473bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
474bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
475bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
476bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates legal line-
477bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * wrapping positions.  This function assumes the text being broken
478bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * is in the default locale's language.
479bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates legal
480bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * line-wrapping positions.
481bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
482bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
483bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getLineInstance()
484bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
485bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getLineInstance(Locale.getDefault());
486bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
487bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
488bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
489bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates legal line-
490bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * wrapping positions.
491bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A Locale specifying the language of the text being broken.
492bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates legal
493bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * line-wrapping positions.
494bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
495bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
496bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getLineInstance(Locale where)
497bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
498bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where, KIND_LINE);
499bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
500bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
501bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
502bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns a new instance of BreakIterator that locates legal line-
503bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * wrapping positions.
504bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A Locale specifying the language of the text being broken.
505bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates legal
506bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * line-wrapping positions.
507bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
508bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
509bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getLineInstance(ULocale where)
510bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
511bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where.toLocale(), KIND_LINE);
512bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
513bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
514bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
515bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates logical-character
516bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundaries.  This function assumes that the text being analyzed is
517bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * in the default locale's language.
518bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates logical-character
519bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundaries.
520bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
521bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
522bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getCharacterInstance()
523bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
524bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getCharacterInstance(Locale.getDefault());
525bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
526bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
527bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
528bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates logical-character
529bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundaries.
530bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A Locale specifying the language of the text being analyzed.
531bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates logical-character
532bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundaries.
533bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
534bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
535bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getCharacterInstance(Locale where)
536bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
537bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where, KIND_CHARACTER);
538bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
539bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
540bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
541bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns a new instance of BreakIterator that locates logical-character
542bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundaries.
543bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A Locale specifying the language of the text being analyzed.
544bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates logical-character
545bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * boundaries.
546bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
547bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
548bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getCharacterInstance(ULocale where)
549bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
550bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where.toLocale(), KIND_CHARACTER);
551bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
552bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
553bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
554bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates sentence boundaries.
555bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * This function assumes the text being analyzed is in the default locale's
556bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * language.
557bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates sentence boundaries.
558bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
559bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
560bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getSentenceInstance()
561bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
562bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getSentenceInstance(Locale.getDefault());
563bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
564bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
565bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
566bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a new instance of BreakIterator that locates sentence boundaries.
567bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A Locale specifying the language of the text being analyzed.
568bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates sentence boundaries.
569bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.0
570bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
571bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getSentenceInstance(Locale where)
572bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
573bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where, KIND_SENTENCE);
574bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
575bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
576bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
577bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns a new instance of BreakIterator that locates sentence boundaries.
578bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param where A Locale specifying the language of the text being analyzed.
579bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return A new instance of BreakIterator that locates sentence boundaries.
580bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 3.2
581bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
582bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getSentenceInstance(ULocale where)
583bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
584bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where.toLocale(), KIND_SENTENCE);
585bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
586bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
587bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
588bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Returns a new instance of BreakIterator that locates title boundaries.
589bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * This function assumes the text being analyzed is in the default locale's
590bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * language. The iterator returned locates title boundaries as described for
591bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration,
592bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * please use a word boundary iterator. {@link #getWordInstance}
593bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return A new instance of BreakIterator that locates title boundaries.
594bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
595bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
596bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static BreakIterator getTitleInstance()
597bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    {
598bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        return getTitleInstance(Locale.getDefault());
599bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
600bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
601bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
602bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Returns a new instance of BreakIterator that locates title boundaries.
603bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * The iterator returned locates title boundaries as described for
604bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration,
605bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * please use Word Boundary iterator.{@link #getWordInstance}
606bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param where A Locale specifying the language of the text being analyzed.
607bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return A new instance of BreakIterator that locates title boundaries.
608bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.0
609bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
610bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static BreakIterator getTitleInstance(Locale where)
611bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    {
612bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        return getBreakInstance(where, KIND_TITLE);
613bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
614bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
615bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
616bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Returns a new instance of BreakIterator that locates title boundaries.
617bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * The iterator returned locates title boundaries as described for
618bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration,
619bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * please use Word Boundary iterator.{@link #getWordInstance}
620bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param where A Locale specifying the language of the text being analyzed.
621bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return A new instance of BreakIterator that locates title boundaries.
622bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 3.2
623bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//s     */
624bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static BreakIterator getTitleInstance(ULocale where)
625bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    {
626bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        return getBreakInstance(where.toLocale(), KIND_TITLE);
627bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
628bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
629bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
630bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Registers a new break iterator of the indicated kind, to use in the given
631bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * locale.  Clones of the iterator will be returned if a request for a break iterator
632bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * of the given kind matches or falls back to this locale.
633bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param iter the BreakIterator instance to adopt.
634bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param locale the Locale for which this instance is to be registered
635bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param kind the type of iterator for which this instance is to be registered
636bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return a registry key that can be used to unregister this instance
637bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.4
638bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
639bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static Object registerInstance(BreakIterator iter, Locale locale, int kind) {
640bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        throw new UnsupportedOperationException("Method not supported by com.ibm.icu.base");
641bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
642bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
643bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
644bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Registers a new break iterator of the indicated kind, to use in the given
645bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * locale.  Clones of the iterator will be returned if a request for a break iterator
646bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * of the given kind matches or falls back to this locale.
647bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param iter the BreakIterator instance to adopt.
648bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param locale the Locale for which this instance is to be registered
649bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param kind the type of iterator for which this instance is to be registered
650bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return a registry key that can be used to unregister this instance
651bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 3.2
652bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
653bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static Object registerInstance(BreakIterator iter, ULocale locale, int kind) {
654bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        throw new UnsupportedOperationException("Method not supported by com.ibm.icu.base");
655bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
656bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
657bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
658bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Unregisters a previously-registered BreakIterator using the key returned
659bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * from the register call.  Key becomes invalid after this call and should not be used
660bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * again.
661bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param key the registry key returned by a previous call to registerInstance
662bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return true if the iterator for the key was successfully unregistered
663bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @stable ICU 2.4
664bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
665bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public static boolean unregister(Object key) {
666bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        throw new UnsupportedOperationException("Method not supported by com.ibm.icu.base");
667bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
668bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
669bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // end of registration
670bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
671bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
672bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a particular kind of BreakIterator for a locale.
673bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Avoids writing a switch statement with getXYZInstance(where) calls.
674bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @internal
675bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @deprecated This API is ICU internal only.
676bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
677bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static BreakIterator getBreakInstance(ULocale where, int kind) {
678bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return getBreakInstance(where.toLocale(), KIND_SENTENCE);
679bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
680bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
681bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static BreakIterator getBreakInstance(Locale where, int kind) {
682bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        java.text.BreakIterator br = null;
683bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        switch(kind) {
684bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case KIND_CHARACTER: br = java.text.BreakIterator.getCharacterInstance(where); break;
685bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case KIND_WORD: br = java.text.BreakIterator.getWordInstance(where); break;
686bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case KIND_LINE: br = java.text.BreakIterator.getLineInstance(where); break;
687bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        case KIND_SENTENCE: br = java.text.BreakIterator.getSentenceInstance(where); break;
688bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        case KIND_TITLE: throw new UnsupportedOperationException("Title break is not supported by com.ibm.icu.base");
689bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
690bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new BreakIteratorHandle(br);
691bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
692bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
693bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
694bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns a list of locales for which BreakIterators can be used.
695bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return An array of Locales.  All of the locales in the array can
696bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * be used when creating a BreakIterator.
697bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @stable ICU 2.6
698bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
699bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized Locale[] getAvailableLocales() {
700bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return java.text.BreakIterator.getAvailableLocales();
701bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
702bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
703bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
704bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * {@icu} Returns a list of locales for which BreakIterators can be used.
705bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @return An array of Locales.  All of the locales in the array can
706bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * be used when creating a BreakIterator.
707bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @draft ICU 3.2 (retain)
708bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @provisional This API might change or be removed in a future release.
709bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
710bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public static synchronized ULocale[] getAvailableULocales() {
711bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        Locale[] locales = java.text.BreakIterator.getAvailableLocales();
712bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        ULocale[] ulocales = new ULocale[locales.length];
713bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        for (int i = 0; i < locales.length; ++i) {
714bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            ulocales[i] = ULocale.forLocale(locales[i]);
715bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
716bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return ulocales;
717bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
718bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
719bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    /**
720bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * {@icu} Returns the locale that was used to create this object, or null.
721bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * This may may differ from the locale requested at the time of
722bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * this object's creation.  For example, if an object is created
723bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * for locale <tt>en_US_CALIFORNIA</tt>, the actual data may be
724bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * drawn from <tt>en</tt> (the <i>actual</i> locale), and
725bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <tt>en_US</tt> may be the most specific locale that exists (the
726bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <i>valid</i> locale).
727bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     *
728bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * <p>Note: The <i>actual</i> locale is returned correctly, but the <i>valid</i>
729bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * locale is not, in most cases.
730bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @param type type of information requested, either {@link
731bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * com.ibm.icu.util.ULocale#VALID_LOCALE} or {@link
732bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * com.ibm.icu.util.ULocale#ACTUAL_LOCALE}.
733bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @return the information specified by <i>type</i>, or null if
734bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * this object was not constructed from locale data.
735bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see com.ibm.icu.util.ULocale
736bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see com.ibm.icu.util.ULocale#VALID_LOCALE
737bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE
738bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @draft ICU 2.8 (retain)
739bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     * @provisional This API might change or be removed in a future release.
740bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//     */
741bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    public final ULocale getLocale(ULocale.Type type) {
742bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//        throw new UnsupportedOperationException("Method not supported by com.ibm.icu.base");
743bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert//    }
744bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
745bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // forwarding implementation class
746bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    static final class BreakIteratorHandle extends BreakIterator {
747bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        /**
748bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @internal
749bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         */
750bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public final java.text.BreakIterator breakIterator;
751bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
752bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        /**
753bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @internal
754bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @param delegate the BreakIterator to which to delegate
755bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         */
756bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public BreakIteratorHandle(java.text.BreakIterator delegate) {
757bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            this.breakIterator = delegate;
758bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
759bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
760bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int first() {
761bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.first();
762bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
763bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int last() {
764bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.last();
765bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
766bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int next(int n) {
767bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.next(n);
768bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
769bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int next() {
770bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.next();
771bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
772bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int previous() {
773bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.previous();
774bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
775bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int following(int offset) {
776bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.following(offset);
777bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
778bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int preceding(int offset) {
779bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.preceding(offset);
780bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
781bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public boolean isBoundary(int offset) {
782bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.isBoundary(offset);
783bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
784bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int current() {
785bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.current();
786bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
787bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public CharacterIterator getText() {
788bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.getText();
789bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
790bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public void setText(CharacterIterator newText) {
791bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            breakIterator.setText(newText);
792bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
793bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
794bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        /**
795bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * Return a string suitable for debugging.
796bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @return a string suitable for debugging
797bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @stable ICU 3.4.3
798bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         */
799bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public String toString() {
800bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.toString();
801bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
802bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
803bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        /**
804bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * Return a clone of this BreakIterator.
805bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @return a clone of this BreakIterator
806bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @stable ICU 3.4.3
807bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         */
808bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public Object clone() {
809bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return new BreakIteratorHandle((java.text.BreakIterator)breakIterator.clone());
810bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
811bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
812bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        /**
813bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * Return true if rhs is a BreakIterator with the same break behavior as this.
814bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @return true if rhs equals this
815bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @stable ICU 3.4.3
816bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         */
817bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public boolean equals(Object rhs) {
818bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            try {
819bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                return breakIterator.equals(((BreakIteratorHandle)rhs).breakIterator);
820bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
821bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            catch (Exception e) {
822bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                return false;
823bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
824bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
825bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
826bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        /**
827bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * Return a hashCode.
828bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @return a hashCode
829bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         * @stable ICU 3.4.3
830bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert         */
831bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        public int hashCode() {
832bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            return breakIterator.hashCode();
833bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
834bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
835bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
836