| /* |
| * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package java.awt.font; |
| |
| import java.text.CharacterIterator; |
| |
| class CharArrayIterator implements CharacterIterator { |
| |
| private char[] chars; |
| private int pos; |
| private int begin; |
| |
| CharArrayIterator(char[] chars) { |
| |
| reset(chars, 0); |
| } |
| |
| CharArrayIterator(char[] chars, int begin) { |
| |
| reset(chars, begin); |
| } |
| |
| /** |
| * Sets the position to getBeginIndex() and returns the character at that |
| * position. |
| * @return the first character in the text, or DONE if the text is empty |
| * @see #getBeginIndex |
| */ |
| public char first() { |
| |
| pos = 0; |
| return current(); |
| } |
| |
| /** |
| * Sets the position to getEndIndex()-1 (getEndIndex() if the text is empty) |
| * and returns the character at that position. |
| * @return the last character in the text, or DONE if the text is empty |
| * @see #getEndIndex |
| */ |
| public char last() { |
| |
| if (chars.length > 0) { |
| pos = chars.length-1; |
| } |
| else { |
| pos = 0; |
| } |
| return current(); |
| } |
| |
| /** |
| * Gets the character at the current position (as returned by getIndex()). |
| * @return the character at the current position or DONE if the current |
| * position is off the end of the text. |
| * @see #getIndex |
| */ |
| public char current() { |
| |
| if (pos >= 0 && pos < chars.length) { |
| return chars[pos]; |
| } |
| else { |
| return DONE; |
| } |
| } |
| |
| /** |
| * Increments the iterator's index by one and returns the character |
| * at the new index. If the resulting index is greater or equal |
| * to getEndIndex(), the current index is reset to getEndIndex() and |
| * a value of DONE is returned. |
| * @return the character at the new position or DONE if the new |
| * position is off the end of the text range. |
| */ |
| public char next() { |
| |
| if (pos < chars.length-1) { |
| pos++; |
| return chars[pos]; |
| } |
| else { |
| pos = chars.length; |
| return DONE; |
| } |
| } |
| |
| /** |
| * Decrements the iterator's index by one and returns the character |
| * at the new index. If the current index is getBeginIndex(), the index |
| * remains at getBeginIndex() and a value of DONE is returned. |
| * @return the character at the new position or DONE if the current |
| * position is equal to getBeginIndex(). |
| */ |
| public char previous() { |
| |
| if (pos > 0) { |
| pos--; |
| return chars[pos]; |
| } |
| else { |
| pos = 0; |
| return DONE; |
| } |
| } |
| |
| /** |
| * Sets the position to the specified position in the text and returns that |
| * character. |
| * @param position the position within the text. Valid values range from |
| * getBeginIndex() to getEndIndex(). An IllegalArgumentException is thrown |
| * if an invalid value is supplied. |
| * @return the character at the specified position or DONE if the specified position is equal to getEndIndex() |
| */ |
| public char setIndex(int position) { |
| |
| position -= begin; |
| if (position < 0 || position > chars.length) { |
| throw new IllegalArgumentException("Invalid index"); |
| } |
| pos = position; |
| return current(); |
| } |
| |
| /** |
| * Returns the start index of the text. |
| * @return the index at which the text begins. |
| */ |
| public int getBeginIndex() { |
| return begin; |
| } |
| |
| /** |
| * Returns the end index of the text. This index is the index of the first |
| * character following the end of the text. |
| * @return the index after the last character in the text |
| */ |
| public int getEndIndex() { |
| return begin+chars.length; |
| } |
| |
| /** |
| * Returns the current index. |
| * @return the current index. |
| */ |
| public int getIndex() { |
| return begin+pos; |
| } |
| |
| /** |
| * Create a copy of this iterator |
| * @return A copy of this |
| */ |
| public Object clone() { |
| CharArrayIterator c = new CharArrayIterator(chars, begin); |
| c.pos = this.pos; |
| return c; |
| } |
| |
| void reset(char[] chars) { |
| reset(chars, 0); |
| } |
| |
| void reset(char[] chars, int begin) { |
| |
| this.chars = chars; |
| this.begin = begin; |
| pos = 0; |
| } |
| } |