diff options
| -rw-r--r-- | src/Document.cxx | 19 | ||||
| -rw-r--r-- | src/Document.h | 2 | ||||
| -rw-r--r-- | src/Editor.cxx | 4 | 
3 files changed, 15 insertions, 10 deletions
| diff --git a/src/Document.cxx b/src/Document.cxx index b9b284e96..eb818b515 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -355,16 +355,18 @@ int Document::GetFoldParent(int line) {  	}  } -void Document::GetHighlightDelimiters(int line, HighlightDelimiter &highlightDelimiter) { +void Document::GetHighlightDelimiters(HighlightDelimiter &highlightDelimiter, int line, int topLine, int bottomLine) { +	int noNeedToParseBefore = Platform::Minimum(line, topLine) - 1; +	int noNeedToParseAfter = Platform::Maximum(line, bottomLine) + 1;  	int endLine = LineFromPosition(Length()); -	int beginFoldBlock = -1; +	int beginFoldBlock = noNeedToParseBefore;  	int endFoldBlock = -1; -	int beginMarginCorrectlyDrawnZone = -1; -	int endMarginCorrectlyDrawnZone = endLine + 1; +	int beginMarginCorrectlyDrawnZone = noNeedToParseBefore; +	int endMarginCorrectlyDrawnZone = noNeedToParseAfter;  	int endOfTailOfWhiteFlag = -1; //endOfTailOfWhiteFlag points the last SC_FOLDLEVELWHITEFLAG if follow a fold block. Otherwise endOfTailOfWhiteFlag points end of fold block.  	int level = GetLevel(line);  	int levelNumber = -1; -	int lineLookLevel = -1; +	int lineLookLevel = 0;  	int lineLookLevelNumber = -1;  	int lineLook = line;  	bool beginFoldBlockFound = false; @@ -375,7 +377,7 @@ void Document::GetHighlightDelimiters(int line, HighlightDelimiter &highlightDel  	/*******************************************************************************/  	/*      search backward (beginFoldBlock & beginMarginCorrectlyDrawnZone)       */  	/*******************************************************************************/ -	for (endOfTailOfWhiteFlag = line; lineLook >= 0 && (!beginFoldBlockFound || !beginMarginCorrectlyDrawnZoneFound); --lineLook) { +	for (endOfTailOfWhiteFlag = line; (lineLook > noNeedToParseBefore || (lineLookLevel & SC_FOLDLEVELWHITEFLAG)) && (!beginFoldBlockFound || !beginMarginCorrectlyDrawnZoneFound); --lineLook) {  		lineLookLevel = GetLevel(lineLook);  		if (levelNumber != -1) {  			lineLookLevelNumber = lineLookLevel & SC_FOLDLEVELNUMBERMASK; @@ -395,7 +397,8 @@ void Document::GetHighlightDelimiters(int line, HighlightDelimiter &highlightDel  					beginMarginCorrectlyDrawnZone = lineLook - 1;  				}  			} else 	if (!beginFoldBlockFound && lineLookLevelNumber == SC_FOLDLEVELBASE) { -				beginFoldBlockFound = true; //beginFoldBlock already set to -1. +				beginFoldBlockFound = true; +				beginFoldBlock = -1;  			}  		} else if (!(lineLookLevel & SC_FOLDLEVELWHITEFLAG)) {  			endOfTailOfWhiteFlag = lineLook - 1; @@ -421,7 +424,7 @@ void Document::GetHighlightDelimiters(int line, HighlightDelimiter &highlightDel  	} else {  		lineLook = line;  	} -	for (; lineLook <= endLine && (!endFoldBlockFound || !endMarginCorrectlyDrawnZoneFound); ++lineLook) { +	for (; lineLook < noNeedToParseAfter && (!endFoldBlockFound || !endMarginCorrectlyDrawnZoneFound); ++lineLook) {  		lineLookLevel = GetLevel(lineLook);  		lineLookLevelNumber = lineLookLevel & SC_FOLDLEVELNUMBERMASK;  		if (!endFoldBlockFound && !(lineLookLevel & SC_FOLDLEVELWHITEFLAG) && lineLookLevelNumber < levelNumber) { diff --git a/src/Document.h b/src/Document.h index 125a4a0a6..274aa0baa 100644 --- a/src/Document.h +++ b/src/Document.h @@ -340,7 +340,7 @@ public:  	void ClearLevels();  	int GetLastChild(int lineParent, int level=-1);  	int GetFoldParent(int line); -	void GetHighlightDelimiters(int line, HighlightDelimiter &hDelimiter); +	void GetHighlightDelimiters(HighlightDelimiter &hDelimiter, int line, int topLine, int bottomLine);  	void Indent(bool forwards);  	int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false); diff --git a/src/Editor.cxx b/src/Editor.cxx index 05531a650..afeffc86f 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1730,7 +1730,9 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {  				}  			}  			if (highlightDelimiter.isEnabled && (vs.ms[margin].mask & SC_MASK_FOLDERS)) { -				pdoc->GetHighlightDelimiters(pdoc->LineFromPosition(CurrentPosition()), highlightDelimiter); +				int lineBack = cs.DocFromDisplay(topLine); +				int lineFront = cs.DocFromDisplay(((rcMargin.bottom - rcMargin.top) / vs.lineHeight) + topLine) + 1; +				pdoc->GetHighlightDelimiters(highlightDelimiter, pdoc->LineFromPosition(CurrentPosition()), lineBack, lineFront);  			}  			// Old code does not know about new markers needed to distinguish all cases | 
