gnu.jemacs.swt
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)
Field Summary | |
---|---|
static int | minGapSize |
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() |
See Also: org.eclipse.swt.custom.StyledTextContent#getLineAtOffset(int)