implemented open package file

git-svn-id: trunk@4028 -
This commit is contained in:
mattias 2003-04-08 22:02:15 +00:00
parent d2685ce21a
commit 0dcd66ea61
6 changed files with 142 additions and 26 deletions

View File

@ -196,6 +196,7 @@ const
// components menu // components menu
ecConfigCustomComps = ecUserFirst + 900; ecConfigCustomComps = ecUserFirst + 900;
ecOpenInstalledPkg = ecUserFirst + 901; ecOpenInstalledPkg = ecUserFirst + 901;
ecOpenPackageFile = ecUserFirst + 902;
// help menu // help menu
ecAboutLazarus = ecUserFirst + 1000; ecAboutLazarus = ecUserFirst + 1000;
@ -628,6 +629,7 @@ begin
// components menu // components menu
ecConfigCustomComps : Result:= lisMenuConfigCustomComps; ecConfigCustomComps : Result:= lisMenuConfigCustomComps;
ecOpenInstalledPkg : Result:= lisMenuOpenInstalledPkg; ecOpenInstalledPkg : Result:= lisMenuOpenInstalledPkg;
ecOpenPackageFile : Result:= lisMenuOpenPackageFile;
// tools menu // tools menu
ecExtToolSettings : Result:= srkmecExtToolSettings; ecExtToolSettings : Result:= srkmecExtToolSettings;
@ -1464,6 +1466,7 @@ begin
C:=Categories[AddCategory('Components',srkmCatComponentsMenu,caAll)]; C:=Categories[AddCategory('Components',srkmCatComponentsMenu,caAll)];
Add(C,'Configure custom components',ecConfigCustomComps,VK_UNKNOWN,[],VK_UNKNOWN,[]); Add(C,'Configure custom components',ecConfigCustomComps,VK_UNKNOWN,[],VK_UNKNOWN,[]);
Add(C,'Open installed package',ecOpenInstalledPkg,VK_UNKNOWN,[],VK_UNKNOWN,[]); Add(C,'Open installed package',ecOpenInstalledPkg,VK_UNKNOWN,[],VK_UNKNOWN,[]);
Add(C,'Open package file',ecOpenPackageFile,VK_UNKNOWN,[],VK_UNKNOWN,[]);
// tools menu // tools menu
C:=Categories[AddCategory(KeyCategoryToolMenuName,srkmCatToolMenu,caAll)]; C:=Categories[AddCategory(KeyCategoryToolMenuName,srkmCatToolMenu,caAll)];

View File

@ -208,6 +208,7 @@ resourcestring
lisMenuConfigCustomComps = 'Configure custom components'; lisMenuConfigCustomComps = 'Configure custom components';
lisMenuOpenInstalledPkg = 'Open installed package'; lisMenuOpenInstalledPkg = 'Open installed package';
lisMenuOpenRecentPkg = 'Open recent package'; lisMenuOpenRecentPkg = 'Open recent package';
lisMenuOpenPackageFile = 'Open package file';
lisMenuSettings = 'Configure custom tools ...'; lisMenuSettings = 'Configure custom tools ...';
lisMenuQuickSyntaxCheck = 'Quick syntax check'; lisMenuQuickSyntaxCheck = 'Quick syntax check';
@ -233,6 +234,7 @@ resourcestring
// file dialogs // file dialogs
lisOpenFile = 'Open file'; lisOpenFile = 'Open file';
lisOpenProjectFile = 'Open Project File'; lisOpenProjectFile = 'Open Project File';
lisOpenPackageFile = 'Open Package File';
lisSaveSpace = 'Save '; lisSaveSpace = 'Save ';
lisSelectDFMFiles = 'Select Delphi form files (*.dfm)'; lisSelectDFMFiles = 'Select Delphi form files (*.dfm)';
lisChooseDirectory = 'Choose directory'; lisChooseDirectory = 'Choose directory';

View File

@ -282,6 +282,7 @@ type
// components menu // components menu
itmCompsConfigCustomComps: TMenuItem; itmCompsConfigCustomComps: TMenuItem;
itmPkgOpenInstalled: TMenuItem; itmPkgOpenInstalled: TMenuItem;
itmPkgOpenPackageFile: TMenuItem;
itmPkgOpenRecent: TMenuItem; itmPkgOpenRecent: TMenuItem;
// tools menu // tools menu
@ -358,6 +359,7 @@ type
Compiling: boolean): TModalResult; Compiling: boolean): TModalResult;
function DoBackupFile(const Filename:string; function DoBackupFile(const Filename:string;
IsPartOfProject:boolean): TModalResult; virtual; abstract; IsPartOfProject:boolean): TModalResult; virtual; abstract;
function DoDeleteAmbigiousFiles(const Filename:string): TModalResult; virtual; abstract;
procedure UpdateWindowsMenu; virtual; procedure UpdateWindowsMenu; virtual;
procedure SaveEnvironment; virtual; abstract; procedure SaveEnvironment; virtual; abstract;
@ -1087,6 +1089,13 @@ begin
mnuComponents.Add(itmPkgOpenInstalled); mnuComponents.Add(itmPkgOpenInstalled);
{$ENDIF} {$ENDIF}
itmPkgOpenPackageFile := TMenuItem.Create(Self);
itmPkgOpenPackageFile.Name:='itmPkgOpenPackageFile';
itmPkgOpenPackageFile.Caption := lisMenuOpenPackageFile;
{$IFDEF EnablePkgs}
mnuComponents.Add(itmPkgOpenPackageFile);
{$ENDIF}
itmPkgOpenRecent := TMenuItem.Create(Self); itmPkgOpenRecent := TMenuItem.Create(Self);
itmPkgOpenRecent.Name:='itmPkgOpenRecent'; itmPkgOpenRecent.Name:='itmPkgOpenRecent';
itmPkgOpenRecent.Caption := lisMenuOpenRecentPkg; itmPkgOpenRecent.Caption := lisMenuOpenRecentPkg;
@ -1297,6 +1306,7 @@ begin
// components menu // components menu
itmCompsConfigCustomComps.ShortCut:=CommandToShortCut(ecConfigCustomComps); itmCompsConfigCustomComps.ShortCut:=CommandToShortCut(ecConfigCustomComps);
itmPkgOpenInstalled.ShortCut:=CommandToShortCut(ecOpenInstalledPkg); itmPkgOpenInstalled.ShortCut:=CommandToShortCut(ecOpenInstalledPkg);
itmPkgOpenPackageFile.ShortCut:=CommandToShortCut(ecOpenPackageFile);
// tools menu // tools menu
itmToolConfigure.ShortCut:=CommandToShortCut(ecExtToolSettings); itmToolConfigure.ShortCut:=CommandToShortCut(ecExtToolSettings);

View File

@ -719,8 +719,8 @@ begin
XMLConfig.SetDeleteValue(Path+'PackageName/Value',PackageName,''); XMLConfig.SetDeleteValue(Path+'PackageName/Value',PackageName,'');
MaxVersion.SaveToXMLConfig(XMLConfig,Path+'MaxVersion/'); MaxVersion.SaveToXMLConfig(XMLConfig,Path+'MaxVersion/');
MinVersion.SaveToXMLConfig(XMLConfig,Path+'MinVersion/'); MinVersion.SaveToXMLConfig(XMLConfig,Path+'MinVersion/');
XMLConfig.SetDeleteValue(Path+'MaxVersion/Value',pdfMaxVersion in FFlags,false); XMLConfig.SetDeleteValue(Path+'MaxVersion/Valid',pdfMaxVersion in FFlags,false);
XMLConfig.SetDeleteValue(Path+'MinVersion/Value',pdfMinVersion in FFlags,false); XMLConfig.SetDeleteValue(Path+'MinVersion/Valid',pdfMinVersion in FFlags,false);
end; end;
function TPkgDependency.MakeSense: boolean; function TPkgDependency.MakeSense: boolean;
@ -1155,7 +1155,7 @@ var
NewCount:=XMLConfig.GetValue(ThePath+'Count',0); NewCount:=XMLConfig.GetValue(ThePath+'Count',0);
for i:=0 to NewCount-1 do begin for i:=0 to NewCount-1 do begin
PkgDependency:=TPkgDependency.Create; PkgDependency:=TPkgDependency.Create;
PkgDependency.LoadFromXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i)+'/', PkgDependency.LoadFromXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i+1)+'/',
FileVersion); FileVersion);
List.Add(PkgDependency); List.Add(PkgDependency);
end; end;
@ -1219,10 +1219,10 @@ procedure TLazPackage.SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string
i: Integer; i: Integer;
PkgDependency: TPkgDependency; PkgDependency: TPkgDependency;
begin begin
XMLConfig.SetDeleteValue(Path+'Count',List.Count,0); XMLConfig.SetDeleteValue(ThePath+'Count',List.Count,0);
for i:=0 to List.Count-1 do begin for i:=0 to List.Count-1 do begin
PkgDependency:=TPkgDependency(List[i]); PkgDependency:=TPkgDependency(List[i]);
PkgDependency.SaveToXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i)+'/'); PkgDependency.SaveToXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i+1)+'/');
end; end;
end; end;

View File

@ -39,8 +39,9 @@ interface
uses uses
Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls, Buttons, Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls, Buttons,
LResources, Graphics, LCLType, Menus, LazarusIDEStrConsts, IDEOptionDefs, LResources, Graphics, LCLType, Menus, Dialogs, LazarusIDEStrConsts,
IDEDefs, ComponentReg, PackageDefs, AddToPackageDlg, PackageSystem; IDEOptionDefs, IDEDefs, ComponentReg, PackageDefs, AddToPackageDlg,
PackageSystem;
type type
TOnOpenFile = TOnOpenFile =
@ -51,6 +52,7 @@ type
function(Sender: TObject; function(Sender: TObject;
const Params: TAddToPkgResult): TModalResult of object; const Params: TAddToPkgResult): TModalResult of object;
{ TPackageEditorForm } { TPackageEditorForm }
TPackageEditorForm = class(TBasePackageEditor) TPackageEditorForm = class(TBasePackageEditor)
@ -76,6 +78,7 @@ type
procedure PackageEditorFormResize(Sender: TObject); procedure PackageEditorFormResize(Sender: TObject);
procedure RegisteredListBoxDrawItem(Control: TWinControl; Index: Integer; procedure RegisteredListBoxDrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState); ARect: TRect; State: TOwnerDrawState);
procedure RemoveBitBtnClick(Sender: TObject);
procedure SaveBitBtnClick(Sender: TObject); procedure SaveBitBtnClick(Sender: TObject);
private private
FLazPackage: TLazPackage; FLazPackage: TLazPackage;
@ -228,6 +231,7 @@ end;
procedure TPackageEditorForm.FilesTreeViewSelectionChanged(Sender: TObject); procedure TPackageEditorForm.FilesTreeViewSelectionChanged(Sender: TObject);
begin begin
UpdateSelectedFile; UpdateSelectedFile;
UpdateButtons;
end; end;
procedure TPackageEditorForm.OpenFileMenuItemClick(Sender: TObject); procedure TPackageEditorForm.OpenFileMenuItemClick(Sender: TObject);
@ -292,6 +296,36 @@ begin
end; end;
end; end;
procedure TPackageEditorForm.RemoveBitBtnClick(Sender: TObject);
var
ANode: TTreeNode;
NodeIndex: Integer;
CurFile: TPkgFile;
begin
ANode:=FilesTreeView.Selected;
if (ANode=nil) or LazPackage.ReadOnly then begin
UpdateButtons;
exit;
end;
NodeIndex:=ANode.Index;
if ANode.Parent=FilesNode then begin
// get current package file
CurFile:=LazPackage.Files[NodeIndex];
if CurFile=nil then exit;
if MessageDlg('Remove file?',
'Remove file "'+CurFile.Filename+'"'#13
+'from package "'+LazPackage.IDAsString+'"?',
mtConfirmation,[mbYes,mbNo],0)=mrNo
then
exit;
// ToDo
end else if ANode.Parent=RequiredPackagesNode then begin
end;
end;
procedure TPackageEditorForm.SaveBitBtnClick(Sender: TObject); procedure TPackageEditorForm.SaveBitBtnClick(Sender: TObject);
begin begin
DoSave; DoSave;
@ -352,6 +386,9 @@ begin
end; end;
end; end;
UpdateSelectedFile;
UpdateStatusBar;
end; end;
procedure TPackageEditorForm.SetLazPackage(const AValue: TLazPackage); procedure TPackageEditorForm.SetLazPackage(const AValue: TLazPackage);
@ -435,6 +472,7 @@ begin
Name:='RemoveBitBtn'; Name:='RemoveBitBtn';
Parent:=Self; Parent:=Self;
Caption:='Remove'; Caption:='Remove';
OnClick:=@RemoveBitBtnClick;
end; end;
InstallBitBtn:=TBitBtn.Create(Self); InstallBitBtn:=TBitBtn.Create(Self);
@ -657,6 +695,8 @@ begin
end; end;
if LazPackage.ReadOnly then if LazPackage.ReadOnly then
StatusText:='Read Only: '+StatusText; StatusText:='Read Only: '+StatusText;
if LazPackage.Modified then
StatusText:='Modified: '+StatusText;
StatusBar.SimpleText:=StatusText; StatusBar.SimpleText:=StatusText;
end; end;
@ -664,6 +704,8 @@ procedure TPackageEditorForm.DoSave;
begin begin
PackageEditors.SavePackage(LazPackage); PackageEditors.SavePackage(LazPackage);
UpdateButtons; UpdateButtons;
UpdateTitle;
UpdateStatusBar;
end; end;
constructor TPackageEditorForm.Create(TheOwner: TComponent); constructor TPackageEditorForm.Create(TheOwner: TComponent);

View File

@ -45,7 +45,7 @@ uses
MemCheck, MemCheck,
{$ENDIF} {$ENDIF}
Classes, SysUtils, LCLProc, Forms, Controls, FileCtrl, Dialogs, Menus, Classes, SysUtils, LCLProc, Forms, Controls, FileCtrl, Dialogs, Menus,
CodeToolManager, CodeCache, Laz_XMLCfg, CodeToolManager, CodeCache, Laz_XMLCfg, LazarusIDEStrConsts,
KeyMapping, EnvironmentOpts, IDEProcs, ProjectDefs, InputHistory, KeyMapping, EnvironmentOpts, IDEProcs, ProjectDefs, InputHistory,
IDEDefs, UComponentManMain, PackageEditor, AddToPackageDlg, PackageDefs, IDEDefs, UComponentManMain, PackageEditor, AddToPackageDlg, PackageDefs,
PackageLinks, PackageSystem, ComponentReg, OpenInstalledPkgDlg, PackageLinks, PackageSystem, ComponentReg, OpenInstalledPkgDlg,
@ -53,6 +53,7 @@ uses
type type
TPkgManager = class(TBasePkgManager) TPkgManager = class(TBasePkgManager)
procedure MainIDEitmPkgOpenPackageFileClick(Sender: TObject);
function OnPackageEditorCreateFile(Sender: TObject; function OnPackageEditorCreateFile(Sender: TObject;
const Params: TAddToPkgResult): TModalResult; const Params: TAddToPkgResult): TModalResult;
procedure OnPackageEditorGetUnitRegisterInfo(Sender: TObject; procedure OnPackageEditorGetUnitRegisterInfo(Sender: TObject;
@ -93,6 +94,34 @@ implementation
{ TPkgManager } { TPkgManager }
procedure TPkgManager.MainIDEitmPkgOpenPackageFileClick(Sender: TObject);
var
OpenDialog: TOpenDialog;
AFilename: string;
I: Integer;
OpenFlags: TPkgOpenFlags;
begin
OpenDialog:=TOpenDialog.Create(Application);
try
InputHistories.ApplyFileDialogSettings(OpenDialog);
OpenDialog.Title:=lisOpenPackageFile;
OpenDialog.Options:=OpenDialog.Options+[ofAllowMultiSelect];
if OpenDialog.Execute and (OpenDialog.Files.Count>0) then begin
OpenFlags:=[pofAddToRecent];
For I := 0 to OpenDialog.Files.Count-1 do
Begin
AFilename:=CleanAndExpandFilename(OpenDialog.Files.Strings[i]);
if DoOpenPackageFile(AFilename,OpenFlags)=mrAbort then begin
break;
end;
end;
end;
InputHistories.StoreFileDialogSettings(OpenDialog);
finally
OpenDialog.Free;
end;
end;
function TPkgManager.OnPackageEditorCreateFile(Sender: TObject; function TPkgManager.OnPackageEditorCreateFile(Sender: TObject;
const Params: TAddToPkgResult): TModalResult; const Params: TAddToPkgResult): TModalResult;
var var
@ -219,6 +248,7 @@ var
NewPkgName: String; NewPkgName: String;
ConflictPkg: TLazPackage; ConflictPkg: TLazPackage;
PkgFile: TPkgFile; PkgFile: TPkgFile;
LowerFilename: String;
begin begin
OldPkgFilename:=APackage.Filename; OldPkgFilename:=APackage.Filename;
@ -267,19 +297,29 @@ begin
end; end;
// apply naming conventions // apply naming conventions
if EnvironmentOptions.PascalFileAutoLowerCase then if lowercase(NewPkgName)<>NewPkgName then begin
NewFileName:=ExtractFilePath(NewFilename) LowerFilename:=ExtractFilePath(NewFilename)
+lowercase(ExtractFileName(NewFilename)); +lowercase(ExtractFileName(NewFilename));
if EnvironmentOptions.PascalFileAskLowerCase then begin
if MessageDlg('Rename File lowercase?',
'Should the file renamed lowercase to'#13
+'"'+LowerFilename+'"?',
mtConfirmation,[mbYes,mbNo],0)=mrYes
then
NewFileName:=LowerFilename;
end else begin
if EnvironmentOptions.PascalFileAutoLowerCase then
NewFileName:=LowerFilename;
end;
end;
// check package name conflicts // check package name conflict
ConflictPkg:=PackageGraph.FindAPackageWithName(NewPkgName,APackage); ConflictPkg:=PackageGraph.FindAPackageWithName(NewPkgName,APackage);
if ConflictPkg<>nil then begin if ConflictPkg<>nil then begin
Result:=MessageDlg('Package name already exists', Result:=MessageDlg('Package name already exists',
'The package name "'+NewPkgName+'" already exists.'#13 'There is already another package with the name "'+NewPkgName+'".'#13
+'Conflict package: "'+ConflictPkg.IDAsString+'"'#13 +'Conflict package: "'+ConflictPkg.IDAsString+'"'#13
+'File: "'+ConflictPkg.Filename+'"'#13 +'File: "'+ConflictPkg.Filename+'"',
+#13
+'It is strongly recommended to choose another name.',
mtInformation,[mbRetry,mbAbort,mbIgnore],0); mtInformation,[mbRetry,mbAbort,mbIgnore],0);
if Result=mrAbort then exit; if Result=mrAbort then exit;
if Result<>mrIgnore then continue; // try again if Result<>mrIgnore then continue; // try again
@ -326,13 +366,15 @@ begin
APackage.Filename:=NewFilename; APackage.Filename:=NewFilename;
// rename package // rename package
if AnsiCompareText(NewPkgName,APackage.Name)=0 then begin if NewPkgName<>APackage.Name then begin
// just change in case if AnsiCompareText(NewPkgName,APackage.Name)=0 then begin
APackage.Name:=NewPkgName; // just change the case
end else begin APackage.Name:=NewPkgName;
// name change -> update package graph end else begin
APackage.Name:=NewPkgName; // name change -> update package graph
// ToDo: update package graph APackage.Name:=NewPkgName;
// ToDo: update package graph
end;
end; end;
// clean up old package file to reduce ambigiousities // clean up old package file to reduce ambigiousities
@ -389,7 +431,10 @@ begin
with MainIDE do begin with MainIDE do begin
itmCompsConfigCustomComps.OnClick :=@mnuConfigCustomCompsClicked; itmCompsConfigCustomComps.OnClick :=@mnuConfigCustomCompsClicked;
itmPkgOpenInstalled.OnClick :=@mnuOpenInstalledPckClicked; itmPkgOpenInstalled.OnClick :=@mnuOpenInstalledPckClicked;
itmPkgOpenPackageFile.OnClick:=@MainIDEitmPkgOpenPackageFileClick;
end; end;
SetRecentPackagesMenu;
end; end;
procedure TPkgManager.ConnectSourceNotebookEvents; procedure TPkgManager.ConnectSourceNotebookEvents;
@ -404,7 +449,6 @@ end;
procedure TPkgManager.SetRecentPackagesMenu; procedure TPkgManager.SetRecentPackagesMenu;
begin begin
writeln('TPkgManager.SetRecentPackagesMenu ',EnvironmentOptions.RecentPackageFiles.Count);
MainIDE.SetRecentSubMenu(MainIDE.itmPkgOpenRecent, MainIDE.SetRecentSubMenu(MainIDE.itmPkgOpenRecent,
EnvironmentOptions.RecentPackageFiles,@mnuOpenRecentPackageClicked); EnvironmentOptions.RecentPackageFiles,@mnuOpenRecentPackageClicked);
end; end;
@ -433,7 +477,7 @@ var
ConflictPkg: TLazPackage; ConflictPkg: TLazPackage;
begin begin
// check Package Name // check Package Name
if not IsValidIdent(APackage.Name) then begin if (APackage.Name='') or (not IsValidIdent(APackage.Name)) then begin
Result:=MessageDlg('Invalid Package Name', Result:=MessageDlg('Invalid Package Name',
'The package name "'+APackage.Name+'" of'#13 'The package name "'+APackage.Name+'" of'#13
+'the file "'+APackage.Filename+'" is invalid.', +'the file "'+APackage.Filename+'" is invalid.',
@ -509,13 +553,22 @@ begin
APackage:=PackageGraph.FindPackageWithFilename(AFilename,true); APackage:=PackageGraph.FindPackageWithFilename(AFilename,true);
if APackage=nil then begin if APackage=nil then begin
// package not yet loaded // package not yet loaded
if not FileExists(AFilename) then begin
MessageDlg('File not found',
'File "'+AFilename+'" not found.',
mtError,[mbCancel],0);
RemoveFromRecentList(AFilename,EnvironmentOptions.RecentPackageFiles);
SetRecentPackagesMenu;
Result:=mrCancel;
exit;
end;
// create a new package // create a new package
Result:=mrCancel; Result:=mrCancel;
APackage:=TLazPackage.Create; APackage:=TLazPackage.Create;
try try
// load the package file // load the package file
APackage.Filename:=AFilename;
try try
XMLConfig:=TXMLConfig.Create(AFilename); XMLConfig:=TXMLConfig.Create(AFilename);
try try
@ -531,6 +584,8 @@ begin
exit; exit;
end; end;
end; end;
APackage.Filename:=AFilename;
APackage.Modified:=false;
Result:=AddPackageToGraph(APackage); Result:=AddPackageToGraph(APackage);
finally finally
@ -569,9 +624,13 @@ begin
if Result<>mrOk then exit; if Result<>mrOk then exit;
end; end;
// backup old file
Result:=MainIDE.DoBackupFile(APackage.Filename,false); Result:=MainIDE.DoBackupFile(APackage.Filename,false);
if Result=mrAbort then exit; if Result=mrAbort then exit;
Result:=MainIDE.DoDeleteAmbigiousFiles(APackage.Filename);
if Result=mrAbort then exit;
// save // save
try try
XMLConfig:=TXMLConfig.Create(APackage.Filename); XMLConfig:=TXMLConfig.Create(APackage.Filename);