ide: don't store an icon data in the .lpi file anymore. store a boolean value (as string 0, -1) which means 0 - icon is not empty => read it from .ico, -1 - icon is empty

git-svn-id: trunk@17694 -
This commit is contained in:
paul 2008-12-05 17:38:58 +00:00
parent 1b7c183342
commit ee59743851
3 changed files with 65 additions and 45 deletions

View File

@ -35,18 +35,22 @@ interface
uses uses
Classes, SysUtils, FileUtil, Process, LCLProc, Controls, Forms, Classes, SysUtils, FileUtil, Process, LCLProc, Controls, Forms,
CodeToolManager, CodeCache, CodeAtom, LazConf, LResources, base64, CodeToolManager, CodeCache, CodeAtom, LazConf, LResources,
ProjectResourcesIntf; ProjectResourcesIntf;
type type
TIconData = array of byte;
{ TProjectIcon } { TProjectIcon }
TProjectIcon = class(TAbstractProjectResource) TProjectIcon = class(TAbstractProjectResource)
private private
FIconText: String; FData: TIconData;
icoFileName: string; FicoFileName: string;
procedure SetIconText(const AValue: String); function GetIsEmpry: Boolean;
procedure SetIconData(const AValue: TIconData);
procedure SetFileNames(const MainFilename: string); procedure SetFileNames(const MainFilename: string);
procedure SetIsEmpty(const AValue: Boolean);
protected protected
function GetAsHex: String; function GetAsHex: String;
public public
@ -58,7 +62,9 @@ type
function UpdateResources(AResources: TAbstractProjectResources; const MainFilename: string): Boolean; override; function UpdateResources(AResources: TAbstractProjectResources; const MainFilename: string): Boolean; override;
function CreateIconFile: Boolean; function CreateIconFile: Boolean;
property IconText: String read FIconText write SetIconText; property IconData: TIconData read FData write SetIconData;
property IsEmpty: Boolean read GetIsEmpry write SetIsEmpty;
property IcoFileName: String read FIcoFileName write FIcoFileName;
end; end;
implementation implementation
@ -69,24 +75,12 @@ const
function TProjectIcon.GetStream: TStream; function TProjectIcon.GetStream: TStream;
var
S: TStringStream;
BS: TBase64DecodingStream;
begin begin
if IconText <> '' then if FData <> nil then
begin begin
S := TStringStream.Create(IconText);
S.Position := 0;
BS := TBase64DecodingStream.Create(S);
Result := TMemoryStream.Create; Result := TMemoryStream.Create;
try Result.WriteBuffer(FData[0], Length(FData));
Result.CopyFrom(BS, BS.Size); Result.Position := 0;
Result.Position := 0;
except
FreeAndNil(Result);
end;
BS.Free;
S.Free;
end end
else else
Result := nil; Result := nil;
@ -94,21 +88,15 @@ end;
procedure TProjectIcon.SetStream(AStream: TStream); procedure TProjectIcon.SetStream(AStream: TStream);
var var
S: TStringStream; NewIconData: TIconData;
BS: TBase64EncodingStream;
NewIconText: String;
begin begin
NewIconText := ''; NewIconData := nil;
if (AStream <> nil) then if (AStream <> nil) then
begin begin
S := TStringStream.Create(''); SetLength(NewIconData, AStream.Size);
BS := TBase64EncodingStream.Create(S); AStream.ReadBuffer(NewIconData[0], AStream.Size);
BS.CopyFrom(AStream, AStream.Size);
BS.Free;
NewIconText := S.DataString;
S.Free;
end; end;
IconText := NewIconText; IconData := NewIconData;
end; end;
function TProjectIcon.UpdateResources(AResources: TAbstractProjectResources; function TProjectIcon.UpdateResources(AResources: TAbstractProjectResources;
@ -119,8 +107,7 @@ var
begin begin
Result := True; Result := True;
//debugln(['TProjectIcon.UpdateResources ',IconText = '']); if FData = nil then
if IconText = '' then
Exit; Exit;
SetFileNames(MainFilename); SetFileNames(MainFilename);
@ -136,9 +123,9 @@ begin
// RCIcon := sIcon + #$D#$A + GetAsHex; // RCIcon := sIcon + #$D#$A + GetAsHex;
// but it does not work // but it does not work
if not FilenameIsAbsolute(icoFileName) or CreateIconFile then if not FilenameIsAbsolute(FicoFileName) or CreateIconFile then
begin begin
IconName := ExtractFileName(icoFileName); IconName := ExtractFileName(FicoFileName);
AResources.AddSystemResource(sIcon + ' "' + IconName + '"'); AResources.AddSystemResource(sIcon + ' "' + IconName + '"');
end end
else else
@ -153,7 +140,7 @@ begin
AStream := GetStream; AStream := GetStream;
FileStream := nil; FileStream := nil;
try try
FileStream := TFileStream.Create(UTF8ToSys(icoFileName), fmCreate); FileStream := TFileStream.Create(UTF8ToSys(FicoFileName), fmCreate);
FileStream.CopyFrom(AStream, AStream.Size); FileStream.CopyFrom(AStream, AStream.Size);
Result := True; Result := True;
finally finally
@ -167,7 +154,33 @@ end;
-----------------------------------------------------------------------------} -----------------------------------------------------------------------------}
procedure TProjectIcon.SetFileNames(const MainFilename: string); procedure TProjectIcon.SetFileNames(const MainFilename: string);
begin begin
icoFileName := ExtractFilePath(MainFilename) + ExtractFileNameWithoutExt(ExtractFileName(MainFileName)) + '.ico'; FicoFileName := ExtractFilePath(MainFilename) + ExtractFileNameWithoutExt(ExtractFileName(MainFileName)) + '.ico';
end;
procedure TProjectIcon.SetIsEmpty(const AValue: Boolean);
var
AStream: TStream;
NewData: TIconData;
begin
if AValue then
IconData := nil
else
begin
// We need to restore data from the .ico file
if FileExistsUTF8(FicoFileName) then
begin
AStream := TFileStream.Create(UTF8ToSys(FicoFileName), fmOpenRead);
try
SetLength(NewData, AStream.Size);
AStream.ReadBuffer(NewData[0], AStream.Size);
IconData := NewData;
finally
AStream.Free;
end;
end
else
IconData := nil;
end;
end; end;
constructor TProjectIcon.Create; constructor TProjectIcon.Create;
@ -177,7 +190,7 @@ var
begin begin
inherited Create; inherited Create;
FIconText := ''; FData := nil;
// Load default icon // Load default icon
DefaultRes := LazarusResources.Find('LazarusProject', 'ICO'); DefaultRes := LazarusResources.Find('LazarusProject', 'ICO');
@ -189,13 +202,21 @@ begin
end; end;
end; end;
procedure TProjectIcon.SetIconText(const AValue: String); procedure TProjectIcon.SetIconData(const AValue: TIconData);
begin begin
if FIconText = AValue then Exit; if (Length(AValue) = Length(FData)) and
FIconText := AValue; (FData <> nil) and
(CompareByte(AValue[0], FData[0], Length(FData)) = 0) then
Exit;
FData := AValue;
Modified := True; Modified := True;
end; end;
function TProjectIcon.GetIsEmpry: Boolean;
begin
Result := FData = nil;
end;
function TProjectIcon.GetAsHex: String; function TProjectIcon.GetAsHex: String;
var var
AStream: TStream; AStream: TStream;

View File

@ -416,8 +416,6 @@ begin
TitleEdit.Text := Title; TitleEdit.Text := Title;
TargetFileEdit.Text := TargetFilename; TargetFileEdit.Text := TargetFilename;
UseAppBundleCheckBox.Checked := UseAppBundle; UseAppBundleCheckBox.Checked := UseAppBundle;
//DebugLn(['TProjectOptionsDialog.SetProject AAA1 ',dbgsname(AProject),' ',dbgsname(Resources)]);
//DebugLn(['TProjectOptionsDialog.SetProject AAA2 ',dbgsname(Resources.XPManifest)]);
UseXPManifestCheckBox.Checked := Resources.XPManifest.UseManifest; UseXPManifestCheckBox.Checked := Resources.XPManifest.UseManifest;
UseVersionInfoCheckBox.Checked := Resources.VersionInfo.UseVersionInfo; UseVersionInfoCheckBox.Checked := Resources.VersionInfo.UseVersionInfo;
AStream := Resources.ProjectIcon.GetStream; AStream := Resources.ProjectIcon.GetStream;

View File

@ -267,7 +267,7 @@ begin
// todo: further split by classes // todo: further split by classes
with AConfig do with AConfig do
begin begin
SetDeleteValue(Path+'General/Icon/Value', ProjectIcon.IconText, ''); SetDeleteValue(Path+'General/Icon/Value', BoolToStr(ProjectIcon.IsEmpty), '-1');
SetDeleteValue(Path+'General/UseXPManifest/Value', XPManifest.UseManifest, False); SetDeleteValue(Path+'General/UseXPManifest/Value', XPManifest.UseManifest, False);
SetDeleteValue(Path+'VersionInfo/UseVersionInfo/Value', VersionInfo.UseVersionInfo,false); SetDeleteValue(Path+'VersionInfo/UseVersionInfo/Value', VersionInfo.UseVersionInfo,false);
SetDeleteValue(Path+'VersionInfo/AutoIncrementBuild/Value', VersionInfo.AutoIncrementBuild,false); SetDeleteValue(Path+'VersionInfo/AutoIncrementBuild/Value', VersionInfo.AutoIncrementBuild,false);
@ -294,7 +294,8 @@ begin
// todo: further split by classes // todo: further split by classes
with AConfig do with AConfig do
begin begin
ProjectIcon.IconText := GetValue(Path+'General/Icon/Value', ''); ProjectIcon.IcoFileName := ChangeFileExt(FileName, '.ico');
ProjectIcon.IsEmpty := StrToBoolDef(GetValue(Path+'General/Icon/Value', '-1'), False);
XPManifest.UseManifest := GetValue(Path+'General/UseXPManifest/Value', False); XPManifest.UseManifest := GetValue(Path+'General/UseXPManifest/Value', False);
VersionInfo.UseVersionInfo := GetValue(Path+'VersionInfo/UseVersionInfo/Value', False); VersionInfo.UseVersionInfo := GetValue(Path+'VersionInfo/UseVersionInfo/Value', False);
VersionInfo.AutoIncrementBuild := GetValue(Path+'VersionInfo/AutoIncrementBuild/Value', False); VersionInfo.AutoIncrementBuild := GetValue(Path+'VersionInfo/AutoIncrementBuild/Value', False);