From 3f0f6a22957dd7a041802bdce7bd1517b28046d5 Mon Sep 17 00:00:00 2001 From: ArkadiuszMichalski <2730894+ArkadiuszMichalski@users.noreply.github.com> Date: Fri, 16 Dec 2022 19:13:20 +0100 Subject: [PATCH] Fix trim operations for selection lines not working issue Fix #12602, fix #12658, close #12655 --- PowerEditor/src/Notepad_plus.cpp | 54 +++++++++++++++++++++++++++++--- PowerEditor/src/Notepad_plus.h | 3 +- PowerEditor/src/NppCommands.cpp | 6 ++-- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 3ebcaa058..b6b0d5f29 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -1473,21 +1473,65 @@ void Notepad_plus::wsTabConvert(spaceTab whichWay) void Notepad_plus::doTrim(trimOp whichPart) { - // whichPart : line head or line tail + // whichPart : line head or line tail or line both FindOption env; if (whichPart == lineHeader) { - env._str2Search = TEXT("^[ ]+"); + env._str2Search = TEXT("^[\\t ]+"); } else if (whichPart == lineTail) { - env._str2Search = TEXT("[ ]+$"); + env._str2Search = TEXT("[\\t ]+$"); + } + else if (whichPart == lineBoth) + { + env._str2Search = TEXT("^[\\t ]+|[\\t ]+$"); } else return; env._str4Replace = TEXT(""); - env._searchType = FindRegex; - _findReplaceDlg.processAll(ProcessReplaceAll, &env, true); + env._searchType = FindRegex; + auto mainSelAnchor = _pEditView->execute(SCI_GETANCHOR); + auto mainSelCaretPos = _pEditView->execute(SCI_GETCURRENTPOS); + auto rectSelAnchorVirt = _pEditView->execute(SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE); + auto rectSelCaretVirt = _pEditView->execute(SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE); + bool isRectSel = (_pEditView->execute(SCI_GETSELECTIONMODE) == SC_SEL_RECTANGLE) || (_pEditView->execute(SCI_GETSELECTIONMODE) == SC_SEL_THIN); + bool isEntireDoc = (mainSelAnchor == mainSelCaretPos) && (rectSelAnchorVirt == rectSelCaretVirt); + auto docLength = _pEditView->execute(SCI_GETLENGTH); + // auto-expand of partially selected lines + if (!isEntireDoc) + { + env._isInSelection = !isEntireDoc; + auto startPos = _pEditView->execute(SCI_GETSELECTIONSTART); + auto startLine = _pEditView->execute(SCI_LINEFROMPOSITION, startPos); + auto endPos = _pEditView->execute(SCI_GETSELECTIONEND); + auto endLine = _pEditView->execute(SCI_LINEFROMPOSITION, endPos); + + if (startPos != _pEditView->execute(SCI_POSITIONFROMLINE, startLine)) + startPos = _pEditView->execute(SCI_POSITIONFROMLINE, startLine); + + if (endPos != _pEditView->execute(SCI_POSITIONFROMLINE, endLine) && endPos < _pEditView->execute(SCI_GETLINEENDPOSITION, endLine)) + endPos = _pEditView->execute(SCI_GETLINEENDPOSITION, endLine); + + _pEditView->execute(SCI_SETSEL, startPos, endPos); + } + _findReplaceDlg.processAll(ProcessReplaceAll, &env, isEntireDoc); + // restore original selection if nothing has changed + if (!isEntireDoc && (docLength == _pEditView->execute(SCI_GETLENGTH))) + { + if (isRectSel) + { + _pEditView->execute(SCI_SETRECTANGULARSELECTIONANCHOR, mainSelAnchor); + _pEditView->execute(SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, rectSelAnchorVirt); + _pEditView->execute(SCI_SETRECTANGULARSELECTIONCARET, mainSelCaretPos); + _pEditView->execute(SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, rectSelCaretVirt); + } + else + { + _pEditView->execute(SCI_SETANCHOR, mainSelAnchor); + _pEditView->execute(SCI_SETCURRENTPOS, mainSelCaretPos); + } + } } void Notepad_plus::removeEmptyLine(bool isBlankContained) diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index 9f5fbea41..182a470c8 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -66,7 +66,8 @@ enum WindowStatus { //bitwise mask enum trimOp { lineHeader = 0, lineTail = 1, - lineEol = 2 + lineBoth = 2, + lineEol = 3 }; enum spaceTab { diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index 379bf4546..cdbb4bf13 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -1902,8 +1902,7 @@ void Notepad_plus::command(int id) std::lock_guard lock(command_mutex); _pEditView->execute(SCI_BEGINUNDOACTION); - doTrim(lineTail); - doTrim(lineHeader); + doTrim(lineBoth); _pEditView->execute(SCI_ENDUNDOACTION); break; } @@ -1920,8 +1919,7 @@ void Notepad_plus::command(int id) std::lock_guard lock(command_mutex); _pEditView->execute(SCI_BEGINUNDOACTION); - doTrim(lineTail); - doTrim(lineHeader); + doTrim(lineBoth); _pEditView->execute(SCI_TARGETWHOLEDOCUMENT); _pEditView->execute(SCI_LINESJOIN); _pEditView->execute(SCI_ENDUNDOACTION);