lazarus/packager/addtopackagedlg.pas
maxim 69a72501fa Merged revision(s) 52618 #553370e733, 52621 #96e287106e from trunk:
IDE: Replace Combobox with Listbox+Filter to add package dependencies for projects and packages.
........
IDE: Make the order of IDE Coolbar items more logical.
........

git-svn-id: branches/fixes_1_6@52624 -
2016-07-04 22:02:38 +00:00

1331 lines
43 KiB
ObjectPascal

{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
TAddToPackageDlg is the form for adding files to an open package.
}
unit AddToPackageDlg;
{$mode objfpc}{$H+}
interface
uses
Math, Classes, SysUtils, LCLProc, LCLType, Forms, Controls, Buttons, ExtDlgs,
StdCtrls, ExtCtrls, Dialogs, ComCtrls, ButtonPanel, AVL_Tree, FileUtil, LazFileUtils,
// IDEIntf
NewItemIntf, PackageIntf, FormEditingIntf, IDEWindowIntf, IDEDialogs,
// IDE
LazarusIDEStrConsts, InputHistory, IDEDefs, IDEProcs, EnvironmentOpts,
PackageSystem, PackageDefs, ComponentReg, ListFilterEdit, AddDirToPkgDlg;
type
TAddToPkgType = (
d2ptUnit,
d2ptVirtualUnit,
d2ptNewComponent,
d2ptRequiredPkg,
d2ptFile,
d2ptFiles
);
{ TAddToPkgResult }
TAddToPkgResult = class
public
Pkg: TLazPackage;
AddType: TAddToPkgType;
Dependency: TPkgDependency;
UnitFilename: string;
Unit_Name: string;
AncestorType: string;
NewClassName: string;
PageName: string;
FileType: TPkgFileType;
PkgFileFlags: TPkgFileFlags;
UsedUnitname: string;
IconFile: string;
AutoAddLFMFile: boolean;
AutoAddLRSFile: boolean;
NewItem: TNewIDEItemTemplate;
Next: TAddToPkgResult;
procedure Clear;
destructor Destroy; override;
end;
TOnGetUnitRegisterInfo = procedure(Sender: TObject; const AFilename: string;
out TheUnitName: string; out HasRegisterProc: boolean) of object;
{ TAddToPackageDlg }
TAddToPackageDlg = class(TForm)
AddFilesBtnPanel: TPanel;
AddFilesPage: TTabSheet;
AncestorComboBox: TComboBox;
AncestorShowAllCheckBox: TCheckBox;
AncestorTypeLabel: TLabel;
ButtonPanel1: TButtonPanel;
ClassNameEdit: TEdit;
ClassNameLabel: TLabel;
ComponentIconLabel: TLabel;
ComponentIconBitBtn: TBitBtn;
ComponentUnitFileBrowseButton: TButton;
ComponentUnitFileEdit: TEdit;
ComponentUnitFileLabel: TLabel;
ComponentUnitFileShortenButton: TButton;
ComponentUnitNameEdit: TEdit;
ComponentUnitNameLabel: TLabel;
DependMaxVersionEdit: TEdit;
DependMaxVersionLabel: TLabel;
DependMinVersionEdit: TEdit;
DependMinVersionLabel: TLabel;
DependPkgNameLabel: TLabel;
FilesDeleteButton: TBitBtn;
FilesDirButton: TBitBtn;
FilesListView: TListView;
FilesShortenButton: TBitBtn;
LabelIconInfo: TLabel;
DependPkgNameListBox: TListBox;
DependPkgNameFilter: TListFilterEdit;
NewComponentPage: TTabSheet;
NewDepPanel: TPanel;
NewRequirementPage: TTabSheet;
PageControl1: TPageControl;
PalettePageCombobox: TComboBox;
PalettePageLabel: TLabel;
procedure AddToPackageDlgClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
procedure AddToPackageDlgKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure AncestorComboBoxChange(Sender: TObject);
procedure AncestorComboBoxCloseUp(Sender: TObject);
procedure AncestorShowAllCheckBoxClick(Sender: TObject);
procedure CancelAddFileButtonClick(Sender: TObject);
procedure CancelAddUnitButtonClick(Sender: TObject);
procedure ClassNameEditChange(Sender: TObject);
procedure ComponentIconBitBtnClick(Sender: TObject);
procedure ComponentUnitFileBrowseButtonClick(Sender: TObject);
procedure ComponentUnitFileShortenButtonClick(Sender: TObject);
procedure ComponentUnitNameEditChange(Sender: TObject);
procedure DependPkgNameListBoxSelectionChange(Sender: TObject; User: boolean);
procedure FilesAddButtonClick(Sender: TObject);
procedure FilesDeleteButtonClick(Sender: TObject);
procedure FilesDirButtonClick(Sender: TObject);
procedure FilesListViewSelectItem(Sender: TObject; {%H-}Item: TListItem; {%H-}Selected: Boolean);
procedure FilesShortenButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure NewComponentButtonClick(Sender: TObject);
procedure NewComponentPageResize(Sender: TObject);
procedure NewDependButtonClick(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
private
fLastNewComponentAncestorType: string;
fLastNewComponentClassName: string;
FLazPackage: TLazPackage;
FOnGetIDEFileInfo: TGetIDEFileStateEvent;
FOnGetUnitRegisterInfo: TOnGetUnitRegisterInfo;
fPkgComponents: TAVLTree;// tree of TPkgComponent
fPackages: TAVLTree;// tree of TLazPackage or TPackageLink
FComponentIconFilename: string;
function GetActivatePage: TAddToPkgType;
procedure SetActivatePage(AValue: TAddToPkgType);
procedure SetLazPackage(const AValue: TLazPackage);
procedure SetupComponents;
procedure SetupNewComponentPage;
procedure SetupAddDependencyPage;
procedure SetupAddFilesPage;
procedure OnIterateComponentClasses(PkgComponent: TPkgComponent);
procedure OnIteratePackages(APackageID: TLazPackageID);
function CheckNewCompOk: Boolean;
function CheckNewReqOk: Boolean;
function CheckFilesButtonsOk: Boolean;
procedure AutoCompleteNewComponent;
procedure AutoCompleteNewComponentUnitName;
function SwitchRelativeAbsoluteFilename(const Filename: string): string;
function FindFileInFilesList(AFilename: string): Integer;
procedure LoadComponentIcon(AFilename: string);
public
Params: TAddToPkgResult;
procedure UpdateAvailableAncestorTypes;
procedure UpdateAvailablePageNames;
procedure UpdateAvailableDependencyNames;
public
property LazPackage: TLazPackage read FLazPackage write SetLazPackage;
property OnGetIDEFileInfo: TGetIDEFileStateEvent read FOnGetIDEFileInfo
write FOnGetIDEFileInfo;
property OnGetUnitRegisterInfo: TOnGetUnitRegisterInfo
read FOnGetUnitRegisterInfo write FOnGetUnitRegisterInfo;
property ActivatePage: TAddToPkgType read GetActivatePage write SetActivatePage;
end;
function ShowAddToPackageDlg(Pkg: TLazPackage; out Params: TAddToPkgResult;
OnGetIDEFileInfo: TGetIDEFileStateEvent;
OnGetUnitRegisterInfo: TOnGetUnitRegisterInfo;
var Page: TAddToPkgType): TModalResult;
function CheckAddingUnitFilename(LazPackage: TLazPackage;
AddFileType: TAddToPkgType; OnGetIDEFileInfo: TGetIDEFileStateEvent;
var AFilename: string): boolean;
function CheckAddingDependency(LazPackage: TLazPackage;
NewDependency: TPkgDependency; Quiet, WarnIfAlreadyThere: boolean
): TModalResult;// mrOk=can be added, mrCancel=do not add, mrIgnore=already there
function CheckAddingPkgDependency(LazPackage: TLazPackage;
RequiredPkg: TLazPackage; Quiet, WarnIfAlreadyThere: boolean): TModalResult;
implementation
{$R *.lfm}
function ShowAddToPackageDlg(Pkg: TLazPackage; out Params: TAddToPkgResult;
OnGetIDEFileInfo: TGetIDEFileStateEvent;
OnGetUnitRegisterInfo: TOnGetUnitRegisterInfo; var Page: TAddToPkgType
): TModalResult;
var
AddDlg: TAddToPackageDlg;
begin
Params:=nil;
AddDlg:=TAddToPackageDlg.Create(nil);
AddDlg.OnGetIDEFileInfo:=OnGetIDEFileInfo;
AddDlg.OnGetUnitRegisterInfo:=OnGetUnitRegisterInfo;
AddDlg.LazPackage:=Pkg;
AddDlg.ActivatePage:=Page;
//auto press AddFiles if called with "Add files" page
if Page=d2ptFiles then
AddDlg.FilesDirButton.Click;
//hide tabs for simpler use
AddDlg.PageControl1.ShowTabs:=false;
AddDlg.PageControl1.TabStop:=false;
Result:=AddDlg.ShowModal;
Page:=AddDlg.ActivatePage;
if Result=mrOk then begin
Params:=AddDlg.Params;
AddDlg.Params:=nil;
end;
AddDlg.Free;
end;
function CheckAddingUnitFilename(LazPackage: TLazPackage;
AddFileType: TAddToPkgType; OnGetIDEFileInfo: TGetIDEFileStateEvent;
var AFilename: string): boolean;
var
AnUnitName: String;
PkgFile: TPkgFile;
Msg: String;
IDEFileFlags: TIDEFileStateFlags;
begin
Result:=false;
PkgFile:=Nil;
// check if package is readonly
if LazPackage.ReadOnly then begin
IDEMessageDialog(lisAF2PPackageIsReadOnly,
Format(lisAF2PThePackageIsReadOnly, [LazPackage.IDAsString]),
mtError,[mbCancel]);
exit;
end;
// normalize filename
AFilename:=TrimFilename(AFilename);
if (AddFileType<>d2ptVirtualUnit) and (not FilenameIsAbsolute(AFilename)) then
begin
if LazPackage.HasDirectory then
AFilename:=LazPackage.Directory+AFilename
else begin
IDEMessageDialog(lisA2PInvalidFilename,
Format(lisA2PTheFilenameIsAmbiguousPleaseSpecifiyAFilename,[AFilename,LineEnding]),
mtError,[mbCancel]);
exit;
end;
end;
// check if file exists
if (FilenameIsAbsolute(AFilename)) then begin
if (not FileExistsUTF8(AFilename)) then begin
if AddFileType=d2ptUnit then begin
IDEMessageDialog(lisFileNotFound,
Format(lisPkgMangFileNotFound, [AFilename]),
mtError, [mbCancel]);
exit;
end;
end;
end;
// check if file already exists in package
if FilenameIsAbsolute(AFilename) then begin
PkgFile:=LazPackage.FindPkgFile(AFilename,true,false);
if PkgFile<>nil then begin
Msg:=Format(lisA2PFileAlreadyExistsInThePackage, [AFilename]);
if PkgFile.Filename<>AFilename then
Msg:=Msg+LineEnding+Format(lisA2PExistingFile2, [PkgFile.Filename]);
IDEMessageDialog(lisA2PFileAlreadyExists, Msg, mtError, [mbCancel]);
exit;
end;
end;
// check if file is part of project
if FilenameIsAbsolute(AFilename) then begin
if Assigned(OnGetIDEFileInfo) then begin
IDEFileFlags:=[];
OnGetIDEFileInfo(nil,AFilename,[ifsPartOfProject],IDEFileFlags);
if (ifsPartOfProject in IDEFileFlags) then begin
IDEMessageDialog(lisA2PFileIsUsed,
Format(lisA2PTheFileIsPartOfTheCurrentProjectItIsABadIdea,[AFilename,LineEnding]),
mtError,[mbCancel]);
exit;
end;
end;
end;
// check file extension
if AddFileType in [d2ptUnit,d2ptNewComponent,d2ptVirtualUnit] then begin
if not FilenameIsPascalUnit(AFilename) then begin
IDEMessageDialog(lisA2PFileNotUnit,
lisA2PPascalUnitsMustHaveTheExtensionPPOrPas,
mtWarning,[mbCancel]);
exit;
end;
end;
// check unitname
if AddFileType in [d2ptUnit,d2ptNewComponent,d2ptVirtualUnit] then begin
AnUnitName:=ExtractFileNameOnly(AFilename);
if not IsValidUnitName(AnUnitName) then begin
IDEMessageDialog(lisA2PFileNotUnit,
Format(lisA2PisNotAValidUnitName, [AnUnitName]),
mtWarning,[mbCancel]);
exit;
end;
// check if unitname already exists in package
PkgFile:=LazPackage.FindUnit(AnUnitName,true,PkgFile);
if PkgFile<>nil then begin
// a unit with this name already exists in this package => warn
if IDEMessageDialog(lisA2PUnitnameAlreadyExists,
Format(lisA2PTheUnitnameAlreadyExistsInThisPackage, [AnUnitName]),
mtError,[mbCancel,mbIgnore])<>mrIgnore then exit;
end else begin
PkgFile:=PackageGraph.FindUnit(LazPackage,AnUnitName,true,true);
if (PkgFile<>nil) and (PkgFile.LazPackage<>LazPackage) then begin
// there is already a unit with this name in another package => warn
if IDEMessageDialog(lisA2PUnitnameAlreadyExists,
Format(lisA2PTheUnitnameAlreadyExistsInThePackage,
[AnUnitName, LineEnding, PkgFile.LazPackage.IDAsString]),
mtWarning,[mbCancel,mbIgnore])<>mrIgnore then exit;
end;
end;
// check if unitname is a componentclass
if IDEComponentPalette.FindComponent(AnUnitName)<>nil then begin
if IDEMessageDialog(lisA2PAmbiguousUnitName,
Format(lisA2PTheUnitNameIsTheSameAsAnRegisteredComponent,
[AnUnitName, LineEnding]),
mtWarning,[mbCancel,mbIgnore])<>mrIgnore
then
exit;
end;
end;
// ok
Result:=true;
end;
function CheckAddingDependency(LazPackage: TLazPackage;
NewDependency: TPkgDependency; Quiet, WarnIfAlreadyThere: boolean): TModalResult;
var
NewPkgName: String;
RequiredPackage: TLazPackage;
ProvidingAPackage: TLazPackage;
ConflictDependency: TPkgDependency;
PathList: TFPList;
s: String;
begin
Result:=mrCancel;
NewPkgName:=NewDependency.PackageName;
// check Max-Min version
if (pdfMinVersion in NewDependency.Flags)
and (pdfMaxVersion in NewDependency.Flags)
and (NewDependency.MaxVersion.Compare(NewDependency.MinVersion)<0) then
begin
if not Quiet then
IDEMessageDialog(lisProjAddInvalidMinMaxVersion,
lisA2PTheMaximumVersionIsLowerThanTheMinimimVersion,
mtError,[mbCancel]);
exit(mrCancel);
end;
// check packagename
if not IsValidPkgName(NewPkgName) then begin
if not Quiet then
IDEMessageDialog(lisProjAddInvalidPackagename,
Format(lisA2PThePackageNameIsInvalidPleaseChooseAnExisting,[NewPkgName,LineEnding]),
mtError,[mbCancel]);
exit(mrCancel);
end;
// check if package is already required
if (CompareText(NewPkgName,LazPackage.Name)=0)
or (PackageGraph.FindDependencyRecursively(
LazPackage.FirstRequiredDependency,NewPkgName)<>nil)
then begin
if WarnIfAlreadyThere then
IDEMessageDialog(lisProjAddDependencyAlreadyExists,
Format(lisA2PThePackageHasAlreadyADependencyForThe, [NewPkgName]),
mtError,[mbCancel]);
exit(mrIgnore);
end;
// check if required lpk exists
if not PackageGraph.DependencyExists(NewDependency,fpfSearchAllExisting)
then begin
if not Quiet then
IDEMessageDialog(lisProjAddPackageNotFound,
Format(lisA2PNoPackageFoundForDependencyPleaseChooseAnExisting,
[NewDependency.AsString, LineEnding]),
mtError,[mbCancel]);
exit(mrCancel);
end;
RequiredPackage:=PackageGraph.FindPackageWithName(NewPkgName,nil);
if RequiredPackage<>nil then begin
// check if there is a dependency, that requires another version
ConflictDependency:=PackageGraph.FindConflictRecursively(
LazPackage.FirstRequiredDependency,RequiredPackage);
if ConflictDependency<>nil then begin
DebugLn(['CheckAddingDependency ',LazPackage.Name,' requiring ',RequiredPackage.IDAsString,' conflicts with ',ConflictDependency.AsString]);
if not Quiet then
IDEMessageDialog(lisVersionMismatch,
Format(lisUnableToAddTheDependencyBecauseThePackageHasAlread, [
RequiredPackage.IDAsString, LazPackage.Name, ConflictDependency.
AsString]),
mtError,[mbCancel]);
exit(mrCancel);
end;
// check if there is a cycle
PathList:=PackageGraph.FindPath(RequiredPackage,nil,LazPackage.Name);
if PathList<>nil then begin
try
s:=PackagePathToStr(PathList);
DebugLn(['CheckAddingDependency ',LazPackage.Name,' requiring ',RequiredPackage.IDAsString,' creates cycles with ',s]);
if not Quiet then
IDEMessageDialog(lisCircularDependencyDetected,
Format(lisUnableToAddTheDependencyBecauseThisWouldCreateA, [
RequiredPackage.IDAsString, s]),
mtError,[mbCancel]);
exit(mrCancel);
finally
PathList.Free;
end;
end;
end;
ProvidingAPackage:=PackageGraph.FindPackageProvidingName(
LazPackage.FirstRequiredDependency,NewPkgName);
if ProvidingAPackage<>nil then
begin
// package is already provided by another package
DebugLn(['CheckAddingDependency ',LazPackage.Name,' requiring ',NewPkgName,', but is already provided by ',ProvidingAPackage.IDAsString]);
if WarnIfAlreadyThere then
IDEMessageDialog(lisProjAddDependencyAlreadyExists,
Format(lisUnableToAddTheDependencyBecauseThePackageHasAlread, [
RequiredPackage.IDAsString, LazPackage.Name, ProvidingAPackage.Name]),
mtError,[mbCancel]);
exit(mrIgnore);
end;
Result:=mrOk;
end;
function CheckAddingPkgDependency(LazPackage: TLazPackage;
RequiredPkg: TLazPackage; Quiet, WarnIfAlreadyThere: boolean): TModalResult;
var
NewDependency: TPkgDependency;
begin
NewDependency:=TPkgDependency.Create;
try
NewDependency.PackageName:=RequiredPkg.Name;
Result:=CheckAddingDependency(LazPackage,NewDependency,Quiet,WarnIfAlreadyThere);
finally
NewDependency.Free;
end;
end;
{ TAddToPackageDlg }
procedure TAddToPackageDlg.AddToPackageDlgClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
IDEDialogLayoutList.SaveLayout(Self);
end;
procedure TAddToPackageDlg.AddToPackageDlgKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if (Key=VK_ESCAPE) and (Shift=[]) then
ModalResult:=mrCancel;
end;
procedure TAddToPackageDlg.AncestorComboBoxChange(Sender: TObject);
begin
CheckNewCompOk;
end;
procedure TAddToPackageDlg.AncestorComboBoxCloseUp(Sender: TObject);
begin
if fLastNewComponentAncestorType<>AncestorComboBox.Text then
AutoCompleteNewComponent;
end;
procedure TAddToPackageDlg.AncestorShowAllCheckBoxClick(Sender: TObject);
begin
UpdateAvailableAncestorTypes;
end;
procedure TAddToPackageDlg.CancelAddFileButtonClick(Sender: TObject);
begin
ModalResult:=mrCancel;
end;
procedure TAddToPackageDlg.CancelAddUnitButtonClick(Sender: TObject);
begin
ModalResult:=mrCancel;
end;
procedure TAddToPackageDlg.ClassNameEditChange(Sender: TObject);
begin
AutoCompleteNewComponentUnitName;
CheckNewCompOk;
end;
procedure TAddToPackageDlg.ComponentIconBitBtnClick(Sender: TObject);
var
Dlg: TOpenPictureDialog;
begin
Dlg:=TOpenPictureDialog.Create(nil);
try
InputHistories.ApplyFileDialogSettings(Dlg);
Dlg.InitialDir:=LazPackage.GetFileDialogInitialDir(ExtractFilePath(ComponentUnitFileEdit.Text));
Dlg.Title:=lisTitleOpenComponentIcon24x24;
Dlg.Options:=Dlg.Options+[ofPathMustExist];
Dlg.Filter:=Format('%s|*.png|%s|*.bmp|%s|*.xpm|%s|%s',
[dlgFilterImagesPng,
dlgFilterImagesBitmap,
dlgFilterImagesPixmap,
dlgFilterAll, GetAllFilesMask]);
if Dlg.Execute then begin
LoadComponentIcon(Dlg.FileName);
end;
InputHistories.StoreFileDialogSettings(Dlg);
finally
Dlg.Free;
end;
end;
procedure TAddToPackageDlg.ComponentUnitFileBrowseButtonClick(Sender: TObject);
var
SaveDialog: TSaveDialog;
AFilename: string;
begin
SaveDialog:=TSaveDialog.Create(nil);
try
InputHistories.ApplyFileDialogSettings(SaveDialog);
SaveDialog.InitialDir := LazPackage.GetFileDialogInitialDir(SaveDialog.InitialDir);
SaveDialog.Title := lisSaveAs;
SaveDialog.Options := SaveDialog.Options+[ofPathMustExist];
SaveDialog.Filter := Format('%s|*.pas;*.pp', [dlgFilterPascalFile]);
if SaveDialog.Execute then begin
AFilename := CleanAndExpandFilename(SaveDialog.Filename);
if FilenameIsPascalUnit(AFilename) then begin
LazPackage.ShortenFilename(AFilename,true);
ComponentUnitFileEdit.Text := AFilename;
end else begin
IDEMessageDialog(lisA2PInvalidFile,
lisA2PAPascalUnitMustHaveTheExtensionPPOrPas,
mtError,[mbCancel]);
end;
end;
InputHistories.StoreFileDialogSettings(SaveDialog);
finally
SaveDialog.Free;
end;
end;
procedure TAddToPackageDlg.ComponentUnitFileShortenButtonClick(Sender: TObject);
begin
if ''=ComponentUnitFileEdit.Text then exit;
ComponentUnitFileEdit.Text:=SwitchRelativeAbsoluteFilename(ComponentUnitFileEdit.Text);
end;
procedure TAddToPackageDlg.ComponentUnitNameEditChange(Sender: TObject);
begin
CheckNewCompOk;
end;
procedure TAddToPackageDlg.DependPkgNameListBoxSelectionChange(Sender: TObject; User: boolean);
begin
CheckNewReqOk;
end;
procedure TAddToPackageDlg.FilesAddButtonClick(Sender: TObject);
var
i: Integer;
Filename: String;
NewFileType: TPkgFileType;
HasRegisterProc: boolean;
CurParams, LastParams: TAddToPkgResult;
ok: Boolean;
begin
ok:=false;
try
LastParams:=nil;
i:=0;
while i<FilesListView.Items.Count do begin
if not FilesListView.Items[i].Selected then begin
Inc(i);
Continue;
end;
Filename:=FilesListView.Items[i].Caption;
LazPackage.LongenFilename(Filename);
Assert(not DirPathExists(Filename));
if LazPackage.FindPkgFile(Filename,true,false)<>nil then begin
FilesListView.Items.Delete(i); // file already in package
continue;
end;
if LastParams<>nil then begin
LastParams.Next:=TAddToPkgResult.Create;
CurParams:=LastParams.Next;
end else
CurParams:=Params;
CurParams.Clear;
CurParams.AddType:=d2ptFile;
CurParams.UnitFilename:=Filename;
NewFileType:=FileNameToPkgFileType(Filename);
CurParams.FileType:=NewFileType;
if NewFileType=pftUnit then begin
CurParams.AddType:=d2ptUnit;
Include(CurParams.PkgFileFlags,pffAddToPkgUsesSection);
// check filename
if not CheckAddingUnitFilename(LazPackage,CurParams.AddType,
OnGetIDEFileInfo,CurParams.UnitFilename)
then begin
FilesListView.Items.Delete(i);
exit;
end;
CurParams.AutoAddLFMFile:=true;
CurParams.AutoAddLRSFile:=true;
if Assigned(OnGetUnitRegisterInfo) then begin
OnGetUnitRegisterInfo(Self,Filename,CurParams.Unit_Name,HasRegisterProc);
if HasRegisterProc then
Include(CurParams.PkgFileFlags,pffHasRegisterProc);
end;
// check unitname
if CompareText(CurParams.Unit_Name,
ExtractFileNameOnly(CurParams.UnitFilename))<>0
then begin
if IDEMessageDialog(lisA2PInvalidUnitName,
Format(lisA2PTheUnitNameAndFilenameDiffer,
[CurParams.Unit_Name, LineEnding, CurParams.UnitFilename]),
mtError,[mbIgnore,mbCancel])<>mrIgnore
then begin
FilesListView.Items.Delete(i);
exit;
end;
end;
end;
LastParams:=CurParams;
inc(i);
end;
ButtonPanel1.OKButton.Enabled:=FilesListView.SelCount>0;
ok:=LastParams<>nil;
finally
if not ok then Params.Clear;
end;
if LastParams=nil then begin
exit;
end;
ModalResult:=mrOk;
end;
procedure TAddToPackageDlg.FilesDeleteButtonClick(Sender: TObject);
var
i: Integer;
begin
for i:=FilesListView.Items.Count-1 downto 0 do
if FilesListView.Items[i].Selected then
FilesListView.Items.Delete(i);
CheckFilesButtonsOk;
end;
procedure TAddToPackageDlg.FilesDirButtonClick(Sender: TObject);
var
i: Integer;
Files: TStrings;
AFilename: string;
NewListItem: TListItem;
NewPgkFileType: TPkgFileType;
begin
Files:=nil;
try
if ShowAddDirToPkgDialog(LazPackage,Files)<>mrOk then exit;
for i:=0 to Files.Count-1 do begin
AFilename:=Files[i];
if FindFileInFilesList(AFilename)<0 then begin
LazPackage.ShortenFilename(AFilename,true);
NewListItem:=FilesListView.Items.Add;
NewListItem.Caption:=AFilename;
NewPgkFileType:=FileNameToPkgFileType(AFilename);
NewListItem.SubItems.Add(GetPkgFileTypeLocalizedName(NewPgkFileType));
NewListItem.Selected:=True;
end;
end;
CheckFilesButtonsOk;
finally
Files.Free;
end;
end;
procedure TAddToPackageDlg.FilesListViewSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
begin
CheckFilesButtonsOk;
end;
procedure TAddToPackageDlg.FilesShortenButtonClick(Sender: TObject);
var
SwitchToAbsolute: Boolean;
i: Integer;
Filename: String;
begin
if FilesListView.Items.Count=0 then exit;
if (not LazPackage.HasDirectory)
or (not FilenameIsAbsolute(LazPackage.Directory)) then exit;
SwitchToAbsolute:=not FilenameIsAbsolute(FilesListView.Items[0].Caption);
for i:=0 to FilesListView.Items.Count-1 do begin
Filename:=FilesListView.Items[i].Caption;
if SwitchToAbsolute then
Filename:=CreateAbsolutePath(Filename,LazPackage.Directory)
else
Filename:=CreateRelativePath(Filename,LazPackage.Directory);
FilesListView.Items[i].Caption:=Filename;
end;
end;
function TAddToPackageDlg.CheckFilesButtonsOk: Boolean;
begin
FilesDeleteButton.Enabled:=FilesListView.SelCount>0;
Result:=FilesListView.Items.Count>0;
FilesShortenButton.Enabled:=Result;
ButtonPanel1.OKButton.Enabled:=FilesListView.SelCount>0;
end;
procedure TAddToPackageDlg.FormCreate(Sender: TObject);
begin
Caption:=lisA2PAddToPackage;
fPkgComponents:=TAVLTree.Create(@CompareIDEComponentByClassName);
fPackages:=TAVLTree.Create(@CompareLazPackageID);
Params:=TAddToPkgResult.Create;
IDEDialogLayoutList.ApplyLayout(Self,500,300);
SetupComponents;
end;
procedure TAddToPackageDlg.FormDestroy(Sender: TObject);
begin
FreeAndNil(fPkgComponents);
FreeAndNil(fPackages);
FreeAndNil(Params);
end;
procedure TAddToPackageDlg.FormShow(Sender: TObject);
begin
SelectNext(PageControl1.ActivePage, True, True);
end;
procedure TAddToPackageDlg.NewComponentButtonClick(Sender: TObject);
var
PkgFile: TPkgFile;
PkgComponent: TPkgComponent;
ARequiredPackage: TLazPackage;
begin
Params.Clear;
Params.AddType:=d2ptNewComponent;
Params.FileType:=pftUnit;
Params.PkgFileFlags:=[pffHasRegisterProc,pffAddToPkgUsesSection];
Params.AncestorType:=AncestorComboBox.Text;
Params.NewClassName:=ClassNameEdit.Text;
Params.PageName:=PalettePageCombobox.Text;
Params.Unit_Name:=ComponentUnitNameEdit.Text;
Params.UnitFilename:=ComponentUnitFileEdit.Text;
Params.UsedUnitname:='';
Params.IconFile:=FComponentIconFilename;
// check Ancestor Type
if not IsValidIdent(Params.AncestorType) then begin
IDEMessageDialog(lisA2PInvalidAncestorType,
Format(lisA2PTheAncestorTypeIsNotAValidPascalIdentifier, [Params.AncestorType]),
mtError,[mbCancel]);
exit;
end;
// check pagename
if length(Params.PageName)>100 then begin
IDEMessageDialog(lisA2PPageNameTooLong,
Format(lisA2PThePageNameIsTooLongMax100Chars, [Params.PageName]),
mtError,[mbCancel]);
exit;
end;
// check unitname - filename redundancy
if CompareText(Params.Unit_name,ExtractFileNameOnly(Params.UnitFilename))<>0
then begin
IDEMessageDialog(lisA2PUnitNameInvalid,
Format(lisA2PTheUnitNameDoesNotCorrespondToTheFilename, [Params.Unit_Name]),
mtError,[mbCancel]);
exit;
end;
// check classname
if not IsValidIdent(Params.NewClassName) then begin
IDEMessageDialog(lisA2PInvalidClassName,
Format(lisA2PTheClassNameIsNotAValidPascalIdentifier, [Params.NewClassName]),
mtError,[mbCancel]);
exit;
end;
// check classname<>ancestortype
if CompareText(Params.NewClassName,Params.AncestorType)=0 then begin
IDEMessageDialog(lisA2PInvalidCircularDependency,
Format(lisA2PTheClassNameAndAncestorTypeAreTheSame,[Params.NewClassName,Params.AncestorType]),
mtError,[mbCancel]);
exit;
end;
// check ancestor type is not unitname
PkgFile:=PackageGraph.FindUnit(LazPackage,Params.AncestorType,true,true);
if PkgFile<>nil then begin
if IDEMessageDialog(lisA2PAmbiguousAncestorType,
Format(lisA2PTheAncestorTypeHasTheSameNameAsTheUnit,
[Params.AncestorType, LineEnding, PkgFile.Filename]),
mtError,[mbCancel,mbIgnore])<>mrIgnore
then
exit;
end;
// check classname does not interfere with an existing unitname
PkgFile:=PackageGraph.FindUnit(LazPackage,Params.NewClassName,true,true);
if PkgFile<>nil then begin
if IDEMessageDialog(lisA2PAmbiguousClassName,
Format(lisA2PTheClassNameHasTheSameNameAsTheUnit,
[Params.AncestorType, LineEnding, PkgFile.Filename]),
mtError,[mbCancel,mbIgnore])<>mrIgnore
then
exit;
end;
// check if classname already exists
PkgComponent:=TPkgComponent(IDEComponentPalette.FindComponent(Params.NewClassname));
if PkgComponent<>nil then begin
if IDEMessageDialog(lisA2PClassNameAlreadyExists,
Format(lisA2PTheClassNameExistsAlreadyInPackageFile, [Params.NewClassName, LineEnding,
PkgComponent.PkgFile.LazPackage.IDAsString, LineEnding, PkgComponent.PkgFile.Filename]),
mtError,[mbCancel,mbIgnore])<>mrIgnore
then
exit;
end;
// check filename
if not CheckAddingUnitFilename(LazPackage,Params.AddType,
OnGetIDEFileInfo,Params.UnitFilename) then exit;
// create dependency if needed
PkgComponent:=TPkgComponent(IDEComponentPalette.FindComponent(Params.AncestorType));
if PkgComponent<>nil then begin
Params.UsedUnitname:=PkgComponent.GetUnitName;
ARequiredPackage:=PkgComponent.PkgFile.LazPackage;
ARequiredPackage:=TLazPackage(PackageEditingInterface.RedirectPackageDependency(ARequiredPackage));
if (LazPackage<>ARequiredPackage)
and (not LazPackage.Requires(PkgComponent.PkgFile.LazPackage))
then
Params.Dependency:=ARequiredPackage.CreateDependencyWithOwner(nil);
end;
ModalResult:=mrOk;
end;
procedure TAddToPackageDlg.NewComponentPageResize(Sender: TObject);
var
x: Integer;
begin
x:=0;
x:=Max(x,AncestorTypeLabel.Left+AncestorTypeLabel.Width);
x:=Max(x,ClassNameLabel.Left+ClassNameLabel.Width);
x:=Max(x,PalettePageLabel.Left+PalettePageLabel.Width);
x:=Max(x,ComponentUnitFileLabel.Left+ComponentUnitFileLabel.Width);
x:=Max(x,ComponentUnitNameLabel.Left+ComponentUnitNameLabel.Width);
x:=Max(x,ComponentIconLabel.Left+ComponentIconLabel.Width);
AncestorComboBox.Left:=x+6;
end;
procedure TAddToPackageDlg.NewDependButtonClick(Sender: TObject);
var
NewDependency: TPkgDependency;
begin
Params.Clear;
Params.AddType:=d2ptRequiredPkg;
NewDependency:=TPkgDependency.Create;
try
// check minimum version
if DependMinVersionEdit.Text<>'' then begin
if not NewDependency.MinVersion.ReadString(DependMinVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisA2PTheMinimumVersionIsInvalidPleaseUseTheFormatMajor,
[DependMinVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
NewDependency.Flags:=NewDependency.Flags+[pdfMinVersion];
end;
// check maximum version
if DependMaxVersionEdit.Text<>'' then begin
if not NewDependency.MaxVersion.ReadString(DependMaxVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisA2PTheMaximumVersionIsInvalidPleaseUseTheFormatMajor,
[DependMaxVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
NewDependency.Flags:=NewDependency.Flags+[pdfMaxVersion];
end;
NewDependency.PackageName:=DependPkgNameListBox.Items[DependPkgNameListBox.ItemIndex];
ModalResult:=CheckAddingDependency(LazPackage,NewDependency,false,true);
if ModalResult<>mrOk then exit;
// ok
Params.Dependency:=NewDependency;
NewDependency:=nil;
finally
NewDependency.Free;
end;
end;
procedure TAddToPackageDlg.SetLazPackage(const AValue: TLazPackage);
begin
if FLazPackage=AValue then exit;
FLazPackage:=AValue;
Params.Pkg:=FLazPackage;
UpdateAvailableAncestorTypes;
UpdateAvailablePageNames;
UpdateAvailableDependencyNames;
end;
function TAddToPackageDlg.GetActivatePage: TAddToPkgType;
begin
if PageControl1.ActivePage=NewComponentPage then
Result:=d2ptNewComponent
else if PageControl1.ActivePage=NewRequirementPage then
Result:=d2ptRequiredPkg
else {if PageControl1.ActivePage=AddFilesPage then } begin
Assert(PageControl1.ActivePage=AddFilesPage,
'TAddToPackageDlg.GetActivatePage: PageControl1.ActivePage <> AddFilesPage');
Result:=d2ptFiles;
end;
//else
// Result:=d2ptNewFile;
end;
procedure TAddToPackageDlg.SetActivatePage(AValue: TAddToPkgType);
begin
case AValue of
d2ptNewComponent: PageControl1.ActivePage:=NewComponentPage;
d2ptRequiredPkg: PageControl1.ActivePage:=NewRequirementPage;
d2ptFiles: PageControl1.ActivePage:=AddFilesPage;
else raise Exception.Create('TAddToPackageDlg.SetActivatePage: invalid value.');
end;
end;
function TAddToPackageDlg.CheckNewCompOk: Boolean;
begin
Result:=(AncestorComboBox.Text<>'') and (ClassNameEdit.Text<>'') and (ComponentUnitNameEdit.Text<>'');
ButtonPanel1.OKButton.Enabled:=Result;
end;
function TAddToPackageDlg.CheckNewReqOk: Boolean;
begin
Result:=DependPkgNameListBox.ItemIndex>-1;
ButtonPanel1.OKButton.Enabled:=Result;
end;
procedure TAddToPackageDlg.PageControl1Change(Sender: TObject);
begin
case PageControl1.PageIndex of
0: begin // New Component
ButtonPanel1.OkButton.Caption:=lisA2PCreateNewComp;
ButtonPanel1.OkButton.OnClick:=@NewComponentButtonClick;
CheckNewCompOk;
end;
1: begin // New Requirement
ButtonPanel1.OkButton.Caption:=lisA2PCreateNewReq;
ButtonPanel1.OkButton.OnClick:=@NewDependButtonClick;
CheckNewReqOk;
end;
2: begin // Add Files
ButtonPanel1.OkButton.Caption:=lisA2PAddFilesToPackage;
ButtonPanel1.OkButton.OnClick:=@FilesAddButtonClick;
CheckFilesButtonsOk;
end;
end;
end;
procedure TAddToPackageDlg.SetupComponents;
begin
//NewFilePage.Caption:=lisA2PNewFile;
NewComponentPage.Caption:=lisA2PNewComponent;
NewRequirementPage.Caption:=lisProjAddNewRequirement;
AddFilesPage.Caption:=lisA2PAddFiles;
ButtonPanel1.CancelButton.Caption:=lisCancel;
PageControl1.PageIndex:=0;
PageControl1Change(PageControl1);
//SetupNewFilePage;
SetupNewComponentPage;
SetupAddDependencyPage;
SetupAddFilesPage;
end;
procedure TAddToPackageDlg.SetupNewComponentPage;
begin
AncestorTypeLabel.Caption:=lisA2PAncestorType;
AncestorComboBox.Text:='';
AncestorShowAllCheckBox.Caption:=lisA2PShowAll;
ClassNameLabel.Caption:=lisA2PNewClassName;
ClassNameEdit.Text:='';
PalettePageLabel.Caption:=lisA2PPalettePage;
PalettePageCombobox.Text:='';
ComponentUnitFileLabel.Caption:=lisA2PUnitFileName2;
ComponentUnitFileEdit.Text:='';
with ComponentUnitFileBrowseButton do begin
Caption:='...';
ShowHint:=true;
Hint:=lisA2PSaveFileDialog;
end;
with ComponentUnitFileShortenButton do begin
Caption:='<>';
ShowHint:=true;
Hint:=lisA2PShortenOrExpandFilename;
end;
ComponentUnitNameLabel.Caption:=lisA2PUnitName;
ComponentUnitNameEdit.Text:='';
ComponentIconLabel.Caption:=lisA2PIconAndSize;
ComponentIconBitBtn.Width:=ComponentPaletteBtnWidth;
ComponentIconBitBtn.Height:=ComponentPaletteBtnHeight;
end;
procedure TAddToPackageDlg.SetupAddDependencyPage;
begin
DependPkgNameLabel.Caption:=lisProjAddPackageName;
DependMinVersionLabel.Caption:=lisProjAddMinimumVersionOptional;
DependMinVersionEdit.Text:='';
DependMaxVersionLabel.Caption:=lisProjAddMaximumVersionOptional;
DependMaxVersionEdit.Text:='';
end;
procedure TAddToPackageDlg.SetupAddFilesPage;
var
CurColumn: TListColumn;
begin
with FilesListView do begin
CurColumn:=Columns[0];
CurColumn.Width:=200;
CurColumn.Caption:=lisA2PFilename2;
CurColumn:=Columns[1];
CurColumn.Caption:=dlgEnvType;
end;
with FilesDirButton do begin
Caption:=lisAddFilesInDirectory;
LoadGlyphFromResourceName(HInstance, 'pkg_files');
end;
with FilesShortenButton do begin
Caption:=lisA2PSwitchPaths;
ShowHint:=true;
Hint:=lisToggleShowingFilenamesWithFullPathOrWithRelativePa;
end;
with FilesDeleteButton do begin
Caption:=lisDelete;
ShowHint:=true;
Hint:=lisDeleteSelectedFiles;
LoadGlyphFromResourceName(HInstance, 'laz_delete');
end;
LabelIconInfo.Caption:=lisNoneClickToChooseOne;
end;
procedure TAddToPackageDlg.OnIterateComponentClasses(PkgComponent: TPkgComponent);
begin
if fPkgComponents.Find(PkgComponent)=nil then
fPkgComponents.Add(PkgComponent);
end;
procedure TAddToPackageDlg.OnIteratePackages(APackageID: TLazPackageID);
begin
if (APackageID<>LazPackage) and (fPackages.Find(APackageID)=nil) then begin
//DebugLn(['TAddToPackageDlg.OnIteratePackages ',APackageID.IDAsString,' ',DbgSName(APackageID)]);
fPackages.Add(APackageID);
end;
end;
procedure TAddToPackageDlg.AutoCompleteNewComponent;
var
PkgComponent: TPkgComponent;
begin
fLastNewComponentAncestorType:=AncestorComboBox.Text;
if not IsValidIdent(fLastNewComponentAncestorType) then exit;
PkgComponent:=TPkgComponent(
IDEComponentPalette.FindComponent(fLastNewComponentAncestorType));
// create unique classname
if (not IsValidIdent(ClassNameEdit.Text)) or (ClassNameEdit.Text='') then
ClassNameEdit.Text:=IDEComponentPalette.CreateNewClassName(
fLastNewComponentAncestorType);
// choose the same page name
if (PalettePageCombobox.Text='')
and (PkgComponent<>nil) and (PkgComponent.RealPage<>nil) then
PalettePageCombobox.Text:=PkgComponent.RealPage.PageName;
// filename
AutoCompleteNewComponentUnitName;
ButtonPanel1.OkButton.Enabled:=True;
end;
procedure TAddToPackageDlg.AutoCompleteNewComponentUnitName;
var
CurClassName: String;
NewUnitName: String;
NewFileName: String;
begin
// check if update needed
CurClassName:=ClassNameEdit.Text;
if fLastNewComponentClassName=CurClassName then exit;
fLastNewComponentClassName:=CurClassName;
// check classname
if not IsValidIdent(CurClassName) then exit;
// create unitname
NewUnitName:=CurClassName;
if NewUnitName[1]='T' then
NewUnitName:=copy(NewUnitName,2,length(NewUnitName)-1);
NewUnitName:=PackageGraph.CreateUniqueUnitName(NewUnitName);
ComponentUnitNameEdit.Text:=NewUnitName;
// create filename
NewFileName:=NewUnitName;
if EnvironmentOptions.CharcaseFileAction in [ccfaAsk, ccfaAutoRename] then
NewFileName:=lowercase(NewFileName);
// append pascal file extension
NewFileName:=NewFileName
+EnvironmentOpts.PascalExtension[EnvironmentOptions.PascalFileExtension];
// prepend path
if LazPackage.HasDirectory then
NewFileName:=LazPackage.Directory+NewFileName;
ComponentUnitFileEdit.Text:=NewFileName;
end;
function TAddToPackageDlg.SwitchRelativeAbsoluteFilename(const Filename: string
): string;
begin
Result:=Filename;
if (not LazPackage.HasDirectory)
or (not FilenameIsAbsolute(LazPackage.Directory)) then exit;
if FilenameIsAbsolute(Filename) then
Result:=TrimFilename(CreateRelativePath(Filename,LazPackage.Directory))
else
Result:=TrimFilename(CreateAbsoluteSearchPath(Filename,LazPackage.Directory));
end;
function TAddToPackageDlg.FindFileInFilesList(AFilename: string): Integer;
var
i: Integer;
Item: TListItem;
OtherFilename: String;
begin
if not FilenameIsAbsolute(AFilename) then
LazPackage.LongenFilename(AFilename);
for i:=0 to FilesListView.Items.Count-1 do begin
Item:=FilesListView.Items[i];
OtherFilename:=Item.Caption;
if not FilenameIsAbsolute(OtherFilename) then
LazPackage.LongenFilename(OtherFilename);
if CompareFilenames(AFilename,OtherFilename)=0 then begin
Result:=i;
exit;
end;
end;
Result:=-1;
end;
procedure TAddToPackageDlg.LoadComponentIcon(AFilename: string);
var
ShortFilename: String;
Image: TImage;
begin
try
Image:=TImage.Create(nil);
try
Image.Picture.LoadFromFile(AFilename);
ComponentIconBitBtn.Glyph.Assign(Image.Picture.Graphic);
ShortFilename:=AFilename;
LazPackage.ShortenFilename(ShortFilename,true);
LabelIconInfo.Caption:= Format('%s (%dx%d)',
[ShortFilename, ComponentIconBitBtn.Glyph.Width, ComponentIconBitBtn.Glyph.Height]);
FComponentIconFilename:=AFilename;
finally
Image.Free;
end;
except
on E: Exception do begin
IDEMessageDialog(lisCCOErrorCaption,
Format(lisErrorLoadingFile2,[AFilename]) + LineEnding + E.Message,
mtError, [mbCancel]);
ComponentIconBitBtn.Glyph.Clear;
FComponentIconFilename:='';
LabelIconInfo.Caption:=lisNoneClickToChooseOne;
end;
end;
end;
procedure TAddToPackageDlg.UpdateAvailableAncestorTypes;
var
ANode: TAVLTreeNode;
sl: TStringList;
OldAncestorType: String;
begin
// get all available registered components
fPkgComponents.Clear;
if AncestorShowAllCheckBox.Checked then begin
PackageGraph.IterateAllComponentClasses(@OnIterateComponentClasses);
end else begin
PackageGraph.IterateComponentClasses(LazPackage,@OnIterateComponentClasses,
true,true);
end;
// put them into a list
sl:=TStringList.Create;
ANode:=fPkgComponents.FindLowest;
while ANode<>nil do begin
sl.Add(TPkgComponent(ANode.Data).ComponentClass.ClassName);
ANode:=fPkgComponents.FindSuccessor(ANode);
end;
// add at least TComponent
sl.Add('TComponent');
sl.Sort;
// put them into the combobox
OldAncestorType:=AncestorComboBox.Text;
AncestorComboBox.Items.Assign(sl);
AncestorComboBox.Text:=OldAncestorType;
sl.Free;
end;
procedure TAddToPackageDlg.UpdateAvailablePageNames;
var
i: Integer;
APageName: String;
sl: TStringList;
begin
// get all current pagenames (excluding the hidden page)
sl:=TStringList.Create;
for i:=0 to IDEComponentPalette.Pages.Count-1 do begin
APageName:=IDEComponentPalette.Pages[i].PageName;
if APageName<>'' then
sl.Add(APageName);
end;
sl.Sort;
PalettePageCombobox.Items.Assign(sl);
sl.Free;
end;
procedure TAddToPackageDlg.UpdateAvailableDependencyNames;
var
ANode: TAVLTreeNode;
sl: TStringList;
PkgName: String;
Pkg: TLazPackage;
begin
fPackages.Clear;
PackageGraph.IteratePackages(fpfSearchAllExisting,@OnIteratePackages);
sl:=TStringList.Create;
ANode:=fPackages.FindLowest;
while ANode<>nil do begin
Pkg:=TLazPackage(ANode.Data);
PkgName:=Pkg.Name;
if (sl.IndexOf(PkgName)<0) then
sl.Add(PkgName);
ANode:=fPackages.FindSuccessor(ANode);
end;
DependPkgNameFilter.Items.Assign(sl);
DependPkgNameFilter.InvalidateFilter;
sl.Free;
end;
{ TAddToPkgResult }
procedure TAddToPkgResult.Clear;
begin
AddType:=d2ptUnit;
Dependency:=nil;
UnitFilename:='';
Unit_Name:='';
AncestorType:='';
NewClassName:='';
PageName:='';
FileType:=pftUnit;
PkgFileFlags:=[];
UsedUnitname:='';
AutoAddLFMFile:=false;
AutoAddLRSFile:=false;
FreeThenNil(Next);
end;
destructor TAddToPkgResult.Destroy;
begin
FreeThenNil(Next);
inherited Destroy;
end;
end.