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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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