aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <unknown>2002-04-04 03:10:20 +0000
committernyamatongwe <unknown>2002-04-04 03:10:20 +0000
commita3e1c4d6f23dabf63c029a2ea31869e17be215fb (patch)
tree8678e789f1288dfed57efe6582924a9ddfb2a1d4 /src
parent00bf13a155d265805ccbcb805502ff6408c7f538 (diff)
downloadscintilla-mirror-a3e1c4d6f23dabf63c029a2ea31869e17be215fb.tar.gz
Improved caret movement in read-only mode by handling more cases where text is inserted and be removing handling of cases where text is deleted as these are handled automatically in the modification listener.
Diffstat (limited to 'src')
-rw-r--r--src/Document.cxx20
-rw-r--r--src/Document.h3
-rw-r--r--src/Editor.cxx55
-rw-r--r--src/Editor.h1
4 files changed, 35 insertions, 44 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index 4272dda63..def80c49c 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -535,26 +535,18 @@ void Document::DelChar(int pos) {
DeleteChars(pos, LenChar(pos));
}
-int Document::DelCharBackMove(int pos, int len) {
- if (DeleteChars(pos - len, len)) {
- return pos - len;
- } else {
- return pos;
- }
-}
-
-int Document::DelCharBack(int pos) {
+void Document::DelCharBack(int pos) {
if (pos <= 0) {
- return pos;
+ return;
} else if (IsCrLf(pos - 2)) {
- return DelCharBackMove(pos, 2);
+ DeleteChars(pos - 2, 2);
} else if (SC_CP_UTF8 == dbcsCodePage) {
int startChar = MovePositionOutsideChar(pos - 1, -1, false);
- return DelCharBackMove(pos, pos - startChar);
+ DeleteChars(startChar, pos - startChar);
} else if (IsDBCS(pos - 1)) {
- return DelCharBackMove(pos, 2);
+ DeleteChars(pos - 2, 2);
} else {
- return DelCharBackMove(pos, 1);
+ DeleteChars(pos - 1, 1);
}
}
diff --git a/src/Document.h b/src/Document.h
index 61fe33fce..9743583fe 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -163,7 +163,7 @@ public:
bool InsertString(int position, const char *s, int insertLength);
void ChangeChar(int pos, char ch);
void DelChar(int pos);
- int DelCharBack(int pos);
+ void DelCharBack(int pos);
char CharAt(int position) { return cb.CharAt(position); }
void GetCharRange(char *buffer, int position, int lengthRetrieve) {
@@ -233,7 +233,6 @@ private:
void NotifySavePoint(bool atSavePoint);
void NotifyModified(DocModification mh);
- int DelCharBackMove(int pos, int len);
int IndentSize() { return indentInChars ? indentInChars : tabInChars; }
};
diff --git a/src/Editor.cxx b/src/Editor.cxx
index d66b49238..57856dc37 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -2417,8 +2417,7 @@ void Editor::DelCharBack(bool allowLineStartDeletion) {
SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
pdoc->EndUndoAction();
} else {
- int newPos = pdoc->DelCharBack(currentPos);
- SetEmptySelection(newPos);
+ pdoc->DelCharBack(currentPos);
}
}
} else {
@@ -2830,8 +2829,9 @@ void Editor::LineTranspose() {
end = startNext;
char *thisLine = CopyRange(start, end);
pdoc->DeleteChars(start, end - start);
- pdoc->InsertString(startPrev, thisLine, end - start);
- MovePositionTo(startPrev + end - start);
+ if (pdoc->InsertString(startPrev, thisLine, end - start)) {
+ MovePositionTo(startPrev + end - start);
+ }
delete []thisLine;
} else {
// Last line so line has no line end
@@ -2839,8 +2839,9 @@ void Editor::LineTranspose() {
char *prevEnd = CopyRange(endPrev, start);
pdoc->DeleteChars(endPrev, end - endPrev);
pdoc->InsertString(startPrev, thisLine, end - start);
- pdoc->InsertString(startPrev + end - start, prevEnd, start - endPrev);
- MovePositionTo(startPrev + end - endPrev);
+ if (pdoc->InsertString(startPrev + end - start, prevEnd, start - endPrev)) {
+ MovePositionTo(startPrev + end - endPrev);
+ }
delete []thisLine;
delete []prevEnd;
}
@@ -2850,6 +2851,25 @@ void Editor::LineTranspose() {
void Editor::CancelModes() {}
+void Editor::NewLine() {
+ ClearSelection();
+ const char *eol = "\n";
+ if (pdoc->eolMode == SC_EOL_CRLF) {
+ eol = "\r\n";
+ } else if (pdoc->eolMode == SC_EOL_CR) {
+ eol = "\r";
+ } // else SC_EOL_LF -> "\n" already set
+ if (pdoc->InsertString(currentPos, eol)) {
+ SetEmptySelection(currentPos + strlen(eol));
+ while (*eol) {
+ NotifyChar(*eol);
+ eol++;
+ }
+ }
+ SetLastXChosen();
+ EnsureCaretVisible();
+}
+
int Editor::KeyCommand(unsigned int iMessage) {
Point pt = LocationFromPosition(currentPos);
@@ -2993,23 +3013,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
EnsureCaretVisible();
break;
case SCI_NEWLINE:
- ClearSelection();
- if (pdoc->eolMode == SC_EOL_CRLF) {
- pdoc->InsertString(currentPos, "\r\n");
- SetEmptySelection(currentPos + 2);
- NotifyChar('\r');
- NotifyChar('\n');
- } else if (pdoc->eolMode == SC_EOL_CR) {
- pdoc->InsertChar(currentPos, '\r');
- SetEmptySelection(currentPos + 1);
- NotifyChar('\r');
- } else if (pdoc->eolMode == SC_EOL_LF) {
- pdoc->InsertChar(currentPos, '\n');
- SetEmptySelection(currentPos + 1);
- NotifyChar('\n');
- }
- SetLastXChosen();
- EnsureCaretVisible();
+ NewLine();
break;
case SCI_FORMFEED:
AddChar('\f');
@@ -3037,21 +3041,18 @@ int Editor::KeyCommand(unsigned int iMessage) {
case SCI_DELWORDLEFT: {
int startWord = pdoc->NextWordStart(currentPos, -1);
pdoc->DeleteChars(startWord, currentPos - startWord);
- MovePositionTo(startWord);
SetLastXChosen();
}
break;
case SCI_DELWORDRIGHT: {
int endWord = pdoc->NextWordStart(currentPos, 1);
pdoc->DeleteChars(currentPos, endWord - currentPos);
- MovePositionTo(currentPos);
}
break;
case SCI_DELLINELEFT: {
int line = pdoc->LineFromPosition(currentPos);
int start = pdoc->LineStart(line);
pdoc->DeleteChars(start, currentPos - start);
- MovePositionTo(start);
SetLastXChosen();
}
break;
@@ -3059,7 +3060,6 @@ int Editor::KeyCommand(unsigned int iMessage) {
int line = pdoc->LineFromPosition(currentPos);
int end = pdoc->LineEnd(line);
pdoc->DeleteChars(currentPos, end - currentPos);
- MovePositionTo(currentPos);
}
break;
case SCI_LINECUT: {
@@ -3081,7 +3081,6 @@ int Editor::KeyCommand(unsigned int iMessage) {
int start = pdoc->LineStart(line);
int end = pdoc->LineStart(line + 1);
pdoc->DeleteChars(start, end - start);
- MovePositionTo(start);
}
break;
case SCI_LINETRANSPOSE:
diff --git a/src/Editor.h b/src/Editor.h
index d9719dc53..d784f478e 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -396,6 +396,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
void ChangeCaseOfSelection(bool makeUpperCase);
void LineTranspose();
virtual void CancelModes();
+ void NewLine();
virtual int KeyCommand(unsigned int iMessage);
virtual int KeyDefault(int /* key */, int /*modifiers*/);
int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0);