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}
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;

View File

@ -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;

View File

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