auto clean/create .lrs file on creating custom .lfm file

git-svn-id: trunk@7209 -
This commit is contained in:
mattias 2005-05-28 11:25:17 +00:00
parent 7a200176dc
commit 1917ac9586
8 changed files with 216 additions and 46 deletions

View File

@ -2031,7 +2031,7 @@ begin
Exclude(fStateFlags, sfIgnoreNextChar);
{$IFDEF SYN_LAZARUS}
// Key was handled anyway, so eat it!
// MG: the comment was right, the implmentation not consequently enough
// MG: the comment was right, the implementation not consequent enough
Key:=#0;
{$ENDIF}
end;

View File

@ -198,7 +198,7 @@ procedure CheckList(List: TList; TestListNil, TestDoubles, TestNils: boolean);
procedure CheckEmptyListCut(List1, List2: TList);
function AnsiSearchInStringList(List: TStrings; const s: string): integer;
procedure ReverseList(List: TList);
procedure FreeListObjects(List: TList; FreeList: boolean);
implementation
@ -1199,6 +1199,17 @@ begin
end;
end;
procedure FreeListObjects(List: TList; FreeList: boolean);
var
i: Integer;
begin
for i:=0 to List.Count-1 do
TObject(List[i]).Free;
List.Clear;
if FreeList then
List.Free;
end;
{-------------------------------------------------------------------------------
function TrimSearchPath(const SearchPath, BaseDirectory: string): boolean;

View File

@ -4761,6 +4761,15 @@ begin
NewBuffer.Source:=BeautifySrc(NewSource)
else
NewBuffer.Source:=NewSource;
if (NewFileDescriptor.ResourceClass<>nil)
or (CompareFileExt(NewBuffer.Filename,'.lfm')=0) then begin
// create/clean the .lrs file
NewResBuffer:=CodeToolBoss.CreateFile(
ChangeFileExt(NewFilename,ResourceFileExt));
if NewResBuffer=nil then begin
RaiseException('TMainIDE.DoNewEditorFile Internal error');
end;
end;
NewUnitInfo.Modified:=true;
end;
@ -11626,6 +11635,9 @@ end.
{ =============================================================================
$Log$
Revision 1.869 2005/05/28 11:25:17 mattias
auto clean/create .lrs file on creating custom .lfm file
Revision 1.868 2005/05/27 21:08:31 mattias
implemented automatic update of TUnitInfo.HasResource on save project

View File

@ -1827,10 +1827,11 @@ function TProject.NewUniqueComponentName(const AComponentPrefix: string
var i: integer;
begin
Result:=true;
if GetClass(AComponentName)<>nil then exit;
for i:=0 to UnitCount-1 do begin
if (Units[i].Component<>nil) then begin
if AnsiCompareText(Units[i].Component.Name,AComponentName)=0 then exit;
if AnsiCompareText(Units[i].Component.ClassName,'T'+AComponentName)=0
if CompareText(Units[i].Component.Name,AComponentName)=0 then exit;
if CompareText(Units[i].Component.ClassName,'T'+AComponentName)=0
then exit;
end else if (Units[i].ComponentName<>'')
and ((Units[i].IsPartOfProject) or (Units[i].Loaded)) then begin
@ -3175,6 +3176,9 @@ end.
{
$Log$
Revision 1.185 2005/05/28 11:25:17 mattias
auto clean/create .lrs file on creating custom .lfm file
Revision 1.184 2005/05/26 20:17:49 mattias
added TLazProject.ProjectInfoFile, fixed saving editor files if deleted

View File

@ -648,7 +648,7 @@ begin
FDefaultResourceName:=''
else begin
FDefaultResourceName:=
copy(FResourceClass.ClassName,2,length(FResourceClass.ClassName)-1);
copy(FResourceClass.ClassName,2,length(FResourceClass.ClassName)-1)+'1';
end;
end;

View File

@ -45,6 +45,11 @@ uses
PackageDefs, PackageSystem;
type
TOnCheckInstallPackageList =
procedure(PkgIDs: TList; var Ok: boolean) of object;
{ TInstallPkgSetDialog }
TInstallPkgSetDialog = class(TForm)
AddToInstallButton: TButton;
AvailableListBox: TListBox;
@ -71,6 +76,7 @@ type
private
FNewInstalledPackages: TList;
FOldInstalledPackages: TPkgDependency;
FOnCheckInstallPackageList: TOnCheckInstallPackageList;
fPackages: TAVLTree;// tree of TLazPackageID (all available packages and links)
FRebuildIDE: boolean;
procedure SetOldInstalledPackages(const AValue: TPkgDependency);
@ -93,15 +99,19 @@ type
write SetOldInstalledPackages;
property NewInstalledPackages: TList read FNewInstalledPackages;
property RebuildIDE: boolean read FRebuildIDE write FRebuildIDE;
property OnCheckInstallPackageList: TOnCheckInstallPackageList
read FOnCheckInstallPackageList write FOnCheckInstallPackageList;
end;
function ShowEditInstallPkgsDialog(OldInstalledPackages: TPkgDependency;
CheckInstallPackageList: TOnCheckInstallPackageList;
var NewInstalledPackages: TList; // list of TLazPackageID (must be freed)
var RebuildIDE: boolean): TModalResult;
implementation
function ShowEditInstallPkgsDialog(OldInstalledPackages: TPkgDependency;
CheckInstallPackageList: TOnCheckInstallPackageList;
var NewInstalledPackages: TList; // list of TLazPackageID
var RebuildIDE: boolean): TModalResult;
var
@ -112,6 +122,7 @@ begin
InstallPkgSetDialog.OldInstalledPackages:=OldInstalledPackages;
InstallPkgSetDialog.UpdateAvailablePackages;
InstallPkgSetDialog.UpdateButtonStates;
InstallPkgSetDialog.OnCheckInstallPackageList:=CheckInstallPackageList;
Result:=InstallPkgSetDialog.ShowModal;
NewInstalledPackages:=InstallPkgSetDialog.GetNewInstalledPackages;
finally
@ -255,6 +266,7 @@ begin
FNewInstalledPackages.Add(Additions[i]);
Additions.Clear;
UpdateNewInstalledPackages;
UpdateButtonStates;
finally
// clean up
NewPackageID.Free;
@ -332,6 +344,7 @@ begin
OldPackageID.Free;
end;
UpdateNewInstalledPackages;
UpdateButtonStates;
finally
Deletions.Free;
end;
@ -440,8 +453,7 @@ end;
function TInstallPkgSetDialog.CheckSelection: boolean;
begin
Result:=false;
// TODO
OnCheckInstallPackageList(FNewInstalledPackages,Result);
end;
procedure TInstallPkgSetDialog.UpdateButtonStates;
@ -598,9 +610,16 @@ begin
end;
function TInstallPkgSetDialog.GetNewInstalledPackages: TList;
var
i: Integer;
NewPackageID: TLazPackageID;
begin
Result:=FNewInstalledPackages;
FNewInstalledPackages:=TList.Create;
Result:=TList.Create;
for i:=0 to FNewInstalledPackages.Count-1 do begin
NewPackageID:=TLazPackageID.Create;
NewPackageID.AssignID(TLazPackageID(FNewInstalledPackages[i]));
Result.Add(NewPackageID);
end;
end;
initialization

View File

@ -241,10 +241,12 @@ type
);
TPkgDependencyList = (
pdlUsedBy,
pdlRequires
pdlRequires,
pdlUsedBy
);
{ TPkgDependency }
TPkgDependency = class
private
FFlags: TPkgDependencyFlags;
@ -279,6 +281,7 @@ type
const Version: TPkgVersion): boolean;
function Compare(Dependency2: TPkgDependency): integer;
procedure Assign(Source: TPkgDependency);
procedure Assign(Source: TLazPackageID);
procedure ConsistencyCheck;
function IsCompatible(Pkg: TLazPackageID): boolean;
procedure MakeCompatible(const PkgName: string; const Version: TPkgVersion);
@ -823,6 +826,11 @@ procedure LoadPkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string;
HoldPackages: boolean);
procedure SavePkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string;
First: TPkgDependency; ListType: TPkgDependencyList);
procedure ListPkgIDToDependencyList(ListOfTLazPackageID: TList;
var First: TPkgDependency; ListType: TPkgDependencyList; Owner: TObject;
HoldPackages: boolean);
procedure FreeDependencyList(var First: TPkgDependency;
ListType: TPkgDependencyList);
function FindDependencyByNameInList(First: TPkgDependency;
ListType: TPkgDependencyList; const Name: string): TPkgDependency;
@ -946,6 +954,37 @@ begin
XMLConfig.SetDeleteValue(ThePath+'Count',i,0);
end;
procedure ListPkgIDToDependencyList(ListOfTLazPackageID: TList;
var First: TPkgDependency; ListType: TPkgDependencyList; Owner: TObject;
HoldPackages: boolean);
var
NewDependency: TPkgDependency;
i: Integer;
PkgID: TLazPackageID;
begin
First:=nil;
for i:=ListOfTLazPackageID.Count-1 downto 0 do begin
PkgID:=TLazPackageID(ListOfTLazPackageID[i]);
NewDependency:=TPkgDependency.Create;
NewDependency.Assign(PkgID);
NewDependency.Owner:=Owner;
NewDependency.HoldPackage:=HoldPackages;
NewDependency.AddToList(First,ListType);
end;
end;
procedure FreeDependencyList(var First: TPkgDependency;
ListType: TPkgDependencyList);
var
NextDependency: TPkgDependency;
begin
while First<>nil do begin
NextDependency:=First.NextDependency[ListType];
First.Free;
First:=NextDependency;
end;
end;
procedure SortDependencyList(Dependencies: TList);
var
Count: Integer;
@ -1612,6 +1651,13 @@ begin
MaxVersion.Assign(Source.MaxVersion);
end;
procedure TPkgDependency.Assign(Source: TLazPackageID);
begin
PackageName:=Source.Name;
Flags:=[pdfMinVersion];
MinVersion.Assign(Source.Version);
end;
procedure TPkgDependency.ConsistencyCheck;
begin

View File

@ -141,6 +141,7 @@ type
var Description: string);
procedure GetWritablePkgOutputDirectory(APackage: TLazPackage;
var AnOutDirectory: string);
procedure OnCheckInstallPackageList(PkgIDList: TList; var Ok: boolean);
private
FirstAutoInstallDependency: TPkgDependency;
// helper functions
@ -350,22 +351,47 @@ end;
procedure TPkgManager.MainIDEitmPkgEditInstallPkgsClick(Sender: TObject);
var
RebuildIDE: Boolean;
i: Integer;
List: TList;
PkgIDList: TList;
NewFirstAutoInstallDependency: TPkgDependency;
BuildIDEFlags: TBuildLazarusFlags;
ok: boolean;
begin
RebuildIDE:=false;
List:=nil;
PkgIDList:=nil;
NewFirstAutoInstallDependency:=nil;
try
if ShowEditInstallPkgsDialog(FirstAutoInstallDependency,List,RebuildIDE)
<>mrOk
if ShowEditInstallPkgsDialog(FirstAutoInstallDependency,
@OnCheckInstallPackageList,PkgIDList,RebuildIDE)<>mrOk
then exit;
// TODO: rebuild auto install list
// TODO: rebuild IDE
finally
if List<>nil then begin
for i:=0 to List.Count-1 do TObject(List[i]).Free;
List.Free;
OnCheckInstallPackageList(PkgIDList,ok);
if not ok then exit;
// create new auto install dependency PkgIDList
ListPkgIDToDependencyList(PkgIDList,NewFirstAutoInstallDependency,
pdlRequires,Self,true);
// replace install list
FreeDependencyList(FirstAutoInstallDependency,pdlRequires);
FirstAutoInstallDependency:=NewFirstAutoInstallDependency;
NewFirstAutoInstallDependency:=nil;
// save package list
SortAutoInstallDependencies;
SaveAutoInstallDependencies(true);
// save IDE build configs, so user can build IDE on command line
BuildIDEFlags:=[blfWithStaticPackages,blfDontClean,blfOnlyIDE];
if MainIDE.DoSaveBuildIDEConfigs(BuildIDEFlags)<>mrOk then exit;
if RebuildIDE then begin
// rebuild Lazarus
if MainIDE.DoBuildLazarus(BuildIDEFlags)<>mrOk then exit;
end;
finally
if PkgIDList<>nil then FreeListObjects(PkgIDList,true);
FreeDependencyList(NewFirstAutoInstallDependency,pdlRequires);
end;
end;
@ -446,6 +472,57 @@ begin
debugln('TPkgManager.GetWritablePkgOutputDirectory APackage=',APackage.IDAsString,' AnOutDirectory="',AnOutDirectory,'"');
end;
procedure TPkgManager.OnCheckInstallPackageList(PkgIDList: TList;
var Ok: boolean);
var
NewFirstAutoInstallDependency: TPkgDependency;
CurDependency: TPkgDependency;
OpenResult: TLoadPackageResult;
PkgList: TList;
i: Integer;
APackage: TLazPackage;
begin
Ok:=false;
try
// create new auto install dependency PkgIDList
ListPkgIDToDependencyList(PkgIDList,NewFirstAutoInstallDependency,
pdlRequires,Self,true);
// load all packages
CurDependency:=NewFirstAutoInstallDependency;
while CurDependency<>nil do begin
OpenResult:=PackageGraph.OpenDependency(CurDependency);
if OpenResult<>lprSuccess then begin
MessageDlg('Error',
'Unable to load package "'+CurDependency.AsString+'"',
mtError,[mbCancel],0);
exit;
end;
CurDependency:=CurDependency.NextRequiresDependency;
end;
// get all required packages
PackageGraph.GetAllRequiredPackages(NewFirstAutoInstallDependency,PkgList);
// check if any package is a runtime package
for i:=0 to PkgList.Count-1 do begin
APackage:=TLazPackage(PkgList[i]);
if APackage.PackageType=lptRunTime then begin
MessageDlg(lisPkgMangPackageIsNoDesigntimePackage,
Format(lisPkgMangThePackageIsARuntimeOnlyPackageRuntimeOnlyPackages, [
APackage.IDAsString, #13]),
mtError,[mbCancel],0);
exit;
end;
end;
Ok:=true;
finally
FreeDependencyList(NewFirstAutoInstallDependency,pdlRequires);
PkgList.Free;
end;
end;
procedure TPkgManager.MainIDEitmPkgAddCurUnitToPkgClick(Sender: TObject);
begin
DoAddActiveUnitToAPackage;
@ -3269,34 +3346,35 @@ begin
NeedSaving:=true;
end;
end;
if NeedSaving then begin
SortAutoInstallDependencies;
SaveAutoInstallDependencies(true);
end;
// save IDE build configs, so user can build IDE on command line
BuildIDEFlags:=[blfWithStaticPackages,blfDontClean,blfOnlyIDE];
Result:=MainIDE.DoSaveBuildIDEConfigs(BuildIDEFlags);
if Result<>mrOk then exit;
// ask user to rebuilt Lazarus now
Result:=MessageDlg(lisPkgMangRebuildLazarus,
Format(lisPkgMangThePackageWasMarkedForInstallationCurrentlyLazarus, [
'"', APackage.IDAsString, '"', #13, #13, #13]),
mtConfirmation,[mbYes,mbNo],0);
if Result=mrNo then begin
Result:=mrOk;
exit;
end;
// rebuild Lazarus
Result:=MainIDE.DoBuildLazarus(BuildIDEFlags);
if Result<>mrOk then exit;
finally
PackageGraph.EndUpdate;
PkgList.Free;
end;
if NeedSaving then begin
SortAutoInstallDependencies;
SaveAutoInstallDependencies(true);
end;
// save IDE build configs, so user can build IDE on command line
BuildIDEFlags:=[blfWithStaticPackages,blfDontClean,blfOnlyIDE];
Result:=MainIDE.DoSaveBuildIDEConfigs(BuildIDEFlags);
if Result<>mrOk then exit;
// ask user to rebuilt Lazarus now
Result:=MessageDlg(lisPkgMangRebuildLazarus,
Format(lisPkgMangThePackageWasMarkedForInstallationCurrentlyLazarus, [
'"', APackage.IDAsString, '"', #13, #13, #13]),
mtConfirmation,[mbYes,mbNo],0);
if Result=mrNo then begin
Result:=mrOk;
exit;
end;
// rebuild Lazarus
Result:=MainIDE.DoBuildLazarus(BuildIDEFlags);
if Result<>mrOk then exit;
Result:=mrOk;
end;