diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Document.cxx | 44 | ||||
| -rw-r--r-- | src/Document.h | 11 | ||||
| -rw-r--r-- | src/Editor.cxx | 25 | 
3 files changed, 47 insertions, 33 deletions
| diff --git a/src/Document.cxx b/src/Document.cxx index 3d3e5a51d..4272dda63 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -344,11 +344,11 @@ void Document::ModifiedAt(int pos) {  // SetStyleAt does not change the persistent state of a document  // Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number -void Document::DeleteChars(int pos, int len) { +bool Document::DeleteChars(int pos, int len) {  	if (len == 0) -		return; +		return false;  	if ((pos + len) > Length()) -		return; +		return false;  	if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {  		enteredReadOnlyCount++;  		NotifyModifyAttempt(); @@ -379,9 +379,10 @@ void Document::DeleteChars(int pos, int len) {  		}  		enteredCount--;  	} +	return !cb.IsReadOnly();  } -void Document::InsertStyledString(int position, char *s, int insertLength) { +bool Document::InsertStyledString(int position, char *s, int insertLength) {  	if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {  		enteredReadOnlyCount++;  		NotifyModifyAttempt(); @@ -409,6 +410,7 @@ void Document::InsertStyledString(int position, char *s, int insertLength) {  		}  		enteredCount--;  	} +	return !cb.IsReadOnly();  }  int Document::Undo() { @@ -497,29 +499,31 @@ int Document::Redo() {  	return newPos;  } -void Document::InsertChar(int pos, char ch) { +bool Document::InsertChar(int pos, char ch) {  	char chs[2];  	chs[0] = ch;  	chs[1] = 0; -	InsertStyledString(pos*2, chs, 2); +	return InsertStyledString(pos*2, chs, 2);  }  // Insert a null terminated string -void Document::InsertString(int position, const char *s) { -	InsertString(position, s, strlen(s)); +bool Document::InsertString(int position, const char *s) { +	return InsertString(position, s, strlen(s));  }  // Insert a string with a length -void Document::InsertString(int position, const char *s, int insertLength) { +bool Document::InsertString(int position, const char *s, int insertLength) { +	bool changed = false;  	char *sWithStyle = new char[insertLength * 2];  	if (sWithStyle) {  		for (int i = 0; i < insertLength; i++) {  			sWithStyle[i*2] = s[i];  			sWithStyle[i*2 + 1] = 0;  		} -		InsertStyledString(position*2, sWithStyle, insertLength*2); +		changed = InsertStyledString(position*2, sWithStyle, insertLength*2);  		delete []sWithStyle;  	} +	return changed;  }  void Document::ChangeChar(int pos, char ch) { @@ -531,22 +535,26 @@ 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) {  	if (pos <= 0) {  		return pos;  	} else if (IsCrLf(pos - 2)) { -		DeleteChars(pos - 2, 2); -		return pos - 2; +		return DelCharBackMove(pos, 2);  	} else if (SC_CP_UTF8 == dbcsCodePage) {  		int startChar = MovePositionOutsideChar(pos - 1, -1, false); -		DeleteChars(startChar, pos - startChar); -		return startChar; +		return DelCharBackMove(pos, pos - startChar);  	} else if (IsDBCS(pos - 1)) { -		DeleteChars(pos - 2, 2); -		return pos - 2; +		return DelCharBackMove(pos, 2);  	} else { -		DeleteChars(pos - 1, 1); -		return pos - 1; +		return DelCharBackMove(pos, 1);  	}  } diff --git a/src/Document.h b/src/Document.h index 941ad79cc..61fe33fce 100644 --- a/src/Document.h +++ b/src/Document.h @@ -132,8 +132,8 @@ public:  	int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);  	// Gateways to modifying document -	void DeleteChars(int pos, int len); -	void InsertStyledString(int position, char *s, int insertLength); +	bool DeleteChars(int pos, int len); +	bool InsertStyledString(int position, char *s, int insertLength);  	int Undo();  	int Redo();  	bool CanUndo() { return cb.CanUndo(); } @@ -158,9 +158,9 @@ public:  	void SetReadOnly(bool set) { cb.SetReadOnly(set); }  	bool IsReadOnly() { return cb.IsReadOnly(); } -	void InsertChar(int pos, char ch); -	void InsertString(int position, const char *s); -	void InsertString(int position, const char *s, int insertLength); +	bool InsertChar(int pos, char ch); +	bool InsertString(int position, const char *s); +	bool InsertString(int position, const char *s, int insertLength);  	void ChangeChar(int pos, char ch);  	void DelChar(int pos);  	int DelCharBack(int pos); @@ -233,6 +233,7 @@ 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 fd8a2d719..d66b49238 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -2220,8 +2220,9 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {  			}  		}  	} -	pdoc->InsertString(currentPos, s, len); -	SetEmptySelection(currentPos + len); +	if (pdoc->InsertString(currentPos, s, len)) { +		SetEmptySelection(currentPos + len); +	}  	EnsureCaretVisible();  	// Avoid blinking during rapid typing:  	ShowCaretAtCurrentPosition(); @@ -3456,9 +3457,10 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul  			SetSelection(position, position);  		} else {  			position = MovePositionOutsideChar(position, currentPos - position); -			pdoc->InsertString(position, value); +			if (pdoc->InsertString(position, value)) { +				SetSelection(position + strlen(value), position); +			}  			pdoc->EndUndoAction(); -			SetSelection(position + strlen(value), position);  		}  	} else if (inDragDrop) {  		SetSelection(position, position); @@ -3743,17 +3745,20 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {  			if (selStart < selEnd) {  				if (drag.len) {  					if (ctrl) { -						pdoc->InsertString(newPos, drag.s, drag.len); -						SetSelection(newPos, newPos + drag.len); +						if (pdoc->InsertString(newPos, drag.s, drag.len)) { +							SetSelection(newPos, newPos + drag.len); +						}  					} else if (newPos < selStart) {  						pdoc->DeleteChars(selStart, drag.len); -						pdoc->InsertString(newPos, drag.s, drag.len); -						SetSelection(newPos, newPos + drag.len); +						if (pdoc->InsertString(newPos, drag.s, drag.len)) { +							SetSelection(newPos, newPos + drag.len); +						}  					} else if (newPos > selEnd) {  						pdoc->DeleteChars(selStart, drag.len);  						newPos -= drag.len; -						pdoc->InsertString(newPos, drag.s, drag.len); -						SetSelection(newPos, newPos + drag.len); +						if (pdoc->InsertString(newPos, drag.s, drag.len)) { +							SetSelection(newPos, newPos + drag.len); +						}  					} else {  						SetEmptySelection(newPos);  					} | 
