555
procedure TProjectInspectorForm.SetIdleConnected(const AValue: boolean);
557
if FIdleConnected=AValue then exit;
558
FIdleConnected:=AValue;
559
if FIdleConnected then
560
Application.AddOnIdleHandler(@IdleHandler)
562
Application.RemoveOnIdleHandler(@IdleHandler);
493
565
procedure TProjectInspectorForm.SetupComponents;
567
function CreateToolButton(AName, ACaption, AHint, AImageName: String; AOnClick: TNotifyEvent): TToolButton;
569
Result := TToolButton.Create(Self);
570
Result.Name := AName;
571
Result.Caption := ACaption;
572
Result.Hint := AHint;
573
if AImageName <> '' then
574
Result.ImageIndex := IDEImages.LoadImage(16, AImageName);
575
Result.ShowHint := True;
576
Result.OnClick := AOnClick;
577
Result.AutoSize := True;
578
Result.Parent := ToolBar;
581
function CreateDivider: TToolButton;
583
Result := TToolButton.Create(Self);
584
Result.Style := tbsDivider;
585
Result.AutoSize := True;
586
Result.Parent := ToolBar;
495
ItemsTreeView.Images := IDEImages.Images_16;
496
ImageIndexFiles := IDEImages.LoadImage(16, 'pkg_files');
497
ImageIndexRequired := IDEImages.LoadImage(16, 'pkg_required');
498
ImageIndexConflict := IDEImages.LoadImage(16, 'pkg_conflict');
590
ImageIndexFiles := IDEImages.LoadImage(16, 'pkg_files');
591
ImageIndexRequired := IDEImages.LoadImage(16, 'pkg_required');
592
ImageIndexConflict := IDEImages.LoadImage(16, 'pkg_conflict');
499
593
ImageIndexRemovedRequired := IDEImages.LoadImage(16, 'pkg_removedrequired');
500
ImageIndexProject := IDEImages.LoadImage(16, 'item_project');
501
ImageIndexUnit := IDEImages.LoadImage(16, 'item_unit');
502
ImageIndexRegisterUnit := IDEImages.LoadImage(16, 'pkg_registerunit');
503
ImageIndexText := IDEImages.LoadImage(16, 'pkg_text');
504
ImageIndexBinary := IDEImages.LoadImage(16, 'pkg_binary');
506
OpenBitBtn.LoadGlyphFromLazarusResource('laz_open');
507
AddBitBtn.LoadGlyphFromLazarusResource('laz_add');
508
RemoveBitBtn.LoadGlyphFromLazarusResource('laz_delete');
509
OptionsBitBtn.LoadGlyphFromLazarusResource('menu_environment_options');
511
OpenBitBtn.Caption:='';
512
AddBitBtn.Caption:='';
513
RemoveBitBtn.Caption:='';
514
OptionsBitBtn.Caption:='';
515
OpenBitBtn.Hint:=lisOpenFile;
516
AddBitBtn.Hint:=lisCodeTemplAdd;
517
RemoveBitBtn.Hint:=lisExtToolRemove;
518
OptionsBitBtn.Hint:=dlgFROpts;
594
ImageIndexProject := IDEImages.LoadImage(16, 'item_project');
595
ImageIndexUnit := IDEImages.LoadImage(16, 'item_unit');
596
ImageIndexRegisterUnit := IDEImages.LoadImage(16, 'pkg_registerunit');
597
ImageIndexText := IDEImages.LoadImage(16, 'pkg_text');
598
ImageIndexBinary := IDEImages.LoadImage(16, 'pkg_binary');
599
ImageIndexDirectory := IDEImages.LoadImage(16, 'pkg_files');
601
ItemsTreeView.Images := IDEImages.Images_16;
602
ToolBar.Images := IDEImages.Images_16;
603
FilterEdit.OnGetImageIndex:=@ChooseImageIndex;
605
AddBitBtn := CreateToolButton('AddBitBtn', lisAdd, lisPckEditAddAnItem, 'laz_add', @AddBitBtnClick);
606
RemoveBitBtn := CreateToolButton('RemoveBitBtn', lisRemove, lisPckEditRemoveSelectedItem, 'laz_delete', @RemoveBitBtnClick);
608
OptionsBitBtn := CreateToolButton('OptionsBitBtn', dlgFROpts, lisPckEditEditGeneralOptions, 'menu_environment_options', @OptionsBitBtnClick);
609
HelpBitBtn := CreateToolButton('HelpBitBtn', GetButtonCaption(idButtonHelp), lisPkgEdThereAreMoreFunctionsInThePopupmenu, 'menu_help', @HelpBitBtnClick);
611
OpenButton.LoadGlyphFromLazarusResource('laz_open');
612
OpenButton.Caption:='';
613
OpenButton.Hint:=lisOpenFile2;
614
SortAlphabeticallyButton.Hint:=lisPESortFilesAlphabetically;
615
SortAlphabeticallyButton.LoadGlyphFromLazarusResource('pkg_sortalphabetically');
616
DirectoryHierarchyButton.Hint:=lisPEShowDirectoryHierarchy;
617
DirectoryHierarchyButton.LoadGlyphFromLazarusResource('pkg_hierarchical');
520
619
with ItemsTreeView do begin
521
FilesNode:=Items.Add(nil, dlgEnvFiles);
522
FilesNode.ImageIndex:=ImageIndexFiles;
523
FilesNode.SelectedIndex:=FilesNode.ImageIndex;
620
FFilesNode:=Items.Add(nil, dlgEnvFiles);
621
FFilesNode.ImageIndex:=ImageIndexFiles;
622
FFilesNode.SelectedIndex:=FFilesNode.ImageIndex;
524
623
DependenciesNode:=Items.Add(nil, lisPckEditRequiredPackages);
525
624
DependenciesNode.ImageIndex:=ImageIndexRequired;
526
625
DependenciesNode.SelectedIndex:=DependenciesNode.ImageIndex;
530
procedure TProjectInspectorForm.UpdateProjectItems;
629
function TProjectInspectorForm.ChooseImageIndex(Str: String; Data: TObject;
630
var AIsEnabled: Boolean): Integer;
632
if Data is TUnitInfo then begin
633
if FilenameIsPascalUnit(TUnitInfo(Data).Filename) then
634
Result:=ImageIndexUnit
635
else if (LazProject<>nil) and (LazProject.MainUnitinfo=Data) then
636
Result:=ImageIndexProject
638
Result:=ImageIndexText;
640
else if Data is TPkgDependency then begin
641
if TPkgDependency(Data).Removed then
642
Result:=ImageIndexRemovedRequired
643
else if TPkgDependency(Data).LoadPackageResult=lprSuccess then
644
Result:=ImageIndexRequired
646
Result:=ImageIndexConflict;
650
procedure TProjectInspectorForm.UpdateProjectFiles;
532
652
CurFile: TUnitInfo;
537
AVLNode: TAvgLvlTreeNode;
653
FilesBranch: TTreeFilterBranch;
539
656
ItemsTreeView.BeginUpdate;
540
if LazProject<>nil then begin
541
Tree:=TAvgLvlTree.CreateObjectCompare(@CompareUnitInfos);
542
CurFile:=LazProject.FirstPartOfProject;
543
while CurFile<>nil do begin
545
CurFile:=CurFile.NextPartOfProject;
547
AVLNode:=Tree.FindLowest;
548
CurNode:=FilesNode.GetFirstChild;
549
while AVLNode<>nil do begin
550
CurFile:=TUnitInfo(AVLNode.Data);
551
NodeText:=ProjectFileToNodeText(CurFile);
553
CurNode:=ItemsTreeView.Items.AddChild(FilesNode,NodeText)
555
CurNode.Text:=NodeText;
556
CurNode.ImageIndex:=GetImageIndexOfFile(CurFile);
557
CurNode.SelectedIndex:=CurNode.ImageIndex;
558
CurNode:=CurNode.GetNextSibling;
559
AVLNode:=Tree.FindSuccessor(AVLNode);
561
while CurNode<>nil do begin
562
NextNode:=CurNode.GetNextSibling;
566
FilesNode.Expanded:=true;
570
FilesNode.HasChildren:=false;
658
FilesBranch:=FilterEdit.GetBranch(FFilesNode);
659
if LazProject<>nil then begin
660
FilterEdit.SelectedPart:=FNextSelectedPart;
661
FilterEdit.ShowDirHierarchy:=ShowDirectoryHierarchy;
662
FilterEdit.SortData:=SortAlphabetically;
663
FilterEdit.ImageIndexDirectory:=ImageIndexDirectory;
664
// collect and sort files
665
CurFile:=LazProject.FirstPartOfProject;
666
while CurFile<>nil do begin
667
Filename:=CurFile.GetShortFilename(true);
669
FilesBranch.AddNodeData(Filename, CurFile, CurFile.Filename);
670
CurFile:=CurFile.NextPartOfProject;
673
FilterEdit.InvalidateFilter; // Data is shown by FilterEdit.
675
ItemsTreeView.EndUpdate;
572
ItemsTreeView.EndUpdate;
575
679
procedure TProjectInspectorForm.UpdateRequiredPackages;
577
681
Dependency: TPkgDependency;
682
RequiredBranch, RemovedBranch: TTreeFilterBranch;
578
683
NodeText, AFilename: String;
582
ItemsTreeView.BeginUpdate;
583
if LazProject<>nil then begin
584
Dependency:=LazProject.FirstRequiredDependency;
585
CurNode:=DependenciesNode.GetFirstChild;
586
while Dependency<>nil do begin
587
NodeText:=Dependency.AsString;
588
if Dependency.DefaultFilename<>'' then begin
589
AFilename:=Dependency.MakeFilenameRelativeToOwner(
590
Dependency.DefaultFilename);
591
if Dependency.PreferDefaultFilename then
592
NodeText:=Format(lisCEIn, [NodeText,AFilename]) // like the 'in' keyword in the uses section
594
NodeText:=Format(lisPckEditDefault, [NodeText, AFilename]);
597
CurNode:=ItemsTreeView.Items.AddChild(DependenciesNode,NodeText)
599
CurNode.Text:=NodeText;
600
if Dependency.LoadPackageResult=lprSuccess then
601
CurNode.ImageIndex:=ImageIndexRequired
603
CurNode.ImageIndex:=ImageIndexConflict;
604
CurNode.SelectedIndex:=CurNode.ImageIndex;
605
Dependency:=Dependency.NextRequiresDependency;
606
CurNode:=CurNode.GetNextSibling;
608
while CurNode<>nil do begin
609
NextNode:=CurNode.GetNextSibling;
613
DependenciesNode.Expanded:=true;
615
// delete dependency nodes
616
DependenciesNode.HasChildren:=false;
618
ItemsTreeView.EndUpdate;
621
procedure TProjectInspectorForm.UpdateRemovedRequiredPackages;
623
Dependency: TPkgDependency;
628
ItemsTreeView.BeginUpdate;
629
if (LazProject<>nil) and (LazProject.FirstRemovedDependency<>nil) then begin
630
Dependency:=LazProject.FirstRemovedDependency;
631
if RemovedDependenciesNode=nil then begin
632
RemovedDependenciesNode:=
633
ItemsTreeView.Items.Add(DependenciesNode,
634
lisProjInspRemovedRequiredPackages);
635
RemovedDependenciesNode.ImageIndex:=ImageIndexRemovedRequired;
636
RemovedDependenciesNode.SelectedIndex:=RemovedDependenciesNode.ImageIndex;
638
CurNode:=RemovedDependenciesNode.GetFirstChild;
639
while Dependency<>nil do begin
640
NodeText:=Dependency.AsString;
642
CurNode:=ItemsTreeView.Items.AddChild(RemovedDependenciesNode,NodeText)
644
CurNode.Text:=NodeText;
645
CurNode.ImageIndex:=RemovedDependenciesNode.ImageIndex;
646
CurNode.SelectedIndex:=CurNode.ImageIndex;
647
Dependency:=Dependency.NextRequiresDependency;
648
CurNode:=CurNode.GetNextSibling;
650
while CurNode<>nil do begin
651
NextNode:=CurNode.GetNextSibling;
655
RemovedDependenciesNode.Expanded:=true;
657
// delete removed dependency nodes
658
if RemovedDependenciesNode<>nil then
685
ItemsTreeView.BeginUpdate;
687
RequiredBranch:=FilterEdit.GetBranch(DependenciesNode);
689
if LazProject<>nil then begin
691
Dependency:=LazProject.FirstRequiredDependency;
692
while Dependency<>nil do begin
693
// Figure out the item's caption
694
NodeText:=Dependency.AsString;
695
if Dependency.DefaultFilename<>'' then begin
696
AFilename:=Dependency.MakeFilenameRelativeToOwner(Dependency.DefaultFilename);
697
if Dependency.PreferDefaultFilename then
698
NodeText:=Format(lisCEIn, [NodeText,AFilename]) // like the 'in' keyword in the uses section
700
NodeText:=Format(lisPckEditDefault, [NodeText, AFilename]);
702
// Add the required package under the branch
703
RequiredBranch.AddNodeData(NodeText, Dependency);
704
Dependency:=Dependency.NextRequiresDependency;
707
// removed required packages
708
Dependency:=LazProject.FirstRemovedDependency;
709
if Dependency<>nil then begin
710
// Create root node for removed dependencies if not done yet.
711
if RemovedDependenciesNode=nil then begin
712
RemovedDependenciesNode:=ItemsTreeView.Items.Add(DependenciesNode,
713
lisProjInspRemovedRequiredPackages);
714
RemovedDependenciesNode.ImageIndex:=ImageIndexRemovedRequired;
715
RemovedDependenciesNode.SelectedIndex:=RemovedDependenciesNode.ImageIndex;
717
RemovedBranch:=FilterEdit.GetBranch(RemovedDependenciesNode);
718
// Add all removed dependencies under the branch
719
while Dependency<>nil do begin
720
RemovedBranch.AddNodeData(Dependency.AsString, Dependency);
721
Dependency:=Dependency.NextRequiresDependency;
726
// Dependency is set to removed required packages if there is active project
727
if (Dependency=nil) and (RemovedDependenciesNode<>nil) then begin
728
// No removed dependencies -> delete the root node
729
FilterEdit.DeleteBranch(RemovedDependenciesNode);
659
730
FreeThenNil(RemovedDependenciesNode);
732
FilterEdit.InvalidateFilter;
734
ItemsTreeView.EndUpdate;
661
ItemsTreeView.EndUpdate;
664
function TProjectInspectorForm.GetImageIndexOfFile(AFile: TUnitInfo): integer;
666
if FilenameIsPascalUnit(AFile.Filename) then
667
Result:=ImageIndexUnit
668
else if (LazProject<>nil) and (LazProject.MainUnitinfo=AFile) then
669
Result:=ImageIndexProject
671
Result:=ImageIndexText;
674
738
procedure TProjectInspectorForm.OnProjectBeginUpdate(Sender: TObject);
689
753
ExecuteIDEShortCut(Self,Key,Shift,nil);
692
function TProjectInspectorForm.ProjectFileToNodeText(AFile: TUnitInfo): string;
756
procedure TProjectInspectorForm.IdleHandler(Sender: TObject; var Done: Boolean);
694
Result:=CreateRelativePath(AFile.Filename,LazProject.ProjectDirectory);
758
if not IsVisible then begin
759
Include(FFlags,pifWasHidden);
760
IdleConnected:=false;
763
Exclude(FFlags,pifWasHidden);
764
if FUpdateLock>0 then begin
765
IdleConnected:=false;
768
if pifAllChanged in FFlags then
770
else if pifItemsChanged in FFlags then
772
else if pifTitleChanged in FFlags then
774
else if pifButtonsChanged in FFlags then
777
IdleConnected:=false;
697
function TProjectInspectorForm.CompareUnitInfos(Tree: TAvgLvlTree;
698
UnitInfo1, UnitInfo2: Pointer): integer;
700
ShortFilename1: String;
701
ShortFilename2: String;
780
procedure TProjectInspectorForm.UpdateShowing;
703
ShortFilename1:=CreateRelativePath(TUnitInfo(UnitInfo1).Filename,
704
LazProject.ProjectDirectory);
705
ShortFilename2:=CreateRelativePath(TUnitInfo(UnitInfo2).Filename,
706
LazProject.ProjectDirectory);
707
Result:=CompareFilenames(ShortFilename1,ShortFilename2);
782
inherited UpdateShowing;
783
if IsVisible and (pifWasHidden in FFlags) then begin
784
Exclude(FFlags,pifWasHidden);
785
if FFlags<>[] then begin
786
// the form is visible again and some updates are pending
710
792
function TProjectInspectorForm.GetSelectedFile: TUnitInfo;
712
794
CurNode: TTreeNode;
716
798
if LazProject=nil then exit;
717
799
CurNode:=ItemsTreeView.Selected;
718
if (CurNode=nil) or (CurNode.Parent<>FilesNode) then exit;
719
Result:=LazProject.FirstPartOfProject;
720
while (Result<>nil) do begin
721
NodeText:=ProjectFileToNodeText(Result);
722
if NodeText=CurNode.Text then exit;
723
Result:=Result.NextPartOfProject;
800
if (CurNode=nil) then exit;
801
//debugln(['TProjectInspectorForm.GetCurrentFile ',DbgSName(TObject(CurNode.Data)),' ',CurNode.Text]);
802
if TObject(CurNode.Data) is TFileNameItem then
804
Item:=TFileNameItem(CurNode.Data);
805
//debugln(['TProjectInspectorForm.GetCurrentFile Item=',Item.Filename,' ',Item.IsDirectory]);
806
Result:=LazProject.UnitInfoWithFilename(Item.Filename);
727
810
function TProjectInspectorForm.GetSelectedDependency: TPkgDependency;
729
812
CurNode: TTreeNode;
813
Branch: TTreeFilterBranch;
733
817
if LazProject=nil then exit;
734
818
CurNode:=ItemsTreeView.Selected;
735
if (CurNode=nil) then exit;
736
NodeIndex:=CurNode.Index;
737
if (CurNode.Parent=DependenciesNode) then begin
738
Result:=GetDependencyWithIndex(LazProject.FirstRequiredDependency,
739
pdlRequires,NodeIndex);
741
if (CurNode.Parent=RemovedDependenciesNode) then begin
742
Result:=GetDependencyWithIndex(LazProject.FirstRemovedDependency,
743
pdlRequires,NodeIndex);
747
function TProjectInspectorForm.StoreCurrentTreeSelection: TStringList;
751
Result:=TStringList.Create;
752
ANode:=ItemsTreeView.Selected;
753
while ANode<>nil do begin
754
Result.Insert(0,ANode.Text);
759
procedure TProjectInspectorForm.ApplyTreeSelection(ASelection: TStringList;
766
while ASelection.Count>0 do begin
767
CurText:=ASelection[0];
769
ANode:=ItemsTreeView.Items.GetFirstNode
771
ANode:=ANode.GetFirstChild;
772
while (ANode<>nil) and (ANode.Text<>CurText) do
773
ANode:=ANode.GetNextSibling;
774
if ANode=nil then break;
775
ASelection.Delete(0);
777
if ANode<>nil then ItemsTreeView.Selected:=ANode;
778
if FreeList then ASelection.Free;
819
if Assigned(CurNode) and Assigned(CurNode.Parent)
820
and ((CurNode.Parent=DependenciesNode) or (CurNode.Parent=RemovedDependenciesNode))
822
Branch:=FilterEdit.GetExistingBranch(CurNode.Parent);
823
Assert(Assigned(Branch));
824
AnObject := Branch.GetData(CurNode.Index);
825
if (AnObject <> nil) and (AnObject is TPkgDependency) then
826
Result := TPkgDependency(AnObject);
781
830
constructor TProjectInspectorForm.Create(TheOwner: TComponent);