diff options
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r-- | src/Editor.cxx | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index 5b690058d..61511cd2a 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -2800,6 +2800,7 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lPar case SCI_LINECUT: case SCI_LINEDELETE: case SCI_LINETRANSPOSE: + case SCI_LINEREVERSE: case SCI_LINEDUPLICATE: case SCI_LOWERCASE: case SCI_UPPERCASE: @@ -2967,6 +2968,32 @@ void Editor::LineTranspose() { } } +void Editor::LineReverse() { + const Sci::Line lineStart = pdoc->LineFromPosition(sel.RangeMain().Start().Position()); + const Sci::Line lineEnd = pdoc->LineFromPosition(sel.RangeMain().End().Position()-1); + const Sci::Line lineDiff = lineEnd - lineStart; + if (lineDiff <= 0) + return; + UndoGroup ug(pdoc); + for (Sci::Line i=(lineDiff+1)/2-1; i>=0; --i) { + const Sci::Line lineNum2 = lineEnd - i; + const Sci::Line lineNum1 = lineStart + i; + Sci::Position lineStart2 = pdoc->LineStart(lineNum2); + const Sci::Position lineStart1 = pdoc->LineStart(lineNum1); + const std::string line2 = RangeText(lineStart2, pdoc->LineEnd(lineNum2)); + const std::string line1 = RangeText(lineStart1, pdoc->LineEnd(lineNum1)); + const Sci::Position lineLen2 = static_cast<Sci::Position>(line2.length()); + const Sci::Position lineLen1 = static_cast<Sci::Position>(line1.length()); + pdoc->DeleteChars(lineStart2, lineLen2); + pdoc->DeleteChars(lineStart1, lineLen1); + lineStart2 -= lineLen1; + pdoc->InsertString(lineStart2, line1.c_str(), lineLen1); + pdoc->InsertString(lineStart1, line2.c_str(), lineLen2); + } + // Wholly select all affected lines + sel.RangeMain() = SelectionRange(pdoc->LineStart(lineStart), pdoc->LineStart(lineEnd+1)); +} + void Editor::Duplicate(bool forLine) { if (sel.Empty()) { forLine = true; @@ -3809,6 +3836,9 @@ int Editor::KeyCommand(unsigned int iMessage) { case SCI_LINETRANSPOSE: LineTranspose(); break; + case SCI_LINEREVERSE: + LineReverse(); + break; case SCI_LINEDUPLICATE: Duplicate(true); break; @@ -7453,6 +7483,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_LINECUT: case SCI_LINEDELETE: case SCI_LINETRANSPOSE: + case SCI_LINEREVERSE: case SCI_LINEDUPLICATE: case SCI_LOWERCASE: case SCI_UPPERCASE: |