public class LineOffsets extends GapVector
With a LineOffsets instance it's possible to map from the number of a line to the text position where it begins, and back, reasonably fast. (O(1) for line number to line offset, O(log(#lines)) for line offset to line number)
LineOffsets extends GapVector with an U32Vector as base, allowing new line offsets to be inserted quickly during normal text typing.
Instances of SwtCharBuffer should hold an instance LineOffsets class and notify it whenever the it's text changes. The notification happens through the methods:
TODO: decouple this, using a more general event model.. Assume that lineOffset is an instance of LineOffsets, held by swtCharBuffer an instance of SwtCharBuffer.
Then a value of o
at index i
in lineOffsets.base
means that the line with line number
n = (i < lOff.gapStart ? i : i + lOff.gapEnd - lOff.gapStart)
starts at text position
p = (o < swtCB.gapStart ? o : o + swtCB.gapEnd - swtCB.gapStart)
Modifier and Type | Field and Description |
---|---|
static int |
minGapSize |
ATTRIBUTE_VALUE, BOOLEAN_VALUE, CDATA_VALUE, CHAR_VALUE, COMMENT_VALUE, DOCUMENT_VALUE, DOUBLE_VALUE, ELEMENT_VALUE, EOF_VALUE, eofValue, FLOAT_VALUE, INT_S16_VALUE, INT_S32_VALUE, INT_S64_VALUE, INT_S8_VALUE, INT_U16_VALUE, INT_U32_VALUE, INT_U64_VALUE, INT_U8_VALUE, OBJECT_VALUE, PRIM_VALUE, PROCESSING_INSTRUCTION_VALUE, TEXT_BYTE_VALUE
Constructor and Description |
---|
LineOffsets(int initialSize) |
Modifier and Type | Method and Description |
---|---|
int |
countLines(java.lang.String newText) |
void |
deleteLines(int firstLine,
int numberOfLines) |
int |
index2offset(int index) |
void |
insertLine(int index,
int offSet) |
void |
insertLines(int index,
int[] offsets) |
boolean |
isLineDelimiter(char c) |
int |
linesInRange(int startOffset,
int endOffset) |
int |
offset2index(int offset)
We seek the line containing a given text offset using a halfing of intervals algorithm.
|
void |
textDeleted(int startOffset,
int endOffset) |
void |
textInserted(int startOffset,
java.lang.CharSequence seq) |
void |
textRegionMoved(int regionStart,
int regionEnd,
int displacement) |
java.lang.String |
toString() |
add, addPos, consumePosRange, createPos, fill, fillPosRange, gapReserve, gapReserve, get, getNextKind, getSegment, hasNext, isAfterPos, nextIndex, removePosRange, set, shiftGap, size
add, addAll, addAll, clear, compare, compare, compare, consume, consume, consumeNext, contains, containsAll, copyPos, createRelativePos, elements, endPos, equals, equals, fill, firstAttributePos, firstChildPos, firstChildPos, fromEndIndex, get, getAttribute, getAttributeLength, getContainingSequenceSize, getEffectiveIndex, getIndexDifference, getIterator, getIterator, getIteratorAtPos, getLowBound, getNextTypeName, getNextTypeObject, getPosNext, getPosPrevious, getSize, gotoAttributesStart, gotoChildrenStart, gotoParent, hashCode, hasPrevious, indexOf, isEmpty, iterator, lastIndexOf, listIterator, listIterator, nextIndex, nextMatching, nextPos, parentPos, previousPos, rank, releasePos, remove, remove, removeAll, removePos, retainAll, set, setPosNext, setPosPrevious, stableCompare, startPos, subList, subSequence, subSequencePos, toArray, toArray, toString, unsupported, unsupportedException
clone, equals, finalize, getClass, notify, notifyAll, wait, wait, wait
add, addAll, addAll, clear, contains, containsAll, equals, hashCode, indexOf, iterator, lastIndexOf, listIterator, listIterator, remove, remove, removeAll, replaceAll, retainAll, sort, spliterator, subList, toArray, toArray
consume
public static final int minGapSize
public void insertLine(int index, int offSet)
public int index2offset(int index)
public int offset2index(int offset)
public void deleteLines(int firstLine, int numberOfLines)
public void insertLines(int index, int[] offsets)
public java.lang.String toString()
toString
in class AbstractSequence
public int countLines(java.lang.String newText)
public int linesInRange(int startOffset, int endOffset)
public void textRegionMoved(int regionStart, int regionEnd, int displacement)
public void textInserted(int startOffset, java.lang.CharSequence seq)
public void textDeleted(int startOffset, int endOffset)
public boolean isLineDelimiter(char c)