diff options
Diffstat (limited to 'src/Editor.cxx')
| -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); | 
