diff options
-rw-r--r-- | doc/ScintillaDoc.html | 18 | ||||
-rw-r--r-- | include/Scintilla.h | 2 | ||||
-rw-r--r-- | include/Scintilla.iface | 6 | ||||
-rw-r--r-- | src/Editor.cxx | 63 | ||||
-rw-r--r-- | src/Editor.h | 3 |
5 files changed, 92 insertions, 0 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 50a7ed477..36e04f239 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -1112,6 +1112,8 @@ struct Sci_TextToFind { <a class="message" href="#SCI_TEXTWIDTH">SCI_TEXTWIDTH(int styleNumber, const char *text)</a><br /> <a class="message" href="#SCI_TEXTHEIGHT">SCI_TEXTHEIGHT(int line)</a><br /> <a class="message" href="#SCI_CHOOSECARETX">SCI_CHOOSECARETX</a><br /> + <a class="message" href="#SCI_MOVESELECTEDLINESUP">SCI_MOVESELECTEDLINESUP</a><br /> + <a class="message" href="#SCI_MOVESELECTEDLINESDOWN">SCI_MOVESELECTEDLINESDOWN</a><br /> </code> <p><b id="SCI_GETTEXTLENGTH">SCI_GETTEXTLENGTH</b><br /> @@ -1456,6 +1458,16 @@ struct Sci_TextToFind { user and this value is then used when moving vertically such as by using the up and down keys. This message sets the current x position of the caret as the remembered value.</p> + <p><b id="SCI_MOVESELECTEDLINESUP">SCI_MOVESELECTEDLINESUP</b><br /> + Move the selected lines up one line, shifting the line above after the selection. + The selection will be automatically extended to the beginning of the selection's first line and the end of the seletion's last line. + If nothing was selected, the line the cursor is currently at will be selected.</p> + + <p><b id="SCI_MOVESELECTEDLINESDOWN">SCI_MOVESELECTEDLINESDOWN</b><br /> + Move the selected lines down one line, shifting the line below before the selection. + The selection will be automatically extended to the beginning of the selection's first line and the end of the seletion's last line. + If nothing was selected, the line the cursor is currently at will be selected.</p> + <h2 id="MultipleSelectionAndVirtualSpace">Multiple Selection and Virtual Space</h2> <code> @@ -4337,6 +4349,12 @@ struct Sci_TextToFind { <td><code>SCI_VERTICALCENTRECARET</code></td> </tr> + + <tr> + <td><code>SCI_MOVESELECTEDLINESUP</code></td> + + <td><code>SCI_MOVESELECTEDLINESDOWN</code></td> + </tr> </tbody> </table> diff --git a/include/Scintilla.h b/include/Scintilla.h index c0ed9545e..f1c4fa99f 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -799,6 +799,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_CHANGELEXERSTATE 2617 #define SCI_CONTRACTEDFOLDNEXT 2618 #define SCI_VERTICALCENTRECARET 2619 +#define SCI_MOVESELECTEDLINESUP 2620 +#define SCI_MOVESELECTEDLINESDOWN 2621 #define SCI_STARTRECORD 3001 #define SCI_STOPRECORD 3002 #define SCI_SETLEXER 4001 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 2cd7eba1d..8cd3ab5d0 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -2125,6 +2125,12 @@ fun int ContractedFoldNext=2618(int lineStart,) # Centre current line in window. fun void VerticalCentreCaret=2619(,) +# Move the selected lines up one line, shifting the line above after the selection +fun void MoveSelectedLinesUp=2620(,) + +# Move the selected lines down one line, shifting the line below before the selection +fun void MoveSelectedLinesDown=2621(,) + # Start notifying the container of all key presses and commands. fun void StartRecord=3001(,) diff --git a/src/Editor.cxx b/src/Editor.cxx index ae2d670ce..2fa3a4340 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1027,6 +1027,59 @@ void Editor::VerticalCentreCaret() { } } +void Editor::MoveSelectedLines(int lineDelta) { + + // if selection doesn't start at the beginning of the line, set the new start + int selectionStart = SelectionStart().Position(); + int startLine = pdoc->LineFromPosition(selectionStart); + int beginningOfStartLine = pdoc->LineStart(startLine); + selectionStart = beginningOfStartLine; + + // if selection doesn't end at the beginning of a line greater than that of the start, + // then set it at the beginning of the next one + int selectionEnd = SelectionEnd().Position(); + int endLine = pdoc->LineFromPosition(selectionEnd); + int beginningOfEndLine = pdoc->LineStart(endLine); + if (selectionEnd > beginningOfEndLine + || selectionStart == selectionEnd) { + selectionEnd = pdoc->LineStart(endLine + 1); + } + + // if there's nowhere for the selection to move + // (i.e. at the beginning going up or at the end going down), + // stop it right there! + if ((selectionStart == 0 && lineDelta < 0) + || (selectionEnd == pdoc->Length() && lineDelta > 0) + || selectionStart == selectionEnd) { + return; + } + + UndoGroup ug(pdoc); + + SetSelection(selectionStart, selectionEnd); + + SelectionText selectedText; + CopySelectionRange(&selectedText); + + int selectionLength = SelectionRange(selectionStart, selectionEnd).Length(); + ClearSelection(); + + Point currentLocation = LocationFromPosition(CurrentPosition()); + int currentLine = LineFromLocation(currentLocation); + GoToLine(currentLine + lineDelta); + + pdoc->InsertCString(CurrentPosition(), selectedText.s); + SetSelection(CurrentPosition(), CurrentPosition() + selectionLength); +} + +void Editor::MoveSelectedLinesUp() { + MoveSelectedLines(-1); +} + +void Editor::MoveSelectedLinesDown() { + MoveSelectedLines(1); +} + void Editor::MoveCaretInsideView(bool ensureVisible) { PRectangle rcClient = GetTextRectangle(); Point pt = PointMainCaret(); @@ -4688,6 +4741,8 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lPar case SCI_SELECTIONDUPLICATE: case SCI_COPYALLOWLINE: case SCI_VERTICALCENTRECARET: + case SCI_MOVESELECTEDLINESUP: + case SCI_MOVESELECTEDLINESDOWN: break; // Filter out all others like display changes. Also, newlines are redundant @@ -6957,6 +7012,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { VerticalCentreCaret(); break; + case SCI_MOVESELECTEDLINESUP: + MoveSelectedLinesUp(); + break; + + case SCI_MOVESELECTEDLINESDOWN: + MoveSelectedLinesDown(); + break; + case SCI_COPYRANGE: CopyRangeToClipboard(wParam, lParam); break; diff --git a/src/Editor.h b/src/Editor.h index ef3fb78f0..5c01ee83d 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -335,6 +335,9 @@ protected: // ScintillaBase subclass needs access to much of Editor virtual void ScrollText(int linesToMove); void HorizontalScrollTo(int xPos); void VerticalCentreCaret(); + void MoveSelectedLines(int lineDelta); + void MoveSelectedLinesUp(); + void MoveSelectedLinesDown(); void MoveCaretInsideView(bool ensureVisible=true); int DisplayFromPosition(int pos); |