diff options
| author | Marko Njezic <unknown> | 2011-06-03 17:54:42 +0200 | 
|---|---|---|
| committer | Marko Njezic <unknown> | 2011-06-03 17:54:42 +0200 | 
| commit | 595bc65e44dae98008e8fbbc3e544c69a34df51a (patch) | |
| tree | 55a587b094f78b520aaac56fc5c9a06af2fba9f3 | |
| parent | 2ac68451116f3f51ecc9e57d2c8b029bee677c69 (diff) | |
| download | scintilla-mirror-595bc65e44dae98008e8fbbc3e544c69a34df51a.tar.gz | |
Fix problem with typing over multiple consecutive selections. Bug #3309906.
| -rw-r--r-- | src/Editor.cxx | 41 | 
1 files changed, 27 insertions, 14 deletions
| diff --git a/src/Editor.cxx b/src/Editor.cxx index d1d0e7f91..dee1d8863 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -3928,37 +3928,50 @@ void Editor::FilterSelections() {  	}  } +static bool cmpSelPtrs(const SelectionRange *a, const SelectionRange *b) { +	return *a < *b; +} +  // AddCharUTF inserts an array of bytes which may or may not be in UTF-8.  void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {  	FilterSelections();  	{  		UndoGroup ug(pdoc, (sel.Count() > 1) || !sel.Empty() || inOverstrike); -		for (size_t r=0; r<sel.Count(); r++) { -			if (!RangeContainsProtected(sel.Range(r).Start().Position(), -				sel.Range(r).End().Position())) { -				int positionInsert = sel.Range(r).Start().Position(); -				if (!sel.Range(r).Empty()) { -					if (sel.Range(r).Length()) { -						pdoc->DeleteChars(positionInsert, sel.Range(r).Length()); -						sel.Range(r).ClearVirtualSpace(); + +		std::vector<SelectionRange *> selPtrs; +		for (size_t r = 0; r < sel.Count(); r++) { +			selPtrs.push_back(&sel.Range(r)); +		} +		std::sort(selPtrs.begin(), selPtrs.end(), cmpSelPtrs); + +		for (std::vector<SelectionRange *>::reverse_iterator rit = selPtrs.rbegin(); +			rit != selPtrs.rend(); ++rit) { +			SelectionRange *currentSel = *rit; +			if (!RangeContainsProtected(currentSel->Start().Position(), +				currentSel->End().Position())) { +				int positionInsert = currentSel->Start().Position(); +				if (!currentSel->Empty()) { +					if (currentSel->Length()) { +						pdoc->DeleteChars(positionInsert, currentSel->Length()); +						currentSel->ClearVirtualSpace();  					} else {  						// Range is all virtual so collapse to start of virtual space -						sel.Range(r).MinimizeVirtualSpace(); +						currentSel->MinimizeVirtualSpace();  					}  				} else if (inOverstrike) {  					if (positionInsert < pdoc->Length()) {  						if (!IsEOLChar(pdoc->CharAt(positionInsert))) {  							pdoc->DelChar(positionInsert); -							sel.Range(r).ClearVirtualSpace(); +							currentSel->ClearVirtualSpace();  						}  					}  				} -				positionInsert = InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); +				positionInsert = InsertSpace(positionInsert, currentSel->caret.VirtualSpace());  				if (pdoc->InsertString(positionInsert, s, len)) { -					sel.Range(r).caret.SetPosition(positionInsert + len); -					sel.Range(r).anchor.SetPosition(positionInsert + len); +					currentSel->caret.SetPosition(positionInsert + len); +					currentSel->anchor.SetPosition(positionInsert + len);  				} -				sel.Range(r).ClearVirtualSpace(); +				currentSel->ClearVirtualSpace();  				// If in wrap mode rewrap current line so EnsureCaretVisible has accurate information  				if (wrapState != eWrapNone) {  					AutoSurface surface(this); | 
