diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 8e5f871f0f..2353bceb73 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -1892,11 +1892,11 @@ begin fBookMarkOpt.OnChange := {$IFDEF FPC}@{$ENDIF}BookMarkOptionsChanged; FLeftGutter := CreateGutter(self, gsLeft, FTextDrawer); - FLeftGutter.OnChange := {$IFDEF FPC}@{$ENDIF}GutterChanged; - FLeftGutter.OnResize := {$IFDEF FPC}@{$ENDIF}GutterResized; + FLeftGutter.RegisterChangeHandler({$IFDEF FPC}@{$ENDIF}GutterChanged); + FLeftGutter.RegisterResizeHandler({$IFDEF FPC}@{$ENDIF}GutterResized); FRightGutter := CreateGutter(self, gsRight, FTextDrawer); - FRightGutter.OnChange := {$IFDEF FPC}@{$ENDIF}GutterChanged; - FRightGutter.OnResize := {$IFDEF FPC}@{$ENDIF}GutterResized; + FRightGutter.RegisterChangeHandler({$IFDEF FPC}@{$ENDIF}GutterChanged); + FRightGutter.RegisterResizeHandler({$IFDEF FPC}@{$ENDIF}GutterResized); ControlStyle := ControlStyle + [csOpaque, csSetCaption, csTripleClicks, csQuadClicks]; Height := 150; @@ -2210,6 +2210,10 @@ begin FreeAndNil(fPlugins); end; RemoveHandlers; + FLeftGutter.UnRegisterChangeHandler({$IFDEF FPC}@{$ENDIF}GutterChanged); + FLeftGutter.UnRegisterResizeHandler({$IFDEF FPC}@{$ENDIF}GutterResized); + FRightGutter.UnRegisterChangeHandler({$IFDEF FPC}@{$ENDIF}GutterChanged); + FRightGutter.UnRegisterResizeHandler({$IFDEF FPC}@{$ENDIF}GutterResized); FreeAndNil(FHookedKeyTranslationList); fHookedCommandHandlers:=nil; diff --git a/components/synedit/syngutter.pp b/components/synedit/syngutter.pp index e50e98ffe3..7ebc2c07c4 100644 --- a/components/synedit/syngutter.pp +++ b/components/synedit/syngutter.pp @@ -63,6 +63,8 @@ type property Width; property Parts; property MouseActions; + property OnResize; + property OnChange; end; { TSynGutterSeparator } diff --git a/components/synedit/syngutterbase.pp b/components/synedit/syngutterbase.pp index b7fd5340eb..fcf5767e51 100644 --- a/components/synedit/syngutterbase.pp +++ b/components/synedit/syngutterbase.pp @@ -5,7 +5,7 @@ unit SynGutterBase; interface uses - Classes, SysUtils, Graphics, Controls, Menus, math, SynEditMarks, + Classes, SysUtils, Graphics, Controls, Menus, math, LCLProc, SynEditMarks, SynEditMiscClasses, SynTextDrawer, SynEditMouseCmds, SynEditFoldedView; type @@ -38,6 +38,8 @@ type FOnResize: TNotifyEvent; FOnChange: TNotifyEvent; FMouseActions: TSynEditMouseInternalActions; + FOnResizeHandler: TMethodList; + FOnChangeHandler: TMethodList; function GetMouseActions: TSynEditMouseActions; procedure SetAutoSize(const AValue: boolean); @@ -70,6 +72,10 @@ type function MaybeHandleMouseAction(var AnInfo: TSynEditMouseActionInfo; HandleActionProc: TSynEditMouseActionHandler): Boolean; virtual; procedure ResetMouseActions; virtual; // set mouse-actions according to current Options / may clear them + procedure RegisterResizeHandler(AHandler: TNotifyEvent); + procedure UnregisterResizeHandler(AHandler: TNotifyEvent); + procedure RegisterChangeHandler(AHandler: TNotifyEvent); + procedure UnregisterChangeHandler(AHandler: TNotifyEvent); property Left: Integer read FLeft; property Top: Integer read FTop; property Height:Integer read FHeight; @@ -214,12 +220,16 @@ uses SynEdit; constructor TSynGutterBase.Create(AOwner: TSynEditBase; ASide: TSynGutterSide; ATextDrawer: TheTextDrawer); begin + FOnResizeHandler := TMethodList.Create; + FOnChangeHandler := TMethodList.Create; + inherited Create; FSide := ASide; FSynEdit := AOwner; CreatePartList; FMouseActions := CreateMouseActions; + FInDoChange := False; FChangeLock := 0; FTextDrawer := ATextDrawer; @@ -237,6 +247,8 @@ begin FOnResize := nil; FreeAndNil(FGutterPartList); FreeAndNil(FMouseActions); + FreeAndNil(FOnChangeHandler); + FreeAndNil(FOnResizeHandler); inherited Destroy; end; @@ -306,6 +318,26 @@ begin FMouseActions.ResetUserActions; end; +procedure TSynGutterBase.RegisterResizeHandler(AHandler: TNotifyEvent); +begin + FOnResizeHandler.Add(TMethod(AHandler)); +end; + +procedure TSynGutterBase.UnregisterResizeHandler(AHandler: TNotifyEvent); +begin + FOnResizeHandler.Remove(TMethod(AHandler)); +end; + +procedure TSynGutterBase.RegisterChangeHandler(AHandler: TNotifyEvent); +begin + FOnChangeHandler.Add(TMethod(AHandler)); +end; + +procedure TSynGutterBase.UnregisterChangeHandler(AHandler: TNotifyEvent); +begin + FOnChangeHandler.Remove(TMethod(AHandler)); +end; + procedure TSynGutterBase.SetColor(const Value: TColor); begin if FColor <> Value then @@ -430,6 +462,7 @@ begin FInDoChange := False; end; end; + FOnChangeHandler.CallNotifyEvents(Self); if Assigned(FOnChange) then FOnChange(Self); end; @@ -441,6 +474,7 @@ begin exit; end; FNeedOnResize := False; + FOnResizeHandler.CallNotifyEvents(Self); if Assigned(FOnResize) then FOnResize(Self) else