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:
-
textRegionMoved, which should be called when the gap (of SwtCharBuffer) changes
(position or size).
-
textInserted.
-
textDeleted.
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)
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.
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)