lazarus/lcl/jsonpropstorage.pas
2024-11-23 08:10:58 +02:00

154 lines
4.1 KiB
ObjectPascal

{ $Id: $ }
{
*****************************************************************************
This file is part of the Lazarus Component Library (LCL)
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
}
unit JSONPropStorage;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, JSONConf, LazUTF8;
type
{ TCustomJSONPropStorage }
TCustomJSONPropStorage = class(TFormPropertyStorage)
private
FCount : Integer;
FJSONFileName: string;
FRootObjectPath: String;
FJSONConf: TJSONConfig;
FFormatted: Boolean;
protected
function GetJSONFileName: String; virtual;
function RootSection: String; override;
function GetFormatted: Boolean;
procedure SetFormatted(Value: Boolean);
function FixPath(const APath: String): String; virtual;
property JSONConf: TJSONConfig read FJSONConf;
public
procedure StorageNeeded(ReadOnly: Boolean); override;
procedure FreeStorage; override;
function DoReadString(const Section, Ident, Default: String): String; override;
procedure DoWriteString(const Section, Ident, Value: String); override;
procedure DoEraseSections(const ARootObjectPath : String); override;
public
property JSONFileName: String read FJSONFileName write FJSONFileName;
property RootObjectPath: String read FRootObjectPath write FRootObjectPath;
property Formatted: Boolean read GetFormatted write SetFormatted;
end;
{ TJSONPropStorage }
TJSONPropStorage = class(TCustomJSONPropStorage)
published
property StoredValues;
property JSONFileName;
property Formatted;
property Active;
property OnSavingProperties;
property OnSaveProperties;
property OnRestoringProperties;
property OnRestoreProperties;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Misc',[TJSONPropStorage]);
end;
{ TCustomJSONPropStorage }
function TCustomJSONPropStorage.GetJSONFileName: String;
begin
If (FJSONFileName<>'') then
Result:=FJSONFileName
else if csDesigning in ComponentState then
raise Exception.Create('TCustomJSONPropStorage.GetJSONFileName: missing Filename')
else
{$ifdef unix}
Result:=IncludeTrailingPathDelimiter(GetEnvironmentVariableUTF8('HOME'))
+'.'+ExtractFileName(Application.ExeName);
{$else}
Result:=ChangeFileExt(Application.ExeName,'.json');
{$endif}
end;
function TCustomJSONPropStorage.RootSection: String;
begin
if (FRootObjectPath<>'') then
Result := FRootObjectPath
else
Result := inherited RootSection;
Result := FixPath(Result);
end;
function TCustomJSONPropStorage.GetFormatted: Boolean;
begin
Result := FFormatted;
end;
procedure TCustomJSONPropStorage.SetFormatted(Value: Boolean);
begin
FFormatted := Value;
if (FJSONConf<>nil) then
FJSONConf.Formatted := Value;
end;
function TCustomJSONPropStorage.FixPath(const APath: String): String;
begin
Result:=StringReplace(APath,'.','/',[rfReplaceAll]);
end;
procedure TCustomJSONPropStorage.StorageNeeded(ReadOnly: Boolean);
begin
if (FJSONConf=nil) and not (csDesigning in ComponentState) then
begin
FJSONConf := TJSONConfig.Create(nil);
FJSONConf.Formatted := FFormatted;
FJSONConf.Filename := GetJSONFileName;
end;
Inc(FCount);
end;
procedure TCustomJSONPropStorage.FreeStorage;
begin
Dec(FCount);
if (FCount<=0) then
begin
FCount:=0;
FreeAndNil(FJSONConf);
end;
end;
function TCustomJSONPropStorage.DoReadString(const Section, Ident,
Default: String): String;
begin
Result := UTF16ToUTF8(FJSONConf.GetValue(UTF8ToUTF16(FixPath(Section)+'/'+FixPath(Ident)),
UTF8ToUTF16(Default)));
end;
procedure TCustomJSONPropStorage.DoWriteString(const Section, Ident,
Value: String);
begin
FJSONConf.SetValue(UTF8ToUTF16(FixPath(Section)+'/'+FixPath(Ident)), UTF8ToUTF16(Value));
end;
procedure TCustomJSONPropStorage.DoEraseSections(const ARootObjectPath: String);
begin
FJSONConf.DeletePath(UTF8ToUTF16(FixPath(ARootObjectPath)));
end;
end.