diff options
author | Marko Njezic <devnull@localhost> | 2012-03-31 15:50:57 +0200 |
---|---|---|
committer | Marko Njezic <devnull@localhost> | 2012-03-31 15:50:57 +0200 |
commit | 66f72d2592991fefe6922a0e9745b776563a02a7 (patch) | |
tree | 97b961c25ff5fe0ce653b192dea68812b24a4ad6 | |
parent | cb8e7cc28672a39c2bf78e2caf1dac74e745d5ee (diff) | |
download | scintilla-mirror-66f72d2592991fefe6922a0e9745b776563a02a7.tar.gz |
Make MoveSelectedLines() work properly when there's no newline at EOF. Bug #3511023.
-rw-r--r-- | src/Editor.cxx | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index 7adff4037..b71d451b3 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1030,6 +1030,12 @@ void Editor::VerticalCentreCaret() { } } +// Avoid 64 bit compiler warnings. +// Scintilla does not support text buffers larger than 2**31 +static int istrlen(const char *s) { + return static_cast<int>(strlen(s)); +} + void Editor::MoveSelectedLines(int lineDelta) { // if selection doesn't start at the beginning of the line, set the new start @@ -1043,9 +1049,11 @@ void Editor::MoveSelectedLines(int lineDelta) { int selectionEnd = SelectionEnd().Position(); int endLine = pdoc->LineFromPosition(selectionEnd); int beginningOfEndLine = pdoc->LineStart(endLine); + bool appendEol = false; if (selectionEnd > beginningOfEndLine || selectionStart == selectionEnd) { selectionEnd = pdoc->LineStart(endLine + 1); + appendEol = (selectionEnd == pdoc->Length() && pdoc->LineFromPosition(selectionEnd) == endLine); } // if there's nowhere for the selection to move @@ -1059,19 +1067,34 @@ void Editor::MoveSelectedLines(int lineDelta) { UndoGroup ug(pdoc); + if (lineDelta > 0 && selectionEnd == pdoc->LineStart(pdoc->LinesTotal() - 1)) { + SetSelection(pdoc->MovePositionOutsideChar(selectionEnd - 1, -1), selectionEnd); + ClearSelection(); + selectionEnd = CurrentPosition(); + } SetSelection(selectionStart, selectionEnd); SelectionText selectedText; CopySelectionRange(&selectedText); int selectionLength = SelectionRange(selectionStart, selectionEnd).Length(); - ClearSelection(); - Point currentLocation = LocationFromPosition(CurrentPosition()); int currentLine = LineFromLocation(currentLocation); + + if (appendEol) + SetSelection(pdoc->MovePositionOutsideChar(selectionStart - 1, -1), selectionEnd); + ClearSelection(); + + const char *eol = StringFromEOLMode(pdoc->eolMode); + if (currentLine + lineDelta >= pdoc->LinesTotal()) + pdoc->InsertCString(pdoc->Length(), eol); GoToLine(currentLine + lineDelta); pdoc->InsertCString(CurrentPosition(), selectedText.s); + if (appendEol) { + pdoc->InsertCString(CurrentPosition() + selectionLength, eol); + selectionLength += istrlen(eol); + } SetSelection(CurrentPosition(), CurrentPosition() + selectionLength); } @@ -1636,12 +1659,6 @@ int Editor::SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) { return markerCheck; } -// Avoid 64 bit compiler warnings. -// Scintilla does not support text buffers larger than 2**31 -static int istrlen(const char *s) { - return static_cast<int>(strlen(s)); -} - bool ValidStyledText(ViewStyle &vs, size_t styleOffset, const StyledText &st) { if (st.multipleStyles) { for (size_t iStyle=0; iStyle<st.length; iStyle++) { |