aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorVicente <unknown>2017-04-02 08:17:38 +1000
committerVicente <unknown>2017-04-02 08:17:38 +1000
commitbe5c8e44aada8184ec1c91b10e8714d85df08ad4 (patch)
treec82096b8ce83b00da3345f685f9d4511be2b62bf /src
parentc02e8d079cb3f39ed1250013fdb614a414d2567c (diff)
downloadscintilla-mirror-be5c8e44aada8184ec1c91b10e8714d85df08ad4.tar.gz
Added "Reverse Selected Lines" as SCI_LINEREVERSE.
Diffstat (limited to 'src')
-rw-r--r--src/Editor.cxx31
-rw-r--r--src/Editor.h1
2 files changed, 32 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:
diff --git a/src/Editor.h b/src/Editor.h
index 00611cf1c..6e4e6474c 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -460,6 +460,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
virtual std::string CaseMapString(const std::string &s, int caseMapping);
void ChangeCaseOfSelection(int caseMapping);
void LineTranspose();
+ void LineReverse();
void Duplicate(bool forLine);
virtual void CancelModes();
void NewLine();