// Copyright (c) 2004-2005 by Leif Frenzel
// See http://leiffrenzel.de
package net.sf.eclipsefp.haskell.ui.util.text;
import java.text.CharacterIterator;
import org.eclipse.jface.text.*;
/** <p>a character iterator that works on an <code>IDocument</code>.</p>
*
* <p>Taken from
* <code>org.eclipse.jface.text.DefaultTextDoubleClickStrategy</code>.</p>
*
* @author Leif Frenzel
*/
class DocumentCharacterIterator implements CharacterIterator {
/** Document to iterate over. */
private IDocument document;
/** Start offset of iteration. */
private int offset= -1;
/** End offset of iteration. */
private int endOffset= -1;
/** Current offset of iteration. */
private int index= -1;
void setDocument( final IDocument document, final IRegion iteratorRange ) {
this.document = document;
offset = iteratorRange.getOffset();
endOffset = offset + iteratorRange.getLength();
}
// interface methods of CharacterIterator
/////////////////////////////////////////
@Override
public char first() {
index = offset;
return current();
}
@Override
public char last() {
index = offset < endOffset ? endOffset - 1 : endOffset;
return current();
}
@Override
public char current() {
if( offset <= index && index < endOffset ) {
try {
return document.getChar( index );
} catch( BadLocationException badlox ) {
// ignored
}
}
return DONE;
}
@Override
public char next() {
char result = DONE;
if( index != endOffset - 1 ) {
if( index < endOffset ) {
++index;
}
result = current();
}
return result;
}
@Override
public char previous() {
char result = DONE;
if( index != offset ) {
if (index > offset) {
--index;
}
result = current();
}
return result;
}
@Override
public char setIndex( final int index ) {
this.index = index;
return current();
}
@Override
public int getBeginIndex() {
return offset;
}
@Override
public int getEndIndex() {
return endOffset;
}
@Override
public int getIndex() {
return index;
}
@Override
public Object clone() {
DocumentCharacterIterator result = new DocumentCharacterIterator();
result.document = document;
result.index = index;
result.offset = offset;
result.endOffset = endOffset;
return result;
}
}