public class LineOffsets extends U32Vector
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 U32Vector with a GapManager, 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)
COPY_ON_WRITE, GAP_FLAG, info, MAX_GAP_SIZE, READ_ONLY_FLAG, SHARED_FLAG, SUBRANGE_FLAG, VERY_SIMPLE_FLAG
noInts
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() |
cast, castOrNull, compareTo, consumePosRange, get, getElementKind, getLongRaw, getRaw, getTag, newInstance, setRaw
add, clearBuffer, copyBuffer, getBuffer, getBufferLength, getInt, getIntRaw, setBuffer, setInt, setIntRaw
compareToInt, getLong
add, add, addPos, addSpace, asImmutable, checkCanWrite, delete, doCopyOnWrite, effectiveIndex, fill, forEach, gapReserve, gapReserveGeneric, getGapEnd, getGapSize, getGapStart, getOffsetBits, getRowMajor, getSegment, getSegment, getSegmentReadOnly, getSizeBits, isAfterPos, isGapBuffer, isReadOnly, isSubRange, isVerySimple, length, readExternal, setGapBounds, setGapBounds, setInfoField, setReadOnly, shift, size, toDataArray, writeExternal
addAll, addAll, badRank, boundedHash, checkRank, clear, compare, compare, compare, consume, consume, consumeNext, contains, containsAll, copyPos, createPos, createRelativePos, effectiveIndex, effectiveIndex, effectiveIndex, effectiveIndex, elements, endPos, equals, equals, fill, fillPosRange, firstAttributePos, firstChildPos, firstChildPos, fromEndIndex, get, get, get, get, getAttribute, getAttributeLength, getBooleanRaw, getByteRaw, getCharRaw, getContainingSequenceSize, getDoubleRaw, getFloatRaw, getIndexDifference, getInt, getInt, getInt, getInt, getIterator, getIterator, getIteratorAtPos, getLowBound, getNextKind, getNextTypeName, getNextTypeObject, getPosNext, getPosPrevious, getShortRaw, getSize, getSize, gotoAttributesStart, gotoChildrenStart, gotoParent, hashCode, hasNext, hasPrevious, indexOf, isEmpty, iterator, lastIndexOf, listIterator, listIterator, nextIndex, nextIndex, nextMatching, nextPos, parentPos, previousPos, rank, releasePos, remove, remove, removeAll, removePos, removePosRange, retainAll, set, set, setAt, setPosNext, setPosPrevious, stableCompare, startPos, subList, subSequence, subSequencePos, toArray, toArray, toString, unsupported, unsupportedException
clone, equals, finalize, getClass, notify, notifyAll, wait, wait, wait
asImmutable, effectiveIndex, effectiveIndex, effectiveIndex, effectiveIndex, effectiveIndex, get, get, get, get, getBooleanRaw, getByteRaw, getCharRaw, getDoubleRaw, getFloatRaw, getInt, getInt, getInt, getInt, getLowBound, getRowMajor, getShortRaw, getSize, getSize, isEmpty, rank, set
add, add, addAll, addAll, clear, contains, containsAll, equals, hashCode, indexOf, iterator, lastIndexOf, listIterator, listIterator, remove, remove, removeAll, replaceAll, retainAll, sort, spliterator, subList, toArray, toArray
consume
boundedHash
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<UInt>
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)