codetools: handlerlist for treetoolchanged

git-svn-id: trunk@33555 -
This commit is contained in:
mattias 2011-11-16 06:52:13 +00:00
parent be7664ee49
commit f05fbd0a1f
3 changed files with 61 additions and 5 deletions

View File

@ -40,7 +40,7 @@ uses
{$IFDEF MEM_CHECK} {$IFDEF MEM_CHECK}
MemCheck, MemCheck,
{$ENDIF} {$ENDIF}
Classes, SysUtils, contnrs, TypInfo, FileProcs, BasicCodeTools, Classes, SysUtils, contnrs, LazMethodList, TypInfo, FileProcs, BasicCodeTools,
CodeToolsStrConsts, CodeToolsStrConsts,
LazFileCache, LazFileCache,
EventCodeTool, CodeTree, CodeAtom, SourceChanger, DefineTemplates, CodeCache, EventCodeTool, CodeTree, CodeAtom, SourceChanger, DefineTemplates, CodeCache,
@ -71,6 +71,12 @@ type
ECodeToolManagerError = class(Exception); ECodeToolManagerError = class(Exception);
TCodeToolManagerHandler = (
ctmOnToolTreeChanging
);
TCodeToolManagerHandlers = set of TCodeToolManagerHandler;
TOnToolTreeChanging = TCodeTreeChangeEvent;
{ TCodeToolManager } { TCodeToolManager }
TCodeToolManager = class(TPersistent) TCodeToolManager = class(TPersistent)
@ -114,6 +120,7 @@ type
FWriteExceptions: boolean; FWriteExceptions: boolean;
FWriteLockCount: integer;// Set/Unset counter FWriteLockCount: integer;// Set/Unset counter
FWriteLockStep: integer; // current write lock ID FWriteLockStep: integer; // current write lock ID
FHandlers: array[TCodeToolManagerHandler] of TMethodList;
function OnScannerGetInitValues(Code: Pointer; function OnScannerGetInitValues(Code: Pointer;
out AChangeStep: integer): TExpressionEvaluator; out AChangeStep: integer): TExpressionEvaluator;
procedure OnDefineTreeReadValue(Sender: TObject; const VariableName: string; procedure OnDefineTreeReadValue(Sender: TObject; const VariableName: string;
@ -166,6 +173,8 @@ type
const UnitSet, AnUnitName: string): string; const UnitSet, AnUnitName: string): string;
procedure DirectoryCachePoolIterateFPCUnitsFromSet(const UnitSet: string; procedure DirectoryCachePoolIterateFPCUnitsFromSet(const UnitSet: string;
const Iterate: TCTOnIterateFile); const Iterate: TCTOnIterateFile);
procedure AddHandler(HandlerType: TCodeToolManagerHandler; const Handler: TMethod);
procedure RemoveHandler(HandlerType: TCodeToolManagerHandler; const Handler: TMethod);
public public
DefinePool: TDefinePool; // definition templates (rules) DefinePool: TDefinePool; // definition templates (rules)
DefineTree: TDefineTree; // cache for defines (e.g. initial compiler values) 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 CodeNodeTreeChangeStep: integer read FCodeNodeTreeChangeStep;// nodes altered, added, deleted
property CodeTreeNodesDeletedStep: integer read FCodeTreeNodesDeletedStep;// nodes deleted property CodeTreeNodesDeletedStep: integer read FCodeTreeNodesDeletedStep;// nodes deleted
procedure GetCodeTreeNodesDeletedStep(out NodesDeletedStep: integer);// use this for events procedure GetCodeTreeNodesDeletedStep(out NodesDeletedStep: integer);// use this for events
procedure AddHandlerToolTreeChanging(const OnToolTreeChanging: TOnToolTreeChanging);
procedure RemoveHandlerToolTreeChanging(const OnToolTreeChanging: TOnToolTreeChanging);
// file handling // file handling
property SourceExtensions: string property SourceExtensions: string
@ -929,6 +940,8 @@ begin
end; end;
destructor TCodeToolManager.Destroy; destructor TCodeToolManager.Destroy;
var
e: TCodeToolManagerHandler;
begin begin
{$IFDEF CTDEBUG} {$IFDEF CTDEBUG}
DebugLn('[TCodeToolManager.Destroy] A'); DebugLn('[TCodeToolManager.Destroy] A');
@ -969,6 +982,8 @@ begin
OnFileAgeCached:=nil; OnFileAgeCached:=nil;
FreeAndNil(DirectoryCachePool); FreeAndNil(DirectoryCachePool);
FreeAndNil(FPCDefinesCache); FreeAndNil(FPCDefinesCache);
for e:=low(FHandlers) to high(FHandlers) do
FreeAndNil(FHandlers[e]);
{$IFDEF CTDEBUG} {$IFDEF CTDEBUG}
DebugLn('[TCodeToolManager.Destroy] F'); DebugLn('[TCodeToolManager.Destroy] F');
{$ENDIF} {$ENDIF}
@ -5217,6 +5232,8 @@ end;
procedure TCodeToolManager.OnToolTreeChange(Tool: TCustomCodeTool; procedure TCodeToolManager.OnToolTreeChange(Tool: TCustomCodeTool;
NodesDeleting: boolean); NodesDeleting: boolean);
var
i: Integer;
begin begin
CTIncreaseChangeStamp(FCodeNodeTreeChangeStep); CTIncreaseChangeStamp(FCodeNodeTreeChangeStep);
if NodesDeleting then begin if NodesDeleting then begin
@ -5224,7 +5241,10 @@ begin
// Note: IdentifierList nodes do not need to be cleared, because Node // Note: IdentifierList nodes do not need to be cleared, because Node
// is accessed via GetNode, which checks if nodes were deleted // is accessed via GetNode, which checks if nodes were deleted
end; end;
//debugln(['TCodeToolManager.OnToolTreeChange ',FHandlers[ctmOnToolTreeChanging].Count]);
i:=FHandlers[ctmOnToolTreeChanging].Count;
while FHandlers[ctmOnToolTreeChanging].NextDownIndex(i) do
TOnToolTreeChanging(FHandlers[ctmOnToolTreeChanging][i])(Tool,NodesDeleting);
end; end;
function TCodeToolManager.OnScannerProgress(Sender: TLinkScanner): boolean; function TCodeToolManager.OnScannerProgress(Sender: TLinkScanner): boolean;
@ -5571,6 +5591,18 @@ begin
NodesDeletedStep:=FCodeTreeNodesDeletedStep; NodesDeletedStep:=FCodeTreeNodesDeletedStep;
end; 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; function TCodeToolManager.GetResourceTool: TResourceCodeTool;
begin begin
if FResourceTool=nil then FResourceTool:=TResourceCodeTool.Create; if FResourceTool=nil then FResourceTool:=TResourceCodeTool.Create;
@ -5707,6 +5739,21 @@ begin
end; end;
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); procedure TCodeToolManager.OnToolSetWriteLock(Lock: boolean);
begin begin
if Lock then ActivateWriteLock else DeactivateWriteLock; if Lock then ActivateWriteLock else DeactivateWriteLock;

View File

@ -30,14 +30,16 @@ unit CodyIdentifiersDlg;
interface interface
uses uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, FileUtil, LResources, LCLProc, Forms, Controls, Graphics,
ButtonPanel, StdCtrls, CodeToolManager, UnitDictionary; Dialogs, ButtonPanel, StdCtrls, CustomCodeTool, CodeToolManager, UnitDictionary;
type type
{ TCodyUnitDictionary } { TCodyUnitDictionary }
TCodyUnitDictionary = class(TUnitDictionary) TCodyUnitDictionary = class(TUnitDictionary)
private
procedure ToolTreeChanged(Tool: TCustomCodeTool; {%H-}NodesDeleting: boolean);
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -83,10 +85,16 @@ end;
{ TCodyUnitDictionary } { TCodyUnitDictionary }
procedure TCodyUnitDictionary.ToolTreeChanged(Tool: TCustomCodeTool;
NodesDeleting: boolean);
begin
//debugln(['TCodyUnitDictionary.ToolTreeChanged ',Tool.MainFilename]);
end;
constructor TCodyUnitDictionary.Create; constructor TCodyUnitDictionary.Create;
begin begin
inherited Create; inherited Create;
CodeToolBoss.AddHandlerToolTreeChanging(@ToolTreeChanged);
end; end;
destructor TCodyUnitDictionary.Destroy; destructor TCodyUnitDictionary.Destroy;

View File

@ -774,6 +774,7 @@ begin
{$ENDIF} {$ENDIF}
ScanTill:=lsrEnd; ScanTill:=lsrEnd;
CloseUnfinishedNodes; CloseUnfinishedNodes;
IncreaseTreeChangeStep(false);
end; end;
except except
{$IFDEF ShowIgnoreErrorAfter} {$IFDEF ShowIgnoreErrorAfter}