aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorA-R-C-A <unknown>2016-09-23 18:07:56 +1000
committerA-R-C-A <unknown>2016-09-23 18:07:56 +1000
commitfdb8953cdffa47ff9f13f1cc173e1cb2df191019 (patch)
tree376de5daa3f3ea982434f9237b732274179ca6a7
parentbb4c51c3f14a3d38b5568e4f12ecfa32b4ec826e (diff)
downloadscintilla-mirror-fdb8953cdffa47ff9f13f1cc173e1cb2df191019.tar.gz
EDGE_MULTILINE and SCI_MULTIEDGEADDLINE added to allow displaying multiple
vertical edges simultaneously.
-rw-r--r--doc/ScintillaDoc.html22
-rw-r--r--doc/ScintillaHistory.html4
-rw-r--r--include/Scintilla.h3
-rw-r--r--include/Scintilla.iface9
-rw-r--r--src/EditView.cxx33
-rw-r--r--src/Editor.cxx18
-rw-r--r--src/ViewStyle.cxx9
-rw-r--r--src/ViewStyle.h17
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){
<a class="message" href="#SCI_GETEDGECOLUMN">SCI_GETEDGECOLUMN</a><br />
<a class="message" href="#SCI_SETEDGECOLOUR">SCI_SETEDGECOLOUR(int colour)</a><br />
<a class="message" href="#SCI_GETEDGECOLOUR">SCI_GETEDGECOLOUR</a><br />
+ <br />
+ <a class="message" href="#SCI_MULTIEDGEADDLINE">SCI_MULTIEDGEADDLINE(int column, int colour)</a><br />
+ <a class="message" href="#SCI_MULTIEDGECLEARALL">SCI_MULTIEDGECLEARALL</a><br />
</code>
<p><b id="SCI_SETEDGEMODE">SCI_SETEDGEMODE(int edgeMode)</b><br />
@@ -6225,6 +6228,17 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
<td>The background colour of characters after the column limit is changed to the colour
set by <code>SCI_SETEDGECOLOUR</code>. This is recommended for proportional fonts.</td>
</tr>
+
+ <tr>
+ <td align="left"><code>EDGE_MULTILINE</code></td>
+
+ <td align="center">3</td>
+
+ <td>This is similar to <code>EDGE_LINE</code> but in contrary to showing only one single
+ line a configurable set of vertical lines can be shown simultaneously. This <code>edgeMode
+ </code> uses a completely independent dataset that can only be configured by using the
+ <code>SCI_MULTIEDGE*</code> messages.</td>
+ </tr>
</tbody>
</table>
@@ -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 <code>SCI_SETEDGECOLUMN</code>.</p>
+ <p><b id="SCI_MULTIEDGEADDLINE">SCI_MULTIEDGEADDLINE(int column, int <a class="jump"
+ href="#colour">colour</a>)</b><br />
+ <b id="SCI_MULTIEDGECLEARALL">SCI_MULTIEDGECLEARALL</b><br />
+ <code>SCI_MULTIEDGEADDLINE</code> 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 <code>STYLE_DEFAULT</code>. All the edges can be cleared with
+ <code>SCI_MULTIEDGECLEARALL</code>.</p>
+
<h2 id="Lexer">Lexer</h2>
<p>If you define the symbol <code>SCI_LEXER</code> 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 @@
<td>Alexey Denisov</td>
<td>jedailey</td>
<td>oirfeodent</td>
+ <td>A-R-C-A</td>
</tr>
</table>
<p>
@@ -526,6 +527,9 @@
These changes do not affect the standard C/C++ binding.
</li>
<li>
+ EDGE_MULTILINE and SCI_MULTIEDGEADDLINE added to allow displaying multiple
+ vertical edges simultaneously.
+ <li>
The WordList class in lexlib used by lexers adds an InListAbridged method for
matching keywords that have particular prefixes and/or suffixes.
</li>
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<int>(vsDraw.theEdge * vsDraw.spaceWidth);
+ int edgeX = static_cast<int>(vsDraw.theEdge.column * vsDraw.spaceWidth);
rcSegment.left = static_cast<XYPOSITION>(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<int>(vsDraw.theMultiEdge[edge].column * vsDraw.spaceWidth);
+ rcSegment.left = static_cast<XYPOSITION>(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<int>(vsDraw.theEdge * vsDraw.spaceWidth);
+ int edgeX = static_cast<int>(vsDraw.theEdge.column * vsDraw.spaceWidth);
rcBeyondEOF.left = static_cast<XYPOSITION>(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<int>(vsDraw.theMultiEdge[edge].column * vsDraw.spaceWidth);
+ rcBeyondEOF.left = static_cast<XYPOSITION>(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<int>(wParam);
+ vs.theEdge.column = static_cast<int>(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<long>(wParam));
+ vs.theEdge.colour = ColourDesired(static_cast<long>(wParam));
+ InvalidateStyleRedraw();
+ break;
+
+ case SCI_MULTIEDGEADDLINE:
+ vs.theMultiEdge.push_back(EdgeProperties(wParam, lParam));
+ InvalidateStyleRedraw();
+ break;
+
+ case SCI_MULTIEDGECLEARALL:
+ std::vector<EdgeProperties>().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<int>(wParam)), colour(static_cast<long>(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<EdgeProperties> 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