diff options
-rw-r--r-- | src/Editor.cxx | 9 | ||||
-rw-r--r-- | src/Selection.cxx | 17 | ||||
-rw-r--r-- | src/Selection.h | 6 |
3 files changed, 24 insertions, 8 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index ee44a6972..caeb9dfdf 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -5644,8 +5644,9 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b SetDragPosition(SelectionPosition(invalidPosition)); if (!shift) { if (ctrl && multipleSelection) { - InvalidateSelection(SelectionRange(newPos), true); - sel.AddSelection(newPos); + SelectionRange range(newPos); + sel.TentativeSelection(range); + InvalidateSelection(range, true); } else { InvalidateSelection(SelectionRange(newPos), true); if (sel.Count() > 1) @@ -5756,8 +5757,7 @@ void Editor::ButtonMove(Point pt) { SetSelection(movePos, sel.RangeMain().anchor); } else if (sel.Count() > 1) { SelectionRange range(movePos, sel.RangeMain().anchor); - sel.TrimSelection(range); - sel.RangeMain() = range; + sel.TentativeSelection(range); InvalidateSelection(range, true); } else { SetSelection(movePos, sel.RangeMain().anchor); @@ -5883,6 +5883,7 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) { SetSelection(newPos, sel.RangeMain().anchor); } } + sel.CommitTentative(); } SetRectangularRange(); lastClickTime = curTime; diff --git a/src/Selection.cxx b/src/Selection.cxx index 246cfe709..b44d4e96c 100644 --- a/src/Selection.cxx +++ b/src/Selection.cxx @@ -156,7 +156,7 @@ void SelectionRange::MinimizeVirtualSpace() { } } -Selection::Selection() : mainRange(0), moveExtends(false), selType(selStream) { +Selection::Selection() : mainRange(0), moveExtends(false), selType(selStream), tentativeMain(false) { AddSelection(SelectionPosition(0)); } @@ -270,8 +270,19 @@ void Selection::AddSelection(SelectionRange range) { mainRange = ranges.size() - 1; } -void Selection::AddSelection(SelectionPosition spPos) { - AddSelection(SelectionRange(spPos, spPos)); +void Selection::TentativeSelection(SelectionRange range) { + if (!tentativeMain) { + rangesSaved = ranges; + } + ranges = rangesSaved; + AddSelection(range); + TrimSelection(ranges[mainRange]); + tentativeMain = true; +} + +void Selection::CommitTentative() { + rangesSaved.clear(); + tentativeMain = false; } int Selection::CharacterInSelection(int posCharacter) const { diff --git a/src/Selection.h b/src/Selection.h index ff13f2130..c18e5c02e 100644 --- a/src/Selection.h +++ b/src/Selection.h @@ -123,9 +123,11 @@ struct SelectionRange { class Selection { std::vector<SelectionRange> ranges; + std::vector<SelectionRange> rangesSaved; SelectionRange rangeRectangular; size_t mainRange; bool moveExtends; + bool tentativeMain; public: enum selTypes { noSel, selStream, selRectangle, selLines, selThin }; selTypes selType; @@ -150,13 +152,15 @@ public: void TrimSelection(SelectionRange range); void SetSelection(SelectionRange range); void AddSelection(SelectionRange range); - void AddSelection(SelectionPosition spPos); + void TentativeSelection(SelectionRange range); + void CommitTentative(); int CharacterInSelection(int posCharacter) const; int InSelectionForEOL(int pos) const; int VirtualSpaceFor(int pos) const; void Clear(); void RemoveDuplicates(); void RotateMain(); + bool Tentative() const { return tentativeMain; } }; #ifdef SCI_NAMESPACE |