diff --git a/components/synedit/lazsynedittext.pas b/components/synedit/lazsynedittext.pas index 2e323f65af..e4fe27f801 100644 --- a/components/synedit/lazsynedittext.pas +++ b/components/synedit/lazsynedittext.pas @@ -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; diff --git a/components/synedit/lazsyntextarea.pp b/components/synedit/lazsyntextarea.pp index 9fef7fbf46..4b1ef7b393 100644 --- a/components/synedit/lazsyntextarea.pp +++ b/components/synedit/lazsyntextarea.pp @@ -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; diff --git a/components/synedit/syneditfoldedview.pp b/components/synedit/syneditfoldedview.pp index 29534c854d..b42eef247c 100644 --- a/components/synedit/syneditfoldedview.pp +++ b/components/synedit/syneditfoldedview.pp @@ -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); diff --git a/components/synedit/synedittextbuffer.pp b/components/synedit/synedittextbuffer.pp index d47dddf76b..492562c346 100644 --- a/components/synedit/synedittextbuffer.pp +++ b/components/synedit/synedittextbuffer.pp @@ -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]); diff --git a/components/synedit/synedittexttrimmer.pas b/components/synedit/synedittexttrimmer.pas index e697570e17..5d21f26034 100644 --- a/components/synedit/synedittexttrimmer.pas +++ b/components/synedit/synedittexttrimmer.pas @@ -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; diff --git a/components/synedit/syneditviewedlinemap.pp b/components/synedit/syneditviewedlinemap.pp index 64a142aa77..dd1bd66a36 100644 --- a/components/synedit/syneditviewedlinemap.pp +++ b/components/synedit/syneditviewedlinemap.pp @@ -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; diff --git a/components/synedit/syneditwrappedview.pp b/components/synedit/syneditwrappedview.pp index 27a393591c..63902bacf9 100644 --- a/components/synedit/syneditwrappedview.pp +++ b/components/synedit/syneditwrappedview.pp @@ -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; diff --git a/components/synedit/test/testwordwrap.pas b/components/synedit/test/testwordwrap.pas index 60c894f41d..a55e709915 100644 --- a/components/synedit/test/testwordwrap.pas +++ b/components/synedit/test/testwordwrap.pas @@ -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); diff --git a/ide/sourcesyneditor.pas b/ide/sourcesyneditor.pas index 4805dbff2c..ad9120f65b 100644 --- a/ide/sourcesyneditor.pas +++ b/ide/sourcesyneditor.pas @@ -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;