gnu.jemacs.swt

Class LineOffsets

Implemented Interfaces:
java.util.List, Consumable, Sequence

public class LineOffsets
extends GapVector

The purpose of this class is to maintain an ordered set of line offsets for an SwtCharBuffer.

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 <32lOff.gapStart ? i : i + lOff.gapEnd - lOff.gapStart)

starts at text position p = (o <32swtCB.gapStart ? o : o + swtCB.gapEnd - swtCB.gapStart)

Field Summary

static int
minGapSize

Fields inherited from class gnu.lists.GapVector

base, gapEnd, gapStart

Fields inherited from interface gnu.lists.Sequence

ATTRIBUTE_VALUE, BOOLEAN_VALUE, CDATA_VALUE, CHAR_VALUE, COMMENT_VALUE, DOCUMENT_VALUE, DOUBLE_VALUE, ELEMENT_VALUE, EOF_VALUE, 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, eofValue

Constructor Summary

LineOffsets(int initialSize)

Method Summary

int
countLines(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, CharSequence seq)
void
textRegionMoved(int regionStart, int regionEnd, int displacement)
String
toString()

Methods inherited from class gnu.lists.GapVector

add, addPos, consumePosRange, createPos, fill, fillPosRange, gapReserve, gapReserve, get, getNextKind, getSegment, hasNext, isAfterPos, nextIndex, removePosRange, set, shiftGap, size

Methods inherited from class gnu.lists.AbstractSequence

add, add, addAll, addAll, addPos, clear, compare, compare, compare, consume, consumeNext, consumePosRange, contains, containsAll, copyPos, createPos, createRelativePos, elements, endPos, equals, equals, fill, fill, fillPosRange, firstAttributePos, firstChildPos, firstChildPos, fromEndIndex, get, get, getAttribute, getAttributeLength, getContainingSequenceSize, getEffectiveIndex, getIndexDifference, getIterator, getIterator, getIteratorAtPos, getLowBound, getNextKind, getNextTypeName, getNextTypeObject, getPosNext, getPosPrevious, getSize, gotoAttributesStart, gotoChildrenStart, gotoParent, hasNext, hasPrevious, hashCode, indexOf, isAfterPos, isEmpty, iterator, lastIndexOf, listIterator, listIterator, nextIndex, nextIndex, nextMatching, nextPos, parentPos, previousPos, rank, releasePos, remove, remove, removeAll, removePos, removePosRange, retainAll, set, set, setPosNext, setPosPrevious, size, stableCompare, startPos, subList, subSequence, subSequencePos, toArray, toArray, toString, toString, unsupported, unsupportedException

Field Details

minGapSize

public static final int minGapSize
Field Value:
100

Constructor Details

LineOffsets

public LineOffsets(int initialSize)

Method Details

countLines

public int countLines(String newText)

deleteLines

public void deleteLines(int firstLine,
                        int numberOfLines)

index2offset

public int index2offset(int index)

insertLine

public void insertLine(int index,
                       int offSet)

insertLines

public void insertLines(int index,
                        int[] offsets)

isLineDelimiter

public boolean isLineDelimiter(char c)

linesInRange

public int linesInRange(int startOffset,
                        int endOffset)

offset2index

public int offset2index(int offset)
We seek the line containing a given text offset using a halfing of intervals algorithm. Therefore the method will use O(log(n)) time, n being the number of lines.
See Also:
org.eclipse.swt.custom.StyledTextContent.getLineAtOffset(int)

textDeleted

public void textDeleted(int startOffset,
                        int endOffset)

textInserted

public void textInserted(int startOffset,
                         CharSequence seq)

textRegionMoved

public void textRegionMoved(int regionStart,
                            int regionEnd,
                            int displacement)

toString

public String toString()
Overrides:
toString in interface AbstractSequence