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