diff options
| author | Vicente <unknown> | 2017-04-02 08:17:38 +1000 | 
|---|---|---|
| committer | Vicente <unknown> | 2017-04-02 08:17:38 +1000 | 
| commit | be5c8e44aada8184ec1c91b10e8714d85df08ad4 (patch) | |
| tree | c82096b8ce83b00da3345f685f9d4511be2b62bf /src | |
| parent | c02e8d079cb3f39ed1250013fdb614a414d2567c (diff) | |
| download | scintilla-mirror-be5c8e44aada8184ec1c91b10e8714d85df08ad4.tar.gz | |
Added "Reverse Selected Lines" as SCI_LINEREVERSE.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Editor.cxx | 31 | ||||
| -rw-r--r-- | src/Editor.h | 1 | 
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(); | 
