diff options
| author | Tse Kit Yam <me@kytse.com> | 2016-11-29 14:14:21 +1100 | 
|---|---|---|
| committer | Tse Kit Yam <me@kytse.com> | 2016-11-29 14:14:21 +1100 | 
| commit | 4ae76e455aec66826a284356d63cc2b5995c0b2f (patch) | |
| tree | c0466475514dee0da647dfa800cb1ccfc4647f0e /src/EditView.cxx | |
| parent | 6bed4e4aa02025e1bd0c294a44c9371fb6b176f1 (diff) | |
| download | scintilla-mirror-4ae76e455aec66826a284356d63cc2b5995c0b2f.tar.gz | |
Textual tags may be displayed on folded lines with SCI_TOGGLEFOLDSHOWTEXT.
Diffstat (limited to 'src/EditView.cxx')
| -rw-r--r-- | src/EditView.cxx | 139 | 
1 files changed, 124 insertions, 15 deletions
| diff --git a/src/EditView.cxx b/src/EditView.cxx index 04eea0ea5..8ffc1bcff 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -879,7 +879,7 @@ void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle  	int alpha = SC_ALPHA_NOALPHA;  	if (!hideSelection) {  		int posAfterLineEnd = model.pdoc->LineStart(line + 1); -		eolInSelection = (subLine == (ll->lines - 1)) ? model.sel.InSelectionForEOL(posAfterLineEnd) : 0; +		eolInSelection = (lastSubLine == true) ? model.sel.InSelectionForEOL(posAfterLineEnd) : 0;  		alpha = (eolInSelection == 1) ? vsDraw.selAlpha : vsDraw.selAdditionalAlpha;  	} @@ -948,25 +948,15 @@ void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle  		}  	} -	// Fill the remainder of the line  	rcSegment.left = rcSegment.right;  	if (rcSegment.left < rcLine.left)  		rcSegment.left = rcLine.left;  	rcSegment.right = rcLine.right; -	if (eolInSelection && vsDraw.selEOLFilled && vsDraw.selColours.back.isSet && (line < model.pdoc->LinesTotal() - 1) && (alpha == SC_ALPHA_NOALPHA)) { -		surface->FillRectangle(rcSegment, SelectionBackground(vsDraw, eolInSelection == 1, model.primarySelection)); -	} else { -		if (background.isSet) { -			surface->FillRectangle(rcSegment, background); -		} else if (vsDraw.styles[ll->styles[ll->numCharsInLine]].eolFilled) { -			surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine]].back); -		} else { -			surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back); -		} -		if (eolInSelection && vsDraw.selEOLFilled && vsDraw.selColours.back.isSet && (line < model.pdoc->LinesTotal() - 1) && (alpha != SC_ALPHA_NOALPHA)) { -			SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1, model.primarySelection), alpha); -		} +	bool fillRemainder = !lastSubLine || model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN || !model.cs.GetFoldDisplayTextShown(line); +	if (fillRemainder) { +		// Fill the remainder of the line +		FillLineRemainder(surface, model, vsDraw, ll, line, rcSegment, subLine);  	}  	bool drawWrapMarkEnd = false; @@ -1071,6 +1061,95 @@ static void DrawIndicators(Surface *surface, const EditModel &model, const ViewS  	}  } +void EditView::DrawFoldDisplayText(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, +							  int line, int xStart, PRectangle rcLine, int subLine, XYACCUMULATOR subLineStart, DrawPhase phase) { +	const bool lastSubLine = subLine == (ll->lines - 1); +	if (!lastSubLine) +		return; + +	if ((model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN) || !model.cs.GetFoldDisplayTextShown(line)) +		return; + +	PRectangle rcSegment = rcLine; +	const char *foldDisplayText = model.cs.GetFoldDisplayText(line); +	const int lengthFoldDisplayText = static_cast<int>(strlen(foldDisplayText)); +	FontAlias fontText = vsDraw.styles[STYLE_FOLDDISPLAYTEXT].font; +	const int widthFoldDisplayText = static_cast<int>(surface->WidthText(fontText, foldDisplayText, lengthFoldDisplayText)); + +	int eolInSelection = 0; +	int alpha = SC_ALPHA_NOALPHA; +	if (!hideSelection) { +		int posAfterLineEnd = model.pdoc->LineStart(line + 1); +		eolInSelection = (subLine == (ll->lines - 1)) ? model.sel.InSelectionForEOL(posAfterLineEnd) : 0; +		alpha = (eolInSelection == 1) ? vsDraw.selAlpha : vsDraw.selAdditionalAlpha; +	} + +	const XYPOSITION spaceWidth = vsDraw.styles[ll->EndLineStyle()].spaceWidth; +	XYPOSITION virtualSpace = model.sel.VirtualSpaceFor(model.pdoc->LineEnd(line)) * spaceWidth; +	rcSegment.left = xStart + static_cast<XYPOSITION>(ll->positions[ll->numCharsInLine] - subLineStart) + spaceWidth + virtualSpace; +	rcSegment.right = rcSegment.left + static_cast<XYPOSITION>(widthFoldDisplayText); + +	ColourOptional background = vsDraw.Background(model.pdoc->GetMark(line), model.caret.active, ll->containsCaret); +	FontAlias textFont = vsDraw.styles[STYLE_FOLDDISPLAYTEXT].font; +	ColourDesired textFore = vsDraw.styles[STYLE_FOLDDISPLAYTEXT].fore; +	if (eolInSelection && (vsDraw.selColours.fore.isSet)) { +		textFore = (eolInSelection == 1) ? vsDraw.selColours.fore : vsDraw.selAdditionalForeground; +	} +	ColourDesired textBack = TextBackground(model, vsDraw, ll, background, eolInSelection, +											false, STYLE_FOLDDISPLAYTEXT, -1); + +	if (model.trackLineWidth) { +		if (rcSegment.right + 1> lineWidthMaxSeen) { +			// Fold display text border drawn on rcSegment.right with width 1 is the last visble object of the line +			lineWidthMaxSeen = static_cast<int>(rcSegment.right + 1); +		} +	} + +	if ((phasesDraw != phasesOne) && (phase & drawBack)) { +		surface->FillRectangle(rcSegment, textBack); + +		// Fill Remainder of the line +		PRectangle rcRemainder = rcSegment; +		rcRemainder.left = rcRemainder.right + 1; +		if (rcRemainder.left < rcLine.left) +			rcRemainder.left = rcLine.left; +		rcRemainder.right = rcLine.right; +		FillLineRemainder(surface, model, vsDraw, ll, line, rcRemainder, subLine); +	} + +	if (phase & drawText) { +		if (phasesDraw != phasesOne) { +			surface->DrawTextTransparent(rcSegment, textFont, +				rcSegment.top + vsDraw.maxAscent, foldDisplayText, +				lengthFoldDisplayText, textFore); +		} else { +			surface->DrawTextNoClip(rcSegment, textFont, +				rcSegment.top + vsDraw.maxAscent, foldDisplayText, +				lengthFoldDisplayText, textFore, textBack); +		} +	} + +	if (phase & drawIndicatorsFore) { +		if (model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_BOXED) { +			surface->PenColour(textFore); +			surface->MoveTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.top)); +			surface->LineTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.bottom)); +			surface->MoveTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.top)); +			surface->LineTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.bottom)); +			surface->MoveTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.top)); +			surface->LineTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.top)); +			surface->MoveTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.bottom - 1)); +			surface->LineTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.bottom - 1)); +		} +	} + +	if (phase & drawSelectionTranslucent) { +		if (eolInSelection && vsDraw.selColours.back.isSet && (line < model.pdoc->LinesTotal() - 1) && alpha != SC_ALPHA_NOALPHA) { +			SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1, model.primarySelection), alpha); +		} +	} +} +  static bool AnnotationBoxedOrIndented(int annotationVisible) {  	return annotationVisible == ANNOTATION_BOXED || annotationVisible == ANNOTATION_INDENTED;  } @@ -1789,6 +1868,8 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  			xStart, subLine, subLineStart, background);  	} +	DrawFoldDisplayText(surface, model, vsDraw, ll, line, xStart, rcLine, subLine, subLineStart, phase); +  	if (!hideSelection && (phase & drawSelectionTranslucent)) {  		DrawTranslucentSelection(surface, model, vsDraw, ll, line, rcLine, subLine, lineRange, xStart);  	} @@ -2002,6 +2083,34 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan  	}  } +void EditView::FillLineRemainder(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, +	int line, PRectangle rcArea, int subLine) { +		int eolInSelection = 0; +		int alpha = SC_ALPHA_NOALPHA; +		if (!hideSelection) { +			int posAfterLineEnd = model.pdoc->LineStart(line + 1); +			eolInSelection = (subLine == (ll->lines - 1)) ? model.sel.InSelectionForEOL(posAfterLineEnd) : 0; +			alpha = (eolInSelection == 1) ? vsDraw.selAlpha : vsDraw.selAdditionalAlpha; +		} + +		ColourOptional background = vsDraw.Background(model.pdoc->GetMark(line), model.caret.active, ll->containsCaret); + +		if (eolInSelection && vsDraw.selEOLFilled && vsDraw.selColours.back.isSet && (line < model.pdoc->LinesTotal() - 1) && (alpha == SC_ALPHA_NOALPHA)) { +			surface->FillRectangle(rcArea, SelectionBackground(vsDraw, eolInSelection == 1, model.primarySelection)); +		} else { +			if (background.isSet) { +				surface->FillRectangle(rcArea, background); +			} else if (vsDraw.styles[ll->styles[ll->numCharsInLine]].eolFilled) { +				surface->FillRectangle(rcArea, vsDraw.styles[ll->styles[ll->numCharsInLine]].back); +			} else { +				surface->FillRectangle(rcArea, vsDraw.styles[STYLE_DEFAULT].back); +			} +			if (eolInSelection && vsDraw.selEOLFilled && vsDraw.selColours.back.isSet && (line < model.pdoc->LinesTotal() - 1) && (alpha != SC_ALPHA_NOALPHA)) { +				SimpleAlphaRectangle(surface, rcArea, SelectionBackground(vsDraw, eolInSelection == 1, model.primarySelection), alpha); +			} +		} +} +  // Space (3 space characters) between line numbers and text when printing.  #define lineNumberPrintSpace "   " | 
