cody: unit deps: refresh

git-svn-id: trunk@41766 -
This commit is contained in:
mattias 2013-06-18 21:13:42 +00:00
parent d7ba1292a3
commit 7d743aacab
3 changed files with 71 additions and 22 deletions

View File

@ -102,12 +102,12 @@ end;
constructor TUGGroups.Create(Graph: TUsesGraph); constructor TUGGroups.Create(Graph: TUsesGraph);
begin begin
FGroups:=TAVLTree.Create(@CompareUGGroupNames);
if (not Graph.UnitClass.InheritsFrom(TUGGroup)) if (not Graph.UnitClass.InheritsFrom(TUGGroup))
and ((Graph.FilesTree.Count>0) or (Graph.QueuedFilesTree.Count>0) and ((Graph.FilesTree.Count>0) or (Graph.QueuedFilesTree.Count>0)
or (Graph.TargetFilesTree.Count>0)) or (Graph.TargetFilesTree.Count>0))
then then
raise Exception.Create('TUGGroups.Create Create TUGGroups before adding units'); raise Exception.Create('TUGGroups.Create You must create TUGGroups before adding units');
FGroups:=TAVLTree.Create(@CompareUGGroupNames);
Graph.UnitClass:=TUGGroupUnit; Graph.UnitClass:=TUGGroupUnit;
end; end;
@ -120,6 +120,7 @@ end;
procedure TUGGroups.Clear; procedure TUGGroups.Clear;
begin begin
if FGroups=nil then exit;
fClearing:=true; fClearing:=true;
try try
FGroups.FreeAndClear; FGroups.FreeAndClear;

View File

@ -373,6 +373,7 @@ object UnitDependenciesWindow: TUnitDependenciesWindow
AutoSize = True AutoSize = True
BorderSpacing.Around = 2 BorderSpacing.Around = 2
Caption = 'RefreshButton' Caption = 'RefreshButton'
OnClick = RefreshButtonClick
TabOrder = 1 TabOrder = 1
end end
object StatsLabel: TLabel object StatsLabel: TLabel

View File

@ -24,7 +24,6 @@
IDE Window showing dependencies of units and packages. IDE Window showing dependencies of units and packages.
ToDo: ToDo:
- add refresh button to rescan
- delay update pages when not visible - delay update pages when not visible
- update pages when becoming visible - update pages when becoming visible
- additional files as start units - additional files as start units
@ -145,6 +144,7 @@ type
procedure AllUnitsSearchPrevSpeedButtonClick(Sender: TObject); procedure AllUnitsSearchPrevSpeedButtonClick(Sender: TObject);
procedure AllUnitsShowDirsSpeedButtonClick(Sender: TObject); procedure AllUnitsShowDirsSpeedButtonClick(Sender: TObject);
procedure AllUnitsShowGroupNodesSpeedButtonClick(Sender: TObject); procedure AllUnitsShowGroupNodesSpeedButtonClick(Sender: TObject);
procedure RefreshButtonClick(Sender: TObject);
procedure UnitsTreeViewShowHint(Sender: TObject; HintInfo: PHintInfo); procedure UnitsTreeViewShowHint(Sender: TObject; HintInfo: PHintInfo);
procedure UnitsTreeViewMouseDown(Sender: TObject; Button: TMouseButton; procedure UnitsTreeViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); Shift: TShiftState; X, Y: Integer);
@ -172,6 +172,9 @@ type
FIdleConnected: boolean; FIdleConnected: boolean;
FUsesGraph: TUsesGraph; FUsesGraph: TUsesGraph;
FGroups: TUGGroups; // referenced by Nodes.Data of GroupsLvlGraph FGroups: TUGGroups; // referenced by Nodes.Data of GroupsLvlGraph
FNewUsesGraph: TUsesGraph; // on idle the units are scanned and this graph
// is filled up, when parsing is complete it becomes the new UsesGraph
FNewGroups: TUGGroups;
FAllUnitsRootUDNode: TUDNode; FAllUnitsRootUDNode: TUDNode;
FSelUnitsRootUDNode: TUDNode; FSelUnitsRootUDNode: TUDNode;
FFlags: TUDWFlags; FFlags: TUDWFlags;
@ -185,6 +188,7 @@ type
function CreateSelUnitsTree: TUDNode; function CreateSelUnitsTree: TUDNode;
procedure CreateTVNodes(TV: TTreeView; procedure CreateTVNodes(TV: TTreeView;
ParentTVNode: TTreeNode; ParentUDNode: TUDNode); ParentTVNode: TTreeNode; ParentUDNode: TUDNode);
procedure FreeUsesGraph;
procedure SelectNextSearchTV(TV: TTreeView; StartTVNode: TTreeNode; procedure SelectNextSearchTV(TV: TTreeView; StartTVNode: TTreeNode;
SearchNext, SkipStart: boolean); SearchNext, SkipStart: boolean);
procedure SetCurrentUnit(AValue: TUGUnit); procedure SetCurrentUnit(AValue: TUGUnit);
@ -194,6 +198,7 @@ type
function CreatePackageGroup(APackage: TIDEPackage): TUGGroup; function CreatePackageGroup(APackage: TIDEPackage): TUGGroup;
procedure CreateFPCSrcGroups; procedure CreateFPCSrcGroups;
procedure GuessGroupOfUnits; procedure GuessGroupOfUnits;
procedure StartParsing;
procedure AddStartAndTargetUnits; procedure AddStartAndTargetUnits;
procedure AddAdditionalFilesAsStartUnits; procedure AddAdditionalFilesAsStartUnits;
procedure SetupGroupsTabSheet; procedure SetupGroupsTabSheet;
@ -322,8 +327,6 @@ procedure TUnitDependenciesWindow.FormCreate(Sender: TObject);
begin begin
FUsesGraph:=CodeToolBoss.CreateUsesGraph; FUsesGraph:=CodeToolBoss.CreateUsesGraph;
FGroups:=TUGGroups.Create(FUsesGraph); FGroups:=TUGGroups.Create(FUsesGraph);
ProgressBar1.Style:=pbstMarquee;
AddStartAndTargetUnits;
fImgIndexProject := IDEImages.LoadImage(16, 'item_project'); fImgIndexProject := IDEImages.LoadImage(16, 'item_project');
fImgIndexUnit := IDEImages.LoadImage(16, 'item_unit'); fImgIndexUnit := IDEImages.LoadImage(16, 'item_unit');
@ -332,15 +335,14 @@ begin
AllUnitsTreeView.Images:=IDEImages.Images_16; AllUnitsTreeView.Images:=IDEImages.Images_16;
Caption:='Unit Dependencies'; Caption:='Unit Dependencies';
RefreshButton.Caption:='Refresh';
StatsLabel.Caption:='Scanning';
MainPageControl.ActivePage:=UnitsTabSheet; MainPageControl.ActivePage:=UnitsTabSheet;
SetupUnitsTabSheet; SetupUnitsTabSheet;
SetupGroupsTabSheet; SetupGroupsTabSheet;
IdleConnected:=true; StartParsing;
end; end;
procedure TUnitDependenciesWindow.AllUnitsSearchEditChange(Sender: TObject); procedure TUnitDependenciesWindow.AllUnitsSearchEditChange(Sender: TObject);
@ -389,6 +391,12 @@ begin
IdleConnected:=true; IdleConnected:=true;
end; end;
procedure TUnitDependenciesWindow.RefreshButtonClick(Sender: TObject);
begin
if udwParsing in FFlags then exit;
StartParsing;
end;
procedure TUnitDependenciesWindow.UnitsTreeViewShowHint(Sender: TObject; procedure TUnitDependenciesWindow.UnitsTreeViewShowHint(Sender: TObject;
HintInfo: PHintInfo); HintInfo: PHintInfo);
var var
@ -470,12 +478,10 @@ end;
procedure TUnitDependenciesWindow.FormDestroy(Sender: TObject); procedure TUnitDependenciesWindow.FormDestroy(Sender: TObject);
begin begin
IdleConnected:=false; IdleConnected:=false;
GroupsLvlGraph.Clear;
UnitsLvlGraph.Clear; FreeUsesGraph;
FreeAndNil(FGroups); FreeAndNil(FNewGroups);
FreeAndNil(FAllUnitsRootUDNode); FreeAndNil(FNewUsesGraph);
FreeAndNil(FSelUnitsRootUDNode);
FreeAndNil(FUsesGraph);
end; end;
procedure TUnitDependenciesWindow.GroupsLvlGraphSelectionChanged(Sender: TObject procedure TUnitDependenciesWindow.GroupsLvlGraphSelectionChanged(Sender: TObject
@ -489,13 +495,24 @@ var
Completed: boolean; Completed: boolean;
begin begin
if udwParsing in FFlags then begin if udwParsing in FFlags then begin
UsesGraph.Parse(true,Completed,200); fNewUsesGraph.Parse(true,Completed,200);
if Completed then begin if Completed then begin
Exclude(FFlags,udwParsing); Exclude(FFlags,udwParsing);
// free old uses graph
FreeUsesGraph;
// switch to new UsesGraph
FUsesGraph:=FNewUsesGraph;
FNewUsesGraph:=nil;
FGroups:=FNewGroups;
FNewGroups:=nil;
// create Groups
CreateGroups; CreateGroups;
// hide progress bar and update stats
ProgressBar1.Visible:=false; ProgressBar1.Visible:=false;
ProgressBar1.Style:=pbstNormal; ProgressBar1.Style:=pbstNormal;
StatsLabel.Caption:='Units: '+IntToStr(UsesGraph.FilesTree.Count); StatsLabel.Caption:='Units: '+IntToStr(UsesGraph.FilesTree.Count);
RefreshButton.Enabled:=true;
// update controls
UpdateAll; UpdateAll;
end; end;
end else if udwNeedUpdateGroupsLvlGraph in FFlags then end else if udwNeedUpdateGroupsLvlGraph in FFlags then
@ -663,6 +680,8 @@ procedure TUnitDependenciesWindow.CreateGroups;
var var
i: Integer; i: Integer;
begin begin
if FGroups=nil then
RaiseCatchableException('');
CreateProjectGroup(LazarusIDE.ActiveProject); CreateProjectGroup(LazarusIDE.ActiveProject);
for i:=0 to PackageEditingInterface.GetPackageCount-1 do for i:=0 to PackageEditingInterface.GetPackageCount-1 do
CreatePackageGroup(PackageEditingInterface.GetPackages(i)); CreatePackageGroup(PackageEditingInterface.GetPackages(i));
@ -828,6 +847,25 @@ begin
FreeAndNil(Owners); FreeAndNil(Owners);
end; end;
procedure TUnitDependenciesWindow.StartParsing;
begin
if (FNewUsesGraph<>nil) or (udwParsing in FFlags) then
RaiseCatchableException('');
Include(FFlags,udwParsing);
ProgressBar1.Visible:=true;
ProgressBar1.Style:=pbstMarquee;
StatsLabel.Caption:='Scanning ...';
RefreshButton.Enabled:=false;
FNewUsesGraph:=CodeToolBoss.CreateUsesGraph;
FNewGroups:=TUGGroups.Create(FNewUsesGraph);
AddStartAndTargetUnits;
IdleConnected:=true;
end;
procedure TUnitDependenciesWindow.SetCurrentUnit(AValue: TUGUnit); procedure TUnitDependenciesWindow.SetCurrentUnit(AValue: TUGUnit);
begin begin
if FCurrentUnit=AValue then Exit; if FCurrentUnit=AValue then Exit;
@ -1057,13 +1095,12 @@ var
j: Integer; j: Integer;
PkgFile: TLazPackageFile; PkgFile: TLazPackageFile;
begin begin
Include(FFlags,udwParsing); FNewUsesGraph.TargetAll:=true;
UsesGraph.TargetAll:=true;
// project lpr // project lpr
aProject:=LazarusIDE.ActiveProject; aProject:=LazarusIDE.ActiveProject;
if (aProject<>nil) and (aProject.MainFile<>nil) then if (aProject<>nil) and (aProject.MainFile<>nil) then
UsesGraph.AddStartUnit(aProject.MainFile.Filename); FNewUsesGraph.AddStartUnit(aProject.MainFile.Filename);
// add all open packages // add all open packages
if SearchPkgsCheckBox.Checked then begin if SearchPkgsCheckBox.Checked then begin
@ -1075,7 +1112,7 @@ begin
if PkgFile.Removed then continue; if PkgFile.Removed then continue;
aFilename:=PkgFile.GetFullFilename; aFilename:=PkgFile.GetFullFilename;
if FilenameIsPascalUnit(AFilename) then if FilenameIsPascalUnit(AFilename) then
UsesGraph.AddStartUnit(AFilename); FNewUsesGraph.AddStartUnit(AFilename);
end; end;
end; end;
end; end;
@ -1086,7 +1123,7 @@ begin
SrcEdit:=SourceEditorManagerIntf.SourceEditors[i]; SrcEdit:=SourceEditorManagerIntf.SourceEditors[i];
AFilename:=SrcEdit.FileName; AFilename:=SrcEdit.FileName;
if FilenameIsPascalUnit(AFilename) then if FilenameIsPascalUnit(AFilename) then
UsesGraph.AddStartUnit(AFilename); FNewUsesGraph.AddStartUnit(AFilename);
end; end;
end; end;
@ -1118,7 +1155,7 @@ begin
if Files<>nil then begin if Files<>nil then begin
for i:=0 to Files.Count-1 do begin for i:=0 to Files.Count-1 do begin
if FilenameIsPascalUnit(Files[i]) then if FilenameIsPascalUnit(Files[i]) then
UsesGraph.AddStartUnit(aFilename+Files[i]); fNewUsesGraph.AddStartUnit(aFilename+Files[i]);
end; end;
end; end;
finally finally
@ -1126,7 +1163,7 @@ begin
end; end;
end else begin end else begin
// add a single file // add a single file
UsesGraph.AddStartUnit(aFilename); fNewUsesGraph.AddStartUnit(aFilename);
end; end;
end; end;
end; end;
@ -1394,6 +1431,16 @@ begin
end; end;
end; end;
procedure TUnitDependenciesWindow.FreeUsesGraph;
begin
FreeAndNil(FAllUnitsRootUDNode);
FreeAndNil(FSelUnitsRootUDNode);
GroupsLvlGraph.Clear;
UnitsLvlGraph.Clear;
FreeAndNil(FGroups);
FreeAndNil(FUsesGraph);
end;
procedure TUnitDependenciesWindow.UpdateAllUnitsTreeView; procedure TUnitDependenciesWindow.UpdateAllUnitsTreeView;
var var
TV: TTreeView; TV: TTreeView;