diff options
| -rw-r--r-- | doc/ScintillaDoc.html | 22 | ||||
| -rw-r--r-- | doc/ScintillaHistory.html | 9 | ||||
| -rw-r--r-- | include/Scintilla.h | 6 | ||||
| -rw-r--r-- | include/Scintilla.iface | 13 | ||||
| -rw-r--r-- | src/EditView.cxx | 41 | ||||
| -rw-r--r-- | src/Editor.cxx | 10 | ||||
| -rw-r--r-- | src/Indicator.cxx | 10 | ||||
| -rw-r--r-- | src/Indicator.h | 14 | ||||
| -rw-r--r-- | src/PositionCache.cxx | 14 | ||||
| -rw-r--r-- | src/PositionCache.h | 2 | ||||
| -rw-r--r-- | src/ViewStyle.cxx | 7 | ||||
| -rw-r--r-- | src/ViewStyle.h | 1 | 
12 files changed, 130 insertions, 19 deletions
| diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 86db4be09..46039ed54 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -82,7 +82,7 @@      <h1>Scintilla Documentation</h1> -    <p>Last edited 10 February 2015 NH</p> +    <p>Last edited 13 February 2015 NH</p>      <p>There is <a class="jump" href="Design.html">an overview of the internal design of      Scintilla</a>.<br /> @@ -3943,6 +3943,8 @@ struct Sci_TextToFind {       <a class="message" href="#SCI_INDICSETHOVERFORE">SCI_INDICSETHOVERFORE(int indicatorNumber, int      colour)</a><br />       <a class="message" href="#SCI_INDICGETHOVERFORE">SCI_INDICGETHOVERFORE(int indicatorNumber)</a><br /> +     <a class="message" href="#SCI_INDICSETFLAGS">SCI_INDICSETFLAGS(int indicatorNumber, int flags)</a><br /> +     <a class="message" href="#SCI_INDICGETFLAGS">SCI_INDICGETFLAGS(int indicatorNumber)</a><br />       <br />       <a class="message" href="#SCI_SETINDICATORCURRENT">SCI_SETINDICATORCURRENT(int indicator)</a><br /> @@ -4141,6 +4143,14 @@ struct Sci_TextToFind {  	  This is similar to an appearance used for non-target ranges in Asian language input composition.</td>          </tr> +        <tr> +          <td align="left"><code>INDIC_TEXTFORE</code></td> + +          <td align="center">17</td> + +          <td>Change the colour of the text to the indicator's fore colour.</td> +        </tr> +        </tbody>      </table> @@ -4189,6 +4199,16 @@ struct Sci_TextToFind {       <a class="message" href="#SCI_INDICSETSTYLE">SCI_INDICSETSTYLE</a> will       also reset the hover attribute.</p> +    <p><b id="SCI_INDICSETFLAGS">SCI_INDICSETFLAGS(int indicatorNumber, int flags)</b><br /> +     <b id="SCI_INDICGETFLAGS">SCI_INDICGETFLAGS(int indicatorNumber)</b><br /> +     These messages set and get the flags associated with an indicator. +     There is currently one flag defined, <code>SC_INDICFLAG_VALUEFORE</code>: when this flag is set +     the colour used by the indicator is not from the indicator's fore setting but instead from the value of the indicator at +     that point in the file. This allows many colours to be displayed for a single indicator. The value is an <a class="jump" +    href="#colour">RGB integer colour</a> that has been ored with <code>SC_INDICVALUEBIT</code>(0x1000000) +    when calling <a class="message" href="#SCI_SETINDICATORVALUE">SCI_SETINDICATORVALUE</a>. +     </p> +      <p>      <b id="SCI_SETINDICATORCURRENT">SCI_SETINDICATORCURRENT(int indicator)</b><br />      <b id="SCI_GETINDICATORCURRENT">SCI_GETINDICATORCURRENT</b><br /> diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index fd9617bd1..e4e91c219 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -489,6 +489,11 @@  	Indicators may have a different colour and style when the mouse is over them or the caret is moved into them.  	</li>  	<li> +	An indicator may display in a large variety of colours with the SC_INDICFLAG_VALUEFORE +	flag taking the colour from the indicator's value, which may differ for every character, instead of its +	foreground colour attribute. +	</li> +	<li>  	Minimum version of Qt supported is now 4.8 due to the use of QElapsedTimer::nsecsElapsed.  	</li>  	<li> @@ -507,10 +512,10 @@  	VHDL folder fixes hang in folding when document starts with "entity".  	</li>  	<li> -	Add new indicators INDIC_COMPOSITIONTHIN and INDIC_FULLBOX. +	Add new indicators INDIC_COMPOSITIONTHIN, INDIC_FULLBOX, and INDIC_TEXTFORE.  	INDIC_COMPOSITIONTHIN is a thin underline that mimics the appearance of non-target segments in OS X IME.  	INDIC_FULLBOX is similar to INDIC_STRAIGHTBOX but covers the entire character area which means that -	indicators with this style on contiguous lines may touch. +	indicators with this style on contiguous lines may touch. INDIC_TEXTFORE changes the text foreground colour.  	</li>  	<li>  	Fix adaptive scrolling speed for GTK+ on OS X with GTK Quartz backend (as opposed to X11 backend). diff --git a/include/Scintilla.h b/include/Scintilla.h index 9668e7fb6..199986c25 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -276,6 +276,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,  #define INDIC_COMPOSITIONTHICK 14  #define INDIC_COMPOSITIONTHIN 15  #define INDIC_FULLBOX 16 +#define INDIC_TEXTFORE 17  #define INDIC_IME 32  #define INDIC_IME_MAX 35  #define INDIC_MAX 35 @@ -294,6 +295,11 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,  #define SCI_INDICGETHOVERSTYLE 2681  #define SCI_INDICSETHOVERFORE 2682  #define SCI_INDICGETHOVERFORE 2683 +#define SC_INDICVALUEBIT 0x1000000 +#define SC_INDICVALUEMASK 0xFFFFFF +#define SC_INDICFLAG_VALUEFORE 1 +#define SCI_INDICSETFLAGS 2684 +#define SCI_INDICGETFLAGS 2685  #define SCI_SETWHITESPACEFORE 2084  #define SCI_SETWHITESPACEBACK 2085  #define SCI_SETWHITESPACESIZE 2086 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 4a405d9d3..c540639da 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -607,6 +607,7 @@ val INDIC_SQUIGGLEPIXMAP=13  val INDIC_COMPOSITIONTHICK=14  val INDIC_COMPOSITIONTHIN=15  val INDIC_FULLBOX=16 +val INDIC_TEXTFORE=17  val INDIC_IME=32  val INDIC_IME_MAX=35  val INDIC_MAX=35 @@ -646,6 +647,18 @@ set void IndicSetHoverFore=2682(int indic, colour fore)  # Retrieve the foreground hover colour of an indicator.  get colour IndicGetHoverFore=2683(int indic,) +val SC_INDICVALUEBIT=0x1000000 +val SC_INDICVALUEMASK=0xFFFFFF + +enu IndicFlag=SC_INDICFLAG_ +val SC_INDICFLAG_VALUEFORE=1 + +# Set the attributes of an indicator. +set void IndicSetFlags=2684(int indic, int flags) + +# Retrieve the attributes of an indicator. +get int IndicGetFlags=2685(int indic,) +  # Set the foreground colour of all whitespace and whether to use this setting.  fun void SetWhitespaceFore=2084(bool useSetting, colour fore) diff --git a/src/EditView.cxx b/src/EditView.cxx index 2c8979f8c..9d940f701 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -445,7 +445,7 @@ void EditView::LayoutLine(const EditModel &model, int line, Surface *surface, co  		ll->positions[0] = 0;  		bool lastSegItalics = false; -		BreakFinder bfLayout(ll, NULL, Range(0, numCharsInLine), posLineStart, 0, false, model.pdoc, &model.reprs); +		BreakFinder bfLayout(ll, NULL, Range(0, numCharsInLine), posLineStart, 0, false, model.pdoc, &model.reprs, NULL);  		while (bfLayout.More()) {  			const TextSegment ts = bfLayout.Next(); @@ -940,14 +940,14 @@ void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle  }  static void DrawIndicator(int indicNum, int startPos, int endPos, Surface *surface, const ViewStyle &vsDraw, -	const LineLayout *ll, int xStart, PRectangle rcLine, int subLine, Indicator::DrawState drawState) { +	const LineLayout *ll, int xStart, PRectangle rcLine, int subLine, Indicator::DrawState drawState, int value) {  	const XYPOSITION subLineStart = ll->positions[ll->LineStart(subLine)];  	PRectangle rcIndic(  		ll->positions[startPos] + xStart - subLineStart,  		rcLine.top + vsDraw.maxAscent,  		ll->positions[endPos] + xStart - subLineStart,  		rcLine.top + vsDraw.maxAscent + 3); -	vsDraw.indicators[indicNum].Draw(surface, rcIndic, rcLine, drawState); +	vsDraw.indicators[indicNum].Draw(surface, rcIndic, rcLine, drawState, value);  }  static void DrawIndicators(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, @@ -969,9 +969,10 @@ static void DrawIndicators(Surface *surface, const EditModel &model, const ViewS  					endPos = posLineEnd;  				const bool hover = vsDraw.indicators[deco->indicator].IsDynamic() &&  					((hoverIndicatorPos >= startPos) && (hoverIndicatorPos <= endPos)); +				const int value = deco->rs.ValueAt(startPos);  				Indicator::DrawState drawState = hover ? Indicator::drawHover : Indicator::drawNormal;  				DrawIndicator(deco->indicator, startPos - posLineStart, endPos - posLineStart, -					surface, vsDraw, ll, xStart, rcLine, subLine, drawState); +					surface, vsDraw, ll, xStart, rcLine, subLine, drawState, value);  				startPos = endPos;  				if (!deco->rs.ValueAt(startPos)) {  					startPos = deco->rs.EndRun(startPos); @@ -989,13 +990,13 @@ static void DrawIndicators(Surface *surface, const EditModel &model, const ViewS  			if (rangeLine.ContainsCharacter(model.braces[0])) {  				int braceOffset = model.braces[0] - posLineStart;  				if (braceOffset < ll->numCharsInLine) { -					DrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, ll, xStart, rcLine, subLine, Indicator::drawNormal); +					DrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, ll, xStart, rcLine, subLine, Indicator::drawNormal, 1);  				}  			}  			if (rangeLine.ContainsCharacter(model.braces[1])) {  				int braceOffset = model.braces[1] - posLineStart;  				if (braceOffset < ll->numCharsInLine) { -					DrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, ll, xStart, rcLine, subLine, Indicator::drawNormal); +					DrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, ll, xStart, rcLine, subLine, Indicator::drawNormal, 1);  				}  			}  		} @@ -1250,7 +1251,7 @@ void EditView::DrawBackground(Surface *surface, const EditModel &model, const Vi  	// Does not take margin into account but not significant  	const int xStartVisible = static_cast<int>(subLineStart)-xStart; -	BreakFinder bfBack(ll, &model.sel, lineRange, posLineStart, xStartVisible, selBackDrawn, model.pdoc, &model.reprs); +	BreakFinder bfBack(ll, &model.sel, lineRange, posLineStart, xStartVisible, selBackDrawn, model.pdoc, &model.reprs, NULL);  	const bool drawWhitespaceBackground = vsDraw.WhitespaceBackgroundDrawn() && !background.isSet; @@ -1427,7 +1428,7 @@ void EditView::DrawForeground(Surface *surface, const EditModel &model, const Vi  	// Foreground drawing loop  	BreakFinder bfFore(ll, &model.sel, lineRange, posLineStart, xStartVisible, -		(((phasesDraw == phasesOne) && selBackDrawn) || vsDraw.selColours.fore.isSet), model.pdoc, &model.reprs); +		(((phasesDraw == phasesOne) && selBackDrawn) || vsDraw.selColours.fore.isSet), model.pdoc, &model.reprs, &vsDraw);  	while (bfFore.More()) { @@ -1450,6 +1451,30 @@ void EditView::DrawForeground(Surface *surface, const EditModel &model, const Vi  				if (vsDraw.hotspotColours.fore.isSet)  					textFore = vsDraw.hotspotColours.fore;  			} +			if (vsDraw.indicatorsSetFore > 0) { +				// At least one indicator sets the text colour so see if it applies to this segment +				for (Decoration *deco = model.pdoc->decorations.root; deco; deco = deco->next) { +					const int indicatorValue = deco->rs.ValueAt(ts.start + posLineStart); +					if (indicatorValue) { +						const Indicator &indicator = vsDraw.indicators[deco->indicator]; +						const bool hover = indicator.IsDynamic() && +							((model.hoverIndicatorPos >= ts.start + posLineStart) &&  +							(model.hoverIndicatorPos <= ts.end() + posLineStart)); +						if (hover) { +							if (indicator.sacHover.style == INDIC_TEXTFORE) { +								textFore = indicator.sacHover.fore; +							} +						} else { +							if (indicator.sacNormal.style == INDIC_TEXTFORE) { +								if (indicator.Flags() & SC_INDICFLAG_VALUEFORE) +									textFore = indicatorValue & SC_INDICVALUEMASK; +								else +									textFore = indicator.sacNormal.fore; +							} +						} +					} +				} +			}  			const int inSelection = hideSelection ? 0 : model.sel.CharacterInSelection(iDoc);  			if (inSelection && (vsDraw.selColours.fore.isSet)) {  				textFore = (inSelection == 1) ? vsDraw.selColours.fore : vsDraw.selAdditionalForeground; diff --git a/src/Editor.cxx b/src/Editor.cxx index 85fab6e70..382e173c3 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -6855,6 +6855,16 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_INDICGETHOVERFORE:  		return (wParam <= INDIC_MAX) ? vs.indicators[wParam].sacHover.fore.AsLong() : 0; +	case SCI_INDICSETFLAGS: +		if (wParam <= INDIC_MAX) { +			vs.indicators[wParam].SetFlags(static_cast<int>(lParam)); +			InvalidateStyleRedraw(); +		} +		break; + +	case SCI_INDICGETFLAGS: +		return (wParam <= INDIC_MAX) ? vs.indicators[wParam].Flags() : 0; +  	case SCI_INDICSETUNDER:  		if (wParam <= INDIC_MAX) {  			vs.indicators[wParam].under = lParam != 0; diff --git a/src/Indicator.cxx b/src/Indicator.cxx index eea5877bb..62df0b716 100644 --- a/src/Indicator.cxx +++ b/src/Indicator.cxx @@ -23,8 +23,11 @@ static PRectangle PixelGridAlign(const PRectangle &rc) {  	return PRectangle::FromInts(int(rc.left + 0.5), int(rc.top), int(rc.right + 0.5), int(rc.bottom));  } -void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine, DrawState drawState) const { +void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine, DrawState drawState, int value) const {  	StyleAndColour sacDraw = sacNormal; +	if (Flags() & SC_INDICFLAG_VALUEFORE) { +		sacDraw.fore = value & SC_INDICVALUEMASK; +	}  	if (drawState == drawHover) {  		sacDraw = sacHover;  	} @@ -108,7 +111,7 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  	} else if (sacDraw.style == INDIC_STRIKE) {  		surface->MoveTo(static_cast<int>(rc.left), static_cast<int>(rc.top) - 4);  		surface->LineTo(static_cast<int>(rc.right), static_cast<int>(rc.top) - 4); -	} else if (sacDraw.style == INDIC_HIDDEN) { +	} else if ((sacDraw.style == INDIC_HIDDEN) || (sacDraw.style == INDIC_TEXTFORE)) {  		// Draw nothing  	} else if (sacDraw.style == INDIC_BOX) {  		surface->MoveTo(static_cast<int>(rc.left), ymid + 1); @@ -172,3 +175,6 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  	}  } +void Indicator::SetFlags(int attributes_) { +	attributes = attributes_; +} diff --git a/src/Indicator.h b/src/Indicator.h index 56777e93e..c22ec71c6 100644 --- a/src/Indicator.h +++ b/src/Indicator.h @@ -34,15 +34,23 @@ public:  	bool under;  	int fillAlpha;  	int outlineAlpha; -	Indicator() : under(false), fillAlpha(30), outlineAlpha(50) { +	int attributes; +	Indicator() : under(false), fillAlpha(30), outlineAlpha(50), attributes(0) {  	}  	Indicator(int style_, ColourDesired fore_=ColourDesired(0,0,0), bool under_=false, int fillAlpha_=30, int outlineAlpha_=50) : -		sacNormal(style_, fore_), sacHover(style_, fore_), under(under_), fillAlpha(fillAlpha_), outlineAlpha(outlineAlpha_) { +		sacNormal(style_, fore_), sacHover(style_, fore_), under(under_), fillAlpha(fillAlpha_), outlineAlpha(outlineAlpha_), attributes(0) {  	} -	void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine, DrawState drawState) const; +	void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine, DrawState drawState, int value) const;  	bool IsDynamic() const {  		return !(sacNormal == sacHover);  	} +	bool OverridesTextFore() const { +		return sacNormal.style == INDIC_TEXTFORE || sacHover.style == INDIC_TEXTFORE; +	} +	int Flags() const { +		return attributes; +	} +	void SetFlags(int attributes_);  };  #ifdef SCI_NAMESPACE diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index 666399503..860a780d9 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -440,7 +440,7 @@ void BreakFinder::Insert(int val) {  }  BreakFinder::BreakFinder(const LineLayout *ll_, const Selection *psel, Range lineRange_, int posLineStart_, -	int xStart, bool breakForSelection, const Document *pdoc_, const SpecialRepresentations *preprs_) : +	int xStart, bool breakForSelection, const Document *pdoc_, const SpecialRepresentations *preprs_, const ViewStyle *pvsDraw) :  	ll(ll_),  	lineRange(lineRange_),  	posLineStart(posLineStart_), @@ -475,7 +475,17 @@ BreakFinder::BreakFinder(const LineLayout *ll_, const Selection *psel, Range lin  			}  		}  	} - +	if (pvsDraw && pvsDraw->indicatorsSetFore > 0) { +		for (Decoration *deco = pdoc->decorations.root; deco; deco = deco->next) { +			if (pvsDraw->indicators[deco->indicator].OverridesTextFore()) { +				int startPos = deco->rs.EndRun(posLineStart); +				while (startPos < (posLineStart + lineRange.end)) { +					Insert(startPos - posLineStart); +					startPos = deco->rs.EndRun(startPos); +				} +			} +		} +	}  	Insert(ll->edgeColumn);  	Insert(lineRange.end);  	saeNext = (!selAndEdge.empty()) ? selAndEdge[0] : -1; diff --git a/src/PositionCache.h b/src/PositionCache.h index 9d9821f8f..edc0a5ddb 100644 --- a/src/PositionCache.h +++ b/src/PositionCache.h @@ -168,7 +168,7 @@ public:  	// Try to make each subdivided run lengthEachSubdivision or shorter.  	enum { lengthEachSubdivision = 100 };  	BreakFinder(const LineLayout *ll_, const Selection *psel, Range rangeLine_, int posLineStart_, -		int xStart, bool breakForSelection, const Document *pdoc_, const SpecialRepresentations *preprs_); +		int xStart, bool breakForSelection, const Document *pdoc_, const SpecialRepresentations *preprs_, const ViewStyle *pvsDraw);  	~BreakFinder();  	TextSegment Next();  	bool More() const; diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx index 864356bc1..e56c8f375 100644 --- a/src/ViewStyle.cxx +++ b/src/ViewStyle.cxx @@ -102,10 +102,13 @@ ViewStyle::ViewStyle(const ViewStyle &source) {  	}  	CalcLargestMarkerHeight();  	indicatorsDynamic = 0; +	indicatorsSetFore = 0;  	for (int ind=0; ind<=INDIC_MAX; ind++) {  		indicators[ind] = source.indicators[ind];  		if (indicators[ind].IsDynamic())  			indicatorsDynamic++; +		if (indicators[ind].OverridesTextFore()) +			indicatorsSetFore++;  	}  	selColours = source.selColours; @@ -201,6 +204,7 @@ void ViewStyle::Init(size_t stylesSize_) {  	technology = SC_TECHNOLOGY_DEFAULT;  	indicatorsDynamic = 0; +	indicatorsSetFore = 0;  	lineHeight = 1;  	lineOverlap = 0;  	maxAscent = 1; @@ -323,9 +327,12 @@ void ViewStyle::Refresh(Surface &surface, int tabInChars) {  		styles[k].Copy(fr->font, *fr);  	}  	indicatorsDynamic = 0; +	indicatorsSetFore = 0;  	for (int ind = 0; ind <= INDIC_MAX; ind++) {  		if (indicators[ind].IsDynamic())  			indicatorsDynamic++; +		if (indicators[ind].OverridesTextFore()) +			indicatorsSetFore++;  	}  	maxAscent = 1;  	maxDescent = 1; diff --git a/src/ViewStyle.h b/src/ViewStyle.h index 08afebaa5..930ad104c 100644 --- a/src/ViewStyle.h +++ b/src/ViewStyle.h @@ -84,6 +84,7 @@ public:  	int largestMarkerHeight;  	Indicator indicators[INDIC_MAX + 1];  	unsigned int indicatorsDynamic; +	unsigned int indicatorsSetFore;  	int technology;  	int lineHeight;  	int lineOverlap; | 
