From 0dcd66ea61ac4ba161628d317153df28ca04ecfd Mon Sep 17 00:00:00 2001 From: mattias Date: Tue, 8 Apr 2003 22:02:15 +0000 Subject: [PATCH] implemented open package file git-svn-id: trunk@4028 - --- ide/keymapping.pp | 3 ++ ide/lazarusidestrconsts.pas | 2 + ide/mainbar.pas | 10 ++++ packager/packagedefs.pas | 10 ++-- packager/packageeditor.pas | 46 +++++++++++++++++- packager/pkgmanager.pas | 97 +++++++++++++++++++++++++++++-------- 6 files changed, 142 insertions(+), 26 deletions(-) diff --git a/ide/keymapping.pp b/ide/keymapping.pp index 3ee1da2860..c14be4a170 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -196,6 +196,7 @@ const // components menu ecConfigCustomComps = ecUserFirst + 900; ecOpenInstalledPkg = ecUserFirst + 901; + ecOpenPackageFile = ecUserFirst + 902; // help menu ecAboutLazarus = ecUserFirst + 1000; @@ -628,6 +629,7 @@ begin // components menu ecConfigCustomComps : Result:= lisMenuConfigCustomComps; ecOpenInstalledPkg : Result:= lisMenuOpenInstalledPkg; + ecOpenPackageFile : Result:= lisMenuOpenPackageFile; // tools menu ecExtToolSettings : Result:= srkmecExtToolSettings; @@ -1464,6 +1466,7 @@ begin C:=Categories[AddCategory('Components',srkmCatComponentsMenu,caAll)]; Add(C,'Configure custom components',ecConfigCustomComps,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 C:=Categories[AddCategory(KeyCategoryToolMenuName,srkmCatToolMenu,caAll)]; diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 9302af5615..40e5dc57d8 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -208,6 +208,7 @@ resourcestring lisMenuConfigCustomComps = 'Configure custom components'; lisMenuOpenInstalledPkg = 'Open installed package'; lisMenuOpenRecentPkg = 'Open recent package'; + lisMenuOpenPackageFile = 'Open package file'; lisMenuSettings = 'Configure custom tools ...'; lisMenuQuickSyntaxCheck = 'Quick syntax check'; @@ -233,6 +234,7 @@ resourcestring // file dialogs lisOpenFile = 'Open file'; lisOpenProjectFile = 'Open Project File'; + lisOpenPackageFile = 'Open Package File'; lisSaveSpace = 'Save '; lisSelectDFMFiles = 'Select Delphi form files (*.dfm)'; lisChooseDirectory = 'Choose directory'; diff --git a/ide/mainbar.pas b/ide/mainbar.pas index 50e9c4c91f..96ed733d12 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -282,6 +282,7 @@ type // components menu itmCompsConfigCustomComps: TMenuItem; itmPkgOpenInstalled: TMenuItem; + itmPkgOpenPackageFile: TMenuItem; itmPkgOpenRecent: TMenuItem; // tools menu @@ -358,6 +359,7 @@ type Compiling: boolean): TModalResult; function DoBackupFile(const Filename:string; IsPartOfProject:boolean): TModalResult; virtual; abstract; + function DoDeleteAmbigiousFiles(const Filename:string): TModalResult; virtual; abstract; procedure UpdateWindowsMenu; virtual; procedure SaveEnvironment; virtual; abstract; @@ -1087,6 +1089,13 @@ begin mnuComponents.Add(itmPkgOpenInstalled); {$ENDIF} + itmPkgOpenPackageFile := TMenuItem.Create(Self); + itmPkgOpenPackageFile.Name:='itmPkgOpenPackageFile'; + itmPkgOpenPackageFile.Caption := lisMenuOpenPackageFile; + {$IFDEF EnablePkgs} + mnuComponents.Add(itmPkgOpenPackageFile); + {$ENDIF} + itmPkgOpenRecent := TMenuItem.Create(Self); itmPkgOpenRecent.Name:='itmPkgOpenRecent'; itmPkgOpenRecent.Caption := lisMenuOpenRecentPkg; @@ -1297,6 +1306,7 @@ begin // components menu itmCompsConfigCustomComps.ShortCut:=CommandToShortCut(ecConfigCustomComps); itmPkgOpenInstalled.ShortCut:=CommandToShortCut(ecOpenInstalledPkg); + itmPkgOpenPackageFile.ShortCut:=CommandToShortCut(ecOpenPackageFile); // tools menu itmToolConfigure.ShortCut:=CommandToShortCut(ecExtToolSettings); diff --git a/packager/packagedefs.pas b/packager/packagedefs.pas index 7e14aa81cc..5a676a46ca 100644 --- a/packager/packagedefs.pas +++ b/packager/packagedefs.pas @@ -719,8 +719,8 @@ begin XMLConfig.SetDeleteValue(Path+'PackageName/Value',PackageName,''); MaxVersion.SaveToXMLConfig(XMLConfig,Path+'MaxVersion/'); MinVersion.SaveToXMLConfig(XMLConfig,Path+'MinVersion/'); - XMLConfig.SetDeleteValue(Path+'MaxVersion/Value',pdfMaxVersion in FFlags,false); - XMLConfig.SetDeleteValue(Path+'MinVersion/Value',pdfMinVersion in FFlags,false); + XMLConfig.SetDeleteValue(Path+'MaxVersion/Valid',pdfMaxVersion in FFlags,false); + XMLConfig.SetDeleteValue(Path+'MinVersion/Valid',pdfMinVersion in FFlags,false); end; function TPkgDependency.MakeSense: boolean; @@ -1155,7 +1155,7 @@ var NewCount:=XMLConfig.GetValue(ThePath+'Count',0); for i:=0 to NewCount-1 do begin PkgDependency:=TPkgDependency.Create; - PkgDependency.LoadFromXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i)+'/', + PkgDependency.LoadFromXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i+1)+'/', FileVersion); List.Add(PkgDependency); end; @@ -1219,10 +1219,10 @@ procedure TLazPackage.SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string i: Integer; PkgDependency: TPkgDependency; begin - XMLConfig.SetDeleteValue(Path+'Count',List.Count,0); + XMLConfig.SetDeleteValue(ThePath+'Count',List.Count,0); for i:=0 to List.Count-1 do begin PkgDependency:=TPkgDependency(List[i]); - PkgDependency.SaveToXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i)+'/'); + PkgDependency.SaveToXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i+1)+'/'); end; end; diff --git a/packager/packageeditor.pas b/packager/packageeditor.pas index 147541d987..4b3cb5e52d 100644 --- a/packager/packageeditor.pas +++ b/packager/packageeditor.pas @@ -39,8 +39,9 @@ interface uses Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls, Buttons, - LResources, Graphics, LCLType, Menus, LazarusIDEStrConsts, IDEOptionDefs, - IDEDefs, ComponentReg, PackageDefs, AddToPackageDlg, PackageSystem; + LResources, Graphics, LCLType, Menus, Dialogs, LazarusIDEStrConsts, + IDEOptionDefs, IDEDefs, ComponentReg, PackageDefs, AddToPackageDlg, + PackageSystem; type TOnOpenFile = @@ -51,6 +52,7 @@ type function(Sender: TObject; const Params: TAddToPkgResult): TModalResult of object; + { TPackageEditorForm } TPackageEditorForm = class(TBasePackageEditor) @@ -76,6 +78,7 @@ type procedure PackageEditorFormResize(Sender: TObject); procedure RegisteredListBoxDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); + procedure RemoveBitBtnClick(Sender: TObject); procedure SaveBitBtnClick(Sender: TObject); private FLazPackage: TLazPackage; @@ -228,6 +231,7 @@ end; procedure TPackageEditorForm.FilesTreeViewSelectionChanged(Sender: TObject); begin UpdateSelectedFile; + UpdateButtons; end; procedure TPackageEditorForm.OpenFileMenuItemClick(Sender: TObject); @@ -292,6 +296,36 @@ begin 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); begin DoSave; @@ -352,6 +386,9 @@ begin end; end; + + UpdateSelectedFile; + UpdateStatusBar; end; procedure TPackageEditorForm.SetLazPackage(const AValue: TLazPackage); @@ -435,6 +472,7 @@ begin Name:='RemoveBitBtn'; Parent:=Self; Caption:='Remove'; + OnClick:=@RemoveBitBtnClick; end; InstallBitBtn:=TBitBtn.Create(Self); @@ -657,6 +695,8 @@ begin end; if LazPackage.ReadOnly then StatusText:='Read Only: '+StatusText; + if LazPackage.Modified then + StatusText:='Modified: '+StatusText; StatusBar.SimpleText:=StatusText; end; @@ -664,6 +704,8 @@ procedure TPackageEditorForm.DoSave; begin PackageEditors.SavePackage(LazPackage); UpdateButtons; + UpdateTitle; + UpdateStatusBar; end; constructor TPackageEditorForm.Create(TheOwner: TComponent); diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index 190b3f8b8b..5f178c5f17 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -45,7 +45,7 @@ uses MemCheck, {$ENDIF} Classes, SysUtils, LCLProc, Forms, Controls, FileCtrl, Dialogs, Menus, - CodeToolManager, CodeCache, Laz_XMLCfg, + CodeToolManager, CodeCache, Laz_XMLCfg, LazarusIDEStrConsts, KeyMapping, EnvironmentOpts, IDEProcs, ProjectDefs, InputHistory, IDEDefs, UComponentManMain, PackageEditor, AddToPackageDlg, PackageDefs, PackageLinks, PackageSystem, ComponentReg, OpenInstalledPkgDlg, @@ -53,6 +53,7 @@ uses type TPkgManager = class(TBasePkgManager) + procedure MainIDEitmPkgOpenPackageFileClick(Sender: TObject); function OnPackageEditorCreateFile(Sender: TObject; const Params: TAddToPkgResult): TModalResult; procedure OnPackageEditorGetUnitRegisterInfo(Sender: TObject; @@ -93,6 +94,34 @@ implementation { 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; const Params: TAddToPkgResult): TModalResult; var @@ -219,6 +248,7 @@ var NewPkgName: String; ConflictPkg: TLazPackage; PkgFile: TPkgFile; + LowerFilename: String; begin OldPkgFilename:=APackage.Filename; @@ -267,19 +297,29 @@ begin end; // apply naming conventions - if EnvironmentOptions.PascalFileAutoLowerCase then - NewFileName:=ExtractFilePath(NewFilename) - +lowercase(ExtractFileName(NewFilename)); + if lowercase(NewPkgName)<>NewPkgName then begin + LowerFilename:=ExtractFilePath(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); if ConflictPkg<>nil then begin 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 - +'File: "'+ConflictPkg.Filename+'"'#13 - +#13 - +'It is strongly recommended to choose another name.', + +'File: "'+ConflictPkg.Filename+'"', mtInformation,[mbRetry,mbAbort,mbIgnore],0); if Result=mrAbort then exit; if Result<>mrIgnore then continue; // try again @@ -326,13 +366,15 @@ begin APackage.Filename:=NewFilename; // rename package - if AnsiCompareText(NewPkgName,APackage.Name)=0 then begin - // just change in case - APackage.Name:=NewPkgName; - end else begin - // name change -> update package graph - APackage.Name:=NewPkgName; - // ToDo: update package graph + if NewPkgName<>APackage.Name then begin + if AnsiCompareText(NewPkgName,APackage.Name)=0 then begin + // just change the case + APackage.Name:=NewPkgName; + end else begin + // name change -> update package graph + APackage.Name:=NewPkgName; + // ToDo: update package graph + end; end; // clean up old package file to reduce ambigiousities @@ -389,7 +431,10 @@ begin with MainIDE do begin itmCompsConfigCustomComps.OnClick :=@mnuConfigCustomCompsClicked; itmPkgOpenInstalled.OnClick :=@mnuOpenInstalledPckClicked; + itmPkgOpenPackageFile.OnClick:=@MainIDEitmPkgOpenPackageFileClick; end; + + SetRecentPackagesMenu; end; procedure TPkgManager.ConnectSourceNotebookEvents; @@ -404,7 +449,6 @@ end; procedure TPkgManager.SetRecentPackagesMenu; begin -writeln('TPkgManager.SetRecentPackagesMenu ',EnvironmentOptions.RecentPackageFiles.Count); MainIDE.SetRecentSubMenu(MainIDE.itmPkgOpenRecent, EnvironmentOptions.RecentPackageFiles,@mnuOpenRecentPackageClicked); end; @@ -433,7 +477,7 @@ var ConflictPkg: TLazPackage; begin // 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', 'The package name "'+APackage.Name+'" of'#13 +'the file "'+APackage.Filename+'" is invalid.', @@ -509,13 +553,22 @@ begin APackage:=PackageGraph.FindPackageWithFilename(AFilename,true); if APackage=nil then begin // 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 Result:=mrCancel; APackage:=TLazPackage.Create; try // load the package file - APackage.Filename:=AFilename; try XMLConfig:=TXMLConfig.Create(AFilename); try @@ -531,6 +584,8 @@ begin exit; end; end; + APackage.Filename:=AFilename; + APackage.Modified:=false; Result:=AddPackageToGraph(APackage); finally @@ -569,9 +624,13 @@ begin if Result<>mrOk then exit; end; + // backup old file Result:=MainIDE.DoBackupFile(APackage.Filename,false); if Result=mrAbort then exit; + Result:=MainIDE.DoDeleteAmbigiousFiles(APackage.Filename); + if Result=mrAbort then exit; + // save try XMLConfig:=TXMLConfig.Create(APackage.Filename);