diff options
author | Martijn Laan <1092369+martijnlaan@users.noreply.github.com> | 2024-07-31 21:49:44 +1000 |
---|---|---|
committer | Martijn Laan <1092369+martijnlaan@users.noreply.github.com> | 2024-07-31 21:49:44 +1000 |
commit | 0d6fd0c6bc452f41919bbdf8dcc9b3d6fbc83205 (patch) | |
tree | 44ea2ccd2b37a031cfda50a93c06ce8cd4acf0b2 | |
parent | 1cccf5165b891eb95c85932474bb872ab0fbe638 (diff) | |
download | scintilla-mirror-0d6fd0c6bc452f41919bbdf8dcc9b3d6fbc83205.tar.gz |
Feature [feature-requests:#1524]. Add SCI_LINEINDENT and SCI_LINEDEDENT.
These force the multiline behaviour of SCI_TAB and SCI_BACKTAB.
-rw-r--r-- | call/ScintillaCall.cxx | 8 | ||||
-rw-r--r-- | doc/ScintillaDoc.html | 6 | ||||
-rw-r--r-- | doc/ScintillaHistory.html | 4 | ||||
-rw-r--r-- | include/Scintilla.h | 2 | ||||
-rw-r--r-- | include/Scintilla.iface | 9 | ||||
-rw-r--r-- | include/ScintillaCall.h | 2 | ||||
-rw-r--r-- | include/ScintillaMessages.h | 2 | ||||
-rw-r--r-- | src/Editor.cxx | 16 | ||||
-rw-r--r-- | src/Editor.h | 2 |
9 files changed, 44 insertions, 7 deletions
diff --git a/call/ScintillaCall.cxx b/call/ScintillaCall.cxx index d1732a463..4508210db 100644 --- a/call/ScintillaCall.cxx +++ b/call/ScintillaCall.cxx @@ -1979,10 +1979,18 @@ void ScintillaCall::Tab() { Call(Message::Tab); } +void ScintillaCall::LineIndent() { + Call(Message::LineIndent); +} + void ScintillaCall::BackTab() { Call(Message::BackTab); } +void ScintillaCall::LineDedent() { + Call(Message::LineDedent); +} + void ScintillaCall::NewLine() { Call(Message::NewLine); } diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index b9a5971b2..b320621cf 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -6929,6 +6929,9 @@ struct Sci_TextToFindFull { <td><code>SCI_VERTICALCENTRECARET</code></td> + <td><code>SCI_LINEINDENT</code></td> + + <td><code>SCI_LINEDEDENT</code></td> </tr> <tr> @@ -6971,6 +6974,9 @@ struct Sci_TextToFindFull { as appropriate for <code>SCI_[[VC]HOME|LINEEND]*</code>. </p> + <p>The <code>SCI_LINE[INDENT|DEDENT]</code> commands are like <code>SCI_[BACK]TAB</code> but force the + multiline behaviour of the second.</p> + <p>The <code>SCI_SCROLLTO[START|END]</code> commands scroll the document to the start or end without changing the selection. These commands match macOS platform conventions for the behaviour of the <code>home</code> and <code>end</code> keys. Scintilla can be made to match macOS applications diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 3a820fb92..90e82cc41 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -599,6 +599,10 @@ <li> Add SCI_GETUNDOSEQUENCE to determine whether an undo sequence is active and its nesting depth. </li> + <li> + Add SCI_LINEINDENT and SCI_LINEDEDENT. + <a href="https://sourceforge.net/p/scintilla/feature-requests/1524/">Feature #1524</a>. + </li> </ul> <h3> <a href="https://www.scintilla.org/scintilla551.zip">Release 5.5.1</a> diff --git a/include/Scintilla.h b/include/Scintilla.h index d97da016f..6fec9be58 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -756,7 +756,9 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP #define SCI_CANCEL 2325 #define SCI_DELETEBACK 2326 #define SCI_TAB 2327 +#define SCI_LINEINDENT 2813 #define SCI_BACKTAB 2328 +#define SCI_LINEDEDENT 2814 #define SCI_NEWLINE 2329 #define SCI_FORMFEED 2330 #define SCI_VCHOME 2331 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index c04d23a80..25201cf47 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1993,9 +1993,16 @@ fun void DeleteBack=2326(,) # If more than one line selected, indent the lines. fun void Tab=2327(,) -# Dedent the selected lines. +# Indent the current and selected lines. +fun void LineIndent=2813(,) + +# If selection is empty or all on one line dedent the line if caret is at start, else move caret. +# If more than one line selected, dedent the lines. fun void BackTab=2328(,) +# Dedent the current and selected lines. +fun void LineDedent=2814(,) + # Insert a new line, may use a CRLF, CR or LF depending on EOL mode. fun void NewLine=2329(,) diff --git a/include/ScintillaCall.h b/include/ScintillaCall.h index 02c383883..065a60ac5 100644 --- a/include/ScintillaCall.h +++ b/include/ScintillaCall.h @@ -540,7 +540,9 @@ public: void Cancel(); void DeleteBack(); void Tab(); + void LineIndent(); void BackTab(); + void LineDedent(); void NewLine(); void FormFeed(); void VCHome(); diff --git a/include/ScintillaMessages.h b/include/ScintillaMessages.h index c511720c5..847ec0881 100644 --- a/include/ScintillaMessages.h +++ b/include/ScintillaMessages.h @@ -459,7 +459,9 @@ enum class Message { Cancel = 2325, DeleteBack = 2326, Tab = 2327, + LineIndent = 2813, BackTab = 2328, + LineDedent = 2814, NewLine = 2329, FormFeed = 2330, VCHome = 2331, diff --git a/src/Editor.cxx b/src/Editor.cxx index 0561b42f8..588f22e4d 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -2934,7 +2934,9 @@ void Editor::NotifyMacroRecord(Message iMessage, uptr_t wParam, sptr_t lParam) { case Message::Cancel: case Message::DeleteBack: case Message::Tab: + case Message::LineIndent: case Message::BackTab: + case Message::LineDedent: case Message::FormFeed: case Message::VCHome: case Message::VCHomeExtend: @@ -3954,7 +3956,8 @@ int Editor::KeyCommand(Message iMessage) { EnsureCaretVisible(); break; case Message::Tab: - Indent(true); + case Message::LineIndent: + Indent(true, iMessage == Message::LineIndent); if (caretSticky == CaretSticky::Off) { SetLastXChosen(); } @@ -3962,7 +3965,8 @@ int Editor::KeyCommand(Message iMessage) { ShowCaretAtCurrentPosition(); // Avoid blinking break; case Message::BackTab: - Indent(false); + case Message::LineDedent: + Indent(false, iMessage == Message::LineDedent); if ((caretSticky == CaretSticky::Off) || (caretSticky == CaretSticky::WhiteSpace)) { SetLastXChosen(); } @@ -4065,14 +4069,14 @@ int Editor::KeyDownWithModifiers(Keys key, KeyMod modifiers, bool *consumed) { } } -void Editor::Indent(bool forwards) { +void Editor::Indent(bool forwards, bool lineIndent) { UndoGroup ug(pdoc); for (size_t r=0; r<sel.Count(); r++) { const Sci::Line lineOfAnchor = pdoc->SciLineFromPosition(sel.Range(r).anchor.Position()); Sci::Position caretPosition = sel.Range(r).caret.Position(); const Sci::Line lineCurrentPos = pdoc->SciLineFromPosition(caretPosition); - if (lineOfAnchor == lineCurrentPos) { + if (lineOfAnchor == lineCurrentPos && !lineIndent) { if (forwards) { pdoc->DeleteChars(sel.Range(r).Start().Position(), sel.Range(r).Length()); caretPosition = sel.Range(r).caret.Position(); @@ -4115,7 +4119,7 @@ void Editor::Indent(bool forwards) { sel.Range(r) = SelectionRange(newPos); } } - } else { // Multiline + } else { // Multiline or LineIndent const Sci::Position anchorPosOnLine = sel.Range(r).anchor.Position() - pdoc->LineStart(lineOfAnchor); const Sci::Position currentPosPosOnLine = caretPosition - @@ -8175,7 +8179,9 @@ sptr_t Editor::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { case Message::Cancel: case Message::DeleteBack: case Message::Tab: + case Message::LineIndent: case Message::BackTab: + case Message::LineDedent: case Message::NewLine: case Message::FormFeed: case Message::VCHome: diff --git a/src/Editor.h b/src/Editor.h index 50aa9a660..e42f36573 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -505,7 +505,7 @@ protected: // ScintillaBase subclass needs access to much of Editor virtual int KeyDefault(Scintilla::Keys /* key */, Scintilla::KeyMod /*modifiers*/); int KeyDownWithModifiers(Scintilla::Keys key, Scintilla::KeyMod modifiers, bool *consumed); - void Indent(bool forwards); + void Indent(bool forwards, bool lineTab); virtual std::unique_ptr<CaseFolder> CaseFolderForEncoding(); Sci::Position FindText(Scintilla::uptr_t wParam, Scintilla::sptr_t lParam); |