pas2js/demo/zenfs/tree/treedemo.lpr
Michaël Van Canneyt 8802cf610b * Some cleanup
2024-08-28 22:31:26 +02:00

183 lines
4.3 KiB
ObjectPascal

program BrowserDom10;
{$mode objfpc}
uses
BrowserConsole, JS, Classes, SysUtils, Web, BrowserApp, libzenfs, libzenfsdom, wasizenfs,
zenfsutils;
Type
{ TMyApplication }
TMyApplication = class(TBrowserApplication)
Private
BtnDownload : TJSHTMLButtonElement;
EdtFileName : TJSHTMLInputElement;
DivDownloads : TJSHTMLElement;
FTreeBuilder : THTMLZenFSTree;
procedure CreateFiles;
procedure DoReset(Event: TJSEvent); async;
procedure DoSelectFile(Sender: TObject; aFileName: String; aType: TFileType);
procedure MaybeCreateFiles;
procedure SetupFS; async;
procedure DoDownload(Event : TJSEvent);
Public
constructor Create(aOwner : TComponent); override;
procedure DoRun; override;
end;
{ TMyApplication }
constructor TMyApplication.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
// Allow to load file specified in hash: index.html#mywasmfile.wasm
BtnDownload:=TJSHTMLButtonElement(GetHTMLElement('btnDownload'));
BtnDownload.AddEVentListener('click',@DoDownload);
BtnDownload:=TJSHTMLButtonElement(GetHTMLElement('btnReset'));
BtnDownload.AddEVentListener('click',@DoReset);
EdtFileName:=TJSHTMLInputElement(GetHTMLElement('edtFilename'));
DivDownloads:=GetHTMLElement('divDownloads');
FTreeBuilder:=THTMLZenFSTree.Create(Self);
FTreeBuilder.MaxHeight:='300px';
FTreeBuilder.ParentElementID:='treeFiles';
FTreeBuilder.OnFileSelected:=@DoSelectFile;
end;
procedure TMyApplication.DoRun;
begin
SetupFS;
end;
procedure TMyApplication.CreateFiles;
Procedure ForceDir(const aDir: string);
var
Stat : TZenFSStats;
begin
try
Stat:=ZenFS.statSync(aDir);
except
Writeln('Directory "',aDir,'" does not exist, creating it.')
end;
if Not assigned(Stat) then
begin
try
ZenFS.mkdirSync(aDir,&775)
except
Writeln('Failed to create directory "',aDir,'"');
Raise;
end;
end
else if Stat.isDirectory then
Raise Exception.Create(aDir+' is not a directory');
end;
Procedure ForceFile(aFile : String);
var
S : String;
I : Integer;
begin
Writeln('Creating file: ',aFile);
S:='This is the content of file "'+aFile+'". Some random numbers:';
For I:=1 to 10+Random(90) do
S:=S+'Line '+IntToStr(i)+': '+IntToStr(1+Random(100))+sLineBreak;
try
ZenFS.writeFileSync(aFile,S);
except
Writeln('Failed to create file: ',aFile);
end;
end;
var
FN : Integer;
begin
ForceDir('/tmp');
ForceFile('/tmp/file1.txt');
ForceDir('/tmp/logs');
For FN:=2 to 5+Random(5) do
ForceFile(Format('/tmp/file_%d.txt',[FN]));
For FN:=1 to 5+Random(5) do
ForceFile(Format('/tmp/logs/file_%.6d.log',[FN]));
ForceDir('/home');
ForceDir('/home/user');
For FN:=1 to 5+Random(5) do
ForceFile(Format('/home/user/diary%d.log',[FN]));
ForceDir('/home/user2');
For FN:=1 to 1+Random(5) do
ForceFile(Format('/home/user2/diary%d.log',[FN]));
end;
procedure TMyApplication.DoSelectFile(Sender: TObject; aFileName: String; aType: TFileType);
const
filetypes : Array[TFileType] of string = ('Unknown','File','Directory','SymLink');
begin
Writeln('You selected '+FileTypes[aType]+': '+aFileName);
if aType=ftFile then
EdtFileName.Value:=aFileName;
end;
procedure TMyApplication.MaybeCreateFiles;
var
Stat : TZenFSStats;
begin
try
Stat:=ZenFS.statSync('/tmp/file1.txt');
except
Writeln('Directory structure does not exist, creating one');
end;
if Not assigned(Stat) then
CreateFiles
else
Writeln('Directory structure already exists.');
end;
procedure TMyApplication.SetupFS;
begin
Terminate;
aWait(TJSObject,ZenFS.configure(
New([
'mounts', New([
'/',DomBackends.WebStorage
])
])));
MaybeCreateFiles;
FTreeBuilder.ShowDir('/');
end;
procedure TMyApplication.DoReset(Event : TJSEvent);
begin
window.localStorage.removeItem('0');
FTreeBuilder.Clear;
SetupFS;
end;
procedure TMyApplication.DoDownload(Event : TJSEvent);
var
a : TJSHTMLAnchorElement;
begin
a:=CreateDownLoadFromFile(edtFileName.value,'application/octet-stream',divDownloads,'file '+edtFileName.value);
a.click;
end;
var
Application : TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Initialize;
Application.Run;
end.