SynEdit: Replace TextDrawer.RegisterOnFontChangeHandler with SynEdit.RegisterStatusChangedHandler(... scFontOrStyleChanged)

This commit is contained in:
Martin 2025-04-06 17:47:26 +02:00
parent fc053b01ee
commit 7ea532fc16
7 changed files with 32 additions and 37 deletions

View File

@ -10,7 +10,7 @@ interface
uses
windows, imm, LazSynIMMBase, Classes, SysUtils, Controls, LazLoggerBase, LCLType, LazUTF8,
Graphics, SynEditMiscClasses, SynTextDrawer, SynEditPointClasses, SynEditMarkupSelection,
Graphics, SynEditMiscClasses, SynEditPointClasses, SynEditMarkupSelection,
SynEditMarkup, SynEditTypes, SynEditKeyCmds, LazSynEditText, SynEditTextBase,
LazEditTextAttributes;
@ -29,12 +29,10 @@ type
private
FImeBlockSelection: TSynEditSelection;
FImeWinX, FImeWinY: Integer;
FTextDrawer: TheTextDrawer;
procedure SetTextDrawer(AValue: TheTextDrawer);
procedure UpdateImeWinXY(aX, aY: Integer; aImc: HIMC = 0; aForce: Boolean = False);
procedure UpdateImeWinFont(aImc: HIMC = 0);
procedure DoStatusChanged(Sender: TObject; Changes: TSynStatusChanges);
procedure DoDrawerFontChanged(Sender: TObject);
procedure DoDrawerFontChanged;
procedure DoOnCommand(Sender: TObject; AfterProcessing: boolean; var Handled: boolean;
var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer;
HandlerData: pointer);
@ -48,7 +46,6 @@ type
procedure WMImeStartComposition(var Msg: TMessage); override;
procedure WMImeEndComposition(var Msg: TMessage); override;
procedure FocusKilled; override;
property TextDrawer: TheTextDrawer read FTextDrawer write SetTextDrawer;
end;
{ LazSynImeFull }
@ -118,12 +115,17 @@ end;
procedure LazSynImeSimple.DoStatusChanged(Sender: TObject; Changes: TSynStatusChanges);
begin
if scFontOrStyleChanged in Changes then begin
DoDrawerFontChanged;
if Changes = [scFontOrStyleChanged] then exit;
end;
UpdateImeWinXY(FriendEdit.CaretXPix, FriendEdit.CaretYPix);
if Changes * [scCaretX, scCaretY] <> [] then
StopIme(False);
end;
procedure LazSynImeSimple.DoDrawerFontChanged(Sender: TObject);
procedure LazSynImeSimple.DoDrawerFontChanged;
var
imc: HIMC;
begin
@ -173,16 +175,6 @@ begin
end;
end;
procedure LazSynImeSimple.SEtTextDrawer(AValue: TheTextDrawer);
begin
if FTextDrawer = AValue then Exit;
if FTextDrawer <> nil then
FTextDrawer.UnRegisterOnFontChangeHandler(@DoDrawerFontChanged);
FTextDrawer := AValue;
if FTextDrawer <> nil then
FTextDrawer.RegisterOnFontChangeHandler(@DoDrawerFontChanged);
end;
procedure LazSynImeSimple.UpdateImeWinFont(aImc: HIMC);
var
imc: HIMC;
@ -207,14 +199,13 @@ begin
FImeBlockSelection := TSynEditSelection.Create(ViewedTextBuffer, False);
FImeBlockSelection.InvalidateLinesMethod := @InvalidateLines;
FriendEdit.RegisterStatusChangedHandler(@DoStatusChanged, [scCaretX, scCaretY, scLeftChar, scTopLine, scModified]);
FriendEdit.RegisterStatusChangedHandler(@DoStatusChanged, [scCaretX, scCaretY, scLeftChar, scTopLine, scModified, scFontOrStyleChanged]);
FriendEdit.RegisterCommandHandler(@DoOnCommand, nil, [hcfInit]);
FriendEdit.RegisterBeforeMouseDownHandler(@DoOnMouse);
end;
destructor LazSynImeSimple.Destroy;
begin
TextDrawer := nil;
FreeAndNil(FImeBlockSelection);
FriendEdit.UnregisterBeforeMouseDownHandler(@DoOnMouse);
FriendEdit.UnregisterCommandHandler(@DoOnCommand);

View File

@ -150,7 +150,7 @@ type
procedure SetLeftChar(AValue: Integer);
procedure SetPadding(Side: TLazSynBorderSide; AValue: integer);
procedure SetTopLine(AValue: TLinePos);
procedure DoDrawerFontChanged(Sender: TObject);
procedure DoDrawerFontChanged(Sender: TObject; Changes: TSynStatusChanges);
protected
procedure BoundsChanged; override;
procedure DoPaint(ACanvas: TCanvas; AClip: TRect); override;
@ -158,7 +158,7 @@ type
FirstCol, LastCol: integer); virtual;
property Canvas: TCanvas read FCanvas;
public
constructor Create(AOwner: TWinControl; ATextDrawer: TheTextDrawer);
constructor Create(AOwner: TSynEditBase; ATextDrawer: TheTextDrawer);
destructor Destroy; override;
procedure Assign(Src: TLazSynSurface); override;
procedure InvalidateLines(FirstTextLine, LastTextLine: TLineIdx; AScreenLineOffset: Integer = 0); override;
@ -245,7 +245,7 @@ type
procedure DoDisplayViewChanged; override;
procedure BoundsChanged; override;
public
constructor Create(AOwner: TWinControl);
constructor Create(AOwner: TSynEditBase);
procedure InvalidateLines(FirstTextLine, LastTextLine: TLineIdx; AScreenLineOffset: Integer = 0); override;
procedure InvalidateTextLines(FirstTextLine, LastTextLine: TLineIdx; AScreenLineOffset: Integer = 0); virtual;
procedure InvalidateGutterLines(FirstTextLine, LastTextLine: TLineIdx; AScreenLineOffset: Integer = 0); virtual;
@ -1304,7 +1304,7 @@ begin
FRightGutterArea.SetBounds(Top, r, Bottom, Right);
end;
constructor TLazSynSurfaceManager.Create(AOwner: TWinControl);
constructor TLazSynSurfaceManager.Create(AOwner: TSynEditBase);
begin
inherited Create(AOwner);
FLeftGutterWidth := 0;
@ -1405,7 +1405,7 @@ begin
FTopLine := AValue;
end;
procedure TLazSynTextArea.DoDrawerFontChanged(Sender: TObject);
procedure TLazSynTextArea.DoDrawerFontChanged(Sender: TObject; Changes: TSynStatusChanges);
begin
FontChanged;
end;
@ -1424,7 +1424,7 @@ begin
Result := FTextBounds.Left + (Col - LeftChar) * fCharWidth;
end;
function TLazSynTextArea.RowColumnToPixels(const RowCol: TScreenPoint): TPoint;
function TLazSynTextArea.RowColumnToPixels(const RowCol: TScreenPoint_0): TPoint;
begin
// Inludes LeftChar, but not Topline
Result.X := FTextBounds.Left + (RowCol.X - LeftChar) * CharWidth;
@ -1453,7 +1453,7 @@ begin
if Result.Y < 0 then Result.Y := 0;
end;
constructor TLazSynTextArea.Create(AOwner: TWinControl; ATextDrawer: TheTextDrawer);
constructor TLazSynTextArea.Create(AOwner: TSynEditBase; ATextDrawer: TheTextDrawer);
var
i: TLazSynBorderSide;
begin
@ -1461,7 +1461,8 @@ begin
FTextSizeChangeList := TMethodList.Create;
FTokenBreaker := TLazSynPaintTokenBreaker.Create;
FTextDrawer := ATextDrawer;
FTextDrawer.RegisterOnFontChangeHandler(@DoDrawerFontChanged);
Owner.RegisterStatusChangedHandler(@DoDrawerFontChanged, [scFontOrStyleChanged]);
FPaintLineColor := TSynSelectedColor.Create;
FPaintLineColor2 := TSynSelectedColor.Create;
for i := low(TLazSynBorderSide) to high(TLazSynBorderSide) do
@ -1477,7 +1478,7 @@ end;
destructor TLazSynTextArea.Destroy;
begin
FreeAndNil(FTokenBreaker);
FTextDrawer.UnRegisterOnFontChangeHandler(@DoDrawerFontChanged);
Owner.UnRegisterStatusChangedHandler(@DoDrawerFontChanged);
FreeAndNil(FPaintLineColor);
FreeAndNil(FPaintLineColor2);
FreeAndNil(FTextSizeChangeList);

View File

@ -8964,6 +8964,7 @@ begin
for i := 0 to Pred(fHighlighter.AttrCount) do
fTextDrawer.BaseStyle := fHighlighter.Attribute[i].Style;
fTextDrawer.CharExtra := ExtraCharSpacing;
StatusChanged([scFontOrStyleChanged]); // Font or Spacing
FLines.IsUtf8 := True;
finally

View File

@ -558,7 +558,7 @@ type
FBounds: TRect;
FBoundsChangeList: TMethodList;
FDisplayView: TLazSynDisplayView;
FOwner: TWinControl;
FOwner: TSynEditBase;
function GetHandle: HWND;
procedure SetDisplayView(AValue: TLazSynDisplayView);
protected
@ -566,8 +566,9 @@ type
procedure DoPaint(ACanvas: TCanvas; AClip: TRect); virtual; abstract;
procedure DoDisplayViewChanged; virtual;
property Handle: HWND read GetHandle;
property Owner: TSynEditBase read FOwner;
public
constructor Create(AOwner: TWinControl);
constructor Create(AOwner: TSynEditBase);
destructor Destroy; override;
procedure Assign(Src: TLazSynSurface); virtual;
procedure AddBoundsChangeHandler(AHandler: TNotifyEvent);
@ -1561,7 +1562,7 @@ begin
//
end;
constructor TLazSynSurface.Create(AOwner: TWinControl);
constructor TLazSynSurface.Create(AOwner: TSynEditBase);
begin
FOwner := AOwner;
FBoundsChangeList := TMethodList.Create;

View File

@ -118,6 +118,7 @@ type
scInsertMode, scModified, scSelection, scReadOnly,
scFocus, // received or lost focus
scHandleCreated, // handle created
scFontOrStyleChanged,
scOptions // some Options were changed (only triggered by some optinos)
);
TSynStatusChanges = set of TSynStatusChange;

View File

@ -46,7 +46,7 @@ type
function PreferedWidthAtCurrentPPI: Integer; override;
procedure LineCountChanged(Sender: TSynEditStrings; AIndex, ACount: Integer);
procedure BufferChanged(Sender: TObject);
procedure FontChanged(Sender: TObject);
procedure FontChanged(Sender: TObject; Changes: TSynStatusChanges);
procedure SetAutoSize(const AValue : boolean); override;
procedure SetVisible(const AValue: boolean); override;
function CreateMouseActions: TSynEditMouseInternalActions; override;
@ -88,14 +88,14 @@ begin
FTextDrawer := Gutter.TextDrawer;
ViewedTextBuffer.AddChangeHandler(senrLineCount, @LineCountChanged);
ViewedTextBuffer.AddNotifyHandler(senrTextBufferChanged, @BufferChanged);
FTextDrawer.RegisterOnFontChangeHandler(@FontChanged);
FriendEdit.RegisterStatusChangedHandler(@FontChanged, [scFontOrStyleChanged]);
LineCountchanged(nil, 0, 0);
end;
destructor TSynGutterLineNumber.Destroy;
begin
ViewedTextBuffer.RemoveHandlers(self);
FTextDrawer.UnRegisterOnFontChangeHandler(@FontChanged);
FriendEdit.UnRegisterStatusChangedHandler(@FontChanged);
inherited Destroy;
end;
@ -208,7 +208,7 @@ begin
LineCountChanged(nil, 0, 0);
end;
procedure TSynGutterLineNumber.FontChanged(Sender: TObject);
procedure TSynGutterLineNumber.FontChanged(Sender: TObject; Changes: TSynStatusChanges);
begin
DoAutoSize;
end;

View File

@ -133,7 +133,7 @@ type
procedure DoDisplayViewChanged; override;
procedure BoundsChanged; override;
public
constructor Create(AOwner: TWinControl; AnOriginalManager: TLazSynSurfaceManager);
constructor Create(AOwner: TSynEditBase; AnOriginalManager: TLazSynSurfaceManager);
destructor Destroy; override;
procedure InvalidateLines(FirstTextLine, LastTextLine: TLineIdx; AScreenLineOffset: Integer = 0); override;
procedure InvalidateTextLines(FirstTextLine, LastTextLine: TLineIdx; AScreenLineOffset: Integer = 0); override;
@ -1519,7 +1519,8 @@ begin
FOriginalManager.SetBounds(t, Left, Bottom, Right);
end;
constructor TSourceLazSynSurfaceManager.Create(AOwner: TWinControl; AnOriginalManager: TLazSynSurfaceManager);
constructor TSourceLazSynSurfaceManager.Create(AOwner: TSynEditBase;
AnOriginalManager: TLazSynSurfaceManager);
var
txt: TLazSynTextArea;
lgutter, rgutter: TLazSynGutterArea;
@ -2138,7 +2139,6 @@ var
begin
if ImeHandler is LazSynImeSimple then exit;
Ime := LazSynImeSimple.Create(Self);
LazSynImeSimple(Ime).TextDrawer := TextDrawer;
Ime.InvalidateLinesMethod := @InvalidateLines;
ImeHandler := Ime;
end;