lazarus/packager/addfiletoapackagedlg.pas

261 lines
7.9 KiB
ObjectPascal

{ $Id$ }
{
/***************************************************************************
addfiletoapackagedlg.pas
------------------------
***************************************************************************/
***************************************************************************
* *
* 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
The dialog for selecting the package to add a file to.
}
unit AddFileToAPackageDlg;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, AVL_Tree,
// LCL
Forms, Controls, StdCtrls, Dialogs, ButtonPanel,
// LazUtils
FileUtil, LazFileUtils,
// IdeIntf
IdeIntfStrConsts, IDEWindowIntf, PackageIntf, IDEHelpIntf,
// IDE
LazarusIDEStrConsts, PackageDefs, PackageSystem, EnvironmentOpts;
type
{ TAddFileToAPackageDialog }
TAddFileToAPackageDialog = class(TForm)
BtnPanel: TButtonPanel;
FileNameEdit: TEdit;
FileGroupBox: TGroupBox;
PackagesGroupBox: TGroupBox;
PackagesComboBox: TComboBox;
ShowAllCheckBox: TCheckBox;
procedure AddFileToAPackageDlgClose(Sender: TObject;
var {%H-}CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure HelpButtonClick(Sender: TObject);
procedure OkButtonClick(Sender: TObject);
procedure PackagesGroupBoxResize(Sender: TObject);
procedure ShowAllCheckBoxClick(Sender: TObject);
private
fPackages: TAVLTree;// tree of TLazPackage
function GetFilename: string;
procedure SetFilename(const AValue: string);
procedure SetupComponents;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure UpdateAvailablePackages;
property Filename: string read GetFilename write SetFilename;
end;
function ShowAddFileToAPackageDlg(const Filename: string): TModalResult;
implementation
{$R *.lfm}
function ShowAddFileToAPackageDlg(const Filename: string): TModalResult;
var
AddFileToAPackageDialog: TAddFileToAPackageDialog;
begin
AddFileToAPackageDialog:=TAddFileToAPackageDialog.Create(nil);
AddFileToAPackageDialog.Filename:=Filename;
AddFileToAPackageDialog.UpdateAvailablePackages;
Result:=AddFileToAPackageDialog.ShowModal;
AddFileToAPackageDialog.Free;
end;
{ TAddFileToAPackageDialog }
procedure TAddFileToAPackageDialog.AddFileToAPackageDlgClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
IDEDialogLayoutList.SaveLayout(Self);
end;
procedure TAddFileToAPackageDialog.HelpButtonClick(Sender: TObject);
begin
LazarusHelp.ShowHelpForIDEControl(Self);
end;
procedure TAddFileToAPackageDialog.OkButtonClick(Sender: TObject);
var
PkgID: TLazPackageID;
APackage: TLazPackage;
aFilename: String;
NewUnitPaths, NewIncPaths: String;
begin
aFilename:=Filename;
PkgID:=TLazPackageID.Create;
try
// check package ID
if not PkgID.StringToID(PackagesComboBox.Text) then begin
MessageDlg(lisAF2PInvalidPackage,
Format(lisAF2PInvalidPackageID, [PackagesComboBox.Text]),
mtError,[mbCancel],0);
exit;
end;
// search package
APackage:=PackageGraph.FindPackageWithID(PkgID);
if APackage=nil then begin
MessageDlg(lisProjAddPackageNotFound,
Format(lisAF2PPackageNotFound, [PkgID.IDAsString]),
mtError,[mbCancel],0);
exit;
end;
// check if package is readonly
if APackage.ReadOnly then begin
MessageDlg(lisAF2PPackageIsReadOnly,
Format(lisAF2PThePackageIsReadOnly, [APackage.IDAsString]),
mtError,[mbCancel],0);
exit;
end;
// ok -> add file to package
APackage.BeginUpdate;
NewUnitPaths:='';
NewIncPaths:='';
APackage.AddFileByName(aFilename, NewUnitPaths, NewIncPaths);
// extend unit and include search path
if not APackage.ExtendUnitSearchPath(NewUnitPaths) then exit;
if not APackage.ExtendIncSearchPath(NewIncPaths) then exit;
if APackage.Editor<>nil then APackage.Editor.UpdateAll(true);
APackage.EndUpdate;
ModalResult:=mrOk;
finally
PkgID.Free;
end;
end;
procedure TAddFileToAPackageDialog.PackagesGroupBoxResize(Sender: TObject);
begin
with ShowAllCheckBox do
SetBounds(10,30,200,Height);
end;
procedure TAddFileToAPackageDialog.ShowAllCheckBoxClick(Sender: TObject);
begin
UpdateAvailablePackages;
end;
procedure TAddFileToAPackageDialog.SetupComponents;
begin
FileGroupBox.Caption:=lisFile;
FileNameEdit.Text:='';
PackagesGroupBox.Caption:=lisAF2PDestinationPackage;
ShowAllCheckBox.Caption:=lisAF2PShowAll;
BtnPanel.OkButton.Caption:=lisBtnOk;
BtnPanel.OkButton.OnClick:=@OkButtonClick;
BtnPanel.OkButton.ModalResult:=mrNone;
BtnPanel.HelpButton.OnClick:=@HelpButtonClick;
end;
procedure TAddFileToAPackageDialog.SetFilename(const AValue: string);
begin
if FileNameEdit.Text=AValue then exit;
FileNameEdit.Text:=AValue;
end;
function TAddFileToAPackageDialog.GetFilename: string;
begin
Result:=FileNameEdit.Text;
end;
constructor TAddFileToAPackageDialog.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
Caption:=lisAF2PAddFileToAPackage;
fPackages:=TAVLTree.Create(@CompareLazPackageID);
IDEDialogLayoutList.ApplyLayout(Self,448,280);
SetupComponents;
end;
destructor TAddFileToAPackageDialog.Destroy;
begin
FreeAndNil(fPackages);
inherited Destroy;
end;
procedure TAddFileToAPackageDialog.FormCreate(Sender: TObject);
begin
PackagesComboBox.DropDownCount:=EnvironmentOptions.DropDownCount;
end;
procedure TAddFileToAPackageDialog.UpdateAvailablePackages;
var
i: Integer;
APackage: TLazPackage;
AFilename: String;
ADirectory: String;
sl: TStringList;
ANode: TAVLTreeNode;
begin
fPackages.Clear;
AFilename:=Filename;
ADirectory:=ExtractFilePath(Filename);
for i:=0 to PackageGraph.Count-1 do begin
APackage:=PackageGraph[i];
// skip readonly packages
if APackage.ReadOnly then continue;
// skip packages, that already contains the file
if APackage.FindPkgFile(AFilename,true,false)<>nil then continue;
if not ShowAllCheckBox.Checked then begin
// skip packages, where the filename is not in the package directory
// or one of its source directories
if (not FileIsInPath(AFilename,APackage.Directory))
and (APackage.SourceDirectories.GetFileReference(ADirectory)=nil) then
continue;
end;
fPackages.Add(APackage);
end;
sl:=TStringList.Create;
ANode:=fPackages.FindLowest;
while ANode<>nil do begin
sl.Add(TLazPackage(ANode.Data).IDAsString);
ANode:=fPackages.FindSuccessor(ANode);
end;
PackagesComboBox.Items.Assign(sl);
if PackagesComboBox.Items.Count>0 then
PackagesComboBox.Text:=PackagesComboBox.Items[0]
else
PackagesComboBox.Text:='';
sl.Free;
end;
end.