From fdb8953cdffa47ff9f13f1cc173e1cb2df191019 Mon Sep 17 00:00:00 2001
From: A-R-C-A
Date: Fri, 23 Sep 2016 18:07:56 +1000
Subject: EDGE_MULTILINE and SCI_MULTIEDGEADDLINE added to allow displaying
multiple vertical edges simultaneously.
---
doc/ScintillaDoc.html | 22 ++++++++++++++++++++++
doc/ScintillaHistory.html | 4 ++++
include/Scintilla.h | 3 +++
include/Scintilla.iface | 9 ++++++++-
src/EditView.cxx | 33 +++++++++++++++++++++++++++------
src/Editor.cxx | 18 ++++++++++++++----
src/ViewStyle.cxx | 9 ++++-----
src/ViewStyle.h | 17 ++++++++++++++---
8 files changed, 96 insertions(+), 19 deletions(-)
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index 9175d6b80..681970d93 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -6177,6 +6177,9 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
SCI_GETEDGECOLUMN
SCI_SETEDGECOLOUR(int colour)
SCI_GETEDGECOLOUR
+
+ SCI_MULTIEDGEADDLINE(int column, int colour)
+ SCI_MULTIEDGECLEARALL
SCI_SETEDGEMODE(int edgeMode)
@@ -6225,6 +6228,17 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
The background colour of characters after the column limit is changed to the colour
set by SCI_SETEDGECOLOUR. This is recommended for proportional fonts. |
+
+
+ EDGE_MULTILINE |
+
+ 3 |
+
+ This is similar to EDGE_LINE but in contrary to showing only one single
+ line a configurable set of vertical lines can be shown simultaneously. This edgeMode
+ uses a completely independent dataset that can only be configured by using the
+ SCI_MULTIEDGE* messages. |
+
@@ -6241,6 +6255,14 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
These messages set and get the colour of the marker used to show that a line has exceeded the
length set by SCI_SETEDGECOLUMN.
+ SCI_MULTIEDGEADDLINE(int column, int colour)
+ SCI_MULTIEDGECLEARALL
+ SCI_MULTIEDGEADDLINE adds a new vertical edge to the view. The edge will be
+ displayed at the given column number. The resulting edge position depends on the metric
+ of a space character in STYLE_DEFAULT. All the edges can be cleared with
+ SCI_MULTIEDGECLEARALL.
+
Lexer
If you define the symbol SCI_LEXER when building Scintilla, (this is sometimes
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index 072de2c70..404ffa16d 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -500,6 +500,7 @@
Alexey Denisov |
jedailey |
oirfeodent |
+ A-R-C-A |
@@ -526,6 +527,9 @@
These changes do not affect the standard C/C++ binding.
+ EDGE_MULTILINE and SCI_MULTIEDGEADDLINE added to allow displaying multiple
+ vertical edges simultaneously.
+
The WordList class in lexlib used by lexers adds an InListAbridged method for
matching keywords that have particular prefixes and/or suffixes.
diff --git a/include/Scintilla.h b/include/Scintilla.h
index 8f0cd44b1..0b5483043 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -650,12 +650,15 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define EDGE_NONE 0
#define EDGE_LINE 1
#define EDGE_BACKGROUND 2
+#define EDGE_MULTILINE 3
#define SCI_GETEDGECOLUMN 2360
#define SCI_SETEDGECOLUMN 2361
#define SCI_GETEDGEMODE 2362
#define SCI_SETEDGEMODE 2363
#define SCI_GETEDGECOLOUR 2364
#define SCI_SETEDGECOLOUR 2365
+#define SCI_MULTIEDGEADDLINE 2694
+#define SCI_MULTIEDGECLEARALL 2695
#define SCI_SEARCHANCHOR 2366
#define SCI_SEARCHNEXT 2367
#define SCI_SEARCHPREV 2368
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 27d1d7513..d52c229bf 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -1667,6 +1667,7 @@ enu EdgeVisualStyle=EDGE_
val EDGE_NONE=0
val EDGE_LINE=1
val EDGE_BACKGROUND=2
+val EDGE_MULTILINE=3
# Retrieve the column number which text should be kept within.
get int GetEdgeColumn=2360(,)
@@ -1678,7 +1679,7 @@ set void SetEdgeColumn=2361(int column,)
# Retrieve the edge highlight mode.
get int GetEdgeMode=2362(,)
-# The edge may be displayed by a line (EDGE_LINE) or by highlighting text that
+# The edge may be displayed by a line (EDGE_LINE/EDGE_MULTILINE) or by highlighting text that
# goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE).
set void SetEdgeMode=2363(int mode,)
@@ -1688,6 +1689,12 @@ get colour GetEdgeColour=2364(,)
# Change the colour used in edge indication.
set void SetEdgeColour=2365(colour edgeColour,)
+# Add a new vertical edge to the view.
+fun void MultiEdgeAddLine=2694(int column, colour edgeColour)
+
+# Clear all vertical edges.
+fun void MultiEdgeClearAll=2695(,)
+
# Sets the current caret position to be the search anchor.
fun void SearchAnchor=2366(,)
diff --git a/src/EditView.cxx b/src/EditView.cxx
index 9ca6e95ad..074c23fc9 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -417,7 +417,7 @@ void EditView::LayoutLine(const EditModel &model, int line, Surface *surface, co
ll->widthLine = LineLayout::wrapWidthInfinite;
ll->lines = 1;
if (vstyle.edgeState == EDGE_BACKGROUND) {
- ll->edgeColumn = model.pdoc->FindColumn(line, vstyle.theEdge);
+ ll->edgeColumn = model.pdoc->FindColumn(line, vstyle.theEdge.column);
if (ll->edgeColumn >= posLineStart) {
ll->edgeColumn -= posLineStart;
}
@@ -749,7 +749,7 @@ static ColourDesired TextBackground(const EditModel &model, const ViewStyle &vsD
if ((vsDraw.edgeState == EDGE_BACKGROUND) &&
(i >= ll->edgeColumn) &&
(i < ll->numCharsBeforeEOL))
- return vsDraw.edgecolour;
+ return vsDraw.theEdge.colour;
if (inHotspot && vsDraw.hotspotColours.back.isSet)
return vsDraw.hotspotColours.back;
}
@@ -1339,12 +1339,24 @@ static void DrawEdgeLine(Surface *surface, const ViewStyle &vsDraw, const LineLa
Range lineRange, int xStart) {
if (vsDraw.edgeState == EDGE_LINE) {
PRectangle rcSegment = rcLine;
- int edgeX = static_cast(vsDraw.theEdge * vsDraw.spaceWidth);
+ int edgeX = static_cast(vsDraw.theEdge.column * vsDraw.spaceWidth);
rcSegment.left = static_cast(edgeX + xStart);
if ((ll->wrapIndent != 0) && (lineRange.start != 0))
rcSegment.left -= ll->wrapIndent;
rcSegment.right = rcSegment.left + 1;
- surface->FillRectangle(rcSegment, vsDraw.edgecolour);
+ surface->FillRectangle(rcSegment, vsDraw.theEdge.colour);
+ } else if (vsDraw.edgeState == EDGE_MULTILINE) {
+ for (size_t edge = 0; edge < vsDraw.theMultiEdge.size(); edge++) {
+ if (vsDraw.theMultiEdge[edge].column >= 0) {
+ PRectangle rcSegment = rcLine;
+ int edgeX = static_cast(vsDraw.theMultiEdge[edge].column * vsDraw.spaceWidth);
+ rcSegment.left = static_cast(edgeX + xStart);
+ if ((ll->wrapIndent != 0) && (lineRange.start != 0))
+ rcSegment.left -= ll->wrapIndent;
+ rcSegment.right = rcSegment.left + 1;
+ surface->FillRectangle(rcSegment, vsDraw.theMultiEdge[edge].colour);
+ }
+ }
}
}
@@ -1919,10 +1931,19 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan
if (rcBeyondEOF.top < rcBeyondEOF.bottom) {
surfaceWindow->FillRectangle(rcBeyondEOF, vsDraw.styles[STYLE_DEFAULT].back);
if (vsDraw.edgeState == EDGE_LINE) {
- int edgeX = static_cast(vsDraw.theEdge * vsDraw.spaceWidth);
+ int edgeX = static_cast(vsDraw.theEdge.column * vsDraw.spaceWidth);
rcBeyondEOF.left = static_cast(edgeX + xStart);
rcBeyondEOF.right = rcBeyondEOF.left + 1;
- surfaceWindow->FillRectangle(rcBeyondEOF, vsDraw.edgecolour);
+ surfaceWindow->FillRectangle(rcBeyondEOF, vsDraw.theEdge.colour);
+ } else if (vsDraw.edgeState == EDGE_MULTILINE) {
+ for (size_t edge = 0; edge < vsDraw.theMultiEdge.size(); edge++) {
+ if (vsDraw.theMultiEdge[edge].column >= 0) {
+ int edgeX = static_cast(vsDraw.theMultiEdge[edge].column * vsDraw.spaceWidth);
+ rcBeyondEOF.left = static_cast(edgeX + xStart);
+ rcBeyondEOF.right = rcBeyondEOF.left + 1;
+ surfaceWindow->FillRectangle(rcBeyondEOF, vsDraw.theMultiEdge[edge].colour);
+ }
+ }
}
}
//Platform::DebugPrintf("start display %d, offset = %d\n", pdoc->Length(), xOffset);
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 12ec73239..beec634d3 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -7433,10 +7433,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return vs.zoomLevel;
case SCI_GETEDGECOLUMN:
- return vs.theEdge;
+ return vs.theEdge.column;
case SCI_SETEDGECOLUMN:
- vs.theEdge = static_cast(wParam);
+ vs.theEdge.column = static_cast(wParam);
InvalidateStyleRedraw();
break;
@@ -7449,10 +7449,20 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_GETEDGECOLOUR:
- return vs.edgecolour.AsLong();
+ return vs.theEdge.colour.AsLong();
case SCI_SETEDGECOLOUR:
- vs.edgecolour = ColourDesired(static_cast(wParam));
+ vs.theEdge.colour = ColourDesired(static_cast(wParam));
+ InvalidateStyleRedraw();
+ break;
+
+ case SCI_MULTIEDGEADDLINE:
+ vs.theMultiEdge.push_back(EdgeProperties(wParam, lParam));
+ InvalidateStyleRedraw();
+ break;
+
+ case SCI_MULTIEDGECLEARALL:
+ std::vector().swap(vs.theMultiEdge); // Free vector and memory, C++03 compatible
InvalidateStyleRedraw();
break;
diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx
index ae68d8bff..33be28422 100644
--- a/src/ViewStyle.cxx
+++ b/src/ViewStyle.cxx
@@ -139,8 +139,6 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
alwaysShowCaretLineBackground = source.alwaysShowCaretLineBackground;
caretLineBackground = source.caretLineBackground;
caretLineAlpha = source.caretLineAlpha;
- edgecolour = source.edgecolour;
- edgeState = source.edgeState;
caretStyle = source.caretStyle;
caretWidth = source.caretWidth;
someStylesProtected = false;
@@ -171,7 +169,9 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
braceBadLightIndicatorSet = source.braceBadLightIndicatorSet;
braceBadLightIndicator = source.braceBadLightIndicator;
+ edgeState = source.edgeState;
theEdge = source.theEdge;
+ theMultiEdge = source.theMultiEdge;
marginNumberPadding = source.marginNumberPadding;
ctrlCharPadding = source.ctrlCharPadding;
@@ -268,8 +268,6 @@ void ViewStyle::Init(size_t stylesSize_) {
alwaysShowCaretLineBackground = false;
caretLineBackground = ColourDesired(0xff, 0xff, 0);
caretLineAlpha = SC_ALPHA_NOALPHA;
- edgecolour = ColourDesired(0xc0, 0xc0, 0xc0);
- edgeState = EDGE_NONE;
caretStyle = CARETSTYLE_LINE;
caretWidth = 1;
someStylesProtected = false;
@@ -310,7 +308,8 @@ void ViewStyle::Init(size_t stylesSize_) {
braceBadLightIndicatorSet = false;
braceBadLightIndicator = 0;
- theEdge = 0;
+ edgeState = EDGE_NONE;
+ theEdge = EdgeProperties(0, ColourDesired(0xc0, 0xc0, 0xc0));
marginNumberPadding = 3;
ctrlCharPadding = 3; // +3 For a blank on front and rounded edge each side
diff --git a/src/ViewStyle.h b/src/ViewStyle.h
index d5a9d5b71..be84598f1 100644
--- a/src/ViewStyle.h
+++ b/src/ViewStyle.h
@@ -72,6 +72,17 @@ struct ForeBackColours {
ColourOptional back;
};
+struct EdgeProperties {
+ int column;
+ ColourDesired colour;
+ EdgeProperties(int column_ = 0, ColourDesired colour_ = ColourDesired(0)) :
+ column(column_), colour(colour_) {
+ }
+ EdgeProperties(uptr_t wParam, sptr_t lParam) :
+ column(static_cast(wParam)), colour(static_cast(lParam)) {
+ }
+};
+
/**
*/
class ViewStyle {
@@ -130,8 +141,6 @@ public:
bool alwaysShowCaretLineBackground;
ColourDesired caretLineBackground;
int caretLineAlpha;
- ColourDesired edgecolour;
- int edgeState;
int caretStyle;
int caretWidth;
bool someStylesProtected;
@@ -146,7 +155,9 @@ public:
int braceHighlightIndicator;
bool braceBadLightIndicatorSet;
int braceBadLightIndicator;
- int theEdge;
+ int edgeState;
+ EdgeProperties theEdge;
+ std::vector theMultiEdge;
int marginNumberPadding; // the right-side padding of the number margin
int ctrlCharPadding; // the padding around control character text blobs
int lastSegItalicsOffset; // the offset so as not to clip italic characters at EOLs
--
cgit v1.2.3