1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
21162b0775772fa66b7eb634760a8159a60c1ddceaElliott Hughesimport libcore.icu.ICU;
22c27a366a89e470690e99374b15270e7b9169ade1Elliott Hughesimport libcore.icu.NativeBreakIterator;
23fe1eba10c5d69e115dfab55d82cc22d42e9fbae5Elliott Hughes
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Locates boundaries in text. This class defines a protocol for objects that
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * break up a piece of natural-language text according to a set of criteria.
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Instances or subclasses of {@code BreakIterator} can be provided, for
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, to break a piece of text into words, sentences, or logical
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters according to the conventions of some language or group of
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * languages. We provide four built-in types of {@code BreakIterator}:
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>{@link #getSentenceInstance()} returns a {@code BreakIterator} that
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * locates boundaries between sentences. This is useful for triple-click
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * selection, for example.</li>
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>{@link #getWordInstance()} returns a {@code BreakIterator} that locates
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * boundaries between words. This is useful for double-click selection or "find
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * whole words" searches. This type of {@code BreakIterator} makes sure there is
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a boundary position at the beginning and end of each legal word (numbers
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * count as words, too). Whitespace and punctuation are kept separate from real
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * words.</li>
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>{@code getLineInstance()} returns a {@code BreakIterator} that locates
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positions where it is legal for a text editor to wrap lines. This is similar
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to word breaking, but not the same: punctuation and whitespace are generally
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * kept with words (you don't want a line to start with whitespace, for
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example), and some special characters can force a position to be considered a
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * line break position or prevent a position from being a line break position.</li>
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>{@code getCharacterInstance()} returns a {@code BreakIterator} that
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * locates boundaries between logical characters. Because of the structure of
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the Unicode encoding, a logical character may be stored internally as more
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * than one Unicode code point. (A with an umlaut may be stored as an a followed
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by a separate combining umlaut character, for example, but the user still
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thinks of it as one character.) This iterator allows various processes
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (especially text editors) to treat as characters the units of text that a
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * user would think of as characters, rather than the units of text that the
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * computer sees as "characters".</li>
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> {@code BreakIterator}'s interface follows an "iterator" model (hence
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name), meaning it has a concept of a "current position" and methods like
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code first()}, {@code last()}, {@code next()}, and {@code previous()} that
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * update the current position. All {@code BreakIterator}s uphold the following
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invariants:
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The beginning and end of the text are always treated as boundary
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positions.</li>
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The current position of the iterator is always a boundary position
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (random- access methods move the iterator to the nearest boundary position
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before or after the specified position, not <i>to</i> the specified
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position).</li>
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>{@code DONE} is used as a flag to indicate when iteration has stopped.
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DONE} is only returned when the current position is the end of the
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * text and the user calls {@code next()}, or when the current position is the
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * beginning of the text and the user calls {@code previous()}.</li>
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Break positions are numbered by the positions of the characters that
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * follow them. Thus, under normal circumstances, the position before the first
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * character is 0, the position after the first character is 1, and the position
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after the last character is 1 plus the length of the string.</li>
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The client can change the position of an iterator, or the text it
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * analyzes, at will, but cannot change the behavior. If the user wants
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * different behavior, he must instantiate a new iterator.</li>
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code BreakIterator} accesses the text it analyzes through a
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link CharacterIterator}, which makes it possible to use {@code
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * BreakIterator} to analyze text in any text-storage vehicle that provides a
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code CharacterIterator} interface.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Note:</em> Some types of {@code BreakIterator} can take a long time to
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * create, and instances of {@code BreakIterator} are not currently cached by
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the system. For optimal performance, keep instances of {@code BreakIterator}
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * around as long as it makes sense. For example, when word-wrapping a document,
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * don't create and destroy a new {@code BreakIterator} for each line. Create
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one break iterator for the whole document (or whatever stretch of text you're
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * wrapping) and use it to do the whole job of wrapping the text.
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Examples</em>:
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creating and using text boundaries:
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
989b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public static void main(String args[]) {
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     if (args.length == 1) {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         String stringToExamine = args[0];
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         //print each word in order
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         BreakIterator boundary = BreakIterator.getWordInstance();
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         boundary.setText(stringToExamine);
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         printEachForward(boundary, stringToExamine);
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         //print each sentence in reverse order
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         boundary = BreakIterator.getSentenceInstance(Locale.US);
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         boundary.setText(stringToExamine);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         printEachBackward(boundary, stringToExamine);
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         printFirst(boundary, stringToExamine);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         printLast(boundary, stringToExamine);
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
1169b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Print each element in order:
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
1219b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public static void printEachForward(BreakIterator boundary, String source) {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int start = boundary.first();
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) {
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         System.out.println(source.substring(start, end));
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
1309b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Print each element in reverse order:
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
1359b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public static void printEachBackward(BreakIterator boundary, String source) {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int end = boundary.last();
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     for (int start = boundary.previous(); start != BreakIterator.DONE; end = start, start = boundary
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             .previous()) {
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         System.out.println(source.substring(start, end));
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
1459b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Print the first element:
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
1509b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public static void printFirst(BreakIterator boundary, String source) {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int start = boundary.first();
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int end = boundary.next();
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     System.out.println(source.substring(start, end));
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
1589b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Print the last element:
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
1639b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public static void printLast(BreakIterator boundary, String source) {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int end = boundary.last();
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int start = boundary.previous();
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     System.out.println(source.substring(start, end));
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
1719b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Print the element at a specified position:
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
1769b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public static void printAt(BreakIterator boundary, int pos, String source) {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int end = boundary.following(pos);
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int start = boundary.previous();
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     System.out.println(source.substring(start, end));
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
1849b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Find the next word:
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
1899b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public static int nextWordStartAfter(int pos, String text) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     BreakIterator wb = BreakIterator.getWordInstance();
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     wb.setText(text);
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int last = wb.following(pos);
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     int current = wb.next();
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     while (current != BreakIterator.DONE) {
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         for (int p = last; p &lt; current; p++) {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             if (Character.isLetter(text.charAt(p)))
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                 return last;
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         }
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         last = current;
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         current = wb.next();
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     return BreakIterator.DONE;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
2079b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The iterator returned by {@code BreakIterator.getWordInstance()} is unique in
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that the break positions it returns don't represent both the start and end of
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the thing being iterated over. That is, a sentence-break iterator returns
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * breaks that each represent the end of one sentence and the beginning of the
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * next. With the word-break iterator, the characters between two boundaries
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * might be a word, or they might be the punctuation or whitespace between two
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * words. The above code uses a simple heuristic to determine which boundary is
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the beginning of a word: If the characters between this boundary and the next
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * boundary include at least one letter (this can be an alphabetical letter, a
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CJK ideograph, a Hangul syllable, a Kana character, etc.), then the text
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * between this boundary and the next is a word; otherwise, it's the material
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * between words.)
2229b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see CharacterIterator
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class BreakIterator implements Cloneable {
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This constant is returned by iterate methods like {@code previous()} or
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code next()} if they have returned all valid boundaries.
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DONE = -1;
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // the wrapped ICU implementation
2349672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes    NativeBreakIterator wrapped;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
237c4a9c063cb234987b4dea66b5d1d26be8e754d0bElliott Hughes     * Default constructor, for use by subclasses.
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected BreakIterator() {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * wrapping constructor
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2459672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes    BreakIterator(NativeBreakIterator iterator) {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        wrapped = iterator;
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
25093f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * Returns an array of locales for which custom {@code BreakIterator} instances
25193f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * are available.
252d2d7abef3e9b73a57cdf1f2afd678d7f48945679Elliott Hughes     * <p>Note that Android does not support user-supplied locale service providers.
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Locale[] getAvailableLocales() {
255757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return ICU.getAvailableBreakIteratorLocales();
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
2603106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * characters using the user's default locale.
2613106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the default locale.
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getCharacterInstance() {
2659672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return getCharacterInstance(Locale.getDefault());
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters using the given locale.
271f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param where
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given locale.
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the given locale.
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getCharacterInstance(Locale where) {
2779672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getCharacterInstance(where));
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {{@code BreakIterator} to iterate over
2823106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * line breaks using the user's default locale.
2833106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the default locale.
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getLineInstance() {
2879672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return getLineInstance(Locale.getDefault());
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * line breaks using the given locale.
293f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param where
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given locale.
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the given locale.
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if {@code where} is {@code null}.
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getLineInstance(Locale where) {
3009672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getLineInstance(where));
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sentence-breaks using the default locale.
3063106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the default locale.
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getSentenceInstance() {
3109672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return getSentenceInstance(Locale.getDefault());
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sentence-breaks using the given locale.
316f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param where
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given locale.
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the given locale.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if {@code where} is {@code null}.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getSentenceInstance(Locale where) {
3239672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getSentenceInstance(where));
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * word-breaks using the default locale.
3293106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the default locale.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getWordInstance() {
3339672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return getWordInstance(Locale.getDefault());
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * word-breaks using the given locale.
339f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param where
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given locale.
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the given locale.
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if {@code where} is {@code null}.
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getWordInstance(Locale where) {
3469672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getWordInstance(where));
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the given offset is a boundary position. If this method
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns true, the current iteration position is set to the given
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * position; if the function returns false, the current iteration position
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is set as though {@link #following(int)} had been called.
354f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given offset to check.
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the given offset is a boundary position; {@code
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isBoundary(int offset) {
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return wrapped.isBoundary(offset);
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the position of last boundary preceding the given offset, and
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sets the current position to the returned value, or {@code DONE} if the
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * given offset specifies the starting position.
3689b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given start position to be searched for.
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the last boundary preceding the given offset.
3729b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
3739b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the offset is invalid.
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int preceding(int offset) {
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return wrapped.preceding(offset);
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the new text string to be analyzed, the current position will be
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reset to the beginning of this new string, and the old string will be
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * lost.
383f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newText
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new text string to be analyzed.
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setText(String newText) {
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        wrapped.setText(newText);
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns this iterator's current position.
393f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this iterator's current position.
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int current();
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the first boundary and returns
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that position.
401f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the first boundary.
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int first();
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the position of the first boundary to the one following the given
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * offset and returns this position. Returns {@code DONE} if there is no
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boundary after the given offset.
4109b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given position to be searched for.
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the first boundary following the given offset.
4149b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
4159b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the offset is invalid.
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int following(int offset);
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code CharacterIterator} which represents the text being
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * analyzed. Please note that the returned value is probably the internal
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * iterator used by this object. If the invoker wants to modify the status
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the returned iterator, it is recommended to first create a clone of
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the iterator returned.
425f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code CharacterIterator} which represents the text being
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         analyzed.
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract CharacterIterator getText();
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the last boundary and returns
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that position.
434f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int last();
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the next boundary after the
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * current position, and returns this position. Returns {@code DONE} if no
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boundary was found after the current position.
443f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int next();
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the next boundary after the
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * given position, and returns that position. Returns {@code DONE} if no
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boundary was found after the given position.
452f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param n
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given position.
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int next(int n);
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the previous boundary before the
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * current position and returns that position. Returns {@code DONE} if
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * no boundary was found before the current position.
463f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int previous();
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the new text to be analyzed by the given {@code CharacterIterator}.
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The position will be reset to the beginning of the new text, and other
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * status information of this iterator will be kept.
472f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newText
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code CharacterIterator} referring to the text to be
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            analyzed.
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void setText(CharacterIterator newText);
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
480fe711d61cafbb878d1d6a5e223fcd2201f2e829aElliott Hughes     * Returns a copy of this iterator.
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            BreakIterator cloned = (BreakIterator) super.clone();
4869672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes            cloned.wrapped = (NativeBreakIterator) wrapped.clone();
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return cloned;
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
489fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            throw new AssertionError(e);
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
493