diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Document.h | 10 | ||||
| -rw-r--r-- | src/Editor.cxx | 68 | ||||
| -rw-r--r-- | src/Editor.h | 4 | 
3 files changed, 61 insertions, 21 deletions
| diff --git a/src/Document.h b/src/Document.h index 8affe294c..941ad79cc 100644 --- a/src/Document.h +++ b/src/Document.h @@ -37,6 +37,7 @@ public:  		return (start != invalidPosition) && (end != invalidPosition);  	} +	// Is the position within the range?  	bool Contains(Position pos) const {  		if (start < end) {  			return (pos >= start && pos <= end); @@ -45,6 +46,15 @@ public:  		}  	} +	// Is the character after pos within the range? +	bool ContainsCharacter(Position pos) const { +		if (start < end) { +			return (pos >= start && pos < end); +		} else { +			return (pos < start && pos >= end); +		} +	} +  	bool Contains(Range other) const {  		return Contains(other.start) && Contains(other.end);  	} diff --git a/src/Editor.cxx b/src/Editor.cxx index cc205feb8..5e648167d 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -106,6 +106,44 @@ void LineLayout::SetLineStart(int line, int start) {  	lineStarts[line] = start;  } +void LineLayout::SetBracesHighlight(Range rangeLine, Position braces[],  +	char bracesMatchStyle, int xHighlight) { +	if (rangeLine.ContainsCharacter(braces[0])) { +		int braceOffset = braces[0] - rangeLine.start; +		if (braceOffset < numCharsInLine) { +			bracePreviousStyles[0] = styles[braceOffset]; +			styles[braceOffset] = static_cast<char>(bracesMatchStyle); +		} +	} +	if (rangeLine.ContainsCharacter(braces[1])) { +		int braceOffset = braces[1] - rangeLine.start; +		if (braceOffset < numCharsInLine) { +			bracePreviousStyles[1] = styles[braceOffset]; +			styles[braceOffset] = static_cast<char>(bracesMatchStyle); +		} +	} +	if ((braces[0] >= rangeLine.start && braces[1] <= rangeLine.end) || +		(braces[1] >= rangeLine.start && braces[0] <= rangeLine.end)) { +		xHighlightGuide = xHighlight; +	} +} + +void LineLayout::RestoreBracesHighlight(Range rangeLine, Position braces[]) { +	if (rangeLine.ContainsCharacter(braces[0])) { +		int braceOffset = braces[0] - rangeLine.start; +		if (braceOffset < numCharsInLine) { +			styles[braceOffset] = bracePreviousStyles[0]; +		} +	} +	if (rangeLine.ContainsCharacter(braces[1])) { +		int braceOffset = braces[1] - rangeLine.start; +		if (braceOffset < numCharsInLine) { +			styles[braceOffset] = bracePreviousStyles[1]; +		} +	} +	xHighlightGuide = 0; +} +  LineLayoutCache::LineLayoutCache() :   	level(0), length(0), size(0), cache(0),   	allInvalidated(false), styleClock(-1) { @@ -1855,34 +1893,22 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {  					ll->containsCaret = false;  				} -				int posLineStart = pdoc->LineStart(lineDoc); -				int posLineEnd = pdoc->LineStart(lineDoc + 1); -				//Platform::DebugPrintf("line %d %d - %d\n", visibleLine, posLineStart, posLineEnd); -	  				PRectangle rcLine = rcClient;  				rcLine.top = ypos;  				rcLine.bottom = ypos + vs.lineHeight; -	 + +				Range rangeLine(pdoc->LineStart(lineDoc), pdoc->LineStart(lineDoc + 1));  				// Highlight the current braces if any -				if ((braces[0] >= posLineStart) && (braces[0] < posLineEnd)) { -					int braceOffset = braces[0] - posLineStart; -					if (braceOffset < ll->numCharsInLine) -						ll->styles[braceOffset] = static_cast<char>(bracesMatchStyle); -				} -				if ((braces[1] >= posLineStart) && (braces[1] < posLineEnd)) { -					int braceOffset = braces[1] - posLineStart; -					if (braceOffset < ll->numCharsInLine) -						ll->styles[braceOffset] = static_cast<char>(bracesMatchStyle); -				} -				if ((braces[0] >= posLineStart && braces[1] <= posLineEnd) || -					(braces[1] >= posLineStart && braces[0] <= posLineEnd)) { -					ll->xHighlightGuide = highlightGuideColumn * vs.spaceWidth; -				} +				ll->SetBracesHighlight(rangeLine, braces,  +					bracesMatchStyle, highlightGuideColumn * vs.spaceWidth);  				// Draw the line  				DrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine);  				//durPaint += et.Duration(true); +				// Restore the precvious styles for the brace highlights in case layout is in cache. +				ll->RestoreBracesHighlight(rangeLine, braces); +  				bool expanded = cs.GetExpanded(lineDoc);  				if ( (expanded && (foldFlags & 2)) || (!expanded && (foldFlags & 4)) ) {  					if (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELHEADERFLAG) { @@ -1901,14 +1927,14 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {  				// Draw the Caret  				if (lineDoc == lineCaret) { -					int offset = Platform::Minimum(posCaret - posLineStart, ll->maxLineLength); +					int offset = Platform::Minimum(posCaret - rangeLine.start, ll->maxLineLength);  					if ((offset >= ll->LineStart(subLine)) &&  						((offset < ll->LineStart(subLine+1)) || offset == ll->numCharsInLine)) {  						int xposCaret = ll->positions[offset] - ll->positions[ll->LineStart(subLine)] + xStart;  						int widthOverstrikeCaret;  						if (posCaret == pdoc->Length())	{   // At end of document  							widthOverstrikeCaret = vs.aveCharWidth; -						} else if ((posCaret - posLineStart) >= ll->numCharsInLine) {	// At end of line +						} else if ((posCaret - rangeLine.start) >= ll->numCharsInLine) {	// At end of line  							widthOverstrikeCaret = vs.aveCharWidth;  						} else {  							widthOverstrikeCaret = ll->positions[offset + 1] - ll->positions[offset]; diff --git a/src/Editor.h b/src/Editor.h index 1056a95bb..8f47819b5 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -55,6 +55,7 @@ public:  	char *styles;  	char *indicators;  	int *positions; +	char bracePreviousStyles[2];  	// Wrapped line support  	int widthLine; @@ -75,6 +76,9 @@ public:  		}  	}  	void SetLineStart(int line, int start); +	void SetBracesHighlight(Range rangeLine, Position braces[],  +		char bracesMatchStyle, int xHighlight); +	void RestoreBracesHighlight(Range rangeLine, Position braces[]);  };  /** | 
