diff --git a/components/codetools/codetoolmanager.pas b/components/codetools/codetoolmanager.pas index 4578238d2d..c948880ce8 100644 --- a/components/codetools/codetoolmanager.pas +++ b/components/codetools/codetoolmanager.pas @@ -40,7 +40,7 @@ uses {$IFDEF MEM_CHECK} MemCheck, {$ENDIF} - Classes, SysUtils, contnrs, TypInfo, FileProcs, BasicCodeTools, + Classes, SysUtils, contnrs, LazMethodList, TypInfo, FileProcs, BasicCodeTools, CodeToolsStrConsts, LazFileCache, EventCodeTool, CodeTree, CodeAtom, SourceChanger, DefineTemplates, CodeCache, @@ -71,6 +71,12 @@ type ECodeToolManagerError = class(Exception); + TCodeToolManagerHandler = ( + ctmOnToolTreeChanging + ); + TCodeToolManagerHandlers = set of TCodeToolManagerHandler; + TOnToolTreeChanging = TCodeTreeChangeEvent; + { TCodeToolManager } TCodeToolManager = class(TPersistent) @@ -114,6 +120,7 @@ type FWriteExceptions: boolean; FWriteLockCount: integer;// Set/Unset counter FWriteLockStep: integer; // current write lock ID + FHandlers: array[TCodeToolManagerHandler] of TMethodList; function OnScannerGetInitValues(Code: Pointer; out AChangeStep: integer): TExpressionEvaluator; procedure OnDefineTreeReadValue(Sender: TObject; const VariableName: string; @@ -166,6 +173,8 @@ type const UnitSet, AnUnitName: string): string; procedure DirectoryCachePoolIterateFPCUnitsFromSet(const UnitSet: string; const Iterate: TCTOnIterateFile); + procedure AddHandler(HandlerType: TCodeToolManagerHandler; const Handler: TMethod); + procedure RemoveHandler(HandlerType: TCodeToolManagerHandler; const Handler: TMethod); public DefinePool: TDefinePool; // definition templates (rules) DefineTree: TDefineTree; // cache for defines (e.g. initial compiler values) @@ -193,6 +202,8 @@ type property CodeNodeTreeChangeStep: integer read FCodeNodeTreeChangeStep;// nodes altered, added, deleted property CodeTreeNodesDeletedStep: integer read FCodeTreeNodesDeletedStep;// nodes deleted procedure GetCodeTreeNodesDeletedStep(out NodesDeletedStep: integer);// use this for events + procedure AddHandlerToolTreeChanging(const OnToolTreeChanging: TOnToolTreeChanging); + procedure RemoveHandlerToolTreeChanging(const OnToolTreeChanging: TOnToolTreeChanging); // file handling property SourceExtensions: string @@ -929,6 +940,8 @@ begin end; destructor TCodeToolManager.Destroy; +var + e: TCodeToolManagerHandler; begin {$IFDEF CTDEBUG} DebugLn('[TCodeToolManager.Destroy] A'); @@ -969,6 +982,8 @@ begin OnFileAgeCached:=nil; FreeAndNil(DirectoryCachePool); FreeAndNil(FPCDefinesCache); + for e:=low(FHandlers) to high(FHandlers) do + FreeAndNil(FHandlers[e]); {$IFDEF CTDEBUG} DebugLn('[TCodeToolManager.Destroy] F'); {$ENDIF} @@ -5217,6 +5232,8 @@ end; procedure TCodeToolManager.OnToolTreeChange(Tool: TCustomCodeTool; NodesDeleting: boolean); +var + i: Integer; begin CTIncreaseChangeStamp(FCodeNodeTreeChangeStep); if NodesDeleting then begin @@ -5224,7 +5241,10 @@ begin // Note: IdentifierList nodes do not need to be cleared, because Node // is accessed via GetNode, which checks if nodes were deleted end; - + //debugln(['TCodeToolManager.OnToolTreeChange ',FHandlers[ctmOnToolTreeChanging].Count]); + i:=FHandlers[ctmOnToolTreeChanging].Count; + while FHandlers[ctmOnToolTreeChanging].NextDownIndex(i) do + TOnToolTreeChanging(FHandlers[ctmOnToolTreeChanging][i])(Tool,NodesDeleting); end; function TCodeToolManager.OnScannerProgress(Sender: TLinkScanner): boolean; @@ -5571,6 +5591,18 @@ begin NodesDeletedStep:=FCodeTreeNodesDeletedStep; end; +procedure TCodeToolManager.AddHandlerToolTreeChanging( + const OnToolTreeChanging: TOnToolTreeChanging); +begin + AddHandler(ctmOnToolTreeChanging,TMethod(OnToolTreeChanging)); +end; + +procedure TCodeToolManager.RemoveHandlerToolTreeChanging( + const OnToolTreeChanging: TOnToolTreeChanging); +begin + RemoveHandler(ctmOnToolTreeChanging,TMethod(OnToolTreeChanging)); +end; + function TCodeToolManager.GetResourceTool: TResourceCodeTool; begin if FResourceTool=nil then FResourceTool:=TResourceCodeTool.Create; @@ -5707,6 +5739,21 @@ begin end; end; +procedure TCodeToolManager.AddHandler(HandlerType: TCodeToolManagerHandler; + const Handler: TMethod); +begin + if Handler.Code=nil then RaiseCatchableException('TCodeToolManager.AddHandler'); + if FHandlers[HandlerType]=nil then + FHandlers[HandlerType]:=TMethodList.Create; + FHandlers[HandlerType].Add(Handler); +end; + +procedure TCodeToolManager.RemoveHandler(HandlerType: TCodeToolManagerHandler; + const Handler: TMethod); +begin + FHandlers[HandlerType].Remove(Handler); +end; + procedure TCodeToolManager.OnToolSetWriteLock(Lock: boolean); begin if Lock then ActivateWriteLock else DeactivateWriteLock; diff --git a/components/codetools/ide/codyidentifiersdlg.pas b/components/codetools/ide/codyidentifiersdlg.pas index 704e13b4ac..c2f0d08e83 100644 --- a/components/codetools/ide/codyidentifiersdlg.pas +++ b/components/codetools/ide/codyidentifiersdlg.pas @@ -30,14 +30,16 @@ unit CodyIdentifiersDlg; interface uses - Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, - ButtonPanel, StdCtrls, CodeToolManager, UnitDictionary; + Classes, SysUtils, FileUtil, LResources, LCLProc, Forms, Controls, Graphics, + Dialogs, ButtonPanel, StdCtrls, CustomCodeTool, CodeToolManager, UnitDictionary; type { TCodyUnitDictionary } TCodyUnitDictionary = class(TUnitDictionary) + private + procedure ToolTreeChanged(Tool: TCustomCodeTool; {%H-}NodesDeleting: boolean); public constructor Create; destructor Destroy; override; @@ -83,10 +85,16 @@ end; { TCodyUnitDictionary } +procedure TCodyUnitDictionary.ToolTreeChanged(Tool: TCustomCodeTool; + NodesDeleting: boolean); +begin + //debugln(['TCodyUnitDictionary.ToolTreeChanged ',Tool.MainFilename]); +end; + constructor TCodyUnitDictionary.Create; begin inherited Create; - + CodeToolBoss.AddHandlerToolTreeChanging(@ToolTreeChanged); end; destructor TCodyUnitDictionary.Destroy; diff --git a/components/codetools/pascalparsertool.pas b/components/codetools/pascalparsertool.pas index da4962275f..949fb262f6 100644 --- a/components/codetools/pascalparsertool.pas +++ b/components/codetools/pascalparsertool.pas @@ -774,6 +774,7 @@ begin {$ENDIF} ScanTill:=lsrEnd; CloseUnfinishedNodes; + IncreaseTreeChangeStep(false); end; except {$IFDEF ShowIgnoreErrorAfter}