aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/CellBuffer.cxx
diff options
context:
space:
mode:
authornyamatongwe <unknown>2007-01-01 23:34:58 +0000
committernyamatongwe <unknown>2007-01-01 23:34:58 +0000
commit9f6740c61ca15c172be2d5c04b672cd0eba7d0e4 (patch)
tree7ec27fd7c4ca3664e5ead3fb122a5aa87c713f41 /src/CellBuffer.cxx
parentc48897c8f67c8f4096fdb51269ec478b45694f7d (diff)
downloadscintilla-mirror-9f6740c61ca15c172be2d5c04b672cd0eba7d0e4.tar.gz
Major change to CellBuffer class with addition of Partitioning class and SplitVector
template. Inserting and deleting lines are made more efficient by lessening the amount of per line information copied. Marker data is only allocated for each line if markers are added.
Diffstat (limited to 'src/CellBuffer.cxx')
-rw-r--r--src/CellBuffer.cxx500
1 files changed, 159 insertions, 341 deletions
diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx
index bd124d011..7096d4419 100644
--- a/src/CellBuffer.cxx
+++ b/src/CellBuffer.cxx
@@ -14,6 +14,8 @@
#include "Scintilla.h"
#include "SVector.h"
+#include "SplitVector.h"
+#include "Partitioning.h"
#include "CellBuffer.h"
MarkerHandleSet::MarkerHandleSet() {
@@ -30,7 +32,7 @@ MarkerHandleSet::~MarkerHandleSet() {
root = 0;
}
-int MarkerHandleSet::Length() {
+int MarkerHandleSet::Length() const {
int c = 0;
MarkerHandleNumber *mhn = root;
while (mhn) {
@@ -40,7 +42,7 @@ int MarkerHandleSet::Length() {
return c;
}
-int MarkerHandleSet::NumberFromHandle(int handle) {
+int MarkerHandleSet::NumberFromHandle(int handle) const {
MarkerHandleNumber *mhn = root;
while (mhn) {
if (mhn->handle == handle) {
@@ -51,7 +53,7 @@ int MarkerHandleSet::NumberFromHandle(int handle) {
return - 1;
}
-int MarkerHandleSet::MarkValue() {
+int MarkerHandleSet::MarkValue() const {
unsigned int m = 0;
MarkerHandleNumber *mhn = root;
while (mhn) {
@@ -61,7 +63,7 @@ int MarkerHandleSet::MarkValue() {
return m;
}
-bool MarkerHandleSet::Contains(int handle) {
+bool MarkerHandleSet::Contains(int handle) const {
MarkerHandleNumber *mhn = root;
while (mhn) {
if (mhn->handle == handle) {
@@ -90,7 +92,7 @@ void MarkerHandleSet::RemoveHandle(int handle) {
if (mhn->handle == handle) {
*pmhn = mhn->next;
delete mhn;
- return ;
+ return;
}
pmhn = &((*pmhn)->next);
}
@@ -121,210 +123,154 @@ void MarkerHandleSet::CombineWith(MarkerHandleSet *other) {
other->root = 0;
}
-LineVector::LineVector() {
- linesData = 0;
- lines = 0;
- size = 0;
- levels = 0;
- sizeLevels = 0;
+LineVector::LineVector() : starts(256) {
handleCurrent = 1;
- growSize = 1000;
Init();
}
LineVector::~LineVector() {
- for (int line = 0; line < lines; line++) {
- delete linesData[line].handleSet;
- linesData[line].handleSet = 0;
+ starts.DeleteAll();
+ for (int line = 0; line < markers.Length(); line++) {
+ delete markers[line];
+ markers[line] = 0;
}
- delete []linesData;
- linesData = 0;
- delete []levels;
- levels = 0;
+ markers.DeleteAll();
+ levels.DeleteAll();
}
void LineVector::Init() {
- for (int line = 0; line < lines; line++) {
- delete linesData[line].handleSet;
- linesData[line].handleSet = 0;
+ starts.DeleteAll();
+ for (int line = 0; line < markers.Length(); line++) {
+ delete markers[line];
+ markers[line] = 0;
}
- delete []linesData;
- linesData = new LineData[static_cast<int>(growSize)];
- size = growSize;
- lines = 1;
- delete []levels;
- levels = 0;
- sizeLevels = 0;
-}
-
-void LineVector::Expand(int sizeNew) {
- LineData *linesDataNew = new LineData[sizeNew];
- if (linesDataNew) {
- for (int i = 0; i < size; i++)
- linesDataNew[i] = linesData[i];
- // Do not delete handleSets here as they are transferred to new linesData
- delete []linesData;
- linesData = linesDataNew;
- size = sizeNew;
- } else {
- Platform::DebugPrintf("No memory available\n");
- // TODO: Blow up
- }
-
+ markers.DeleteAll();
+ levels.DeleteAll();
}
void LineVector::ExpandLevels(int sizeNew) {
- if (sizeNew == -1)
- sizeNew = size;
- int *levelsNew = new int[sizeNew];
- if (levelsNew) {
- int i = 0;
- for (; i < sizeLevels; i++)
- levelsNew[i] = levels[i];
- for (; i < sizeNew; i++)
- levelsNew[i] = SC_FOLDLEVELBASE;
- delete []levels;
- levels = levelsNew;
- sizeLevels = sizeNew;
- } else {
- Platform::DebugPrintf("No memory available\n");
- // TODO: Blow up
- }
-
+ levels.InsertValue(levels.Length(), sizeNew - levels.Length(), SC_FOLDLEVELBASE);
}
void LineVector::ClearLevels() {
- delete []levels;
- levels = 0;
- sizeLevels = 0;
-}
-
-void LineVector::InsertValue(int pos, int value) {
- //Platform::DebugPrintf("InsertValue[%d] = %d\n", pos, value);
- if ((lines + 2) >= size) {
- if (growSize * 6 < size)
- growSize *= 2;
- Expand(size + growSize);
- if (levels) {
- ExpandLevels(size + growSize);
- }
- }
- lines++;
- for (int i = lines; i > pos; i--) {
- linesData[i] = linesData[i - 1];
- }
- linesData[pos].startPosition = value;
- linesData[pos].handleSet = 0;
- if (levels) {
- for (int j = lines; j > pos; j--) {
- levels[j] = levels[j - 1];
+ levels.DeleteAll();
+}
+
+int LineVector::SetLevel(int line, int level) {
+ int prev = 0;
+ if ((line >= 0) && (line < Lines())) {
+ if (!levels.Length()) {
+ ExpandLevels(Lines() + 1);
}
- if (pos == 0) {
- levels[pos] = SC_FOLDLEVELBASE;
- } else if (pos == (lines - 1)) { // Last line will not be a folder
- levels[pos] = SC_FOLDLEVELBASE;
- } else {
- levels[pos] = levels[pos - 1] & ~SC_FOLDLEVELWHITEFLAG;
+ prev = levels[line];
+ if (prev != level) {
+ levels[line] = level;
}
}
+ return prev;
}
-void LineVector::SetValue(int pos, int value) {
- //Platform::DebugPrintf("SetValue[%d] = %d\n", pos, value);
- if ((pos + 2) >= size) {
- //Platform::DebugPrintf("Resize %d %d\n", size,pos);
- Expand(pos + growSize);
- //Platform::DebugPrintf("end Resize %d %d\n", size,pos);
- lines = pos;
- if (levels) {
- ExpandLevels(pos + growSize);
+int LineVector::GetLevel(int line) {
+ if (levels.Length() && (line >= 0) && (line < Lines())) {
+ return levels[line];
+ } else {
+ return SC_FOLDLEVELBASE;
+ }
+}
+
+void LineVector::InsertText(int line, int delta) {
+ starts.InsertText(line, delta);
+}
+
+void LineVector::InsertLine(int line, int position) {
+ starts.InsertPartition(line, position);
+ if (markers.Length()) {
+ markers.Insert(line, 0);
+ }
+ if (levels.Length()) {
+ int level = SC_FOLDLEVELBASE;
+ if ((line > 0) && (line < Lines())) {
+ level = levels[line-1] & ~SC_FOLDLEVELWHITEFLAG;
}
+ levels.InsertValue(line, 1, level);
}
- linesData[pos].startPosition = value;
}
-void LineVector::Remove(int pos) {
- //Platform::DebugPrintf("Remove %d\n", pos);
+void LineVector::SetLineStart(int line, int position) {
+ starts.SetPartitionStartPosition(line, position);
+}
+
+void LineVector::RemoveLine(int line) {
+ starts.RemovePartition(line);
// Retain the markers from the deleted line by oring them into the previous line
- if (pos > 0) {
- MergeMarkers(pos - 1);
- }
- for (int i = pos; i < lines; i++) {
- linesData[i] = linesData[i + 1];
+ if (markers.Length()) {
+ if (line > 0) {
+ MergeMarkers(line - 1);
+ }
+ markers.Delete(line);
}
- if (levels) {
+ if (levels.Length()) {
// Move up following lines but merge header flag from this line
// to line before to avoid a temporary disappearence causing expansion.
- int firstHeader = levels[pos] & SC_FOLDLEVELHEADERFLAG;
- for (int j = pos; j < lines; j++) {
- levels[j] = levels[j + 1];
- }
- if (pos > 0)
- levels[pos-1] |= firstHeader;
+ int firstHeader = levels[line] & SC_FOLDLEVELHEADERFLAG;
+ levels.Delete(line);
+ if (line > 0)
+ levels[line-1] |= firstHeader;
}
- lines--;
}
int LineVector::LineFromPosition(int pos) {
- //Platform::DebugPrintf("LineFromPostion %d lines=%d end = %d\n", pos, lines, linesData[lines].startPosition);
- if (lines == 0)
+ return starts.PartitionFromPosition(pos);
+}
+
+int LineVector::MarkValue(int line) {
+ if (markers.Length() && markers.ValueAt(line))
+ return markers.ValueAt(line)->MarkValue();
+ else
return 0;
- //Platform::DebugPrintf("LineFromPosition %d\n", pos);
- if (pos >= linesData[lines].startPosition)
- return lines - 1;
- int lower = 0;
- int upper = lines;
- do {
- int middle = (upper + lower + 1) / 2; // Round high
- if (pos < linesData[middle].startPosition) {
- upper = middle - 1;
- } else {
- lower = middle;
- }
- } while (lower < upper);
- //Platform::DebugPrintf("LineFromPostion %d %d %d\n", pos, lower, linesData[lower].startPosition, linesData[lower > 1 ? lower - 1 : 0].startPosition);
- return lower;
}
int LineVector::AddMark(int line, int markerNum) {
handleCurrent++;
- if (!linesData[line].handleSet) {
+ if (!markers.Length()) {
+ // No existing markers so allocate one element per line
+ markers.InsertValue(0, Lines(), 0);
+ }
+ if (!markers[line]) {
// Need new structure to hold marker handle
- linesData[line].handleSet = new MarkerHandleSet;
- if (!linesData[line].handleSet)
+ markers[line] = new MarkerHandleSet();
+ if (!markers[line])
return - 1;
}
- linesData[line].handleSet->InsertHandle(handleCurrent, markerNum);
+ markers[line]->InsertHandle(handleCurrent, markerNum);
return handleCurrent;
}
void LineVector::MergeMarkers(int pos) {
- if (linesData[pos + 1].handleSet != NULL) {
- if (linesData[pos].handleSet == NULL )
- linesData[pos].handleSet = new MarkerHandleSet;
- linesData[pos].handleSet->CombineWith(linesData[pos + 1].handleSet);
- delete linesData[pos + 1].handleSet;
- linesData[pos + 1].handleSet = NULL;
+ if (markers[pos + 1] != NULL) {
+ if (markers[pos] == NULL)
+ markers[pos] = new MarkerHandleSet;
+ markers[pos]->CombineWith(markers[pos + 1]);
+ delete markers[pos + 1];
+ markers[pos + 1] = NULL;
}
}
void LineVector::DeleteMark(int line, int markerNum, bool all) {
- if (linesData[line].handleSet) {
+ if (markers.Length() && markers[line]) {
if (markerNum == -1) {
- delete linesData[line].handleSet;
- linesData[line].handleSet = 0;
+ delete markers[line];
+ markers[line] = NULL;
} else {
- bool performedDeletion =
- linesData[line].handleSet->RemoveNumber(markerNum);
+ bool performedDeletion = markers[line]->RemoveNumber(markerNum);
while (all && performedDeletion) {
- performedDeletion =
- linesData[line].handleSet->RemoveNumber(markerNum);
+ performedDeletion = markers[line]->RemoveNumber(markerNum);
}
- if (linesData[line].handleSet->Length() == 0) {
- delete linesData[line].handleSet;
- linesData[line].handleSet = 0;
+ if (markers[line]->Length() == 0) {
+ delete markers[line];
+ markers[line] = NULL;
}
}
}
@@ -333,23 +279,25 @@ void LineVector::DeleteMark(int line, int markerNum, bool all) {
void LineVector::DeleteMarkFromHandle(int markerHandle) {
int line = LineFromHandle(markerHandle);
if (line >= 0) {
- linesData[line].handleSet->RemoveHandle(markerHandle);
- if (linesData[line].handleSet->Length() == 0) {
- delete linesData[line].handleSet;
- linesData[line].handleSet = 0;
+ markers[line]->RemoveHandle(markerHandle);
+ if (markers[line]->Length() == 0) {
+ delete markers[line];
+ markers[line] = NULL;
}
}
}
int LineVector::LineFromHandle(int markerHandle) {
- for (int line = 0; line < lines; line++) {
- if (linesData[line].handleSet) {
- if (linesData[line].handleSet->Contains(markerHandle)) {
- return line;
+ if (markers.Length()) {
+ for (int line = 0; line < Lines(); line++) {
+ if (markers[line]) {
+ if (markers[line]->Contains(markerHandle)) {
+ return line;
+ }
}
}
}
- return - 1;
+ return -1;
}
Action::Action() {
@@ -437,7 +385,7 @@ void UndoHistory::EnsureUndoRoom() {
int lenActionsNew = lenActions * 2;
Action *actionsNew = new Action[lenActionsNew];
if (!actionsNew)
- return ;
+ return;
for (int act = 0; act <= currentAction; act++)
actionsNew[act].Grab(&actions[act]);
delete []actions;
@@ -488,7 +436,7 @@ void UndoHistory::AppendAction(actionType at, int position, char *data, int leng
currentAction++;
}
} else {
- //Platform::DebugPrintf("action coalesced\n");
+ // Action coalesced.
}
} else {
@@ -603,91 +551,12 @@ void UndoHistory::CompletedRedoStep() {
currentAction++;
}
-CellBuffer::CellBuffer(int initialLength) {
- body = new char[initialLength];
- size = initialLength;
- length = 0;
- part1len = 0;
- gaplen = initialLength;
- part2body = body + gaplen;
+CellBuffer::CellBuffer() {
readOnly = false;
collectingUndo = true;
- growSize = 4000;
}
CellBuffer::~CellBuffer() {
- delete []body;
- body = 0;
-}
-
-void CellBuffer::GapTo(int position) {
- if (position == part1len)
- return ;
- if (position < part1len) {
- int diff = part1len - position;
- //Platform::DebugPrintf("Move gap backwards to %d diff = %d part1len=%d length=%d \n", position,diff, part1len, length);
- for (int i = 0; i < diff; i++)
- body[part1len + gaplen - i - 1] = body[part1len - i - 1];
- } else { // position > part1len
- int diff = position - part1len;
- //Platform::DebugPrintf("Move gap forwards to %d diff =%d\n", position,diff);
- for (int i = 0; i < diff; i++)
- body[part1len + i] = body[part1len + gaplen + i];
- }
- part1len = position;
- part2body = body + gaplen;
-}
-
-void CellBuffer::RoomFor(int insertionLength) {
- //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
- if (gaplen <= insertionLength) {
- //Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
- if (growSize * 6 < size)
- growSize *= 2;
- int newSize = size + insertionLength + growSize;
- Allocate(newSize);
- }
-}
-
-// To make it easier to write code that uses ByteAt, a position outside the range of the buffer
-// can be retrieved. All characters outside the range have the value '\0'.
-char CellBuffer::ByteAt(int position) {
- if (position < part1len) {
- if (position < 0) {
- return '\0';
- } else {
- return body[position];
- }
- } else {
- if (position >= length) {
- return '\0';
- } else {
- return part2body[position];
- }
- }
-}
-
-void CellBuffer::SetByteAt(int position, char ch) {
-
- if (position < 0) {
- //Platform::DebugPrintf("Bad position %d\n",position);
- return ;
- }
- if (position >= length + 11) {
- Platform::DebugPrintf("Very Bad position %d of %d\n", position, length);
- //exit(2);
- return ;
- }
- if (position >= length) {
- //Platform::DebugPrintf("Bad position %d of %d\n",position,length);
- return ;
- }
-
- if (position < part1len) {
- body[position] = ch;
- } else {
- part2body[position] = ch;
- }
}
char CellBuffer::CharAt(int position) {
@@ -696,20 +565,19 @@ char CellBuffer::CharAt(int position) {
void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) {
if (lengthRetrieve < 0)
- return ;
+ return;
if (position < 0)
- return ;
+ return;
int bytePos = position * 2;
- if ((bytePos + lengthRetrieve * 2) > length) {
+ if ((bytePos + lengthRetrieve * 2) > body.Length()) {
Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n", bytePos,
- lengthRetrieve, length);
- return ;
+ lengthRetrieve, body.Length());
+ return;
}
- GapTo(0); // Move the buffer so its easy to subscript into it
- char *pb = part2body + bytePos;
+ int i = bytePos;
while (lengthRetrieve--) {
- *buffer++ = *pb;
- pb += 2;
+ *buffer++ = body.ValueAt(i);
+ i += 2;
}
}
@@ -740,7 +608,7 @@ bool CellBuffer::SetStyleAt(int position, char style, char mask) {
style &= mask;
char curVal = ByteAt(position * 2 + 1);
if ((curVal & mask) != style) {
- SetByteAt(position*2 + 1, static_cast<char>((curVal & ~mask) | style));
+ body.SetValueAt(position*2 + 1, static_cast<char>((curVal & ~mask) | style));
return true;
} else {
return false;
@@ -751,11 +619,11 @@ bool CellBuffer::SetStyleFor(int position, int lengthStyle, char style, char mas
int bytePos = position * 2 + 1;
bool changed = false;
PLATFORM_ASSERT(lengthStyle == 0 ||
- (lengthStyle > 0 && lengthStyle + position < length));
+ (lengthStyle > 0 && lengthStyle + position < body.Length()));
while (lengthStyle--) {
char curVal = ByteAt(bytePos);
if ((curVal & mask) != style) {
- SetByteAt(bytePos, static_cast<char>((curVal & ~mask) | style));
+ body.SetValueAt(bytePos, static_cast<char>((curVal & ~mask) | style));
changed = true;
}
bytePos += 2;
@@ -783,38 +651,29 @@ const char *CellBuffer::DeleteChars(int position, int deleteLength, bool &startS
}
int CellBuffer::ByteLength() {
- return length;
+ return body.Length();
}
int CellBuffer::Length() {
return ByteLength() / 2;
}
+
void CellBuffer::Allocate(int newSize) {
- if (newSize > length) {
- GapTo(length);
- char *newBody = new char[newSize];
- memcpy(newBody, body, length);
- delete []body;
- body = newBody;
- gaplen += newSize - size;
- part2body = body + gaplen;
- size = newSize;
- }
+ body.ReAllocate(newSize);
}
int CellBuffer::Lines() {
- //Platform::DebugPrintf("Lines = %d\n", lv.lines);
- return lv.lines;
+ return lv.Lines();
}
int CellBuffer::LineStart(int line) {
if (line < 0)
return 0;
- else if (line > lv.lines)
+ else if (line >= Lines())
return Length();
else
- return lv.linesData[line].startPosition;
+ return lv.LineStart(line);
}
bool CellBuffer::IsReadOnly() {
@@ -834,14 +693,14 @@ bool CellBuffer::IsSavePoint() {
}
int CellBuffer::AddMark(int line, int markerNum) {
- if ((line >= 0) && (line < lv.lines)) {
+ if ((line >= 0) && (line < Lines())) {
return lv.AddMark(line, markerNum);
}
return - 1;
}
void CellBuffer::DeleteMark(int line, int markerNum) {
- if ((line >= 0) && (line < lv.lines)) {
+ if ((line >= 0) && (line < Lines())) {
lv.DeleteMark(line, markerNum, false);
}
}
@@ -851,13 +710,13 @@ void CellBuffer::DeleteMarkFromHandle(int markerHandle) {
}
int CellBuffer::GetMark(int line) {
- if ((line >= 0) && (line < lv.lines) && (lv.linesData[line].handleSet))
- return lv.linesData[line].handleSet->MarkValue();
+ if ((line >= 0) && (line < Lines()))
+ return lv.MarkValue(line);
return 0;
}
void CellBuffer::DeleteAllMarks(int markerNum) {
- for (int line = 0; line < lv.lines; line++) {
+ for (int line = 0; line < Lines(); line++) {
lv.DeleteMark(line, markerNum, true);
}
}
@@ -869,51 +728,38 @@ int CellBuffer::LineFromHandle(int markerHandle) {
// Without undo
void CellBuffer::BasicInsertString(int position, char *s, int insertLength) {
- //Platform::DebugPrintf("Inserting at %d for %d\n", position, insertLength);
if (insertLength == 0)
- return ;
+ return;
PLATFORM_ASSERT(insertLength > 0);
- RoomFor(insertLength);
- GapTo(position);
- memcpy(body + part1len, s, insertLength);
- length += insertLength;
- part1len += insertLength;
- gaplen -= insertLength;
- part2body = body + gaplen;
+ body.InsertFromArray(position, s, 0, insertLength);
int lineInsert = lv.LineFromPosition(position / 2) + 1;
// Point all the lines after the insertion point further along in the buffer
- for (int lineAfter = lineInsert; lineAfter <= lv.lines; lineAfter++) {
- lv.linesData[lineAfter].startPosition += insertLength / 2;
- }
+ lv.InsertText(lineInsert-1, insertLength / 2);
char chPrev = ' ';
if ((position - 2) >= 0)
chPrev = ByteAt(position - 2);
char chAfter = ' ';
- if ((position + insertLength) < length)
+ if ((position + insertLength) < body.Length())
chAfter = ByteAt(position + insertLength);
if (chPrev == '\r' && chAfter == '\n') {
- //Platform::DebugPrintf("Splitting a crlf pair at %d\n", lineInsert);
// Splitting up a crlf pair at position
- lv.InsertValue(lineInsert, position / 2);
+ lv.InsertLine(lineInsert, position / 2);
lineInsert++;
}
char ch = ' ';
for (int i = 0; i < insertLength; i += 2) {
ch = s[i];
if (ch == '\r') {
- //Platform::DebugPrintf("Inserting cr at %d\n", lineInsert);
- lv.InsertValue(lineInsert, (position + i) / 2 + 1);
+ lv.InsertLine(lineInsert, (position + i) / 2 + 1);
lineInsert++;
} else if (ch == '\n') {
if (chPrev == '\r') {
- //Platform::DebugPrintf("Patching cr before lf at %d\n", lineInsert-1);
// Patch up what was end of line
- lv.SetValue(lineInsert - 1, (position + i) / 2 + 1);
+ lv.SetLineStart(lineInsert - 1, (position + i) / 2 + 1);
} else {
- //Platform::DebugPrintf("Inserting lf at %d\n", lineInsert);
- lv.InsertValue(lineInsert, (position + i) / 2 + 1);
+ lv.InsertLine(lineInsert, (position + i) / 2 + 1);
lineInsert++;
}
}
@@ -922,44 +768,37 @@ void CellBuffer::BasicInsertString(int position, char *s, int insertLength) {
// Joining two lines where last insertion is cr and following text starts with lf
if (chAfter == '\n') {
if (ch == '\r') {
- //Platform::DebugPrintf("Joining cr before lf at %d\n", lineInsert-1);
// End of line already in buffer so drop the newly created one
- lv.Remove(lineInsert - 1);
+ lv.RemoveLine(lineInsert - 1);
}
}
}
void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
- //Platform::DebugPrintf("Deleting at %d for %d\n", position, deleteLength);
if (deleteLength == 0)
- return ;
+ return;
- if ((position == 0) && (deleteLength == length)) {
+ if ((position == 0) && (deleteLength == body.Length())) {
// If whole buffer is being deleted, faster to reinitialise lines data
// than to delete each line.
- //printf("Whole buffer being deleted\n");
lv.Init();
} else {
// Have to fix up line positions before doing deletion as looking at text in buffer
// to work out which lines have been removed
int lineRemove = lv.LineFromPosition(position / 2) + 1;
- // Point all the lines after the insertion point further along in the buffer
- for (int lineAfter = lineRemove; lineAfter <= lv.lines; lineAfter++) {
- lv.linesData[lineAfter].startPosition -= deleteLength / 2;
- }
+ lv.InsertText(lineRemove-1, - (deleteLength / 2));
char chPrev = ' ';
if (position >= 2)
chPrev = ByteAt(position - 2);
char chBefore = chPrev;
char chNext = ' ';
- if (position < length)
+ if (position < body.Length())
chNext = ByteAt(position);
bool ignoreNL = false;
if (chPrev == '\r' && chNext == '\n') {
- //Platform::DebugPrintf("Deleting lf after cr, move line end to cr at %d\n", lineRemove);
// Move back one
- lv.SetValue(lineRemove, position / 2);
+ lv.SetLineStart(lineRemove, position / 2);
lineRemove++;
ignoreNL = true; // First \n is not real deletion
}
@@ -967,20 +806,17 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
char ch = chNext;
for (int i = 0; i < deleteLength; i += 2) {
chNext = ' ';
- if ((position + i + 2) < length)
+ if ((position + i + 2) < body.Length())
chNext = ByteAt(position + i + 2);
- //Platform::DebugPrintf("Deleting %d %x\n", i, ch);
if (ch == '\r') {
if (chNext != '\n') {
- //Platform::DebugPrintf("Removing cr end of line\n");
- lv.Remove(lineRemove);
+ lv.RemoveLine(lineRemove);
}
} else if (ch == '\n') {
if (ignoreNL) {
ignoreNL = false; // Further \n are real deletions
} else {
- //Platform::DebugPrintf("Removing lf end of line\n");
- lv.Remove(lineRemove);
+ lv.RemoveLine(lineRemove);
}
}
@@ -989,19 +825,15 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
// May have to fix up end if last deletion causes cr to be next to lf
// or removes one of a crlf pair
char chAfter = ' ';
- if ((position + deleteLength) < length)
+ if ((position + deleteLength) < body.Length())
chAfter = ByteAt(position + deleteLength);
if (chBefore == '\r' && chAfter == '\n') {
- //d.printf("Joining cr before lf at %d\n", lineRemove);
// Using lineRemove-1 as cr ended line before start of deletion
- lv.Remove(lineRemove - 1);
- lv.SetValue(lineRemove - 1, position / 2 + 1);
+ lv.RemoveLine(lineRemove - 1);
+ lv.SetLineStart(lineRemove - 1, position / 2 + 1);
}
}
- GapTo(position);
- length -= deleteLength;
- gaplen += deleteLength;
- part2body = body + gaplen;
+ body.DeleteRange(position, deleteLength);
}
bool CellBuffer::SetUndoCollection(bool collectUndo) {
@@ -1097,25 +929,11 @@ int CellBuffer::GetMaxLineState() {
}
int CellBuffer::SetLevel(int line, int level) {
- int prev = 0;
- if ((line >= 0) && (line < lv.lines)) {
- if (!lv.levels) {
- lv.ExpandLevels();
- }
- prev = lv.levels[line];
- if (lv.levels[line] != level) {
- lv.levels[line] = level;
- }
- }
- return prev;
+ return lv.SetLevel(line, level);
}
int CellBuffer::GetLevel(int line) {
- if (lv.levels && (line >= 0) && (line < lv.lines)) {
- return lv.levels[line];
- } else {
- return SC_FOLDLEVELBASE;
- }
+ return lv.GetLevel(line);
}
void CellBuffer::ClearLevels() {