mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 10:57:55 +02:00
154 lines
4.1 KiB
ObjectPascal
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.
|