diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Editor.cxx | 70 | ||||
-rw-r--r-- | src/Editor.h | 1 |
2 files changed, 44 insertions, 27 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index ca7fe2e88..627179876 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -6009,6 +6009,43 @@ void Editor::SetSelectionNMessage(Message iMessage, uptr_t wParam, sptr_t lParam ContainerNeedsUpdate(Update::Selection); } +namespace { + +constexpr Selection::SelTypes SelTypeFromMode(SelectionMode mode) { + switch (mode) { + case SelectionMode::Rectangle: + return Selection::SelTypes::rectangle; + case SelectionMode::Lines: + return Selection::SelTypes::lines; + case SelectionMode::Thin: + return Selection::SelTypes::thin; + case SelectionMode::Stream: + default: + return Selection::SelTypes::stream; + } +} + +} + +void Editor::SetSelectionMode(uptr_t wParam, bool setMoveExtends) { + const Selection::SelTypes newSelType = SelTypeFromMode(static_cast<SelectionMode>(wParam)); + if (setMoveExtends) { + sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != newSelType)); + } + sel.selType = newSelType; + switch (sel.selType) { + case Selection::SelTypes::rectangle: + sel.Rectangular() = sel.RangeMain(); // adjust current selection + break; + case Selection::SelTypes::lines: + SetSelection(sel.RangeMain().caret, sel.RangeMain().anchor); // adjust current selection + break; + default: + ; + } + InvalidateWholeSelection(); +} + sptr_t Editor::StringResult(sptr_t lParam, const char *val) noexcept { const size_t len = val ? strlen(val) : 0; if (lParam) { @@ -8186,33 +8223,12 @@ sptr_t Editor::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { case Message::SelectionIsRectangle: return sel.selType == Selection::SelTypes::rectangle ? 1 : 0; - case Message::SetSelectionMode: { - switch (static_cast<SelectionMode>(wParam)) { - case SelectionMode::Stream: - sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::SelTypes::stream)); - sel.selType = Selection::SelTypes::stream; - break; - case SelectionMode::Rectangle: - sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::SelTypes::rectangle)); - sel.selType = Selection::SelTypes::rectangle; - sel.Rectangular() = sel.RangeMain(); // adjust current selection - break; - case SelectionMode::Lines: - sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::SelTypes::lines)); - sel.selType = Selection::SelTypes::lines; - SetSelection(sel.RangeMain().caret, sel.RangeMain().anchor); // adjust current selection - break; - case SelectionMode::Thin: - sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::SelTypes::thin)); - sel.selType = Selection::SelTypes::thin; - break; - default: - sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::SelTypes::stream)); - sel.selType = Selection::SelTypes::stream; - } - InvalidateWholeSelection(); - break; - } + case Message::SetSelectionMode: + SetSelectionMode(wParam, true); + break; + case Message::ChangeSelectionMode: + SetSelectionMode(wParam, false); + break; case Message::GetSelectionMode: switch (sel.selType) { case Selection::SelTypes::stream: diff --git a/src/Editor.h b/src/Editor.h index 8c6458879..e7e198aec 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -612,6 +612,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void StyleSetMessage(Scintilla::Message iMessage, Scintilla::uptr_t wParam, Scintilla::sptr_t lParam); Scintilla::sptr_t StyleGetMessage(Scintilla::Message iMessage, Scintilla::uptr_t wParam, Scintilla::sptr_t lParam); void SetSelectionNMessage(Scintilla::Message iMessage, Scintilla::uptr_t wParam, Scintilla::sptr_t lParam); + void SetSelectionMode(uptr_t wParam, bool setMoveExtends); // Coercion functions for transforming WndProc parameters into pointers static void *PtrFromSPtr(Scintilla::sptr_t lParam) noexcept { |