From ffe1e08553a7d964036d9626d36d5c991ea5ec5c Mon Sep 17 00:00:00 2001 From: Marko Njezic Date: Fri, 3 Jun 2011 17:54:42 +0200 Subject: Fix problem with typing over multiple consecutive selections. Bug #3309906. --- src/Editor.cxx | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'src/Editor.cxx') 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; rDeleteChars(positionInsert, sel.Range(r).Length()); - sel.Range(r).ClearVirtualSpace(); + + std::vector 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::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); -- cgit v1.2.3