mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 00:09:15 +02:00
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:
parent
1b7c183342
commit
ee59743851
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user