diff options
Diffstat (limited to 'src/Document.cxx')
-rw-r--r-- | src/Document.cxx | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index b50b9691a..bfb52d36e 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -94,22 +94,25 @@ int Document::LineStart(int line) { return cb.LineStart(line); } -int Document::LineFromPosition(int pos) { - return cb.LineFromPosition(pos); -} - -int Document::LineEndPosition(int position) { - int line = LineFromPosition(position); +int Document::LineEnd(int line) { if (line == LinesTotal() - 1) { - position = LineStart(line + 1); + return LineStart(line + 1); } else { - position = LineStart(line + 1) - 1; + int position = LineStart(line + 1) - 1; // When line terminator is CR+LF, may need to go back one more if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) { position--; } + return position; } - return position; +} + +int Document::LineFromPosition(int pos) { + return cb.LineFromPosition(pos); +} + +int Document::LineEndPosition(int position) { + return LineEnd(LineFromPosition(position)); } int Document::VCHomePosition(int position) { @@ -335,6 +338,7 @@ int Document::Undo() { enteredCount++; bool startSavePoint = cb.IsSavePoint(); int steps = cb.StartUndo(); + Platform::DebugPrintf("Steps=%d\n", steps); for (int step=0; step<steps; step++) { int prevLinesTotal = LinesTotal(); const Action &action = cb.UndoStep(); @@ -345,9 +349,11 @@ int Document::Undo() { int modFlags = SC_PERFORMED_UNDO; // With undo, an insertion action becomes a deletion notification if (action.at == removeAction) { + Platform::DebugPrintf("Insert of %d\n", action.lenData); newPos += action.lenData; modFlags |= SC_MOD_INSERTTEXT; } else { + Platform::DebugPrintf("Remove of %d\n", action.lenData); modFlags |= SC_MOD_DELETETEXT; } if (step == steps-1) @@ -423,6 +429,11 @@ void Document::InsertString(int position, const char *s, int insertLength) { } } +void Document::ChangeChar(int pos, char ch) { + DeleteChars(pos, 1); + InsertChar(pos, ch); +} + void Document::DelChar(int pos) { if (IsCrLf(pos)) { DeleteChars(pos, 2); @@ -633,6 +644,25 @@ int Document::LinesTotal() { return cb.Lines(); } +void Document::ChangeCase(Range r, bool makeUpperCase) { + for (int pos=r.start; pos<r.end; pos++) { + char ch = CharAt(pos); + if (dbcsCodePage && IsDBCS(pos)) { + pos++; + } else { + if (makeUpperCase) { + if (islower(ch)) { + ChangeChar(pos, toupper(ch)); + } + } else { + if (isupper(ch)) { + ChangeChar(pos, tolower(ch)); + } + } + } + } +} + void Document::SetWordChars(unsigned char *chars) { int ch; for (ch = 0; ch < 256; ch++) { |