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 < 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