diff options
-rw-r--r-- | doc/ScintillaDoc.html | 35 | ||||
-rw-r--r-- | include/Scintilla.h | 4 | ||||
-rw-r--r-- | include/Scintilla.iface | 10 | ||||
-rw-r--r-- | src/Editor.cxx | 58 | ||||
-rw-r--r-- | src/ViewStyle.cxx | 2 | ||||
-rw-r--r-- | src/ViewStyle.h | 4 |
6 files changed, 101 insertions, 12 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 22e4a7658..be0c3cef0 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -2658,7 +2658,7 @@ struct TextToFind { <p><b id="SCI_GETLINEINDENTPOSITION">SCI_GETLINEINDENTPOSITION(int line)</b><br /> This returns the position at the end of indentation of a line.</p> - <p><b id="SCI_SETINDENTATIONGUIDES">SCI_SETINDENTATIONGUIDES(bool view)</b><br /> + <p><b id="SCI_SETINDENTATIONGUIDES">SCI_SETINDENTATIONGUIDES(int indentView)</b><br /> <b id="SCI_GETINDENTATIONGUIDES">SCI_GETINDENTATIONGUIDES</b><br /> Indentation guides are dotted vertical lines that appear within indentation white space every indent size columns. They make it easy to see which constructs line up especially when they @@ -2666,6 +2666,39 @@ struct TextToFind { href="#StyleDefinition"><code>STYLE_INDENTGUIDE</code></a> (37) is used to specify the foreground and background colour of the indentation guides.</p> + <p>There are 4 indentation guide views. + SC_IV_NONE turns the feature off but the other 3 states determine how far the guides appear on + empty lines. + <table border="0" summary="Search flags"> + <tbody> + <tr> + <td><code>SC_IV_NONE</code></td> + <td>No indentation guides are shown.</td> + </tr> + + <tr> + <td><code>SC_IV_REAL</code></td> + <td>Indentation guides are shown inside real indentation white space.</td> + </tr> + + <tr> + <td><code>SC_IV_LOOKFORWARD</code></td> + <td>Indentation guides are shown beyond the actual indentation up to the level of the + next non-empty line. + If the previous non-empty line was a fold header then indentation guides are shown for + one more level of indent than that line. This setting is good for Python.</td> + </tr> + + <tr> + <td><code>SC_IV_LOOKBOTH</code></td> + <td>Indentation guides are shown beyond the actual indentation up to the level of the + next non-empty line or previous non-empty line whichever is the greater. + This setting is good for most languages.</td> + </tr> + + </table> + </p> + <p><b id="SCI_SETHIGHLIGHTGUIDE">SCI_SETHIGHLIGHTGUIDE(int column)</b><br /> <b id="SCI_GETHIGHLIGHTGUIDE">SCI_GETHIGHLIGHTGUIDE</b><br /> When brace highlighting occurs, the indentation guide corresponding to the braces may be diff --git a/include/Scintilla.h b/include/Scintilla.h index f4eca1aef..816edb36f 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -298,6 +298,10 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_GETCOLUMN 2129 #define SCI_SETHSCROLLBAR 2130 #define SCI_GETHSCROLLBAR 2131 +#define SC_IV_NONE 0 +#define SC_IV_REAL 1 +#define SC_IV_LOOKFORWARD 2 +#define SC_IV_LOOKBOTH 3 #define SCI_SETINDENTATIONGUIDES 2132 #define SCI_GETINDENTATIONGUIDES 2133 #define SCI_SETHIGHLIGHTGUIDE 2134 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index e1f24ebb1..6d05e437e 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -727,11 +727,17 @@ set void SetHScrollBar=2130(bool show,) # Is the horizontal scroll bar visible? get bool GetHScrollBar=2131(,) +enu IndentView=SC_IV_ +val SC_IV_NONE=0 +val SC_IV_REAL=1 +val SC_IV_LOOKFORWARD=2 +val SC_IV_LOOKBOTH=3 + # Show or hide indentation guides. -set void SetIndentationGuides=2132(bool show,) +set void SetIndentationGuides=2132(int indentView,) # Are the indentation guides visible? -get bool GetIndentationGuides=2133(,) +get int GetIndentationGuides=2133(,) # Set the highlighted indentation guide column. # 0 = no highlighted guide. diff --git a/src/Editor.cxx b/src/Editor.cxx index 916f32316..3373424da 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -2286,7 +2286,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis // Normal text display surface->FillRectangle(rcSegment, textBack); if (vsDraw.viewWhitespace != wsInvisible || - (inIndentation && vsDraw.viewIndentationGuides)) { + (inIndentation && vsDraw.viewIndentationGuides == ivReal)) { for (int cpos = 0; cpos <= i - startseg; cpos++) { if (ll->chars[cpos + startseg] == ' ') { if (drawWhitespaceBackground && @@ -2361,12 +2361,13 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis textBack = vsDraw.whitespaceBackground.allocated; surface->FillRectangle(rcSegment, textBack); } - if ((vsDraw.viewWhitespace != wsInvisible) || ((inIndentation && vsDraw.viewIndentationGuides))) { + if ((vsDraw.viewWhitespace != wsInvisible) || + (inIndentation && vsDraw.viewIndentationGuides != ivNone)) { if (vsDraw.whitespaceForegroundSet) textFore = vsDraw.whitespaceForeground.allocated; surface->PenColour(textFore); } - if (inIndentation && vsDraw.viewIndentationGuides) { + if (inIndentation && vsDraw.viewIndentationGuides == ivReal) { for (int xIG = ll->positions[i] / indentWidth * indentWidth; xIG < ll->positions[i + 1]; xIG += indentWidth) { if (xIG >= ll->positions[i] && xIG > 0) { DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIG + xStart, rcSegment, @@ -2426,7 +2427,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis } } if (vsDraw.viewWhitespace != wsInvisible || - (inIndentation && vsDraw.viewIndentationGuides)) { + (inIndentation && vsDraw.viewIndentationGuides != ivNone)) { for (int cpos = 0; cpos <= i - startseg; cpos++) { if (ll->chars[cpos + startseg] == ' ') { if (vsDraw.viewWhitespace != wsInvisible) { @@ -2446,7 +2447,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis surface->FillRectangle(rcDot, textFore); } } - if (inIndentation && vsDraw.viewIndentationGuides) { + if (inIndentation && vsDraw.viewIndentationGuides == ivReal) { int startSpace = ll->positions[cpos + startseg]; if (startSpace > 0 && (startSpace % indentWidth == 0)) { DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, startSpace + xStart, rcSegment, @@ -2477,6 +2478,49 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis break; } } + if ((vsDraw.viewIndentationGuides == ivLookForward || vsDraw.viewIndentationGuides == ivLookBoth) + && (subLine == 0)) { + int indentSpace = pdoc->GetLineIndentation(line); + // Find the most recent line with some text + + int lineLastWithText = line; + while (lineLastWithText > 0 && pdoc->IsWhiteLine(lineLastWithText)) { + lineLastWithText--; + } + if (lineLastWithText < line) { + // This line is empty, so use indentation of last line with text + int indentLastWithText = pdoc->GetLineIndentation(lineLastWithText); + int isFoldHeader = pdoc->GetLevel(lineLastWithText) & SC_FOLDLEVELHEADERFLAG; + if (isFoldHeader) { + // Level is one more level than parent + indentLastWithText += pdoc->IndentSize(); + } + if (vsDraw.viewIndentationGuides == ivLookForward) { + // In viLookForward mode, previous line only used if it is a fold header + if (isFoldHeader) { + indentSpace = Platform::Maximum(indentSpace, indentLastWithText); + } + } else { // viLookBoth + indentSpace = Platform::Maximum(indentSpace, indentLastWithText); + } + } + + int lineNextWithText = line; + while (lineNextWithText < pdoc->LinesTotal() && pdoc->IsWhiteLine(lineNextWithText)) { + lineNextWithText++; + } + if (lineNextWithText > line) { + // This line is empty, so use indentation of last line with text + indentSpace = Platform::Maximum(indentSpace, + pdoc->GetLineIndentation(lineNextWithText)); + } + + for (int indentPos=pdoc->IndentSize(); indentPos < indentSpace; indentPos += pdoc->IndentSize()) { + int xIndent = indentPos * vsDraw.spaceWidth; + DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIndent + xStart, rcSegment, + (ll->xHighlightGuide == xIndent)); + } + } DrawIndicators(surface, vsDraw, line, xStart, rcLine, ll, subLine, lineEnd, false); @@ -3030,7 +3074,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) { vsPrint.showMarkedLines = false; vsPrint.fixedColumnWidth = 0; vsPrint.zoomLevel = printMagnification; - vsPrint.viewIndentationGuides = false; + vsPrint.viewIndentationGuides = ivNone; // Don't show the selection when printing vsPrint.selbackset = false; vsPrint.selforeset = false; @@ -6557,7 +6601,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return verticalScrollBarVisible; case SCI_SETINDENTATIONGUIDES: - vs.viewIndentationGuides = wParam != 0; + vs.viewIndentationGuides = IndentView(wParam); Redraw(); break; diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx index f73c15ed1..15efea8cc 100644 --- a/src/ViewStyle.cxx +++ b/src/ViewStyle.cxx @@ -229,7 +229,7 @@ void ViewStyle::Init(size_t stylesSize_) { } zoomLevel = 0; viewWhitespace = wsInvisible; - viewIndentationGuides = false; + viewIndentationGuides = ivNone; viewEOL = false; showMarkedLines = true; extraFontFlag = false; diff --git a/src/ViewStyle.h b/src/ViewStyle.h index a41e5f452..2f2d52461 100644 --- a/src/ViewStyle.h +++ b/src/ViewStyle.h @@ -38,6 +38,8 @@ public: const char *Save(const char *name); }; +enum IndentView {ivNone, ivReal, ivLookForward, ivLookBoth}; + enum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterIndent=2}; /** @@ -87,7 +89,7 @@ public: int fixedColumnWidth; int zoomLevel; WhiteSpaceVisibility viewWhitespace; - bool viewIndentationGuides; + IndentView viewIndentationGuides; bool viewEOL; bool showMarkedLines; ColourPair caretcolour; |