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.
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
272a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes    public static BreakIterator getCharacterInstance(Locale locale) {
273a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getCharacterInstance(locale));
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {{@code BreakIterator} to iterate over
2783106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * line breaks using the user's default locale.
2793106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the default locale.
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getLineInstance() {
2839672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return getLineInstance(Locale.getDefault());
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * line breaks using the given locale.
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
290a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes    public static BreakIterator getLineInstance(Locale locale) {
291a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getLineInstance(locale));
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sentence-breaks using the default locale.
2973106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the default locale.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getSentenceInstance() {
3019672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return getSentenceInstance(Locale.getDefault());
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sentence-breaks using the given locale.
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
308a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes    public static BreakIterator getSentenceInstance(Locale locale) {
309a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getSentenceInstance(locale));
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * word-breaks using the default locale.
3153106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code BreakIterator} using the default locale.
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static BreakIterator getWordInstance() {
3199672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes        return getWordInstance(Locale.getDefault());
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code BreakIterator} to iterate over
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * word-breaks using the given locale.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
326a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes    public static BreakIterator getWordInstance(Locale locale) {
327a94266074c7b82720fd2cecfb37ab8da85f1b296Elliott Hughes        return new RuleBasedBreakIterator(NativeBreakIterator.getWordInstance(locale));
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the given offset is a boundary position. If this method
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns true, the current iteration position is set to the given
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * position; if the function returns false, the current iteration position
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is set as though {@link #following(int)} had been called.
335f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given offset to check.
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the given offset is a boundary position; {@code
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isBoundary(int offset) {
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return wrapped.isBoundary(offset);
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the position of last boundary preceding the given offset, and
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sets the current position to the returned value, or {@code DONE} if the
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * given offset specifies the starting position.
3499b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given start position to be searched for.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the last boundary preceding the given offset.
3539b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
3549b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the offset is invalid.
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int preceding(int offset) {
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return wrapped.preceding(offset);
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the new text string to be analyzed, the current position will be
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reset to the beginning of this new string, and the old string will be
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * lost.
364f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newText
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new text string to be analyzed.
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setText(String newText) {
369db1a2e3641d679faf34ce6532c487ab0236550a1Elliott Hughes        if (newText == null) {
370db1a2e3641d679faf34ce6532c487ab0236550a1Elliott Hughes            throw new NullPointerException("newText == null");
371db1a2e3641d679faf34ce6532c487ab0236550a1Elliott Hughes        }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        wrapped.setText(newText);
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns this iterator's current position.
377f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this iterator's current position.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int current();
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the first boundary and returns
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that position.
385f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the first boundary.
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int first();
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the position of the first boundary to the one following the given
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * offset and returns this position. Returns {@code DONE} if there is no
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boundary after the given offset.
3949b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given position to be searched for.
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the first boundary following the given offset.
3989b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
3999b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the offset is invalid.
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int following(int offset);
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code CharacterIterator} which represents the text being
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * analyzed. Please note that the returned value is probably the internal
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * iterator used by this object. If the invoker wants to modify the status
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the returned iterator, it is recommended to first create a clone of
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the iterator returned.
409f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code CharacterIterator} which represents the text being
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         analyzed.
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract CharacterIterator getText();
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the last boundary and returns
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that position.
418f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int last();
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the next boundary after the
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * current position, and returns this position. Returns {@code DONE} if no
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boundary was found after the current position.
427f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int next();
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the next boundary after the
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * given position, and returns that position. Returns {@code DONE} if no
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * boundary was found after the given position.
436f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param n
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the given position.
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int next(int n);
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets this iterator's current position to the previous boundary before the
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * current position and returns that position. Returns {@code DONE} if
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * no boundary was found before the current position.
447f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of last boundary.
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int previous();
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the new text to be analyzed by the given {@code CharacterIterator}.
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The position will be reset to the beginning of the new text, and other
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * status information of this iterator will be kept.
456f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newText
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code CharacterIterator} referring to the text to be
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            analyzed.
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void setText(CharacterIterator newText);
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
464fe711d61cafbb878d1d6a5e223fcd2201f2e829aElliott Hughes     * Returns a copy of this iterator.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            BreakIterator cloned = (BreakIterator) super.clone();
4709672b4887f2972c1b7c5f3d1a6cf882deccf857fElliott Hughes            cloned.wrapped = (NativeBreakIterator) wrapped.clone();
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return cloned;
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
473fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            throw new AssertionError(e);
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
477