001: /*
002: * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved.
003: *
004: * The program is provided "as is" without any warranty express or
005: * implied, including the warranty of non-infringement and the implied
006: * warranties of merchantibility and fitness for a particular purpose.
007: * IBM will not be liable for any damages suffered by you as a result
008: * of using the Program. In no event will IBM be liable for any
009: * special, indirect or consequential damages or lost profits even if
010: * IBM has been advised of the possibility of their occurrence. IBM
011: * will not be liable for any third party claims against you.
012: */
013: package com.ibm.richtext.styledtext;
014:
015: import java.text.CharacterIterator;
016:
017: final class CharBufferIterator implements CharacterIterator, Cloneable {
018: static final String COPYRIGHT = "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";
019: private int fRangeStart;
020: private int fRangeLimit;
021: private int fCurrentIndex;
022: private char fStorage[];
023: private int fGap;
024: private int fGapLength;
025: private Validation fValidation;
026:
027: CharBufferIterator(int start, int limit, char[] storage,
028: int length, int gap, Validation validation) {
029:
030: if (start > limit) {
031: throw new IllegalArgumentException("start > limit");
032: }
033: fRangeStart = start;
034: fRangeLimit = limit;
035: fCurrentIndex = fRangeStart;
036: fStorage = storage;
037: fGap = gap;
038: fGapLength = (storage == null ? 0 : storage.length) - length;
039: fValidation = validation;
040: }
041:
042: private void checkValidation() {
043:
044: if (!fValidation.isValid()) {
045: throw new Error("Iterator is no longer valid");
046: }
047: }
048:
049: public char first() {
050: return setIndex(fRangeStart);
051: }
052:
053: public char last() {
054: return setIndex(fRangeLimit - 1);
055: }
056:
057: public char current() {
058: checkValidation();
059: if (fCurrentIndex < fRangeStart || fCurrentIndex >= fRangeLimit)
060: return DONE;
061: int i = (fCurrentIndex < fGap) ? fCurrentIndex
062: : (fCurrentIndex + fGapLength);
063: return fStorage[i];
064: }
065:
066: public char next() {
067: checkValidation();
068: fCurrentIndex++;
069: if (fCurrentIndex >= fRangeLimit) {
070: fCurrentIndex = fRangeLimit;
071: return DONE;
072: }
073: int i = (fCurrentIndex < fGap) ? fCurrentIndex
074: : (fCurrentIndex + fGapLength);
075: return fStorage[i];
076: }
077:
078: public char previous() {
079: fCurrentIndex--;
080: if (fCurrentIndex >= fRangeStart)
081: return current();
082: fCurrentIndex = fRangeStart;
083: return DONE;
084: }
085:
086: public char setIndex(int i) {
087: if (i < fRangeStart || i > fRangeLimit)
088: throw new IllegalArgumentException("Invalid position");
089: fCurrentIndex = i;
090: return current();
091: }
092:
093: public int getBeginIndex() {
094: return fRangeStart;
095: }
096:
097: public int getEndIndex() {
098: return fRangeLimit;
099: }
100:
101: public int getIndex() {
102: return fCurrentIndex;
103: }
104:
105: public Object clone() {
106: try {
107: return super .clone();
108: } catch (CloneNotSupportedException e) {
109: return null;
110: }
111: }
112: }
|