SynEdit: Token Attributes (TSynSelectedColor), move StartX and EndX to base class

This commit is contained in:
Martin 2025-04-05 10:58:19 +02:00
parent 9b0070e05e
commit 5abe12a280
3 changed files with 58 additions and 69 deletions

View File

@ -25,6 +25,14 @@ uses
Classes, SysUtils, Graphics;
type
TLazEditDisplayTokenBound = record
Physical: Integer; // 1 based - May be in middle of char
Logical: Integer; // 1 based
Offset: Integer; // default 0. MultiWidth (e.g. Tab), if token starts in the middle of char
end;
//TLazTextAttributeFeature = (
// lafForeColor, lafBackColor,
// lafFrameColor,
@ -60,6 +68,9 @@ type
protected type
TLazTextAttributeColor = (lacForeColor, lacBackColor, lacFrameColor);
private
// 0 or -1 start/end before/after line // 1 first char
FStartX, FEndX: TLazEditDisplayTokenBound;
FColors: array[TLazTextAttributeColor] of TColor;
FFrameEdges: TLazTextAttrFrameEdges;
FFrameStyle: TLazTextAttrLineStyle;
@ -103,6 +114,11 @@ type
procedure EndUpdate;
function IsEnabled: boolean; virtual;
procedure SetAllPriorities(APriority: integer); virtual;
// boundaries of the frame
procedure SetFrameBoundsPhys(AStart, AEnd: Integer);
procedure SetFrameBoundsLog(AStart, AEnd: Integer; AStartOffs: Integer = 0; AEndOffs: Integer = 0);
property StartX: TLazEditDisplayTokenBound read FStartX write FStartX;
property EndX: TLazEditDisplayTokenBound read FEndX write FEndX;
public
property Foreground: TColor index lacForeColor read GetColor write SetColor;
property Background: TColor index lacBackColor read GetColor write SetColor;
@ -383,6 +399,13 @@ begin
FFrameEdges := sfeAround;
FFrameStyle := slsSolid;
FStyle := [];
FStartX.Physical := -1;
FEndX.Physical := -1;
FStartX.Logical := -1;
FEndX.Logical := -1;
FStartX.Offset := 0;
FEndX.Offset := 0;
end;
procedure TLazCustomEditTextAttribute.AssignFrom(ASource: TLazCustomEditTextAttribute);
@ -391,6 +414,9 @@ begin
FFrameEdges := ASource.FFrameEdges;
FFrameStyle := ASource.FFrameStyle;
FStyle := ASource.FStyle;
FStartX := ASource.FStartX;
FEndX := ASource.FEndX;
end;
constructor TLazCustomEditTextAttribute.Create;
@ -453,6 +479,27 @@ begin
//raise exception.Create('abstract');
end;
procedure TLazCustomEditTextAttribute.SetFrameBoundsPhys(AStart, AEnd: Integer);
begin
FStartX.Physical := AStart;
FEndX.Physical := AEnd;
FStartX.Logical := -1;
FEndX.Logical := -1;
FStartX.Offset := 0;
FEndX.Offset := 0;
end;
procedure TLazCustomEditTextAttribute.SetFrameBoundsLog(AStart, AEnd: Integer;
AStartOffs: Integer; AEndOffs: Integer);
begin
FStartX.Physical := -1;
FEndX.Physical := -1;
FStartX.Logical := AStart;
FEndX.Logical := AEnd;
FStartX.Offset := AStartOffs;
FEndX.Offset := AEndOffs;
end;
{ TLazEditTextAttribute }
function TLazEditTextAttribute.GetPriority(AnIndex: TLazTextAttributeColor): integer;

View File

@ -715,7 +715,7 @@ begin
inherited Create;
FFoldView := AFoldView;
FTokenAttr := TSynHighlighterAttributesModifier.Create(nil);
FMarkupLine := TSynSelectedColorMergeResult.Create(nil);
FMarkupLine := TSynSelectedColorMergeResult.Create;
end;
destructor TLazSynDisplayFold.Destroy;

View File

@ -471,28 +471,13 @@ type
TSynObjectListItemClass = class of TSynObjectListItem;
TLazSynDisplayTokenBound = record
Physical: Integer; // 1 based - May be in middle of char
Logical: Integer; // 1 based
Offset: Integer; // default 0. MultiWidth (e.g. Tab), if token starts in the middle of char
end;
TLazSynDisplayTokenBound = TLazEditDisplayTokenBound;
{ TSynSelectedColor }
TSynSelectedColor = class(TSynHighlighterAttributesModifier)
private
// 0 or -1 start/end before/after line // 1 first char
FStartX, FEndX: TLazSynDisplayTokenBound;
protected
procedure DoClear; override;
procedure AssignFrom(Src: TLazCustomEditTextAttribute); override;
procedure Init; override;
public
// boundaries of the frame
procedure SetFrameBoundsPhys(AStart, AEnd: Integer);
procedure SetFrameBoundsLog(AStart, AEnd: Integer; AStartOffs: Integer = 0; AEndOffs: Integer = 0);
property StartX: TLazSynDisplayTokenBound read FStartX write FStartX;
property EndX: TLazSynDisplayTokenBound read FEndX write FEndX;
end;
TSynSelectedColorAlphaEntry = record
@ -1068,8 +1053,8 @@ begin
if (FCurrentStartX.Logical >= 0) or (FCurrentStartX.Physical >= 0) then
case Side of
bsLeft: if not IsMatching(FCurrentStartX, FStartX) then exit(clNone);
bsRight: if not IsMatching(FCurrentEndX, FEndX) then exit(clNone);
bsLeft: if not IsMatching(FCurrentStartX, StartX) then exit(clNone);
bsRight: if not IsMatching(FCurrentEndX, EndX) then exit(clNone);
end;
if (Side in SynFrameEdgeToSides[FrameEdges])
@ -1095,8 +1080,8 @@ begin
if (FCurrentStartX.Logical >= 0) or (FCurrentStartX.Physical >= 0) then
case Side of
bsLeft: if not IsMatching(FCurrentStartX, FStartX) then exit(0);
bsRight: if not IsMatching(FCurrentEndX, FEndX) then exit(0);
bsLeft: if not IsMatching(FCurrentStartX, StartX) then exit(0);
bsRight: if not IsMatching(FCurrentEndX, EndX) then exit(0);
end;
if (Side in SynFrameEdgeToSides[FrameEdges])
@ -1118,7 +1103,7 @@ procedure TSynSelectedColorMergeResult.SetCurrentEndX(AValue: TLazSynDisplayToke
begin
//if FCurrentEndX = AValue then Exit;
FCurrentEndX := AValue;
if not IsMatching(FCurrentEndX, FEndX) then begin
if not IsMatching(FCurrentEndX, EndX) then begin
FFrameSideColors[bsRight] := clNone;
FMergeInfos[sscFrameRight].BaseColor := clNone;
FMergeInfos[sscFrameRight].AlphaCount := 0;
@ -1129,7 +1114,7 @@ procedure TSynSelectedColorMergeResult.SetCurrentStartX(AValue: TLazSynDisplayTo
begin
//if FCurrentStartX = AValue then Exit;
FCurrentStartX := AValue;
if not IsMatching(FCurrentStartX, FStartX) then begin
if not IsMatching(FCurrentStartX, StartX) then begin
FFrameSideColors[bsLeft] := clNone;
FMergeInfos[sscFrameLeft].BaseColor := clNone;
FMergeInfos[sscFrameLeft].AlphaCount := 0;
@ -1384,7 +1369,7 @@ end;
procedure TSynSelectedColorMergeResult.Merge(Other: TSynHighlighterAttributesModifier);
begin
Merge(Other, FStartX, FEndX); // always merge frame
Merge(Other, StartX, EndX); // always merge frame
end;
procedure TSynSelectedColorMergeResult.Merge(Other: TSynHighlighterAttributesModifier; LeftCol,
@ -1460,9 +1445,9 @@ procedure TSynSelectedColorMergeResult.MergeFrames(Other: TSynHighlighterAttribu
// FFrameSidePriority[ASide] := ASrc.FramePriority;
// FFrameSideOrigin[ASide] := ASrc.FrameEdges;
// if ASide = bsLeft then
// FStartX := LeftCol; // LeftCol has Phys and log ; // ASrc.FStartX;
// StartX := LeftCol; // LeftCol has Phys and log ; // ASrc.StartX;
// if ASide = bsRight then
// FEndX := RightCol; // ASrc.FEndX;
// EndX := RightCol; // ASrc.EndX;
//end;
procedure SetSide(AInfoSide: TSynSelectedColorEnum; ASide: TLazSynBorderSide;
@ -1527,17 +1512,6 @@ end;
{ TSynSelectedColor }
procedure TSynSelectedColor.AssignFrom(Src: TLazCustomEditTextAttribute);
begin
inherited AssignFrom(Src);
if not (Src is TSynSelectedColor) then exit;
FStartX := TSynSelectedColor(Src).FStartX;
FEndX := TSynSelectedColor(Src).FEndX;
Changed; {TODO: only if really changed}
end;
procedure TSynSelectedColor.Init;
begin
inherited Init;
@ -1549,38 +1523,6 @@ begin
InternalSaveDefaultValues;
end;
procedure TSynSelectedColor.SetFrameBoundsPhys(AStart, AEnd: Integer);
begin
FStartX.Physical := AStart;
FEndX.Physical := AEnd;
FStartX.Logical := -1;
FEndX.Logical := -1;
FStartX.Offset := 0;
FEndX.Offset := 0;
end;
procedure TSynSelectedColor.SetFrameBoundsLog(AStart, AEnd: Integer; AStartOffs: Integer;
AEndOffs: Integer);
begin
FStartX.Physical := -1;
FEndX.Physical := -1;
FStartX.Logical := AStart;
FEndX.Logical := AEnd;
FStartX.Offset := AStartOffs;
FEndX.Offset := AEndOffs;
end;
procedure TSynSelectedColor.DoClear;
begin
inherited;
FStartX.Physical := -1;
FEndX.Physical := -1;
FStartX.Logical := -1;
FEndX.Logical := -1;
FStartX.Offset := 0;
FEndX.Offset := 0;
end;
{ TLazSynSurface }
function TLazSynSurface.GetHandle: HWND;