SynEdit: Show fold indicator on last wrapped line.

This commit is contained in:
Martin 2025-02-07 11:59:20 +01:00
parent 269f304c2c
commit c29347cfc7
9 changed files with 35 additions and 31 deletions

View File

@ -226,7 +226,7 @@ type
property NextView: TLazSynDisplayView read FNextView write FNextView;
public
procedure InitHighlighterTokens(AHighlighter: TSynCustomHighlighter); virtual;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer); virtual;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer); virtual;
procedure FinishHighlighterTokens; virtual;
function GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean; virtual;
function GetLinesCount: Integer; virtual;
@ -646,12 +646,12 @@ begin
FNextView.InitHighlighterTokens(AHighlighter);
end;
procedure TLazSynDisplayView.SetHighlighterTokensLine(ALine: TLineIdx; out
ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
procedure TLazSynDisplayView.SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx;
out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
begin
//AStartBytePos := 1;
if assigned(FNextView) then
FNextView.SetHighlighterTokensLine(ALine, ARealLine, AStartBytePos, AStartPhysPos, ALineByteLen);
FNextView.SetHighlighterTokensLine(ALine, ARealLine, ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen);
end;
procedure TLazSynDisplayView.FinishHighlighterTokens;

View File

@ -327,9 +327,9 @@ end;
procedure TLazSynPaintTokenBreaker.SetHighlighterTokensLine(ALine: TLineIdx; out
ARealLine: TLineIdx);
var
LogLeftPos: Integer;
LogLeftPos, ASubLineIdx: Integer;
begin
FDisplayView.SetHighlighterTokensLine(ALine, ARealLine, LogLeftPos, FCurLinePhysStart, FCurLineByteLen);
FDisplayView.SetHighlighterTokensLine(ALine, ARealLine, ASubLineIdx, LogLeftPos, FCurLinePhysStart, FCurLineByteLen);
if FLinesView.LogPhysConvertor.CurrentLine = ARealLine then begin
if not FCharWidthsFromConverter then begin
FCharWidthsFromConverter := True;

View File

@ -373,7 +373,7 @@ type
public
constructor Create(AFoldView: TSynEditFoldedView);
destructor Destroy; override;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
function GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean; override;
function GetLinesCount: Integer; override;
@ -735,12 +735,15 @@ begin
inherited Destroy;
end;
procedure TLazSynDisplayFold.SetHighlighterTokensLine(ALine: TLineIdx; out
ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
procedure TLazSynDisplayFold.SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx;
out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
begin
FLineState := 0;
CurrentTokenLine := ALine;
FLineFlags := FFoldView.FoldType[CurrentTokenLine + 1 - FFoldView.TopViewPos] * [cfCollapsedFold, cfCollapsedHide];
inherited SetHighlighterTokensLine(FFoldView.InternViewToTextIndex(ALine), ARealLine, ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen);
FLineFlags := FFoldView.FoldType[CurrentTokenLine - ASubLineIdx + 1 - FFoldView.TopViewPos] * [cfCollapsedFold, cfCollapsedHide];
FLineFlags2 := FLineFlags;
if not FFoldView.MarkupInfoFoldedCodeLine.IsEnabled then
@ -752,8 +755,6 @@ begin
FFoldView.MarkupInfoFoldedCodeLine.SetFrameBoundsLog(1, MaxInt, 0);
FFoldView.MarkupInfoHiddenCodeLine.SetFrameBoundsLog(1, MaxInt, 0);
end;
inherited SetHighlighterTokensLine(FFoldView.InternViewToTextIndex(ALine), ARealLine, AStartBytePos, AStartPhysPos, ALineByteLen);
end;
function TLazSynDisplayFold.GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean;
@ -773,7 +774,8 @@ begin
case FLineState of
LSTATE_BOL, LSTATE_TEXT: begin
Result := inherited GetNextHighlighterToken(ATokenInfo);
if ( (not Result) or (ATokenInfo.TokenStart = nil)) and (FLineFlags <> [])
if (ATokenInfo.TokenOrigin = dtoAfterText) and
( (not Result) or (ATokenInfo.TokenStart = nil)) and (FLineFlags <> [])
then begin
inc(FLineState, 2); // LSTATE_BOL_GAP(2), if was at bol // LSTATE_GAP(3) otherwise
ATokenInfo.TokenStart := PChar(MarkSpaces);

View File

@ -126,7 +126,7 @@ type
FAtLineStart: Boolean;
public
constructor Create(ABuffer: TSynEditStringList);
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
function GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean; override;
function GetDrawDividerInfo: TSynDividerDrawConfigSetting; override;
function GetLinesCount: Integer; override;
@ -386,10 +386,11 @@ begin
end;
procedure TLazSynDisplayBuffer.SetHighlighterTokensLine(ALine: TLineIdx; out
ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
begin
CurrentTokenLine := ALine;
ARealLine := ALine;
ASubLineIdx := 0;
AStartBytePos := 1;
AStartPhysPos := 1;
ALineByteLen := Length(FBuffer[ARealLine]);

View File

@ -47,7 +47,7 @@ type
public
constructor Create(ATrimer: TSynEditStringTrimmingList);
procedure FinishHighlighterTokens; override;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
function GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean; override;
end;
@ -321,14 +321,14 @@ begin
end;
procedure TLazSynDisplayTrim.SetHighlighterTokensLine(ALine: TLineIdx; out
ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
begin
CurrentTokenLine := ALine;
FAtLineStart := True;
if (CurrentTokenHighlighter = nil) and (FTrimer.Spaces(CurrentTokenLine) <> '') then begin
ALineByteLen := Length(FTrimer[CurrentTokenLine]);
end;
inherited SetHighlighterTokensLine(ALine, ARealLine, AStartBytePos, AStartPhysPos, ALineByteLen);
inherited SetHighlighterTokensLine(ALine, ARealLine, ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen);
ALineByteLen := ALineByteLen + length(FTrimer.Spaces(ALine));
end;

View File

@ -239,7 +239,7 @@ type
public
constructor Create(AWrappedView: TSynEditLineMappingView);
procedure SetHighlighterTokensLine(AWrappedLine: TLineIdx; out
ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
// function GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean; override;
procedure FinishHighlighterTokens; override;
function TextToViewIndex(ATextIndex: TLineIdx): TLineRange; override;
@ -1288,7 +1288,7 @@ begin
end;
procedure TLazSynDisplayLineMapping.SetHighlighterTokensLine(
AWrappedLine: TLineIdx; out ARealLine: TLineIdx; out AStartBytePos,
AWrappedLine: TLineIdx; out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos,
AStartPhysPos, ALineByteLen: Integer);
var
RealIdx: IntIdx;
@ -1307,7 +1307,8 @@ begin
FCurrentWrapSubline := 0;
end;
inherited SetHighlighterTokensLine(RealIdx, ARealLine, AStartBytePos, AStartPhysPos, ALineByteLen);
inherited SetHighlighterTokensLine(RealIdx, ARealLine, ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen);
ASubLineIdx := FCurrentWrapSubline;
end;
procedure TLazSynDisplayLineMapping.FinishHighlighterTokens;

View File

@ -188,7 +188,7 @@ type
constructor Create(AWrappedView: TSynEditLineMappingView; AWrapPlugin: TLazSynEditLineWrapPlugin);
//destructor Destroy; override;
procedure SetHighlighterTokensLine(AWrappedLine: TLineIdx; out
ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
function GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean; override;
end;
@ -1484,7 +1484,7 @@ begin
end;
procedure TLazSynDisplayWordWrap.SetHighlighterTokensLine(
AWrappedLine: TLineIdx; out ARealLine: TLineIdx; out AStartBytePos,
AWrappedLine: TLineIdx; out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos,
AStartPhysPos, ALineByteLen: Integer);
var
IsNext: Boolean;
@ -1496,7 +1496,7 @@ begin
IsNext := (AWrappedLine = FCurWrappedLine + 1) and (FCurWrappedLine >= 0);
PrevSub := FCurrentWrapSubline;
inherited SetHighlighterTokensLine(AWrappedLine, ARealLine, AStartBytePos, AStartPhysPos, FCurRealLineByteLen);
inherited SetHighlighterTokensLine(AWrappedLine, ARealLine, ASubLineIdx, AStartBytePos, AStartPhysPos, FCurRealLineByteLen);
LineTxt := FLineMappingView.NextLines.Strings[ARealLine];
FLineMappingView.LogPhysConvertor.CurrentLine := ARealLine;

View File

@ -1749,13 +1749,13 @@ procedure TTestWordWrapPluginBase.InternalCheckLine(AName: String;
NoTrim: Boolean);
var
gotRealLine: TLineIdx;
gotStartPos, GotLineLen, gotStartPhys: Integer;
gotStartPos, GotLineLen, gotStartPhys, gotSubLineIdx: Integer;
gotTokenOk: Boolean;
gotToken: TLazSynDisplayTokenInfo;
gotText: PChar;
s: String;
begin
dsp.SetHighlighterTokensLine(ALine, gotRealLine, gotStartPos, gotStartPhys, GotLineLen);
dsp.SetHighlighterTokensLine(ALine, gotRealLine, gotSubLineIdx, gotStartPos, gotStartPhys, GotLineLen);
gotTokenOk := dsp.GetNextHighlighterToken(gotToken);
if gotTokenOk then
gotText := gotToken.TokenStart
@ -1806,7 +1806,7 @@ procedure TTestWordWrapPluginBase.CheckLines(AName: String;
var
v: TSynEditStringsLinked;
dsp: TLazSynDisplayView;
i, gotStartPos, GotLineLen, gotStartPhys: Integer;
i, gotStartPos, GotLineLen, gotStartPhys, gotSubLineIdx: Integer;
gotTokenOk: Boolean;
gotToken: TLazSynDisplayTokenInfo;
s: String;
@ -1823,7 +1823,7 @@ begin
dsp.FinishHighlighterTokens;
dsp.InitHighlighterTokens(nil);
for i := 0 to Length(AExpTextStart)-1 do begin
dsp.SetHighlighterTokensLine(AStartLine+i, gotRealLine, gotStartPos, gotStartPhys, GotLineLen);
dsp.SetHighlighterTokensLine(AStartLine+i, gotRealLine, gotSubLineIdx, gotStartPos, gotStartPhys, GotLineLen);
s := '';
while dsp.GetNextHighlighterToken(gotToken) and (gotToken.TokenLength > 0) do
s := s + copy(gotToken.TokenStart, 1, gotToken.TokenLength);

View File

@ -82,7 +82,7 @@ type
procedure SetLineMap(Index: Integer; AValue: Integer);
procedure SetLineMapCount(AValue: integer);
public
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
procedure SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer); override;
function GetLinesCount: Integer; override;
function TextToViewIndex(AIndex: TLineIdx): TLineRange; override;
function ViewToTextIndex(AIndex: TLineIdx): TLineIdx; override;
@ -1319,10 +1319,10 @@ begin
end;
procedure TSourceLazSynTopInfoView.SetHighlighterTokensLine(ALine: TLineIdx;
out ARealLine: TLineIdx; out AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
out ARealLine: TLineIdx; out ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen: Integer);
begin
CurrentTokenLine := ALine;
inherited SetHighlighterTokensLine(FLineMap[ALine], ARealLine, AStartBytePos, AStartPhysPos, ALineByteLen);
inherited SetHighlighterTokensLine(FLineMap[ALine], ARealLine, ASubLineIdx, AStartBytePos, AStartPhysPos, ALineByteLen);
end;
function TSourceLazSynTopInfoView.GetLinesCount: Integer;