SynEdit: prepare extra highlight for lines starting a fold

git-svn-id: trunk@43425 -
This commit is contained in:
martin 2013-11-11 20:28:56 +00:00
parent fc0030c327
commit 1ce927a927

View File

@ -427,6 +427,8 @@ type
FFoldView: TSynEditFoldedView; FFoldView: TSynEditFoldedView;
FLineState: integer; FLineState: integer;
FTokenAttr: TSynHighlighterAttributesModifier; FTokenAttr: TSynHighlighterAttributesModifier;
FMarkupLine: TSynSelectedColorMergeResult;
FLineFlags, FLineFlags2: TSynEditFoldLineCapabilities;
public public
constructor Create(AFoldView: TSynEditFoldedView); constructor Create(AFoldView: TSynEditFoldedView);
destructor Destroy; override; destructor Destroy; override;
@ -457,6 +459,8 @@ type
fLines : TSynEditStrings; fLines : TSynEditStrings;
fFoldTree : TSynTextFoldAVLTree; // Folds are stored 1-based (the 1st line is 1) fFoldTree : TSynTextFoldAVLTree; // Folds are stored 1-based (the 1st line is 1)
FMarkupInfoFoldedCode: TSynSelectedColor; FMarkupInfoFoldedCode: TSynSelectedColor;
FMarkupInfoFoldedCodeLine: TSynSelectedColor;
FMarkupInfoHiddenCodeLine: TSynSelectedColor;
FOnLineInvalidate: TInvalidateLineProc; FOnLineInvalidate: TInvalidateLineProc;
fTopLine : Integer; fTopLine : Integer;
fLinesInWindow : Integer; // there may be an additional part visible line fLinesInWindow : Integer; // there may be an additional part visible line
@ -543,6 +547,8 @@ type
property Count : integer read GetCount; (* refers to visible (unfolded) lines *) property Count : integer read GetCount; (* refers to visible (unfolded) lines *)
property MarkupInfoFoldedCode: TSynSelectedColor read FMarkupInfoFoldedCode; property MarkupInfoFoldedCode: TSynSelectedColor read FMarkupInfoFoldedCode;
property MarkupInfoFoldedCodeLine: TSynSelectedColor read FMarkupInfoFoldedCodeLine;
property MarkupInfoHiddenCodeLine: TSynSelectedColor read FMarkupInfoHiddenCodeLine;
public public
procedure Lock; procedure Lock;
procedure UnLock; procedure UnLock;
@ -785,11 +791,13 @@ begin
inherited Create; inherited Create;
FFoldView := AFoldView; FFoldView := AFoldView;
FTokenAttr := TSynHighlighterAttributesModifier.Create(nil); FTokenAttr := TSynHighlighterAttributesModifier.Create(nil);
FMarkupLine := TSynSelectedColorMergeResult.Create(nil);
end; end;
destructor TLazSynDisplayFold.Destroy; destructor TLazSynDisplayFold.Destroy;
begin begin
FreeAndNil(FTokenAttr); FreeAndNil(FTokenAttr);
FreeAndNil(FMarkupLine);
inherited Destroy; inherited Destroy;
end; end;
@ -797,6 +805,19 @@ procedure TLazSynDisplayFold.SetHighlighterTokensLine(ALine: TLineIdx; out AReal
begin begin
FLineState := 0; FLineState := 0;
CurrentTokenLine := ALine; CurrentTokenLine := ALine;
FLineFlags := FFoldView.FoldType[CurrentTokenLine + 1 - FFoldView.TopLine] * [cfCollapsedFold, cfCollapsedHide];
FLineFlags2 := FLineFlags;
if not FFoldView.MarkupInfoFoldedCodeLine.IsEnabled then
Exclude(FLineFlags2, cfCollapsedFold);
if not FFoldView.MarkupInfoHiddenCodeLine.IsEnabled then
Exclude(FLineFlags2, cfCollapsedHide);
if (FLineFlags2 <> []) then begin
FFoldView.MarkupInfoFoldedCodeLine.SetFrameBoundsLog(1, MaxInt, 0);
FFoldView.MarkupInfoHiddenCodeLine.SetFrameBoundsLog(1, MaxInt, 0);
end;
inherited SetHighlighterTokensLine(FFoldView.ViewPosToTextIndex(ALine + 1), ARealLine); inherited SetHighlighterTokensLine(FFoldView.ViewPosToTextIndex(ALine + 1), ARealLine);
end; end;
@ -804,16 +825,22 @@ function TLazSynDisplayFold.GetNextHighlighterToken(out ATokenInfo: TLazSynDispl
const const
MarkSpaces: string = ' '; MarkSpaces: string = ' ';
MarkDots: string = '...'; MarkDots: string = '...';
LSTATE_BOL = 0; // at BOL
LSTATE_TEXT = 1; // in text
LSTATE_BOL_GAP = 2; // BOL and in Gap (empty line) // must be LSTATE_BOL + 2
LSTATE_GAP = 3; // In Gap betwen txt and dots // must be LSTATE_TEXT + 2
LSTATE_DOTS = 4; // In Dots
LSTATE_EOL = 5; // at start of EOL
var var
EolAttr: TSynHighlighterAttributes; EolAttr: TSynHighlighterAttributes;
MergeStartX, MergeEndX: TLazSynDisplayTokenBound;
begin begin
case FLineState of case FLineState of
0: begin LSTATE_BOL, LSTATE_TEXT: begin
Result := inherited GetNextHighlighterToken(ATokenInfo); Result := inherited GetNextHighlighterToken(ATokenInfo);
if ( (not Result) or (ATokenInfo.TokenStart = nil)) and if ( (not Result) or (ATokenInfo.TokenStart = nil)) and (FLineFlags <> [])
(FFoldView.FoldType[CurrentTokenLine + 1 - FFoldView.TopLine] * [cfCollapsedFold, cfCollapsedHide] <> [])
then begin then begin
inc(FLineState); inc(FLineState, 2); // LSTATE_BOL_GAP(2), if was at bol // LSTATE_GAP(3) otherwise
ATokenInfo.TokenStart := PChar(MarkSpaces); ATokenInfo.TokenStart := PChar(MarkSpaces);
ATokenInfo.TokenLength := 3; ATokenInfo.TokenLength := 3;
if Assigned(CurrentTokenHighlighter) if Assigned(CurrentTokenHighlighter)
@ -823,13 +850,14 @@ begin
FTokenAttr.Assign(EolAttr); FTokenAttr.Assign(EolAttr);
ATokenInfo.TokenAttr := FTokenAttr; ATokenInfo.TokenAttr := FTokenAttr;
end end
else else begin
ATokenInfo.TokenAttr := nil; ATokenInfo.TokenAttr := nil;
end;
Result := True; Result := True;
end; end;
end; end;
1: begin LSTATE_GAP: begin
inc(FLineState); FLineState := LSTATE_DOTS;
FTokenAttr.Assign(FFoldView.MarkupInfoFoldedCode); FTokenAttr.Assign(FFoldView.MarkupInfoFoldedCode);
FTokenAttr.SetAllPriorities(MaxInt); FTokenAttr.SetAllPriorities(MaxInt);
ATokenInfo.TokenStart := PChar(MarkDots); ATokenInfo.TokenStart := PChar(MarkDots);
@ -837,9 +865,49 @@ begin
ATokenInfo.TokenAttr := FTokenAttr; ATokenInfo.TokenAttr := FTokenAttr;
Result := True; Result := True;
end; end;
else else begin
Result := inherited GetNextHighlighterToken(ATokenInfo); Result := inherited GetNextHighlighterToken(ATokenInfo);
end;
end; end;
if (FLineFlags2 <> []) then begin
FMarkupLine.Clear;
if ATokenInfo.TokenAttr = nil then begin
// Text Area does not expect StartX/Endx
// So we must merge, to eliminate unwanted borders
// if (cfCollapsedFold in FLineFlags2)
// then ATokenInfo.TokenAttr := FFoldView.MarkupInfoFoldedCodeLine
// else ATokenInfo.TokenAttr := FFoldView.MarkupInfoHiddenCodeLine;
// exit;
FMarkupLine.Clear;
end //;
else
FMarkupLine.Assign(ATokenInfo.TokenAttr);
MergeStartX.Physical := -1;
MergeStartX.Logical := -1;
MergeEndX.Physical := -1;
MergeEndX.Logical := -1;
if FLineState in [LSTATE_BOL, LSTATE_BOL_GAP] then
MergeStartX := FFoldView.MarkupInfoFoldedCodeLine.StartX;
if FLineState = LSTATE_EOL then // LSTATE_GAP; // or result := true
MergeEndX := FFoldView.MarkupInfoFoldedCodeLine.EndX;
// fully expand all frames
//FMarkupLine.SetFrameBoundsLog(0,0,0);
//FMarkupLine.CurrentStartX := FMarkupLine.StartX;
//FMarkupLine.CurrentEndX := FMarkupLine.EndX;
if (cfCollapsedFold in FLineFlags2) then
FMarkupLine.Merge(FFoldView.MarkupInfoFoldedCodeLine, MergeStartX, MergeEndX)
else
FMarkupLine.Merge(FFoldView.MarkupInfoHiddenCodeLine, MergeStartX, MergeEndX);
ATokenInfo.TokenAttr := FMarkupLine;
end;
if FLineState in [LSTATE_BOL, LSTATE_BOL_GAP, LSTATE_DOTS, LSTATE_EOL] then
inc(FLineState);
end; end;
function TLazSynDisplayFold.GetLinesCount: Integer; function TLazSynDisplayFold.GetLinesCount: Integer;
@ -3642,6 +3710,16 @@ begin
FMarkupInfoFoldedCode.Foreground := clDkGray; FMarkupInfoFoldedCode.Foreground := clDkGray;
FMarkupInfoFoldedCode.FrameColor := clDkGray; FMarkupInfoFoldedCode.FrameColor := clDkGray;
FMarkupInfoFoldedCodeLine := TSynSelectedColor.Create;
FMarkupInfoFoldedCodeLine.Background := clNone;
FMarkupInfoFoldedCodeLine.Foreground := clNone;
FMarkupInfoFoldedCodeLine.FrameColor := clNone;
FMarkupInfoHiddenCodeLine := TSynSelectedColor.Create;
FMarkupInfoHiddenCodeLine.Background := clNone;
FMarkupInfoHiddenCodeLine.Foreground := clNone;
FMarkupInfoHiddenCodeLine.FrameColor := clNone;
fLines.AddChangeHandler(senrLineCount, @LineCountChanged); fLines.AddChangeHandler(senrLineCount, @LineCountChanged);
fLines.AddNotifyHandler(senrCleared, @LinesCleared); fLines.AddNotifyHandler(senrCleared, @LinesCleared);
fLines.AddEditHandler(@LineEdited); fLines.AddEditHandler(@LineEdited);
@ -3659,6 +3737,8 @@ begin
fTextIndexList := nil; fTextIndexList := nil;
fFoldTypeList := nil; fFoldTypeList := nil;
FMarkupInfoFoldedCode.Free; FMarkupInfoFoldedCode.Free;
FMarkupInfoFoldedCodeLine.Free;
FMarkupInfoHiddenCodeLine.Free;
FreeAndNil(FFoldProvider); FreeAndNil(FFoldProvider);
inherited Destroy; inherited Destroy;
end; end;