From 4f8350a41bada443a39f37400923017d9f404b9b Mon Sep 17 00:00:00 2001 From: Max Gomes Date: Tue, 10 Mar 2026 16:17:40 -0300 Subject: [PATCH 1/6] =?UTF-8?q?Principais=20Mudan=C3=A7as:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Incluido suporte para gerar aplicações lazarus linux nativa - Criado novo app na pasta de demo lazarus_linux com configurações especificas para linux - Atualizado o wizard para gerar configurações necessária quando estiver no linux ps: Não foi atualizado numero da versao da framework e nem versão do wizard --- Beta/D2Bridge Framework/D2Bridge.API.Mail.pas | 4 +- .../D2Bridge Framework/D2Bridge.APPConfig.pas | 2 +- .../D2Bridge.AppConfig.Version.pas | 220 +- .../D2Bridge.DebugUtils.pas | 50 + .../D2Bridge.ItemCommon.Add.pas | 4 +- .../D2Bridge.Lang.BaseClass.pas | 2 +- Beta/D2Bridge Framework/D2Bridge.Manager.pas | 5 +- .../D2Bridge.Rest.Route.pas | 2 +- .../D2Bridge.ServerControllerBase.lfm | 4 +- .../D2Bridge.ServerControllerBase.pas | 41 +- Beta/D2Bridge Framework/D2Bridge.Util.pas | 67 +- Beta/D2Bridge Framework/D2Bridge.inc | 4 + .../Prism/Prism.BaseClass.Sessions.pas | 4 +- .../Prism/Prism.Options.pas | 4 +- .../Prism/Prism.Server.HTML.Headers.lfm | 4 +- .../Prism/Prism.Server.HTML.Headers.pas | 2 +- .../Prism/Prism.Server.TCP.pas | 26 +- .../Prism/Prism.Server.Thread.TCP.pas | 6 +- Beta/D2Bridge Framework/Prism/Prism.Util.pas | 92 +- Beta/Demos/Lazarus/Lazarus.lps | 190 +- .../Lazarus_linux/D2BridgeFormTemplate.pas | 75 + .../Lazarus_linux/FixD2BridgeLazBuild.sh | 2 + .../Lazarus_linux/FixD2BridgeLazCompile.sh | 18 + Beta/Demos/Lazarus_linux/Lazarus.lpi | 402 ++++ Beta/Demos/Lazarus_linux/Lazarus.lpr | 44 + Beta/Demos/Lazarus_linux/Lazarus.lps | 214 ++ Beta/Demos/Lazarus_linux/Lazarus.res | Bin 0 -> 1824 bytes Beta/Demos/Lazarus_linux/LazarusWebApp.lfm | 4 + Beta/Demos/Lazarus_linux/LazarusWebApp.pas | 168 ++ Beta/Demos/Lazarus_linux/Lazarus_Session.lfm | 4 + Beta/Demos/Lazarus_linux/Lazarus_Session.pas | 54 + Beta/Demos/Lazarus_linux/UnitMenu.lfm | 62 + Beta/Demos/Lazarus_linux/UnitMenu.pas | 242 ++ .../Unit_D2Bridge_Server_Console.pas | 479 ++++ Beta/Demos/Lazarus_linux/Unit_Login.lfm | 109 + Beta/Demos/Lazarus_linux/Unit_Login.pas | 299 +++ Beta/Demos/Lazarus_linux/unitauth.lfm | 82 + Beta/Demos/Lazarus_linux/unitauth.pas | 168 ++ Beta/Demos/Lazarus_linux/unitcamera.lfm | 97 + Beta/Demos/Lazarus_linux/unitcamera.pas | 235 ++ .../Lazarus_linux/unitcardgriddatamodel.lfm | 196 ++ .../Lazarus_linux/unitcardgriddatamodel.pas | 198 ++ Beta/Demos/Lazarus_linux/unitcontrols.lfm | 1957 +++++++++++++++++ Beta/Demos/Lazarus_linux/unitcontrols.pas | 489 ++++ Beta/Demos/Lazarus_linux/unitdbgrid.lfm | 101 + Beta/Demos/Lazarus_linux/unitdbgrid.pas | 233 ++ Beta/Demos/Lazarus_linux/unitdbgridedit.lfm | 94 + Beta/Demos/Lazarus_linux/unitdbgridedit.pas | 156 ++ Beta/Demos/Lazarus_linux/unitkanban.lfm | 47 + Beta/Demos/Lazarus_linux/unitkanban.pas | 258 +++ .../Lazarus_linux/unitmarkdowneditor.lfm | 130 ++ .../Lazarus_linux/unitmarkdowneditor.pas | 190 ++ Beta/Demos/Lazarus_linux/unitqrcode.lfm | 254 +++ Beta/Demos/Lazarus_linux/unitqrcode.pas | 243 ++ Beta/Demos/Lazarus_linux/unitqrcodereader.lfm | 69 + Beta/Demos/Lazarus_linux/unitqrcodereader.pas | 239 ++ Beta/Demos/Lazarus_linux/unitstringgrid.lfm | 62 + Beta/Demos/Lazarus_linux/unitstringgrid.pas | 179 ++ .../Demos/Lazarus_linux/unitwysiwygeditor.lfm | 114 + .../Demos/Lazarus_linux/unitwysiwygeditor.pas | 197 ++ .../Lazarus_linux/web/d2dockerdeploy.conf | 12 + .../web/wwwroot/images/bridge.jpg | Bin 0 -> 119228 bytes .../web/wwwroot/images/d2bridge.png | Bin 0 -> 2831 bytes .../web/wwwroot/images/lazarus.png | Bin 0 -> 26118 bytes ...lls-and-lights-in-the-evening-11061802.pdf | Bin 0 -> 59812 bytes .../D2Bridge.NewProject.Wizard.Common.pas | 16 + .../Console/Unit_D2Bridge_Server_Console.pas | 152 +- Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppLCL.lpi | 16 +- .../dpr/LAZARUS/D2BridgeWebAppWithLCL.lpi | 14 +- .../Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh | 2 +- .../dpr/LAZARUS/FixD2BridgeLazCompile.sh | 2 +- 71 files changed, 8784 insertions(+), 327 deletions(-) create mode 100644 Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas create mode 100644 Beta/Demos/Lazarus_linux/D2BridgeFormTemplate.pas create mode 100644 Beta/Demos/Lazarus_linux/FixD2BridgeLazBuild.sh create mode 100644 Beta/Demos/Lazarus_linux/FixD2BridgeLazCompile.sh create mode 100644 Beta/Demos/Lazarus_linux/Lazarus.lpi create mode 100644 Beta/Demos/Lazarus_linux/Lazarus.lpr create mode 100644 Beta/Demos/Lazarus_linux/Lazarus.lps create mode 100644 Beta/Demos/Lazarus_linux/Lazarus.res create mode 100644 Beta/Demos/Lazarus_linux/LazarusWebApp.lfm create mode 100644 Beta/Demos/Lazarus_linux/LazarusWebApp.pas create mode 100644 Beta/Demos/Lazarus_linux/Lazarus_Session.lfm create mode 100644 Beta/Demos/Lazarus_linux/Lazarus_Session.pas create mode 100644 Beta/Demos/Lazarus_linux/UnitMenu.lfm create mode 100644 Beta/Demos/Lazarus_linux/UnitMenu.pas create mode 100644 Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas create mode 100644 Beta/Demos/Lazarus_linux/Unit_Login.lfm create mode 100644 Beta/Demos/Lazarus_linux/Unit_Login.pas create mode 100644 Beta/Demos/Lazarus_linux/unitauth.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitauth.pas create mode 100644 Beta/Demos/Lazarus_linux/unitcamera.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitcamera.pas create mode 100644 Beta/Demos/Lazarus_linux/unitcardgriddatamodel.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitcardgriddatamodel.pas create mode 100644 Beta/Demos/Lazarus_linux/unitcontrols.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitcontrols.pas create mode 100644 Beta/Demos/Lazarus_linux/unitdbgrid.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitdbgrid.pas create mode 100644 Beta/Demos/Lazarus_linux/unitdbgridedit.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitdbgridedit.pas create mode 100644 Beta/Demos/Lazarus_linux/unitkanban.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitkanban.pas create mode 100644 Beta/Demos/Lazarus_linux/unitmarkdowneditor.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitmarkdowneditor.pas create mode 100644 Beta/Demos/Lazarus_linux/unitqrcode.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitqrcode.pas create mode 100644 Beta/Demos/Lazarus_linux/unitqrcodereader.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitqrcodereader.pas create mode 100644 Beta/Demos/Lazarus_linux/unitstringgrid.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitstringgrid.pas create mode 100644 Beta/Demos/Lazarus_linux/unitwysiwygeditor.lfm create mode 100644 Beta/Demos/Lazarus_linux/unitwysiwygeditor.pas create mode 100644 Beta/Demos/Lazarus_linux/web/d2dockerdeploy.conf create mode 100644 Beta/Demos/Lazarus_linux/web/wwwroot/images/bridge.jpg create mode 100644 Beta/Demos/Lazarus_linux/web/wwwroot/images/d2bridge.png create mode 100644 Beta/Demos/Lazarus_linux/web/wwwroot/images/lazarus.png create mode 100644 Beta/Demos/Lazarus_linux/web/wwwroot/images/license-25-de-abril-bridge-over-the-tagus-river-surrounded-by-hills-and-lights-in-the-evening-11061802.pdf diff --git a/Beta/D2Bridge Framework/D2Bridge.API.Mail.pas b/Beta/D2Bridge Framework/D2Bridge.API.Mail.pas index 44be994..08e3190 100644 --- a/Beta/D2Bridge Framework/D2Bridge.API.Mail.pas +++ b/Beta/D2Bridge Framework/D2Bridge.API.Mail.pas @@ -39,7 +39,7 @@ interface {$IFDEF HAS_UNIT_SYSTEM_THREADING} System.Threading, {$ENDIF} - IdSMTP, IdSSLOpenSSL, IdMessage, IdExplicitTLSClientServerBase, IdAttachmentFile, idText, + IdSMTP, IdSSLOpenSSL, IdMessage, IdExplicitTLSClientServerBase, IdAttachmentFile, IdText, D2Bridge.Interfaces, Prism.Server.HTTP.Commom {$IFDEF FMX} @@ -375,4 +375,4 @@ procedure TD2BridgeAPIMail.SetSubject(const Value: string); FSubject:= Value; end; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/D2Bridge.APPConfig.pas b/Beta/D2Bridge Framework/D2Bridge.APPConfig.pas index 02238c1..f06a90c 100644 --- a/Beta/D2Bridge Framework/D2Bridge.APPConfig.pas +++ b/Beta/D2Bridge Framework/D2Bridge.APPConfig.pas @@ -78,7 +78,7 @@ TD2BridgeAPPConfig = class(TInterfacedPersistent, ID2BridgeAPPConfig) implementation Uses - D2Bridge.APPConfig.Database, D2Bridge.AppConfig.Version, D2Bridge.AppConfig.Path, D2Bridge.APPConfig.INIConfig, + D2Bridge.APPConfig.Database, D2Bridge.APPConfig.Version, D2Bridge.APPConfig.Path, D2Bridge.APPConfig.INIConfig, D2Bridge.APPConfig.Custom, D2Bridge.JSON; { TD2BridgeAPPConfig } diff --git a/Beta/D2Bridge Framework/D2Bridge.AppConfig.Version.pas b/Beta/D2Bridge Framework/D2Bridge.AppConfig.Version.pas index 522a39e..10dcd65 100644 --- a/Beta/D2Bridge Framework/D2Bridge.AppConfig.Version.pas +++ b/Beta/D2Bridge Framework/D2Bridge.AppConfig.Version.pas @@ -30,61 +30,75 @@ {$I D2Bridge.inc} -unit D2Bridge.AppConfig.Version; +unit D2Bridge.APPConfig.Version; interface uses - Classes, SysUtils, IniFiles, TypInfo, -{$IFDEF MSWINDOWS} - Windows, -{$ENDIF} - D2Bridge.Interfaces; - + Classes, SysUtils, IniFiles, TypInfo, + {$IFDEF MSWINDOWS} + Windows, + {$ENDIF} + {$IFDEF LINUX} + baseunix, + linux, + {$ENDIF} + D2Bridge.Interfaces; type - TD2BridgeAppConfigVersion = class(TInterfacedPersistent, ID2BridgeAPPConfigVersion) + TD2BridgeAppConfigVersion = class(TInterfacedPersistent, ID2BridgeAPPConfigVersion) private - FBuild: Integer; - FMajor: Integer; - FMinor: Integer; - FRelease: Integer; - function GetBuild: Integer; - function GetMajor: Integer; - function GetMinor: Integer; - function GetRelease: Integer; - function GetVersionStr: string; - procedure SetBuild(const Value: Integer); - procedure SetMajor(const Value: Integer); - procedure SetMinor(const Value: Integer); - procedure SetRelease(const Value: Integer); - procedure SetVersionStr(const Value: string); + FBuild: Integer; + FMajor: Integer; + FMinor: Integer; + FRelease: Integer; + function GetBuild: Integer; + function GetMajor: Integer; + function GetMinor: Integer; + function GetRelease: Integer; + function GetVersionStr: string; + procedure SetBuild(const Value: Integer); + procedure SetMajor(const Value: Integer); + procedure SetMinor(const Value: Integer); + procedure SetRelease(const Value: Integer); + procedure SetVersionStr(const Value: string); public - constructor Create; + constructor Create; published - property Build: Integer read GetBuild write SetBuild; - property Major: Integer read GetMajor write SetMajor; - property Minor: Integer read GetMinor write SetMinor; - property Release: Integer read GetRelease write SetRelease; - property VersionStr: string read GetVersionStr write SetVersionStr; - - end; - + property Build: Integer read GetBuild write SetBuild; + property Major: Integer read GetMajor write SetMajor; + property Minor: Integer read GetMinor write SetMinor; + property Release: Integer read GetRelease write SetRelease; + property VersionStr: string read GetVersionStr write SetVersionStr; + end; implementation - function GetExecutableVersion: string; +{$IFDEF MSWINDOWS} var VerInfoSize, VerHandle: DWORD; VerBuffer: Pointer; FixedInfo: PVSFixedFileInfo; FileName: array[0..MAX_PATH - 1] of Char; +{$ENDIF} +{$IFDEF LINUX} +var + FileName: string; + VersionFile: TextFile; + VersionLine: string; + FileStream: TFileStream; + Buffer: array[0..255] of Byte; + BytesRead: Integer; + VersionStr: string; + Major, Minor, Release, Build: Integer; +{$ENDIF} begin + {$IFDEF MSWINDOWS} Result := '0.0.0.0'; - // Pega o caminho do módulo atual (EXE ou DLL) + // Pega o caminho do módulo atual (EXE ou DLL) if GetModuleFileName(HInstance, FileName, MAX_PATH) = 0 then Exit; @@ -107,89 +121,163 @@ function GetExecutableVersion: string; finally FreeMem(VerBuffer); end; + {$ENDIF} + + {$IFDEF LINUX} + Result := '1.0.0.0'; // Versão padrão para Linux + + // Estratégia 1: Tentar ler do arquivo .version no mesmo diretório + FileName := ExtractFilePath(ParamStr(0)) + '.version'; + if FileExists(FileName) then + begin + try + AssignFile(VersionFile, FileName); + Reset(VersionFile); + try + ReadLn(VersionFile, VersionLine); + VersionLine := Trim(VersionLine); + if VersionLine <> '' then + Result := VersionLine; + finally + CloseFile(VersionFile); + end; + except + // Ignora erros de leitura + end; + end + else + begin + // Estratégia 2: Tentar ler variável de ambiente + VersionLine := GetEnvironmentVariable('APP_VERSION'); + if VersionLine <> '' then + Result := VersionLine + else + begin + // Estratégia 3: Usar data de compilação como versão + {$IFDEF DEBUG} + Result := '1.0.0.0-DEBUG'; + {$ELSE} + Result := Format('1.0.0.%d', [ + Trunc((Now - EncodeDate(2024, 1, 1)) / 1) + ]); + {$ENDIF} + end; + end; + + // Garantir que a versão está no formato correto (X.X.X.X) + Major := 1; Minor := 0; Release := 0; Build := 0; + + // Tenta extrair números da string de versão + VersionStr := Result; + if VersionStr.Contains('.') then + begin + // Aqui você pode implementar a lógica de parsing + // Por enquanto, mantém o resultado como está + end; + {$ENDIF} end; - +{ TD2BridgeAppConfigVersion } constructor TD2BridgeAppConfigVersion.Create; begin - inherited; + inherited; - FMajor:= -1; - FMinor:= -1; - FRelease:= -1; - FBuild:= -1; + FMajor := -1; + FMinor := -1; + FRelease := -1; + FBuild := -1; end; function TD2BridgeAppConfigVersion.GetBuild: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FBuild; + Result := FBuild; end; function TD2BridgeAppConfigVersion.GetMajor: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FMajor; + Result := FMajor; end; function TD2BridgeAppConfigVersion.GetMinor: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FMinor; + Result := FMinor; end; function TD2BridgeAppConfigVersion.GetRelease: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FRelease; + Result := FRelease; end; function TD2BridgeAppConfigVersion.GetVersionStr: string; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - Result := GetExecutableVersion - else - Result := Format('%d.%d.%d.%d', [FMajor, FMinor, FRelease, FBuild]); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + Result := GetExecutableVersion + else + Result := Format('%d.%d.%d.%d', [FMajor, FMinor, FRelease, FBuild]); end; procedure TD2BridgeAppConfigVersion.SetBuild(const Value: Integer); begin - FBuild := Value; + FBuild := Value; end; procedure TD2BridgeAppConfigVersion.SetMajor(const Value: Integer); begin - FMajor := Value; + FMajor := Value; end; procedure TD2BridgeAppConfigVersion.SetMinor(const Value: Integer); begin - FMinor := Value; + FMinor := Value; end; procedure TD2BridgeAppConfigVersion.SetRelease(const Value: Integer); begin - FRelease := Value; + FRelease := Value; end; procedure TD2BridgeAppConfigVersion.SetVersionStr(const Value: string); var - Parts: TArray; + Parts: TArray; + i: Integer; + TempStr: string; begin - Parts := Value.Split(['.']); - if Length(Parts) > 0 then FMajor := StrToIntDef(Parts[0], 0); - if Length(Parts) > 1 then FMinor := StrToIntDef(Parts[1], 0); - if Length(Parts) > 2 then FRelease := StrToIntDef(Parts[2], 0); - if Length(Parts) > 3 then FBuild := StrToIntDef(Parts[3], 0); + // Remove qualquer texto adicional (como -DEBUG) + TempStr := Value; + i := Pos('-', TempStr); + if i > 0 then + TempStr := Copy(TempStr, 1, i - 1); + + Parts := TempStr.Split(['.']); + + FMajor := 0; + FMinor := 0; + FRelease := 0; + FBuild := 0; + + if Length(Parts) > 0 then FMajor := StrToIntDef(Parts[0], 1); + if Length(Parts) > 1 then FMinor := StrToIntDef(Parts[1], 0); + if Length(Parts) > 2 then FRelease := StrToIntDef(Parts[2], 0); + if Length(Parts) > 3 then FBuild := StrToIntDef(Parts[3], 0); + + // Garantir valores mínimos + if FMajor < 1 then FMajor := 1; + if FMinor < 0 then FMinor := 0; + if FRelease < 0 then FRelease := 0; + if FBuild < 0 then FBuild := 0; end; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas b/Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas new file mode 100644 index 0000000..7f8039f --- /dev/null +++ b/Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas @@ -0,0 +1,50 @@ +{$I D2Bridge.inc} + +unit D2Bridge.DebugUtils; + +interface + +function IsDebuggerPresent: Boolean; + +implementation + +uses + {$IFDEF MSWINDOWS} + Windows, + {$ENDIF} + SysUtils; + +function IsDebuggerPresent: Boolean; +{$IFDEF MSWINDOWS} +begin + Result := Windows.IsDebuggerPresent; +end; +{$ELSE} +var + F: TextFile; + Line: string; + TracerPid: Integer; +begin + Result := False; + if not FileExists('/proc/self/status') then + Exit; + AssignFile(F, '/proc/self/status'); + try + Reset(F); + while not EOF(F) do + begin + ReadLn(F, Line); + if Copy(Line, 1, 10) = 'TracerPid:' then + begin + TracerPid := StrToIntDef(Trim(Copy(Line, 11, MaxInt)), 0); + Result := TracerPid <> 0; + Break; + end; + end; + finally + CloseFile(F); + end; +end; +{$ENDIF} + +end. diff --git a/Beta/D2Bridge Framework/D2Bridge.ItemCommon.Add.pas b/Beta/D2Bridge Framework/D2Bridge.ItemCommon.Add.pas index 1d1e345..6754b80 100644 --- a/Beta/D2Bridge Framework/D2Bridge.ItemCommon.Add.pas +++ b/Beta/D2Bridge Framework/D2Bridge.ItemCommon.Add.pas @@ -190,7 +190,7 @@ implementation D2Bridge.Item.HTML.Card.Grid, D2Bridge.Item.HTML.Card.Grid.DataModel, D2Bridge.Item.HTML.PanelGroup, D2Bridge.Item.HTML.Tabs, D2Bridge.Item.HTML.Accordion, D2Bridge.Item.HTML.Popup, D2Bridge.Item.HTML.Upload, - D2Bridge.Item.HTMLelement, D2Bridge.Item.HTML.Link, D2Bridge.Item.HTML.Carousel, D2Bridge.Item.HTML.QRCode, + D2Bridge.Item.HTMLElement, D2Bridge.Item.HTML.Link, D2Bridge.Item.HTML.Carousel, D2Bridge.Item.HTML.QRCode, D2Bridge.Item.HTML.MainMenu, D2Bridge.Item.HTML.SideMenu, D2Bridge.Item.HTML.Image, D2Bridge.Item.HTML.DBImage, D2Bridge.Item.HTML.Kanban, D2Bridge.Item.HTML.Editor.MarkDown, D2Bridge.Item.HTML.Editor.WYSIWYG, D2Bridge.Item.HTML.Camera, D2Bridge.Item.HTML.QRCodeReader, @@ -1486,4 +1486,4 @@ function TItemAdd.ColFull(AAutoResponsive: boolean; ACSSClass, AItemID, result:= ColFull(vCSSCallCol, AItemID, AHTMLExtras, AHTMLStyle, AHTMLTag); end; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/D2Bridge.Lang.BaseClass.pas b/Beta/D2Bridge Framework/D2Bridge.Lang.BaseClass.pas index 179fa07..ee2e804 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Lang.BaseClass.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Lang.BaseClass.pas @@ -45,7 +45,7 @@ interface {$IFDEF MSWINDOWS} Windows, {$ENDIF} - D2Bridge.Lang.Interfaces, D2Bridge.Lang.Term.BaseClass, Prism.JSONHelper, Prism.Types; + D2Bridge.DebugUtils, D2Bridge.Lang.Interfaces, D2Bridge.Lang.Term.BaseClass, Prism.JSONHelper, Prism.Types; type TD2BridgeLangBaseClass = class(TInterfacedPersistent, ID2BridgeLangBaseClass) diff --git a/Beta/D2Bridge Framework/D2Bridge.Manager.pas b/Beta/D2Bridge Framework/D2Bridge.Manager.pas index 99ba2a7..c20e41f 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Manager.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Manager.pas @@ -135,12 +135,15 @@ function OverrideFindComponent(const Name: string): TComponent; vPrismSession: TPrismSession; FThreadID: Integer; vComponent: TComponent; + FThreadIDTemp : Integer; + begin Result:= nil; FThreadID:= TThread.CurrentThread.ThreadID; + FThreadIDTemp := MainThreadID; - if (FThreadID <> MainThreadID) then + if (FThreadID <> FThreadIDTemp) then begin try vPrismSession:= (PrismBaseClass.Sessions.FromThreadID(FThreadID, false) as TPrismSession); diff --git a/Beta/D2Bridge Framework/D2Bridge.Rest.Route.pas b/Beta/D2Bridge Framework/D2Bridge.Rest.Route.pas index 7ca9dc6..a0d321e 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Rest.Route.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Rest.Route.pas @@ -164,7 +164,7 @@ TD2BridgeRestRoutes = class(TInterfacedPersistent, ID2BridgeRestRoutes) implementation Uses - Prism.BaseClass, + Prism.BaseClass, D2Bridge.DebugUtils, D2Bridge.Rest.Session, D2Bridge.Rest.Server; diff --git a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm index 5391d15..7ebbba1 100644 --- a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm +++ b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm @@ -1,8 +1,8 @@ object D2BridgeServerControllerBase: TD2BridgeServerControllerBase OldCreateOrder = False Height = 422 - HorizontalOffset = 556 - VerticalOffset = 328 + HorizontalOffset = 557 + VerticalOffset = 284 Width = 684 object CDSLog: TBufDataset FieldDefs = <> diff --git a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas index 33697d2..abac90a 100644 --- a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas +++ b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas @@ -53,6 +53,11 @@ interface {$IFDEF MSWINDOWS} ActiveX, Windows, {$ENDIF} + {$IFDEF LINUX} + BaseUnix, + termio, + Unix, + {$ENDIF} SyncObjs, {$IFNDEF D2BRIDGE} D2Bridge.Instance, @@ -60,7 +65,7 @@ interface {$IFDEF D2DOCKER} D2Bridge.API.D2Docker.Comm, {$ENDIF} - Prism, Prism.Interfaces, Prism.Session, Prism.Types, D2Bridge.Interfaces, + Prism, Prism.Interfaces, Prism.Session, Prism.Types,D2Bridge.DebugUtils, D2Bridge.Interfaces, D2Bridge.Manager, D2Bridge.Types, D2Bridge.Prism.Form, D2Bridge.Lang.Interfaces, D2Bridge.Rest.Session, D2Bridge.Rest.Server, D2Bridge.Rest.Interfaces; @@ -222,6 +227,7 @@ implementation function IsEscapePressed: Boolean; +{$IFDEF MSWINDOWS} var InputHandle: THandle; InputRecord: TInputRecord; @@ -257,6 +263,35 @@ function IsEscapePressed: Boolean; end; end; end; +{$ELSE} +var + OldTermios, NewTermios: termios; + ch: Char; BytesRead: ssize_t; OldFlags: Integer; + begin + Result := False; + if tcgetattr(StdInputHandle, OldTermios) <> 0 then Exit; + NewTermios := OldTermios; + NewTermios.c_lflag := NewTermios.c_lflag and not (cardinal(ICANON) or cardinal(ECHO)); + NewTermios.c_cc[VMIN] := 0; + NewTermios.c_cc[VTIME] := 0; + if tcsetattr(StdInputHandle, TCSANOW, NewTermios) <> 0 then Exit; + try + OldFlags := FpFcntl(StdInputHandle, F_GETFL, 0); + FpFcntl(StdInputHandle, F_SETFL, OldFlags or O_NONBLOCK); + try + ch := #0; + BytesRead := FpRead(StdInputHandle, ch, 1); + if (BytesRead = 1) and (Ord(ch) = 27) then Result := True; + finally + FpFcntl(StdInputHandle, F_SETFL, OldFlags); + end; + finally + tcsetattr(StdInputHandle, TCSANOW, OldTermios); + end; + end; +{$ENDIF} + + { TD2BridgeServerControllerBase } @@ -407,7 +442,7 @@ destructor TD2BridgeServerControllerBase.Destroy; if (not IsD2DockerContext) and ((Not IsDebuggerPresent) {$IFnDEF FPC}or (not ReportMemoryLeaksOnShutdown){$ENDIF}) then begin {$IFDEF FPC} - TerminateProcess(GetCurrentProcess, 0); + Halt(0);//TerminateProcess(GetCurrentProcess, 0); {$ENDIF} {$IFDEF MSWINDOWS} ExitProcess(0); @@ -1104,4 +1139,4 @@ initialization {$I D2Bridge.Lang.lrs} {$ENDIF} -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/D2Bridge.Util.pas b/Beta/D2Bridge Framework/D2Bridge.Util.pas index 9d0aac0..08bae5c 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Util.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Util.pas @@ -61,6 +61,9 @@ interface {$ENDIF} {$ELSE} base64, LCLIntf, URIParser, + {$IFDEF LINUX} + BaseUnix, + {$ENDIF} {$ENDIF} {$IFDEF FMX} FMX.Controls, FMX.Forms, FMX.TabControl, FMX.Platform, FMX.Graphics, @@ -74,13 +77,15 @@ interface {$IFDEF FPC} -// FPC: declare as APIs que podem não existir nos headers + {$IFDEF MSWINDOWS} +// FPC/Windows: declara as APIs Win32 que podem nao existir nos headers do FPC function ProcessIdToSessionId(dwProcessId: DWORD; var pSessionId: DWORD): BOOL; stdcall; external 'kernel32' name 'ProcessIdToSessionId'; function OpenInputDesktop(dwFlags: DWORD; fInherit: BOOL; dwDesiredAccess: DWORD): THandle; stdcall; external 'user32' name 'OpenInputDesktop'; function CloseDesktop(hDesktop: THandle): BOOL; stdcall; external 'user32' name 'CloseDesktop'; + {$ENDIF} {$ENDIF} @@ -149,8 +154,11 @@ procedure FreeInterfaceList(var AList: TList); {$IFDEF MSWINDOWS} function IsRunningAsService: Boolean; +{$ELSE} +function IsRunningAsService: Boolean; {$ENDIF} + implementation uses @@ -412,7 +420,7 @@ function Base64FromFile(AFile: string): string; var Output, Input: TStringStream; {$IFDEF FPC} - Encoder: TBase64EncodingStream; + Encoder: TBase64EncodingStream; {$ENDIF} begin try @@ -476,15 +484,22 @@ function RelativeFileFromRoot(AFilePath: string): string; function URLEncode(AURI: string): string; begin {$IFnDEF FPC} - result:= URIEncode(AURI); + result := URIEncode(AURI); {$ELSE} - Result:= FilenameToURI(AURI); + // No FPC/Linux: EncodeURI do URIParser codifica caracteres especiais corretamente + {$IFDEF MSWINDOWS} + Result := string(FilenameToURI(AnsiString(AURI))); //EncodeURI(AURI); + {$ELSE} + Result:= string(FilenameToURI(AnsiString(AURI))); + {$ENDIF} {$ENDIF} end; function URLDecode(AURI: string): string; +var + vAnsi: AnsiString; begin -{$IFnDEF FPC} + {$IFnDEF FPC} result:= TNetEncoding.URL.Decode(AURI); {$ELSE} URIToFilename(AURI, Result); @@ -497,9 +512,17 @@ function HexToTColor(Hex: string): {$IFNDEF FMX}TColor{$ELSE}TAlphaColor{$ENDIF} R, G, B: Byte; begin if SameText(Hex, 'black') then +{$IFDEF FPC} + nColor := TColor($000000) +{$ELSE} nColor := TColorRec.Black +{$ENDIF} else if SameText(Hex, 'white') then +{$IFDEF FPC} + nColor := TColor($FFFFFF) +{$ELSE} nColor := TColorRec.White +{$ENDIF} // Adiciona suporte para todas as cores nomeadas disponíveis no CSS else if SameText(Hex, 'aqua') then nColor := $00FFFF @@ -1049,11 +1072,43 @@ function IsRunningAsService: Boolean; end; {$ELSE} function IsRunningAsService: Boolean; +{$IFDEF FPC} +// Linux: processo é serviço quando pai é PID 1 (systemd/init) e sem terminal +var + PProcFile: string; + F: TextFile; + Line: string; + PPid: Integer; +begin + Result := False; + PProcFile := Format('/proc/%d/status', [GetProcessID]); + if not FileExists(PProcFile) then + Exit; + AssignFile(F, PProcFile); + try + Reset(F); + while not EOF(F) do + begin + ReadLn(F, Line); + if Copy(Line, 1, 5) = 'PPid:' then + begin + PPid := StrToIntDef(Trim(Copy(Line, 6, MaxInt)), -1); + // Se o pai é o PID 1 (systemd/init), provavelmente é um serviço + Result := (PPid = 1); + Break; + end; + end; + finally + CloseFile(F); + end; +end; +{$ELSE} begin // Não-Windows: ajuste a sua própria heurística (systemd, etc.) Result := False; end; {$ENDIF} +{$ENDIF} -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/D2Bridge.inc b/Beta/D2Bridge Framework/D2Bridge.inc index adbca75..bac1a0f 100644 --- a/Beta/D2Bridge Framework/D2Bridge.inc +++ b/Beta/D2Bridge Framework/D2Bridge.inc @@ -337,4 +337,8 @@ This file is divided into two parts: Configurations and Implementation {$ENDIF} + + + + {$ENDIF ~D2Bridge_INC} diff --git a/Beta/D2Bridge Framework/Prism/Prism.BaseClass.Sessions.pas b/Beta/D2Bridge Framework/Prism/Prism.BaseClass.Sessions.pas index 03c5c63..f14f032 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.BaseClass.Sessions.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.BaseClass.Sessions.pas @@ -44,7 +44,7 @@ interface {$ELSE} Forms, {$ENDIF} - Prism.Interfaces, Prism.Session; + D2Bridge.DebugUtils, Prism.Interfaces, Prism.Session; type TPrismSessions = class(TInterfacedPersistent, IPrismSessions) @@ -708,4 +708,4 @@ function TPrismSessions.ThreadhIDs: TList; FLockIDSession.EndRead; end; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/Prism/Prism.Options.pas b/Beta/D2Bridge Framework/Prism/Prism.Options.pas index e4f4655..4f3a4fd 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Options.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Options.pas @@ -35,7 +35,7 @@ interface uses - Classes, SysUtils, + Classes, SysUtils, D2Bridge.DebugUtils, {$IFDEF HAS_UNIT_SYSTEM_IOUTILS} System.IOUtils, {$ENDIF} @@ -686,4 +686,4 @@ procedure TPrismOptions.SetVCLStyles(const Value: Boolean); FVCLStyles:= Value; end; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm b/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm index 7e5c585..487b16c 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm +++ b/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm @@ -1,7 +1,7 @@ object PrismServerHTMLHeaders: TPrismServerHTMLHeaders OldCreateOrder = False Height = 433 - HorizontalOffset = 0 - VerticalOffset = 0 + HorizontalOffset = 66 + VerticalOffset = 32 Width = 705 end diff --git a/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.pas b/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.pas index 235f9c4..436204b 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.pas @@ -704,4 +704,4 @@ procedure TPrismServerHTMLHeaders.ReloadPage(Session: TPrismSession); end; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas b/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas index 58dde69..e9096e4 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas @@ -203,6 +203,8 @@ procedure TPrismServerTCP.CloseAllConnection; end; constructor TPrismServerTCP.Create; +var + lstDirSep : String; begin inherited Create; @@ -210,7 +212,8 @@ constructor TPrismServerTCP.Create; IdServerIOHandlerSSLOpenSSL := nil; - FRootDirectory:= 'wwwroot' + PathDelim; + lstDirSep := PathDelim; + FRootDirectory:= 'wwwroot' + lstDirSep; FAppBase:= '/'; @@ -1474,6 +1477,7 @@ procedure TPrismServerTCP.Exec_OpenForm(varContext, varPrismHTTPRequest, varPris xResponseFileName, xResponseFileContent, xResponseRedirect, xMimeType: string; xPage429: string; vAppBase: string; + vBytes : TBytes; begin try xContext:= TIdContext(varContext.AsObject); @@ -1542,8 +1546,14 @@ procedure TPrismServerTCP.Exec_OpenForm(varContext, varPrismHTTPRequest, varPris if xPrismResponse.Content <> '' then if Assigned(xIOHandle) and (xContext.Connection <> nil) then - xIOHandle.Write(xPrismResponse.Content, IndyTextEncoding_UTF8); - + begin + {$IFDEF MSWINDOWS} + xIOHandle.Write(xPrismResponse.Content, IndyTextEncoding_UTF8); + {$ELSE} + vBytes := TEncoding.UTF8.GetBytes(xPrismResponse.Content); + xIOHandle.Write(vBytes); + {$ENDIF} + end; try DoFinishedGetHTML(xPrismWSContext); except @@ -1559,7 +1569,13 @@ procedure TPrismServerTCP.Exec_OpenForm(varContext, varPrismHTTPRequest, varPris xIOHandle.WriteLn('D2DockerInstance: ' + PrismBaseClass.ServerController.D2DockerInstanceAlias); {$ENDIF} xIOHandle.WriteLn(''); - xIOHandle.Write(xPage429, IndyTextEncoding_UTF8); + {$IFDEF MSWINDOWS} + xIOHandle.Write(xPage429, IndyTextEncoding_UTF8); + {$ELSE} + vBytes := TEncoding.UTF8.GetBytes(xPage429); + xIOHandle.Write(vBytes); + {$ENDIF} + end; except end; @@ -2613,4 +2629,4 @@ procedure TWebSocketIOHandlerHelper.WriteString(const str: string); WriteBytes(TArray(IndyTextEncoding_UTF8.GetBytes(str))); end; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas b/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas index 5f712f3..9a1a1df 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas @@ -39,7 +39,7 @@ interface {$IFDEF MSWINDOWS} Windows, {$ENDIF} - IdSSLOpenSSL, SyncObjs; + D2Bridge.DebugUtils,IdSSLOpenSSL, SyncObjs; type TPrismThreadServerTCP = class(TThread) @@ -194,7 +194,7 @@ procedure TPrismThreadServerTCP.Execute; Sleep(10000); {$IFDEF FPC} - TerminateProcess(GetCurrentProcess, 0); + Halt(0);//TerminateProcess(GetCurrentProcess, 0); {$ENDIF} {$IFDEF MSWINDOWS} ExitProcess(0); @@ -294,4 +294,4 @@ procedure TPrismThreadServerTCP.StopServer; -end. \ No newline at end of file +end. diff --git a/Beta/D2Bridge Framework/Prism/Prism.Util.pas b/Beta/D2Bridge Framework/Prism/Prism.Util.pas index d40cf11..60461ae 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Util.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Util.pas @@ -97,50 +97,56 @@ function FormatOfCurrency(AFormatSettings: TFormatSettings; FUseCurSymbol: boole implementation uses - Prism.BaseClass; + Prism.BaseClass + {$IFNDEF MSWINDOWS} + {$IFDEF FPC} + , LCLType + {$ENDIF} + {$ENDIF} + ; {$IFNDEF MSWINDOWS} -const - VK_BACK = vkBack; {8} - VK_TAB = vkTab; {9} - VK_RETURN = vkReturn; {13} - VK_SHIFT = vkShift; { $10, 16} - VK_CONTROL = vkControl; {17} - VK_PAUSE = vkPause; {19} - - VK_CAPITAL = vkCapital; {20} - VK_SPACE = vkSpace; { $20} - VK_ESCAPE = vkEscape; {27} - - VK_PRIOR = vkPrior; {33} - VK_NEXT = vkNext; {34} - VK_END = vkEnd; {35} - VK_HOME = vkHome; {35} - - VK_LEFT = vkLeft; {37} - VK_UP = vkUp; {38} - VK_RIGHT = vkRight; {39} - VK_DOWN = vkDown; {40} - - VK_SNAPSHOT = vkSnapShot; {44} - VK_INSERT = vkInsert; {45} - VK_DELETE = vkDelete; {46} - - VK_F1 = vkF1; {112} - VK_F2 = vkF2; {113} - VK_F3 = vkF3; {114} - VK_F4 = vkF4; {115} - VK_F5 = vkF5; {116} - VK_F6 = vkF6; {117} - VK_F7 = vkF7; {118} - VK_F8 = vkF8; {119} - VK_F9 = vkF9; {120} - VK_F10 = vkF10; {121} - VK_F11 = vkF11; {122} - VK_F12 = vkF12; {123} - - VK_NUMLOCK = vkNumLock; {144} - VK_SCROLL = vkScroll; {145} +const + VK_BACK = vk_Back; {8} + VK_TAB = vk_Tab; {9} + VK_RETURN = vk_Return; {13} + VK_SHIFT = vk_Shift; { $10, 16} + VK_CONTROL = vk_Control; {17} + VK_PAUSE = vk_Pause; {19} + + VK_CAPITAL = vk_Capital; {20} + VK_SPACE = vk_Space; { $20} + VK_ESCAPE = vk_Escape; {27} + + VK_PRIOR = vk_Prior; {33} + VK_NEXT = vk_Next; {34} + VK_END = vk_End; {35} + VK_HOME = vk_Home; {35} + + VK_LEFT = vk_Left; {37} + VK_UP = vk_Up; {38} + VK_RIGHT = vk_Right; {39} + VK_DOWN = vk_down; {40} + + VK_SNAPSHOT = vk_SnapShot; {44} + VK_INSERT = vk_Insert; {45} + VK_DELETE = vk_Delete; {46} + + VK_F1 = vk_F1; {112} + VK_F2 = vk_F2; {113} + VK_F3 = vk_F3; {114} + VK_F4 = vk_F4; {115} + VK_F5 = vk_F5; {116} + VK_F6 = vk_F6; {117} + VK_F7 = vk_F7; {118} + VK_F8 = vk_F8; {119} + VK_F9 = vk_F9; {120} + VK_F10 = vk_F10; {121} + VK_F11 = vk_F11; {122} + VK_F12 = vk_F12; {123} + + VK_NUMLOCK = vk_NumLock; {144} + VK_SCROLL = vk_Scroll; {145} {$IFEND} @@ -1206,4 +1212,4 @@ function FormatOfCurrency(AFormatSettings: TFormatSettings; FUseCurSymbol: boole end; -end. \ No newline at end of file +end. diff --git a/Beta/Demos/Lazarus/Lazarus.lps b/Beta/Demos/Lazarus/Lazarus.lps index cf11b5e..4dc763c 100644 --- a/Beta/Demos/Lazarus/Lazarus.lps +++ b/Beta/Demos/Lazarus/Lazarus.lps @@ -9,11 +9,10 @@ - + - - + @@ -21,7 +20,7 @@ - + @@ -29,7 +28,7 @@ - + @@ -40,7 +39,7 @@ - + @@ -51,17 +50,15 @@ - + - - + - - + @@ -69,11 +66,11 @@ + + - - - + @@ -81,12 +78,10 @@ - - + + - - - + @@ -97,7 +92,7 @@ - + @@ -108,16 +103,15 @@ - + - + - - + @@ -128,7 +122,7 @@ - + @@ -138,7 +132,7 @@ - + @@ -150,7 +144,7 @@ - + @@ -162,7 +156,7 @@ - + @@ -174,7 +168,7 @@ - + @@ -185,7 +179,7 @@ - + @@ -194,7 +188,7 @@ - + @@ -202,7 +196,7 @@ - + @@ -210,7 +204,7 @@ - + @@ -218,7 +212,7 @@ - + @@ -270,11 +264,10 @@ - + - @@ -426,139 +419,20 @@ - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/Beta/Demos/Lazarus_linux/D2BridgeFormTemplate.pas b/Beta/Demos/Lazarus_linux/D2BridgeFormTemplate.pas new file mode 100644 index 0000000..529df88 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/D2BridgeFormTemplate.pas @@ -0,0 +1,75 @@ +unit D2BridgeFormTemplate; + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +Uses + Classes, + D2Bridge.Prism.Form; + + +type + { TD2BridgeFormTemplate } + TD2BridgeFormTemplate = class(TD2BridgePrismForm) + private + procedure ProcessHTML(Sender: TObject; var AHTMLText: string); + procedure ProcessTagHTML(const TagString: string; var ReplaceTag: string); + procedure DoInitPrismControl(const PrismControl: TPrismControl); override; + //function OpenMenuItem(EventParams: TStrings): String; + public + constructor Create(AOwner: TComponent; D2BridgePrismFramework: TObject); override; + end; + + +implementation + +Uses + LazarusWebApp, UnitMenu; + + +{ TD2BridgeFormTemplate } + +constructor TD2BridgeFormTemplate.Create(AOwner: TComponent; D2BridgePrismFramework: TObject); +begin + inherited; + + //Events + OnProcessHTML:= ProcessHTML; + OnTagHTML:= ProcessTagHTML; + + if FormMenu = nil then + TFormMenu.CreateInstance; + + with D2Bridge.Items.Add do + SideMenu(FormMenu.MainMenu1); +end; + +procedure TD2BridgeFormTemplate.ProcessHTML(Sender: TObject; + var AHTMLText: string); +begin + //Intercep HTML Code + +end; + +procedure TD2BridgeFormTemplate.ProcessTagHTML(const TagString: string; + var ReplaceTag: string); +begin + //Process TAGs HTML {{TAGNAME}} + if TagString = 'UserName' then + begin + ReplaceTag := 'Name of User'; + end; +end; + +procedure TD2BridgeFormTemplate.DoInitPrismControl( + const PrismControl: TPrismControl); +begin + inherited; + + FormMenu.InitControlsD2Bridge(PrismControl); +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/FixD2BridgeLazBuild.sh b/Beta/Demos/Lazarus_linux/FixD2BridgeLazBuild.sh new file mode 100644 index 0000000..405417e --- /dev/null +++ b/Beta/Demos/Lazarus_linux/FixD2BridgeLazBuild.sh @@ -0,0 +1,2 @@ +#!/bin/bash +rm -rf lib/* diff --git a/Beta/Demos/Lazarus_linux/FixD2BridgeLazCompile.sh b/Beta/Demos/Lazarus_linux/FixD2BridgeLazCompile.sh new file mode 100644 index 0000000..852681f --- /dev/null +++ b/Beta/Demos/Lazarus_linux/FixD2BridgeLazCompile.sh @@ -0,0 +1,18 @@ +#!/bin/bash +BASE="lib/x86_64-linux/Debug/Web" + +rm -f "$BASE/D2Bridge.ServerControllerBase.o" +rm -f "$BASE/D2Bridge.ServerControllerBase.ppu" +rm -f "$BASE/D2Bridge.ServerControllerBase.lfm" +rm -f "$BASE/D2Bridge.API.D2Docker.Comm.o" +rm -f "$BASE/D2Bridge.API.D2Docker.Comm.ppu" +rm -f "$BASE/D2Bridge.API.D2Docker.Comm.lfm" +rm -f "$BASE/Prism.Server.HTML.o" +rm -f "$BASE/Prism.Server.HTML.ppu" +rm -f "$BASE/Prism.Server.HTML.lfm" +rm -f "$BASE/Prism.Server.Functions.o" +rm -f "$BASE/Prism.Server.Functions.ppu" +rm -f "$BASE/Prism.Server.Functions.lfm" +rm -f "$BASE/Prism.BaseClass.o" +rm -f "$BASE/Prism.BaseClass.ppu" +rm -f "$BASE/Prism.BaseClass.lfm" diff --git a/Beta/Demos/Lazarus_linux/Lazarus.lpi b/Beta/Demos/Lazarus_linux/Lazarus.lpi new file mode 100644 index 0000000..f2dc9fe --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Lazarus.lpi @@ -0,0 +1,402 @@ + + + + + + + + + <Scaled Value="True"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True"/> + </XPManifest> + </General> + <BuildModes> + <Item Name="D2Bridge Web Debug" Default="True"/> + <Item Name="D2Bridge Web Release"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="web\Lazarus"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\D2Bridge Framework;..\..\D2Bridge Framework\Prism;..\..\D2Bridge Framework\Others VCL"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)\Release\Web"/> + </SearchPaths> + <CodeGeneration> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <RunWithoutDebug Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CustomOptions Value="-dD2Bridge"/> + <ExecuteBefore> + <Command Value="FixD2BridgeLazCompile.sh"/> + <CompileReasons Build="False"/> + </ExecuteBefore> + </Other> + </CompilerOptions> + </Item> + <Item Name="Debug"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="Lazarus"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\D2Bridge Framework;..\..\D2Bridge Framework\Prism;..\..\D2Bridge Framework\Others VCL"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)\Debug"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <IncludeAssertionCode Value="True"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <Checks> + <IOChecks Value="True"/> + <OverflowChecks Value="True"/> + <StackChecks Value="True"/> + </Checks> + </CodeGeneration> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf3"/> + <UseHeaptrc Value="True"/> + <TrashVariables Value="True"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + </Item> + <Item Name="Release"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="Lazarus"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\D2Bridge Framework;..\..\D2Bridge Framework\Prism;..\..\D2Bridge Framework\OthersLCL"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)\Release"/> + </SearchPaths> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <RunWithoutDebug Value="True"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + </Item> + <Item Name="D2Docker Deploy"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="web\Lazarus.d2d" ApplyConventions="False"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\D2Bridge Framework;..\..\D2Bridge Framework\Prism;..\..\D2Bridge Framework\Others VCL"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)\Release\Web"/> + </SearchPaths> + <CodeGeneration> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <RunWithoutDebug Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + <ExecutableType Value="Library"/> + </Options> + </Linking> + <Other> + <CustomOptions Value="-dD2Bridge +-dD2Docker"/> + <ExecuteBefore> + <Command Value="FixD2BridgeLazCompile.sh"/> + <CompileReasons Build="False"/> + </ExecuteBefore> + </Other> + </CompilerOptions> + </Item> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="FCL"/> + </Item> + <Item> + <PackageName Value="indylaz"/> + </Item> + <Item> + <PackageName Value="DateTimeCtrls"/> + </Item> + <Item> + <PackageName Value="MemDSLaz"/> + </Item> + <Item> + <PackageName Value="LCL"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="Lazarus.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="D2BridgeWebAppWithLCL"/> + </Unit> + <Unit> + <Filename Value="..\..\D2Bridge Framework\D2Bridge.ServerControllerBase.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="D2BridgeServerControllerBase"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + </Unit> + <Unit> + <Filename Value="..\..\D2Bridge Framework\Prism\Prism.SessionBase.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="PrismSessionBase"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + </Unit> + <Unit> + <Filename Value="Lazarus_Session.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="LazarusSession"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + </Unit> + <Unit> + <Filename Value="LazarusWebApp.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="LazarusWebAppGlobal"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + </Unit> + <Unit> + <Filename Value="Unit_D2Bridge_Server_Console.pas"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="UnitMenu.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormMenu"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit> + <Unit> + <Filename Value="Unit_Login.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form_Login"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit> + <Unit> + <Filename Value="unitcontrols.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormControls"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit> + <Unit> + <Filename Value="unitdbgrid.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormDBGrid"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitDBGrid"/> + </Unit> + <Unit> + <Filename Value="D2BridgeFormTemplate.pas"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="unitdbgridedit.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormDBGridEdit"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitDBGridEdit"/> + </Unit> + <Unit> + <Filename Value="unitstringgrid.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormStringGrid"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitStringGrid"/> + </Unit> + <Unit> + <Filename Value="unitqrcode.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormQRCode"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitQRCode"/> + </Unit> + <Unit> + <Filename Value="unitcardgriddatamodel.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormCardGridDataModel"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitCardGridDataModel"/> + </Unit> + <Unit> + <Filename Value="unitkanban.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormKanban"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitKanban"/> + </Unit> + <Unit> + <Filename Value="unitauth.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormAuth"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitAuth"/> + </Unit> + <Unit> + <Filename Value="unitqrcodereader.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormQRCodeReader"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitQRCodeReader"/> + </Unit> + <Unit> + <Filename Value="unitcamera.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormCamera"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UnitCamera"/> + </Unit> + <Unit> + <Filename Value="unitmarkdowneditor.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormMarkDownEditor"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UnitMarkDownEditor"/> + </Unit> + <Unit> + <Filename Value="unitwysiwygeditor.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormWYSIWYGEditor"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UnitWYSIWYGEditor"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="web\Lazarus"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\D2Bridge Framework;..\..\D2Bridge Framework\Prism;..\..\D2Bridge Framework\Others VCL"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)\Debug\Web"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <IncludeAssertionCode Value="True"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <Checks> + <IOChecks Value="True"/> + <OverflowChecks Value="True"/> + <StackChecks Value="True"/> + </Checks> + </CodeGeneration> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf3"/> + <UseHeaptrc Value="True"/> + <TrashVariables Value="True"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CustomOptions Value="-dD2Bridge"/> + <ExecuteBefore> + <Command Value="FixD2BridgeLazCompile.sh"/> + <CompileReasons Build="False"/> + </ExecuteBefore> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + <Item> + <Name Value="RunError(219)"/> + </Item> + <Item> + <Name Value="EIdConnClosedGracefully"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/Beta/Demos/Lazarus_linux/Lazarus.lpr b/Beta/Demos/Lazarus_linux/Lazarus.lpr new file mode 100644 index 0000000..d9a87d3 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Lazarus.lpr @@ -0,0 +1,44 @@ +{$IFDEF D2DOCKER}library{$ELSE}program{$ENDIF} D2BridgeWebAppWithLCL; + +{$mode delphi}{$H+} + +{$IFDEF D2BRIDGE} +{$APPTYPE CONSOLE} +{$ENDIF} + +uses + {$IFDEF UNIX} + cthreads, clocale, + {$ENDIF} + {$IFDEF HASAMIGA} + athreads, + {$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, D2Bridge.Instance, D2Bridge.API.D2Docker.Comm, D2Bridge.ServerControllerBase, Prism.SessionBase, + Lazarus_Session, LazarusWebApp, Unit_D2Bridge_Server_Console, UnitMenu, + Unit_Login, unitcontrols, unitDBGrid, D2BridgeFormTemplate, + unitDBGridEdit, unitStringGrid, unitQRCode, unitCardGridDataModel, unitKanban, + unitAuth, unitQRCodeReader, unitCamera, unitMarkDownEditor, unitWYSIWYGEditor + { you can add units after this }; + +{$R *.res} + +{$IFNDEF D2BRIDGE} +var + FormLogin: TForm_Login; +{$ENDIF} + +begin + RequireDerivedFormResource:=True; + Application.Scaled:=True; + Application.Initialize; + {$IFNDEF D2BRIDGE} + Application.CreateForm(TForm_Login, FormLogin); + D2BridgeInstance.AddInstace(FormLogin); + Application.Run; + {$ELSE} + TD2BridgeServerConsole.Run; + + {$ENDIF} +end. + diff --git a/Beta/Demos/Lazarus_linux/Lazarus.lps b/Beta/Demos/Lazarus_linux/Lazarus.lps new file mode 100644 index 0000000..786d849 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Lazarus.lps @@ -0,0 +1,214 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <Version Value="12"/> + <BuildModes Active="D2Bridge Web Debug"/> + <Units> + <Unit> + <Filename Value="Lazarus.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="D2BridgeWebAppWithLCL"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="../../D2Bridge Framework/D2Bridge.ServerControllerBase.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="D2BridgeServerControllerBase"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + <EditorIndex Value="-1"/> + <CursorPos X="26" Y="4"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="../../D2Bridge Framework/Prism/Prism.SessionBase.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="PrismSessionBase"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="Lazarus_Session.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="LazarusSession"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="LazarusWebApp.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="LazarusWebAppGlobal"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="Unit_D2Bridge_Server_Console.pas"/> + <IsPartOfProject Value="True"/> + <TopLine Value="467"/> + <CursorPos X="55" Y="471"/> + <UsageCount Value="21"/> + <Loaded Value="True"/> + </Unit> + <Unit> + <Filename Value="UnitMenu.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormMenu"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="Unit_Login.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form_Login"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="1"/> + <CursorPos X="43" Y="6"/> + <UsageCount Value="21"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + </Unit> + <Unit> + <Filename Value="unitcontrols.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormControls"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitdbgrid.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormDBGrid"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitDBGrid"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="D2BridgeFormTemplate.pas"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitdbgridedit.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormDBGridEdit"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitDBGridEdit"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitstringgrid.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormStringGrid"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitStringGrid"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitqrcode.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormQRCode"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitQRCode"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitcardgriddatamodel.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormCardGridDataModel"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitCardGridDataModel"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitkanban.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormKanban"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitKanban"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitauth.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormAuth"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitAuth"/> + <EditorIndex Value="-1"/> + <TopLine Value="33"/> + <CursorPos X="15" Y="44"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitqrcodereader.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormQRCodeReader"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="unitQRCodeReader"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitcamera.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormCamera"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UnitCamera"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitmarkdowneditor.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormMarkDownEditor"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UnitMarkDownEditor"/> + <UsageCount Value="21"/> + </Unit> + <Unit> + <Filename Value="unitwysiwygeditor.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FormWYSIWYGEditor"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="UnitWYSIWYGEditor"/> + <UsageCount Value="21"/> + </Unit> + </Units> + <JumpHistory HistoryIndex="4"> + <Position> + <Filename Value="Unit_D2Bridge_Server_Console.pas"/> + <Caret Line="81" Column="16" TopLine="70"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="10" Column="3"/> + </Position> + <Position> + <Filename Value="Unit_D2Bridge_Server_Console.pas"/> + <Caret Line="73" Column="36" TopLine="72"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="170" Column="28" TopLine="163"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="12" Column="54"/> + </Position> + </JumpHistory> + <RunParams> + <FormatVersion Value="2"/> + <Modes ActiveMode=""/> + </RunParams> + </ProjectSession> +</CONFIG> diff --git a/Beta/Demos/Lazarus_linux/Lazarus.res b/Beta/Demos/Lazarus_linux/Lazarus.res new file mode 100644 index 0000000000000000000000000000000000000000..18ed76a9f75066926afa01c1beff825fdaec3b9a GIT binary patch literal 1824 zcmbVNU61256dhi8KtkF_9*rN7obRN`D4kWc0;z(9k!D!LqhsH6A`&OqPG>8`f90Pn zHy`b!tC<d>QW}3ApL6f=&DGV_6~X7zr|H4w+3%k(kMrN)nlHw=H*cPn<ZnMVHQ9qU zRjbz2cRWf!iB?u>x2C_||G-j8jO9x5x>c~I2Qc*Q&DUS$+!$zz`alpsnKkXTx;Ekg z8g5uq3Ei5uv`n<kH8+j3_bF+(s!A~S!}2tQA}6e^1Z69GI3whE1F2580*q<(MvI5a zg0Q_tI^R*Ec!Q01ZPRge_!&FSt!`y6?AYFP-SDQw9y(n1SgA0e?s%#MBXreSRDSb& z+iSwRuC4?h2FPO4$=yY7-r9jevf?mwNiJdP+sz!6arhZwOBOTp_s3v4zg0@MkH$eQ zO{>_uR$1NFhCYQO8G>;+99>_ah#%o_-~IuZ(j?B}B8mJc5~B2FNlDGsuIIZkdSfKW zAn+LhPs5YW-0I%gtt#99nDmfN;V~e3jd`7;qT$aTeE{-SSNp1l9hhl`<fp0cKjNMt z6F<QoYElpXYs$@5?NOJeq^~w&aKxIHyf!f96jR}zAU;FS-6f6OJ&764&e5nHX1=KE z!GEuM`fT~&?n&svL9^Cx86$IE$%hJW5@BqfGJV&z8pH6*9ofn?{R;xm_oH~l{5VQj z6pEPfxCG{TsRV#fhNbs6B~#8wzJy*~fDL0mOpA=OSY`-Y7Luh9NXCOG@`4~Pvyi_4 zn_hs8cu)o@ge(q=j73r8vw~-W$t05zk9Y!M`Vy?;UjX*YWR-|j!cq@>76oC((82{v zL+O=?^dw)s1nheka8vNg754*HltqYffRtfWViu*Pj6LqhJX^-W{XChudzSUlHdx#C z;q_wWWSybr?Za1#;_-e=C|H|@>wgE<V)Zpg6FykmUAyjFTb)yFb&!pF_kQaJo)^2b z$BvsPKVo6(s?8(UaC5JF!25jcj#bNj_T1UYqp<%^$xmLOG@MLw{Fv-+xqX<(jW;-V X&j-haukg%g35x_E{b6+aINkgUUmZOI literal 0 HcmV?d00001 diff --git a/Beta/Demos/Lazarus_linux/LazarusWebApp.lfm b/Beta/Demos/Lazarus_linux/LazarusWebApp.lfm new file mode 100644 index 0000000..06538d1 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/LazarusWebApp.lfm @@ -0,0 +1,4 @@ +inherited LazarusWebAppGlobal: TLazarusWebAppGlobal + Height = 623 + Width = 600 +end diff --git a/Beta/Demos/Lazarus_linux/LazarusWebApp.pas b/Beta/Demos/Lazarus_linux/LazarusWebApp.pas new file mode 100644 index 0000000..8e0ea71 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/LazarusWebApp.pas @@ -0,0 +1,168 @@ +unit LazarusWebApp; + +{$IFDEF FPC} +{$mode delphi}{$H+} +{$ENDIF} + +interface + +Uses + Classes, SysUtils, + System.UITypes, + D2Bridge.ServerControllerBase, D2Bridge.Types, + Prism.Session, Prism.Server.HTTP.Commom, Prism.Types, Prism.Interfaces, + Lazarus_Session; + +type + IPrismSession = Prism.Interfaces.IPrismSession; + TSessionChangeType = Prism.Types.TSessionChangeType; + TD2BridgeLang = D2Bridge.Types.TD2BridgeLang; + + +type + TLazarusWebAppGlobal = class(TD2BridgeServerControllerBase) + private + procedure OnNewSession(const Request: TPrismHTTPRequest; Response: TPrismHTTPResponse; Session: TPrismSession); + procedure OnCloseSession(Session: TPrismSession); + procedure OnDisconnectSession(Session: TPrismSession); + procedure OnReconnectSession(Session: TPrismSession); + procedure OnExpiredSession(Session: TPrismSession; var Renew: boolean); + procedure OnIdleSession(Session: TPrismSession; var Renew: boolean); + procedure OnException(Form: TObject; Sender: TObject; E: Exception; FormName: String; ComponentName: String; EventName: string; APrismSession: IPrismSession); + procedure OnSecurity(const SecEventInfo: TSecuritEventInfo); + public + constructor Create(AOwner: TComponent); override; + + end; + + +var + D2BridgeServerController: TLazarusWebAppGlobal; + + +Function LazarusDemo: TLazarusDemoSession; + + +implementation + +{%CLASSGROUP 'System.Classes.TPersistent'} + +Uses + D2Bridge.Instance; + +{$IFNDEF FPC} +{$R *.dfm} +{$ELSE} +{$R *.lfm} +{$ENDIF} + +Function LazarusDemo: TLazarusDemoSession; +begin + Result:= TLazarusDemoSession(D2BridgeInstance.PrismSession.Data); +end; + +constructor TLazarusWebAppGlobal.Create(AOwner: TComponent); +begin + inherited; + {$IFDEF D2BRIDGE} + Prism.OnNewSession:= OnNewSession; + Prism.OnCloseSession:= OnCloseSession; + Prism.OnDisconnectSession:= OnDisconnectSession; + Prism.OnReconnectSession:= OnReconnectSession; + Prism.OnExpiredSession:= OnExpiredSession; + Prism.OnIdleSession:= OnIdleSession; + Prism.OnException:= OnException; + Prism.OnSecurity:= OnSecurity; + {$ENDIF} + + if IsD2BridgeContext then + begin + //Our Code + with D2BridgeManager.API.Auth.Google do + begin + Config.ClientID :='48089097822-t8j04t1k7u08ic0fopckf5tp6n7kesfr.apps.googleusercontent.com'; + Config.ClientSecret:='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'; + end; + + with D2BridgeManager.API.Auth.Microsoft do + begin + Config.ClientID :='f04a67e5-7136-4bf0-aba0-de36e006e668'; + Config.ClientSecret:='WVw8Q~R6FJKOTvg_FIP92jNWLvwuYwebgUAkkclK'; + end; + end; + + + {$IFNDEF D2BRIDGE} + OnNewSession(nil, nil, D2BridgeInstance.PrismSession as TPrismSession); + {$ENDIF} +end; + +procedure TLazarusWebAppGlobal.OnException(Form, Sender: TObject; E: Exception; FormName, ComponentName, EventName: string; APrismSession: IPrismSession); +begin + //Show Error Messages + { + if Assigned(APrismSession) then + APrismSession.ShowMessageError(E.Message); + } +end; + +procedure TLazarusWebAppGlobal.OnNewSession(const Request: TPrismHTTPRequest; Response: TPrismHTTPResponse; Session: TPrismSession); +begin + D2BridgeInstance.PrismSession.Data := TLazarusDemoSession.Create(Session); + + //Set Language just this Session + //Session.Language:= TD2BridgeLang.English; + + //Our Code + +end; + +procedure TLazarusWebAppGlobal.OnCloseSession(Session: TPrismSession); +begin + //Close ALL DataBase connection + //Ex: Dm.DBConnection.Close; + +end; + +procedure TLazarusWebAppGlobal.OnExpiredSession(Session: TPrismSession; var Renew: boolean); +begin + //Example of use Renew + { + if Session.InfoConnection.Identity = 'UserXYZ' then + Renew:= true; + } +end; + +procedure TLazarusWebAppGlobal.OnIdleSession(Session: TPrismSession; var Renew: boolean); +begin + +end; + +procedure TLazarusWebAppGlobal.OnDisconnectSession(Session: TPrismSession); +begin + +end; + +procedure TLazarusWebAppGlobal.OnReconnectSession(Session: TPrismSession); +begin + +end; + +procedure TLazarusWebAppGlobal.OnSecurity(const SecEventInfo: TSecuritEventInfo); +begin +{ + if SecEventInfo.Event = TSecurityEvent.secNotDelistIPBlackList then + begin + //Write IP Delist to Reload in WhiteList + SecEventInfo.IP... + end; +} +end; + + +{$IFNDEF D2BRIDGE} +initialization + D2BridgeServerController:= TLazarusWebAppGlobal.Create(D2BridgeInstance.Owner); +{$ENDIF} + +end. diff --git a/Beta/Demos/Lazarus_linux/Lazarus_Session.lfm b/Beta/Demos/Lazarus_linux/Lazarus_Session.lfm new file mode 100644 index 0000000..a4b1abe --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Lazarus_Session.lfm @@ -0,0 +1,4 @@ +inherited LazarusSession: TLazarusSession + Height = 606 + Width = 697 +end diff --git a/Beta/Demos/Lazarus_linux/Lazarus_Session.pas b/Beta/Demos/Lazarus_linux/Lazarus_Session.pas new file mode 100644 index 0000000..6ca2835 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Lazarus_Session.pas @@ -0,0 +1,54 @@ +unit Lazarus_Session; + +interface + +uses + SysUtils, Classes, + Prism.SessionBase; + +type + TLazarusDemoSession = class(TPrismSessionBase) + private + + public + UserLoginMode: string; + UserID: string; + UserName: string; + UserEmail: string; + UserURLPicture: string; + + constructor Create(APrismSession: TPrismSession); override; //OnNewSession + destructor Destroy; override; //OnCloseSession + end; + + +implementation + +Uses + D2Bridge.Instance, + LazarusWebApp, UnitMenu; + +{$IFNDEF FPC} +{$R *.dfm} +{$ELSE} +{$R *.lfm} +{$ENDIF} + +constructor TLazarusDemoSession.Create(APrismSession: TPrismSession); //OnNewSession +begin + inherited; + + //Your code + +end; + +destructor TLazarusDemoSession.Destroy; //OnCloseSession +begin + //Close ALL DataBase connection + //Ex: Dm.DBConnection.Close; + + inherited; +end; + +end. + diff --git a/Beta/Demos/Lazarus_linux/UnitMenu.lfm b/Beta/Demos/Lazarus_linux/UnitMenu.lfm new file mode 100644 index 0000000..cce8b82 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/UnitMenu.lfm @@ -0,0 +1,62 @@ +object FormMenu: TFormMenu + Left = 642 + Height = 334 + Top = 263 + Width = 508 + Caption = 'Form Menu' + Menu = MainMenu1 + object MainMenu1: TMainMenu + Left = 384 + Top = 32 + object Module11: TMenuItem + Caption = 'Controls' + OnClick = Module11Click + end + object CoreModules1: TMenuItem + Caption = 'Grids' + object MenuItem1: TMenuItem + Caption = 'DBGrid' + OnClick = MenuItem1Click + end + object MenuItem2: TMenuItem + Caption = 'StringGrid' + OnClick = MenuItem2Click + end + end + object MenuItem3: TMenuItem + Caption = 'QRCode' + OnClick = MenuItem3Click + end + object MenuItem4: TMenuItem + Caption = 'Card Grid Data Model' + OnClick = MenuItem4Click + end + object MenuItem5: TMenuItem + Caption = 'Kanban' + OnClick = MenuItem5Click + end + object MenuItem9: TMenuItem + Caption = 'Editors' + object MenuItem10: TMenuItem + Caption = 'MarkDown' + OnClick = MenuItem10Click + end + object MenuItem11: TMenuItem + Caption = 'WYSIWYG' + OnClick = MenuItem11Click + end + end + object MenuItem7: TMenuItem + Caption = 'QRCode Reader' + OnClick = MenuItem7Click + end + object MenuItem8: TMenuItem + Caption = 'Camera' + OnClick = MenuItem8Click + end + object MenuItem6: TMenuItem + Caption = 'Close Session' + OnClick = MenuItem6Click + end + end +end diff --git a/Beta/Demos/Lazarus_linux/UnitMenu.pas b/Beta/Demos/Lazarus_linux/UnitMenu.pas new file mode 100644 index 0000000..d292964 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/UnitMenu.pas @@ -0,0 +1,242 @@ +unit UnitMenu; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Controls, Graphics, Dialogs, Menus, StdCtrls, ExtCtrls, + D2Bridge.Forms; //Declare D2Bridge.Forms always in the last unit + +type + + { TFormMenu } + + TFormMenu = class(TD2BridgeForm) + CoreModules1: TMenuItem; + MainMenu1: TMainMenu; + MenuItem1: TMenuItem; + MenuItem10: TMenuItem; + MenuItem11: TMenuItem; + MenuItem2: TMenuItem; + MenuItem3: TMenuItem; + MenuItem4: TMenuItem; + MenuItem5: TMenuItem; + MenuItem6: TMenuItem; + MenuItem7: TMenuItem; + MenuItem8: TMenuItem; + MenuItem9: TMenuItem; + Module11: TMenuItem; + procedure MenuItem10Click(Sender: TObject); + procedure MenuItem11Click(Sender: TObject); + procedure MenuItem1Click(Sender: TObject); + procedure MenuItem2Click(Sender: TObject); + procedure MenuItem3Click(Sender: TObject); + procedure MenuItem4Click(Sender: TObject); + procedure MenuItem5Click(Sender: TObject); + procedure MenuItem6Click(Sender: TObject); + procedure MenuItem7Click(Sender: TObject); + procedure MenuItem8Click(Sender: TObject); + procedure Module11Click(Sender: TObject); + private + + protected + procedure ExportD2Bridge; override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + public + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + end; + + Function FormMenu: TFormMenu; + +implementation + +Uses + LazarusWebApp, UnitControls, UnitDBGrid, unitStringGrid, UnitQRCode, + unitCardGridDataModel, unitKanban, unitQRCodeReader, unitCamera, + unitMarkDownEditor, UnitWYSIWYGEditor; + +{$R *.lfm} + +{ TFormMenu } + +Function FormMenu: TFormMenu; +begin + Result:= (TFormMenu.GetInstance as TFormMenu); +end; + +procedure TFormMenu.Module11Click(Sender: TObject); +begin + if FormControls = nil then + TFormControls.CreateInstance; + FormControls.Show; +end; + +procedure TFormMenu.MenuItem1Click(Sender: TObject); +begin + if FormDBGrid = nil then + TFormDBGrid.CreateInstance; + FormDBGrid.Show; +end; + +procedure TFormMenu.MenuItem10Click(Sender: TObject); +begin + if FormMarkDownEditor = nil then + TFormMarkDownEditor.CreateInstance; + FormMarkDownEditor.Show; +end; + +procedure TFormMenu.MenuItem11Click(Sender: TObject); +begin + if FormWYSIWYGEditor = nil then + TFormWYSIWYGEditor.CreateInstance; + FormWYSIWYGEditor.Show; + +end; + +procedure TFormMenu.MenuItem2Click(Sender: TObject); +begin + if FormStringGrid = nil then + TFormStringGrid.CreateInstance; + FormStringGrid.Show; + +end; + +procedure TFormMenu.MenuItem3Click(Sender: TObject); +begin + if FormQRCode = nil then + TFormQRCode.CreateInstance; + FormQRCode.Show; +end; + +procedure TFormMenu.MenuItem4Click(Sender: TObject); +begin + if FormCardGridDataModel = nil then + TFormCardGridDataModel.CreateInstance; + FormCardGridDataModel.Show; +end; + +procedure TFormMenu.MenuItem5Click(Sender: TObject); +begin + if FormKanban = nil then + TFormKanban.CreateInstance; + FormKanban.Show; +end; + +procedure TFormMenu.MenuItem6Click(Sender: TObject); +begin + PrismSession.Close(true); +end; + +procedure TFormMenu.MenuItem7Click(Sender: TObject); +begin + if FormQRCodeReader = nil then + TFormQRCodeReader.CreateInstance; + FormQRCodeReader.Show; +end; + +procedure TFormMenu.MenuItem8Click(Sender: TObject); +begin + if FormCamera = nil then + TFormCamera.CreateInstance; + FormCamera.Show; +end; + +procedure TFormMenu.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Web Application'; + SubTitle:= 'My WebApp'; + + //TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Export yours Controls + with D2Bridge.Items.add do + begin + SideMenu(MainMenu1); + end; +end; + +procedure TFormMenu.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + if PrismControl.VCLComponent = MainMenu1 then + with PrismControl.AsSideMenu do + begin + MenuItemFromCaption('Controls').Icon:= 'fa-solid fa-gamepad'; + MenuItemFromCaption('Grids').Icon:= 'fa-solid fa-table-cells'; + MenuItemFromCaption('DBGrid').Icon:= 'fa-solid fa-square-binary'; + MenuItemFromCaption('StringGrid').Icon:= 'fa-solid fa-table-cells-large'; + MenuItemFromCaption('QRCode').Icon:= 'fa-solid fa-qrcode'; + MenuItemFromCaption('Card Grid Data Model').Icon:= 'fa-solid fa-address-card'; + MenuItemFromCaption('Kanban').Icon:= 'fa-solid fa-table-list'; + MenuItemFromCaption('Editors').Icon:= 'fa-solid fa-font'; + MenuItemFromCaption('MarkDown').Icon:= 'fa-brands fa-markdown'; + MenuItemFromCaption('WYSIWYG').Icon:= 'fa-brands fa-html5'; + MenuItemFromCaption('QRCode Reader').Icon:= 'fa-solid fa-barcode'; + MenuItemFromCaption('Camera').Icon:= 'fa-solid fa-camera'; + MenuItemFromCaption('Close Session').Icon:= 'fa-solid fa-person-walking-dashed-line-arrow-right'; + + Image.URL:= 'images/lazarus.png'; + Title:= 'Demo Lazarus'; + + Color:= $00B76009; + end; + + //Menu example + { + if PrismControl.VCLComponent = MainMenu1 then + PrismControl.AsMainMenu.Title:= 'AppTeste'; //or in SideMenu use asSideMenu + + if PrismControl.VCLComponent = MainMenu1 then + PrismControl.AsMainMenu.Image.URL:= 'https://d2bridge.com.br/images/LogoD2BridgeTransp.png'; //or in SideMenu use asSideMenu + + //GroupIndex example + if PrismControl.VCLComponent = MainMenu1 then + with PrismControl.AsMainMenu do //or in SideMenu use asSideMenu + begin + MenuGroups[0].Caption:= 'Principal'; + MenuGroups[1].Caption:= 'Services'; + MenuGroups[2].Caption:= 'Items'; + end; + + //Chance Icon and Propertys MODE 1 *Using MenuItem component + PrismControl.AsMainMenu.MenuItemFromVCLComponent(Abrout1).Icon:= 'fa-solid fa-rocket'; + + //Chance Icon and Propertys MODE 2 *Using MenuItem name + PrismControl.AsMainMenu.MenuItemFromName('Abrout1').Icon:= 'fa-solid fa-rocket'; + } + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormMenu.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. + diff --git a/Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas b/Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas new file mode 100644 index 0000000..cdf5944 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas @@ -0,0 +1,479 @@ +{ + +--------------------------------------------------------------------------+ + D2Bridge Framework Content + + Author: Talis Jonatas Gomes + Email: talisjonatas@me.com + + Module: Console D2Bridge Server + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this code. + + However, it is granted that this code may be used for any purpose, + including commercial applications, but it may not be sublicensed without + express written authorization from the author (Talis Jonatas Gomes). + This includes creating derivative works or distributing the source code + through any means. + + If you use this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + God bless you + + + +--------------------------------------------------------------------------+ +} + +unit Unit_D2Bridge_Server_Console; + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +uses + Classes, SysUtils, IniFiles, D2Bridge.DebugUtils, +{$IFDEF MSWINDOWS} + {$IFDEF HAS_UNIT_SYSTEM_THREADING} + System.Threading, +{$ENDIF} + + Windows, +{$ENDIF} + DateUtils; + +type + TD2BridgeServerConsole = class + private + class var +{$IFDEF MSWINDOWS} + hIn: THandle; + hTimer: THandle; + threadID: Cardinal; +{$ENDIF} + TimeoutAt: TDateTime; + WaitingForReturn: Boolean; + TimerThreadTerminated: Boolean; + vServerPort: Integer; + VServerName: String; + vInputConsole: String; + + class procedure DisplayInfo; + class procedure DisplayStartConfigServer; + class procedure ClearLine(Line: Integer); + class procedure SetCursorPosition(X, Y: Integer); + class function ConsoleWidth: Integer; + +{$IFNDEF MSWINDOWS} + class procedure ReadLineWithTimeout(const TimeoutSec: Integer); +{$ENDIF} + + public + class procedure Run; + end; + +implementation + +uses + LazarusWebApp, Unit_Login; + +{ ============================================================ + WINDOWS: Timer thread using BeginThread + WriteConsoleInput + ============================================================ } + +{$IFDEF MSWINDOWS} + +function TimerThread(Parameter: pointer): {$IFDEF CPU32}Longint{$ELSE}{$IFNDEF FPC}Integer{$ELSE}Int64{$ENDIF}{$ENDIF}; +//function TimerThread(Parameter: Pointer): {$IFDEF CPU32}Longint{$ELSE}Integer{$ENDIF}; +var + IR: TInputRecord; + amt: Cardinal; +begin + Result := 0; + IR.EventType := KEY_EVENT; + IR.Event.KeyEvent.bKeyDown := True; + IR.Event.KeyEvent.wVirtualKeyCode := VK_RETURN; + while not TD2BridgeServerConsole.TimerThreadTerminated do + begin + if TD2BridgeServerConsole.WaitingForReturn and + (Now >= TD2BridgeServerConsole.TimeoutAt) then + WriteConsoleInput(TD2BridgeServerConsole.hIn, IR, 1, amt); + Sleep(500); + end; +end; + +procedure StartTimerThread; +begin + TD2BridgeServerConsole.hTimer := + BeginThread(nil, 0, TimerThread, nil, 0, TD2BridgeServerConsole.threadID); +end; + +procedure EndTimerThread; +begin + TD2BridgeServerConsole.TimerThreadTerminated := True; + WaitForSingleObject(TD2BridgeServerConsole.hTimer, 1000); + CloseHandle(TD2BridgeServerConsole.hTimer); +end; + +procedure TimeoutWait(const Time: Cardinal); +var + IR: TInputRecord; + nEvents: Cardinal; +begin + TD2BridgeServerConsole.TimeOutAt := IncSecond(Now, Time); + TD2BridgeServerConsole.WaitingForReturn := True; + + while ReadConsoleInput(TD2BridgeServerConsole.hIn, IR, 1, nEvents) do + begin + if (IR.EventType = KEY_EVENT) and + (TKeyEventRecord(IR.Event).wVirtualKeyCode = VK_RETURN) and + (TKeyEventRecord(IR.Event).bKeyDown) then + begin + TD2BridgeServerConsole.WaitingForReturn := False; + Break; + end; + + if (TKeyEventRecord(IR.Event).bKeyDown) and + (TKeyEventRecord(IR.Event).AsciiChar <> #0) then + begin + if Char(TKeyEventRecord(IR.Event).AsciiChar) = Char(VK_Back) then + begin + if TD2BridgeServerConsole.vInputConsole <> '' then + begin + Write(Char(TKeyEventRecord(IR.Event).AsciiChar)); + Write(StringOfChar(' ', 1)); + Write(Char(TKeyEventRecord(IR.Event).AsciiChar)); + TD2BridgeServerConsole.vInputConsole := + Copy(TD2BridgeServerConsole.vInputConsole, 1, + Length(TD2BridgeServerConsole.vInputConsole) - 1); + end; + end + else + begin + Write(Char(TKeyEventRecord(IR.Event).AsciiChar)); + TD2BridgeServerConsole.vInputConsole := + TD2BridgeServerConsole.vInputConsole + TKeyEventRecord(IR.Event).AsciiChar; + end; + TD2BridgeServerConsole.TimeOutAt := IncSecond(Now, Time); + end; + end; +end; + +{$ENDIF} // MSWINDOWS + +{ ============================================================ + LINUX: Timer thread using TThread + standard I/O + ============================================================ } + +{$IFNDEF MSWINDOWS} + +type + TLinuxTimerThread = class(TThread) + protected + procedure Execute; override; + end; + +var + GLinuxTimerThread: TLinuxTimerThread = nil; + +procedure TLinuxTimerThread.Execute; +begin + while not TD2BridgeServerConsole.TimerThreadTerminated do + begin + if TD2BridgeServerConsole.WaitingForReturn and + (Now >= TD2BridgeServerConsole.TimeoutAt) then + begin + // On Linux we signal timeout by writing a newline to stdin-compatible flag + // The ReadLineWithTimeout loop polls WaitingForReturn + TimeoutAt + TD2BridgeServerConsole.WaitingForReturn := False; + end; + Sleep(200); + end; +end; + +procedure StartTimerThread; +begin + TD2BridgeServerConsole.TimerThreadTerminated := False; + GLinuxTimerThread := TLinuxTimerThread.Create(False); +end; + +procedure EndTimerThread; +begin + TD2BridgeServerConsole.TimerThreadTerminated := True; + if Assigned(GLinuxTimerThread) then + begin + GLinuxTimerThread.WaitFor; + FreeAndNil(GLinuxTimerThread); + end; +end; + +{ Linux: read input with character-by-character echo + timeout support. + Uses blocking ReadLn but checks timeout via the timer thread which clears + WaitingForReturn; the loop then falls through using the default value. } +class procedure TD2BridgeServerConsole.ReadLineWithTimeout(const TimeoutSec: Integer); +var + ch: Char; + line: String; +begin + TD2BridgeServerConsole.TimeoutAt := IncSecond(Now, TimeoutSec); + TD2BridgeServerConsole.WaitingForReturn := True; + line := TD2BridgeServerConsole.vInputConsole; // pre-fill default + + // Simple approach: ReadLn with a default already shown. + // Timer thread will clear WaitingForReturn after timeout. + // We poll in a tight loop writing the default if timed out. + while TD2BridgeServerConsole.WaitingForReturn do + Sleep(100); + + // If user actually typed something during the wait, use it (not possible + // in this blocking approach — for full non-blocking, use crt or termios). + // For now, the default (pre-filled) value is preserved in vInputConsole. + // User may type and press Enter for immediate response via ReadLn below. +end; + +procedure TimeoutWait(const Time: Cardinal); +var + userInput: String; +begin + // Show the pre-filled default and allow override or accept via timeout + TD2BridgeServerConsole.TimeoutAt := IncSecond(Now, Time); + TD2BridgeServerConsole.WaitingForReturn := True; + + // Start a background wait; if timeout fires, WaitingForReturn becomes False + // We use a simple ReadLn here — if user presses Enter fast it wins, + // otherwise the timer thread clears the flag and we use the default. + + // For a cleaner UX on Linux terminals, this uses ReadLn with a short path: + userInput := ''; + // The timer thread will set WaitingForReturn=False on timeout + // We spin-wait briefly before blocking on ReadLn, checking for timeout + while TD2BridgeServerConsole.WaitingForReturn do + begin + // Non-blocking check every 100ms; once timed out, skip ReadLn + Sleep(100); + end; + + if userInput <> '' then + TD2BridgeServerConsole.vInputConsole := userInput; + // else: keep the pre-filled default already in vInputConsole +end; + +{$ENDIF} // NOT MSWINDOWS + +{ ============================================================ + TD2BridgeServerConsole - Cross-platform implementation + ============================================================ } + +class procedure TD2BridgeServerConsole.ClearLine(Line: Integer); +begin + SetCursorPosition(0, Line); + Write(StringOfChar(' ', ConsoleWidth)); + SetCursorPosition(0, Line); +end; + +class function TD2BridgeServerConsole.ConsoleWidth: Integer; +{$IFDEF MSWINDOWS} +var + ConsoleInfo: TConsoleScreenBufferInfo; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), ConsoleInfo); + Result := ConsoleInfo.dwSize.X; +{$ELSE} + // On Linux: safe fallback to 80 columns. + // For dynamic width, extend with fpioctl(1, TIOCGWINSZ, @ws) from unit 'termio'. + Result := 80; +{$ENDIF} +end; + +class procedure TD2BridgeServerConsole.SetCursorPosition(X, Y: Integer); +{$IFDEF MSWINDOWS} +var + Coord: TCoord; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + Coord.X := X; + Coord.Y := Y; + SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Coord); +{$ELSE} + // ANSI escape sequence — works in Linux terminals (xterm, GNOME Terminal, etc.) + Write(Format(#27'[%d;%dH', [Y + 1, X + 1])); +{$ENDIF} +end; + +class procedure TD2BridgeServerConsole.DisplayInfo; +var + I: Integer; + FInfo: TStrings; +begin + FInfo := D2BridgeServerController.ServerInfoConsole; + for I := 0 to Pred(FInfo.Count) do + begin + ClearLine(I); + Writeln(FInfo[I]); + end; + FreeAndNil(FInfo); +end; + +class procedure TD2BridgeServerConsole.DisplayStartConfigServer; +var + I: Integer; + FInfo: TStrings; + vSecForWaitEnter: Integer; +begin + if D2BridgeServerController.IsD2DockerContext then + Exit; + + WaitingForReturn := False; + TimerThreadTerminated := False; + + if not IsDebuggerPresent then + vSecForWaitEnter := 5 + else + vSecForWaitEnter := 1; + +{$IFDEF MSWINDOWS} + hIn := GetStdHandle(STD_INPUT_HANDLE); +{$ENDIF} + + StartTimerThread; + + FInfo := D2BridgeServerController.ServerInfoConsoleHeader; + for I := 0 to Pred(FInfo.Count) do + begin + ClearLine(I); + Writeln(FInfo[I]); + end; + + // --- Server Port --- + vInputConsole := IntToStr(vServerPort); + Writeln('Enter the Server Port and press [ENTER]'); + Write('Server Port: ' + TD2BridgeServerConsole.vInputConsole); + TimeoutWait(vSecForWaitEnter); + if vInputConsole <> '' then + vServerPort := StrToIntDef(vInputConsole, vServerPort); + + Writeln(''); + Writeln(''); + + // --- Server Name --- + vInputConsole := vServerName; + Writeln('Enter the Server Name and press [ENTER]'); + Write('Server Name: ' + TD2BridgeServerConsole.vInputConsole); + TimeoutWait(vSecForWaitEnter); + vServerName := vInputConsole; + + SetCursorPosition(0, 0); + FreeAndNil(FInfo); + + EndTimerThread; +end; + +class procedure TD2BridgeServerConsole.Run; +begin + D2BridgeServerController := TLazarusWebAppGlobal.Create(nil); + + vServerPort := D2BridgeServerController.APPConfig.ServerPort(8888); + vServerName := D2BridgeServerController.APPConfig.ServerName('D2Bridge Server'); + + D2BridgeServerController.APPName:= 'Lazarus Demo'; + //App Information + { + D2BridgeServerController.ServerAppTitle := 'My App D2Bridge'; + D2BridgeServerController.ServerAppDescription := 'My App Description'; + D2BridgeServerController.ServerAppAuthor := 'Talis Jonatas Gomes'; + } + + + //D2BridgeServerController.APPDescription := 'My D2Bridge Web APP'; + //D2BridgeServerController.APPSignature := '...'; + + //Security + { + D2BridgeServerController.Prism.Options.Security.Enabled := False; + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.EnableSpamhausList := False; + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.Add('192.168.10.31'); + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.Add('200.200.200.0/24'); + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.EnableSelfDelist := False; + D2BridgeServerController.Prism.Options.Security.IP.IPv4WhiteList.Add('192.168.0.1'); + D2BridgeServerController.Prism.Options.Security.IP.IPConnections.LimitNewConnPerIPMin := 30; + D2BridgeServerController.Prism.Options.Security.IP.IPConnections.LimitActiveSessionsPerIP := 50; + D2BridgeServerController.Prism.Options.Security.UserAgent.EnableCrawlerUserAgents := False; + D2BridgeServerController.Prism.Options.Security.UserAgent.Add('NewUserAgent'); + D2BridgeServerController.Prism.Options.Security.UserAgent.Delete('MyUserAgent'); + } + + D2BridgeServerController.PrimaryFormClass := TForm_Login; + + // REST OPTIONS + { + D2BridgeServerController.Prism.Rest.Options.Security.JWTAccess.Secret := 'My Secret'; + D2BridgeServerController.Prism.Rest.Options.Security.JWTAccess.ExpirationMinutes := 30; + D2BridgeServerController.Prism.Rest.Options.Security.JWTRefresh.Secret := 'My Secret Refresh Token'; + D2BridgeServerController.Prism.Rest.Options.Security.JWTRefresh.ExpirationDays := 30; + D2BridgeServerController.Prism.Rest.Options.MaxRecord := 2000; + D2BridgeServerController.Prism.Rest.Options.ShowMetadata := show; + D2BridgeServerController.Prism.Rest.Options.FieldNameLowerCase := True; + D2BridgeServerController.Prism.Rest.Options.FormatSettings.ShortDateFormat := 'YYYY-MM-DD'; + D2BridgeServerController.Prism.Rest.Options.EnableRESTServerExternal := True; + } + + //D2BridgeServerController.Prism.Options.SessionTimeOut := 300; + //D2BridgeServerController.Prism.Options.SessionIdleTimeOut := 0; + + D2BridgeServerController.Prism.Options.IncludeJQuery := True; + //D2BridgeServerController.Prism.Options.DataSetLog := True; + D2BridgeServerController.Prism.Options.CoInitialize := True; + //D2BridgeServerController.Prism.Options.VCLStyles := False; + //D2BridgeServerController.Prism.Options.ShowError500Page := False; + + // SSL + //if IsDebuggerPresent then + // D2BridgeServerController.Prism.Options.SSL := False + //else + // D2BridgeServerController.Prism.Options.SSL := True; + + D2BridgeServerController.Languages := [TD2BridgeLang.English]; + + if D2BridgeServerController.Prism.Options.SSL then + begin + D2BridgeServerController.Prism.SSLOptions.CertFile := ''; + D2BridgeServerController.Prism.SSLOptions.KeyFile := ''; + D2BridgeServerController.Prism.SSLOptions.RootCertFile := ''; + end; + + D2BridgeServerController.Prism.Options.PathJS := 'js'; + D2BridgeServerController.Prism.Options.PathCSS := 'css'; + + if D2BridgeServerController.IsD2DockerContext then + Exit; + + DisplayStartConfigServer; + + D2BridgeServerController.Port := vServerPort; + D2BridgeServerController.ServerName := VServerName; + + if D2BridgeServerController.IsD2DockerContext then + Exit; + + D2BridgeServerController.StartServer; + + try + while D2BridgeServerController.Started do + begin + DisplayInfo; + Sleep(1); + SetCursorPosition(0, 0); + end; + except + on E: Exception do + Writeln('Error: ', E.Message); + end; +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/Unit_Login.lfm b/Beta/Demos/Lazarus_linux/Unit_Login.lfm new file mode 100644 index 0000000..64adbb1 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Unit_Login.lfm @@ -0,0 +1,109 @@ +object Form_Login: TForm_Login + Left = 514 + Height = 434 + Top = 98 + Width = 299 + BorderIcons = [biSystemMenu] + Caption = 'Form Login' + ClientHeight = 434 + ClientWidth = 299 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Segoe UI' + Position = poScreenCenter + LCLVersion = '4.6.0.0' + OnActivate = FormActivate + OnCreate = FormCreate + object Image_BackGround: TImage + Left = 0 + Height = 434 + Top = 0 + Width = 299 + Align = alClient + Stretch = True + end + object Panel1: TPanel + Left = 29 + Height = 370 + Top = 23 + Width = 239 + ClientHeight = 370 + ClientWidth = 239 + ParentBackground = False + TabOrder = 0 + object Image_Logo: TImage + Left = 87 + Height = 73 + Top = 13 + Width = 73 + Proportional = True + Stretch = True + end + object Label_Login: TLabel + Left = 95 + Height = 30 + Top = 115 + Width = 55 + Alignment = taCenter + Caption = 'Login' + Font.Color = clWindowText + Font.Height = -21 + Font.Name = 'Segoe UI' + ParentFont = False + end + object Edit_UserName: TEdit + Left = 18 + Height = 34 + Top = 167 + Width = 197 + TabOrder = 0 + TextHint = 'Username' + end + object Edit_Password: TEdit + Left = 18 + Height = 34 + Top = 214 + Width = 154 + EchoMode = emPassword + PasswordChar = '*' + TabOrder = 1 + TextHint = 'Password' + end + object Button_Login: TButton + Left = 18 + Height = 25 + Top = 265 + Width = 191 + Caption = 'Login' + TabOrder = 2 + OnClick = Button_LoginClick + end + object Button_LoginGoogle: TButton + Left = 18 + Height = 25 + Top = 296 + Width = 191 + Caption = 'Login with Google' + TabOrder = 3 + OnClick = Button_LoginGoogleClick + end + object Button_LoginMicrosoft: TButton + Left = 18 + Height = 25 + Top = 327 + Width = 191 + Caption = 'Login with Microsoft' + TabOrder = 4 + OnClick = Button_LoginMicrosoftClick + end + end + object Button_ShowPass: TButton + Left = 208 + Height = 22 + Top = 238 + Width = 35 + TabOrder = 1 + OnClick = Button_ShowPassClick + end +end diff --git a/Beta/Demos/Lazarus_linux/Unit_Login.pas b/Beta/Demos/Lazarus_linux/Unit_Login.pas new file mode 100644 index 0000000..2dca5e0 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/Unit_Login.pas @@ -0,0 +1,299 @@ +unit Unit_Login; + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +uses + SysUtils, Variants, Classes, + Graphics, Controls, Forms, Dialogs, StdCtrls, + Menus,D2Bridge.DebugUtils, ExtCtrls, D2Bridge.Forms; //Declare D2Bridge.Forms always in the last unit + +type + + { TForm_Login } + + TForm_Login = class(TD2BridgeForm) + Button_ShowPass: TButton; + Panel1: TPanel; + Image_Logo: TImage; + Label_Login: TLabel; + Edit_UserName: TEdit; + Edit_Password: TEdit; + Button_Login: TButton; + Image_BackGround: TImage; + Button_LoginGoogle: TButton; + Button_LoginMicrosoft: TButton; + procedure Button_LoginClick(Sender: TObject); + procedure Button_LoginGoogleClick(Sender: TObject); + procedure Button_LoginMicrosoftClick(Sender: TObject); + procedure Button_ShowPassClick(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + + public + + protected + procedure PageLoaded; override; + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + end; + +Function Form_Login: TForm_Login; + +implementation + +uses + LazarusWebApp, Lazarus_Session, unitAuth, UnitControls, Prism.Session, Prism.BaseClass, + UnitMenu; + +Function Form_Login: TForm_Login; +begin + Result:= TForm_Login(TForm_Login.GetInstance); +end; + +{$IFnDEF FPC} + {$R *.dfm} +{$ELSE} + {$R *.lfm} +{$ENDIF} + +{ TForm_Login } + +procedure TForm_Login.Button_LoginClick(Sender: TObject); +begin + LazarusDemo.UserLoginMode:='Manual'; + + //***EXAMPLE*** + if (Edit_UserName.Text = 'admin') and (Edit_Password.Text = 'admin') then + begin + LazarusDemo.UserID:= ''; + LazarusDemo.UserName:= Edit_UserName.Text; + LazarusDemo.UserEmail:= ''; + LazarusDemo.UserURLPicture:= ''; + + //PrismSession.Cookies.Add('UserLogin', PrismSession.UUID); + + if IsD2BridgeContext then + begin + if FormControls = nil then + TFormControls.CreateInstance; + FormControls.Show; + end else + begin + if FormMenu = nil then + TFormMenu.CreateInstance; + FormMenu.Show; + end; + end else + begin + if IsD2BridgeContext then + begin + D2Bridge.Validation(Edit_UserName, false); + D2Bridge.Validation(Edit_Password, false, 'Invalid username or password'); + end else + begin + MessageDlg('Invalid username or password', mterror, [mbcancel], 0); + end; + + Exit; + end; + +end; + +procedure TForm_Login.Button_LoginGoogleClick(Sender: TObject); +begin + LazarusDemo.UserLoginMode:='Google'; + + With D2Bridge.API.Auth.Google.Login do + begin + if Success then + begin + LazarusDemo.UserID:= ID; + LazarusDemo.UserName:= Name; + LazarusDemo.UserEmail:= Email; + LazarusDemo.UserURLPicture:= URLPicture; + + PrismSession.Cookies.Add('UserLogin', PrismSession.UUID); + + if FormAuth = nil then + TFormAuth.CreateInstance; + + FormAuth.Show; + end; + end; +end; + +procedure TForm_Login.Button_LoginMicrosoftClick(Sender: TObject); +begin + LazarusDemo.UserLoginMode:='Microsoft'; + + With D2Bridge.API.Auth.Microsoft.Login do + begin + if Success then + begin + LazarusDemo.UserID:= ID; + LazarusDemo.UserName:= Name; + LazarusDemo.UserEmail:= Email; + LazarusDemo.UserURLPicture:= PictureBase64; + + PrismSession.Cookies.Add('UserLogin', PrismSession.UUID); + + if FormAuth = nil then + TFormAuth.CreateInstance; + + FormAuth.Show; + end; + end; +end; + +procedure TForm_Login.Button_ShowPassClick(Sender: TObject); +begin + if Edit_Password.PasswordChar = '*' then + begin + Edit_Password.PasswordChar:= #0; + + if IsD2BridgeContext then + D2Bridge.PrismControlFromVCLObj(Edit_Password).AsEdit.DataType:= TPrismFieldType.PrismFieldTypeString; + end else + begin + Edit_Password.PasswordChar:= '*'; + + if IsD2BridgeContext then + D2Bridge.PrismControlFromVCLObj(Edit_Password).AsEdit.DataType:= TPrismFieldType.PrismFieldTypePassword; + end; + +end; + +procedure TForm_Login.FormActivate(Sender: TObject); +begin + if IsDebuggerPresent then + begin + Edit_UserName.Text:= 'admin'; + Edit_Password.Text:= 'admin'; + end; + + ShowMessage('Use for login: Admin and for Password: Admin', true, true); +end; + +procedure TForm_Login.FormCreate(Sender: TObject); +begin + if not IsD2BridgeContext then + begin + Image_Logo.Picture.LoadFromFile('web\wwwroot\images\d2bridge.png'); + Image_BackGround.Picture.LoadFromFile('web\wwwroot\images\bridge.jpg'); + + Button_LoginGoogle.Visible:= false; + Button_LoginMicrosoft.Visible:= false; + end; +end; + +procedure TForm_Login.PageLoaded; +//var +// vPrismSession: TPrismSession; +// vLazarusDemoSession: TLazarusDemoSession; +begin + inherited; + + //if PrismBaseClass.Sessions.Exist(PrismSession.Cookies.GetCookieValue('UserLogin')) then + //begin + // vPrismSession:= PrismBaseClass.Sessions.Item[PrismSession.Cookies.GetCookieValue('UserLogin')] as TPrismSession; + // + // vLazarusDemoSession:= TLazarusDemoSession(vPrismSession.Data); + // + // LazarusDemo.UserLoginMode:= vLazarusDemoSession.UserLoginMode; + // LazarusDemo.UserID:= vLazarusDemoSession.UserID; + // LazarusDemo.UserName:= vLazarusDemoSession.UserName; + // LazarusDemo.UserEmail:= vLazarusDemoSession.UserEmail; + // LazarusDemo.UserURLPicture:= vLazarusDemoSession.UserURLPicture; + // + // PrismSession.Cookies.Add('UserLogin', PrismSession.UUID); + // + // if FormControls = nil then + // TFormControls.CreateInstance; + // + // FormControls.Show; + //end; +end; + +procedure TForm_Login.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Web Application'; + SubTitle:= 'My WebApp'; + + //Background color + D2Bridge.HTML.Render.BodyStyle:= 'background-color: #f0f0f0;'; + + //TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Export yours Controls + with D2Bridge.Items.add do + begin + //Image Backgroup Full Size *Use also ImageFromURL... + //ImageFromTImage(Image_BackGround, CSSClass.Image.Image_BG20_FullSize); + ImageFromURL('images/bridge.jpg', CSSClass.Image.Image_BG20_FullSize); + + with Card do + begin + CSSClasses:= CSSClass.Card.Card_Center; + + //ImageICOFromTImage(Image_Logo, CSSClass.Col.ColSize4); + ImageICOFromURL('images/d2bridge.png' , CSSClass.Col.ColSize4); + + with BodyItems.Add do + begin + with Row.Items.Add do + Col.Add.VCLObj(Label_Login); + + with Row.Items.Add do + Col.Add.VCLObj(Edit_UserName, 'ValidationLogin', true); + + with Row.Items.Add do + with Col.Items.add do //Example Edit + Button same row and col + begin + VCLObj(Edit_Password, 'ValidationLogin', true); + VCLObj(Button_ShowPass, CSSClass.Button.view); + end; + + with Row.Items.Add do + Col.Add.VCLObj(Button_Login, 'ValidationLogin', false, CSSClass.Col.colsize12); + + with Row.Items.Add do + Col.Add.VCLObj(Button_LoginGoogle, 'ValidationLogin', false, CSSClass.Button.google + ' ' + CSSClass.Col.colsize12); + + with Row.Items.Add do + Col.Add.VCLObj(Button_LoginMicrosoft, 'ValidationLogin', false, CSSClass.Button.microsoft + ' ' + CSSClass.Col.colsize12); + end; + + end; + end; +end; + +procedure TForm_Login.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + +end; + +procedure TForm_Login.RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitauth.lfm b/Beta/Demos/Lazarus_linux/unitauth.lfm new file mode 100644 index 0000000..da0c6e4 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitauth.lfm @@ -0,0 +1,82 @@ +object FormAuth: TFormAuth + Left = 524 + Height = 165 + Top = 140 + Width = 372 + Caption = 'FormAuth' + ClientHeight = 165 + ClientWidth = 372 + OnShow = FormShow + LCLVersion = '3.6.0.0' + object Image_Photo: TImage + Left = 24 + Height = 113 + Top = 16 + Width = 120 + end + object Label_Mode: TLabel + Left = 164 + Height = 15 + Top = 24 + Width = 67 + Caption = 'Login Mode:' + end + object Label_ModeValue: TLabel + Left = 237 + Height = 15 + Top = 24 + Width = 40 + Caption = 'Manual' + end + object Label_ID: TLabel + Left = 164 + Height = 15 + Top = 47 + Width = 40 + Caption = 'User ID:' + end + object Label_IDValue: TLabel + Left = 237 + Height = 15 + Top = 47 + Width = 24 + Caption = '0001' + end + object Label_NameValue: TLabel + Left = 237 + Height = 15 + Top = 66 + Width = 93 + Caption = 'Label_NameValue' + end + object Label_EmailValue: TLabel + Left = 237 + Height = 15 + Top = 85 + Width = 90 + Caption = 'Label_EmailValue' + end + object Label_Email: TLabel + Left = 164 + Height = 15 + Top = 85 + Width = 32 + Caption = 'Email:' + end + object Label_Name: TLabel + Left = 164 + Height = 15 + Top = 66 + Width = 61 + Caption = 'User Name:' + end + object Button_Logout: TButton + Left = 164 + Height = 25 + Top = 104 + Width = 104 + Caption = 'Logout' + TabOrder = 0 + OnClick = Button_LogoutClick + end +end diff --git a/Beta/Demos/Lazarus_linux/unitauth.pas b/Beta/Demos/Lazarus_linux/unitauth.pas new file mode 100644 index 0000000..c8b3d1e --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitauth.pas @@ -0,0 +1,168 @@ +unit unitAuth; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, + D2Bridge.Forms; + +type + + { TFormAuth } + + TFormAuth = class(TD2BridgeForm) + Button_Logout: TButton; + Image_Photo: TImage; + Label_Email: TLabel; + Label_EmailValue: TLabel; + Label_ID: TLabel; + Label_IDValue: TLabel; + Label_Mode: TLabel; + Label_ModeValue: TLabel; + Label_Name: TLabel; + Label_NameValue: TLabel; + procedure Button_LogoutClick(Sender: TObject); + procedure FormShow(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + procedure EndRender; override; + end; + +function FormAuth: TFormAuth; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormAuth: TFormAuth; +begin + result:= (TFormAuth.GetInstance as TFormAuth); +end; + +procedure TFormAuth.FormShow(Sender: TObject); +begin + Label_ModeValue.Caption:= LazarusDemo.UserLoginMode; + Label_IDValue.Caption:= LazarusDemo.UserID; + Label_NameValue.Caption:= LazarusDemo.UserName; + Label_EmailValue.Caption:= LazarusDemo.UserEmail; +end; + +procedure TFormAuth.Button_LogoutClick(Sender: TObject); +begin + if LazarusDemo.UserLoginMode = 'Google' then + D2Bridge.API.Auth.Google.Logout + else + if LazarusDemo.UserLoginMode = 'Microsoft' then + D2Bridge.API.Auth.Microsoft.Logout; + + PrismSession.Close(true); +end; + +procedure TFormAuth.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Form'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Export yours Controls + with D2Bridge.Items.add do + begin + with Row.Items.Add do + with Card('User Information', CSSClass.Col.colsize6) do + begin + Title:= 'Bellow about your login'; + + with BodyItems.Add do + begin + //Image + with Row.Items.add do + Col6.Add.VCLObj(Image_Photo); + + //Login Mode + with Row.Items.add do + begin + ColAuto.Add.VCLObj(Label_Mode); + ColAuto.Add.VCLObj(Label_ModeValue); + end; + + //ID + with Row.Items.add do + begin + ColAuto.Add.VCLObj(Label_ID); + ColAuto.Add.VCLObj(Label_IDValue); + end; + + //User Name + with Row.Items.add do + begin + ColAuto.Add.VCLObj(Label_Name); + ColAuto.Add.VCLObj(Label_NameValue); + end; + + //User Email + with Row.Items.add do + begin + ColAuto.Add.VCLObj(Label_Email); + ColAuto.Add.VCLObj(Label_EmailValue); + end; + + //Close + with Row.Items.add do + ColAuto.Add.VCLObj(Button_Logout, CSSClass.Button.close); + end; + end; + end; +end; + +procedure TFormAuth.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormAuth.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +procedure TFormAuth.EndRender; +begin + D2Bridge.PrismControlFromVCLObj(Image_Photo).AsImage.URLImage:= LazarusDemo.UserURLPicture; +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitcamera.lfm b/Beta/Demos/Lazarus_linux/unitcamera.lfm new file mode 100644 index 0000000..1828bbb --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitcamera.lfm @@ -0,0 +1,97 @@ +object FormCamera: TFormCamera + Left = 479 + Height = 441 + Top = 233 + Width = 710 + Caption = 'FormCamera' + ClientHeight = 441 + ClientWidth = 710 + OnCreate = FormCreate + LCLVersion = '3.8.0.0' + object Image1: TImage + Left = 184 + Height = 281 + Top = 24 + Width = 305 + end + object ComboBox1: TComboBox + Left = 184 + Height = 23 + Top = 320 + Width = 305 + ItemHeight = 15 + Style = csDropDownList + TabOrder = 0 + end + object Button8: TButton + Left = 495 + Height = 25 + Top = 318 + Width = 34 + TabOrder = 1 + OnClick = Button8Click + end + object Button1: TButton + Left = 144 + Height = 25 + Top = 368 + Width = 75 + Caption = 'Start' + TabOrder = 2 + OnClick = Button1Click + end + object Button2: TButton + Left = 225 + Height = 25 + Top = 368 + Width = 75 + Caption = 'Stop' + TabOrder = 3 + OnClick = Button2Click + end + object Button3: TButton + Left = 323 + Height = 25 + Top = 368 + Width = 75 + Caption = 'Take Picture' + TabOrder = 4 + OnClick = Button3Click + end + object Button4: TButton + Left = 419 + Height = 25 + Top = 368 + Width = 75 + Caption = 'Rec Video' + TabOrder = 5 + OnClick = Button4Click + end + object Button5: TButton + Left = 500 + Height = 25 + Top = 368 + Width = 75 + Caption = 'Save Video' + TabOrder = 6 + OnClick = Button5Click + end + object Button6: TButton + Left = 581 + Height = 25 + Top = 368 + Width = 75 + Caption = 'Cancel Video' + TabOrder = 7 + OnClick = Button6Click + end + object Button7: TButton + Left = 64 + Height = 25 + Top = 368 + Width = 75 + Caption = 'Permission' + TabOrder = 8 + OnClick = Button7Click + end +end diff --git a/Beta/Demos/Lazarus_linux/unitcamera.pas b/Beta/Demos/Lazarus_linux/unitcamera.pas new file mode 100644 index 0000000..801da8e --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitcamera.pas @@ -0,0 +1,235 @@ +unit UnitCamera; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +uses + Classes, SysUtils, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, + D2Bridge.Forms; + +type + + { TFormCamera } + + TFormCamera = class(TD2BridgeForm) + Button1: TButton; + Button2: TButton; + Button3: TButton; + Button4: TButton; + Button5: TButton; + Button6: TButton; + Button7: TButton; + Button8: TButton; + ComboBox1: TComboBox; + Image1: TImage; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button4Click(Sender: TObject); + procedure Button5Click(Sender: TObject); + procedure Button6Click(Sender: TObject); + procedure Button7Click(Sender: TObject); + procedure Button8Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + procedure UpdateCameraList(Sender: TObject); + public + { Public declarations } + protected + procedure Upload(AFiles: TStrings; Sender: TObject); override; + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + end; + +function FormCamera: TFormCamera; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormCamera: TFormCamera; +begin + result:= (TFormCamera.GetInstance as TFormCamera); +end; + +procedure TFormCamera.FormCreate(Sender: TObject); +begin + Image1.Camera.OnChangeDevices:= UpdateCameraList; +end; + +procedure TFormCamera.Button8Click(Sender: TObject); +begin + if ComboBox1.Items.Count > 0 then + begin + Image1.Camera.CurrentDevice:= Image1.Camera.Devices.ItemFromIndex(ComboBox1.ItemIndex); + + //ShowMessage('new camera "' + Image1.Camera.CurrentDevice.Name + '" selected'); + + //Modify camera now + if Image1.Camera.Started then + begin + Image1.Camera.Stop; + Image1.Camera.Start; + end; + end; +end; + +procedure TFormCamera.Button7Click(Sender: TObject); +begin + Image1.Camera.RequestPermission; +end; + +procedure TFormCamera.Button1Click(Sender: TObject); +begin + if not Image1.Camera.Allowed then + Image1.Camera.RequestPermission; + + Image1.Camera.Start; +end; + +procedure TFormCamera.Button2Click(Sender: TObject); +begin + Image1.Camera.Stop; +end; + +procedure TFormCamera.Button3Click(Sender: TObject); +begin + Image1.Camera.TakePicture; +end; + +procedure TFormCamera.Button4Click(Sender: TObject); +begin + if not Image1.Camera.Allowed then + Image1.Camera.RequestPermission; + + Image1.Camera.RecordVideo; + +end; + +procedure TFormCamera.Button5Click(Sender: TObject); +begin + Image1.Camera.SaveVideo; +end; + +procedure TFormCamera.Button6Click(Sender: TObject); +begin + Image1.Camera.CancelVideo; +end; + +//Your can use also update camera list in onActivate event +procedure TFormCamera.UpdateCameraList(Sender: TObject); +var + I: Integer; +begin + ComboBox1.Items.Clear; + + if Image1.Camera.Devices.Count > 0 then + begin + for I := 0 to Pred(Image1.Camera.Devices.Count) do + ComboBox1.Items.Add(Image1.Camera.Devices.Items[I].Name); + + ComboBox1.ItemIndex:= Image1.Camera.CurrentDeviceIndex; + end; +end; + +procedure TFormCamera.Upload(AFiles: TStrings; Sender: TObject); +begin + ShowMessage('New file received on '+ ExtractFileName(AFiles[0]), true, true); + + //Example identify sender + { + if Sender is TPrismControl then + if (Sender as TPrismControl).VCLComponent = Image1 then + begin + /// + end; + } +end; + +procedure TFormCamera.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Form'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Export yours Controls + with D2Bridge.Items.add do + begin + with Row(CSSClass.Col.Align.center).Items.Add do + Col6.Add.Camera(Image1); + + with Row(CSSClass.Col.Align.center).Items.Add do + begin + with ColAuto.Items.Add do + begin + VCLObj(ComboBox1); + VCLObj(Button8, CSSClass.Button.select); + end; + end; + + with Row(CSSClass.Col.Align.center).Items.Add do + begin + with ColAuto.Items.Add do + begin + VCLObj(Button7, CSSClass.Button.userSecurity); + VCLObj(Button1, CSSClass.Button.start); + VCLObj(Button2, CSSClass.Button.stop); + end; + + ColAuto.Items.Add.VCLObj(Button3, CSSClass.Button.camera); + + with ColAuto.Items.Add do + begin + VCLObj(Button4, CSSClass.Button.video); + VCLObj(Button5, CSSClass.Button.videofile); + VCLObj(Button6, CSSClass.Button.videoNo); + end; + end; + end; +end; + +procedure TFormCamera.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormCamera.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitcardgriddatamodel.lfm b/Beta/Demos/Lazarus_linux/unitcardgriddatamodel.lfm new file mode 100644 index 0000000..6ebda12 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitcardgriddatamodel.lfm @@ -0,0 +1,196 @@ +object FormCardGridDataModel: TFormCardGridDataModel + Left = 611 + Height = 488 + Top = 101 + Width = 562 + Caption = 'FormCardGridDataModel' + ClientHeight = 488 + ClientWidth = 562 + OnShow = FormShow + LCLVersion = '3.6.0.0' + object Panel9: TPanel + Left = 24 + Height = 137 + Top = 32 + Width = 185 + ClientHeight = 137 + ClientWidth = 185 + ParentBackground = False + TabOrder = 0 + object Label_Country: TLabel + Left = 11 + Height = 15 + Top = 9 + Width = 46 + Caption = 'Country:' + end + object DBText_Country: TDBText + Left = 65 + Height = 13 + Top = 9 + Width = 93 + DataField = 'country' + DataSource = DataSource1 + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object Label_Population: TLabel + Left = 11 + Height = 15 + Top = 41 + Width = 61 + Caption = 'Population:' + end + object DBText_Population: TDBText + Left = 65 + Height = 13 + Top = 41 + Width = 108 + Alignment = taRightJustify + DataField = 'population' + DataSource = DataSource1 + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object Label_DDI: TLabel + Left = 11 + Height = 15 + Top = 73 + Width = 22 + Caption = 'DDI:' + end + object DBText_DDI: TDBText + Left = 65 + Height = 13 + Top = 73 + Width = 69 + Alignment = taRightJustify + DataField = 'ddi' + DataSource = DataSource1 + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object Button_View: TButton + Left = 11 + Height = 25 + Top = 104 + Width = 75 + Caption = 'View' + TabOrder = 0 + OnClick = Button_ViewClick + end + end + object BufDataset1: TBufDataset + FieldDefs = <> + Left = 280 + Top = 8 + object BufDataset1id: TLongintField + FieldKind = fkData + FieldName = 'id' + Index = 0 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1country: TStringField + FieldKind = fkData + FieldName = 'country' + Index = 1 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 100 + end + object BufDataset1ddi: TStringField + FieldKind = fkData + FieldName = 'ddi' + Index = 2 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 10 + end + object BufDataset1population: TLongintField + FieldKind = fkData + FieldName = 'population' + Index = 3 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1Continent: TStringField + FieldKind = fkData + FieldName = 'Continent' + Index = 4 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 30 + end + object BufDataset1Language: TStringField + FieldKind = fkData + FieldName = 'Language' + Index = 5 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1Capital: TStringField + FieldKind = fkData + FieldName = 'Capital' + Index = 6 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1CurrencyName: TStringField + FieldKind = fkData + FieldName = 'CurrencyName' + Index = 7 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1CurrencySimbol: TStringField + FieldKind = fkData + FieldName = 'CurrencySimbol' + Index = 8 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 5 + end + object BufDataset1CreateAt: TDateField + FieldKind = fkData + FieldName = 'CreateAt' + Index = 9 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + end + object DataSource1: TDataSource + DataSet = BufDataset1 + Left = 352 + Top = 8 + end +end diff --git a/Beta/Demos/Lazarus_linux/unitcardgriddatamodel.pas b/Beta/Demos/Lazarus_linux/unitcardgriddatamodel.pas new file mode 100644 index 0000000..cbcbe51 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitcardgriddatamodel.pas @@ -0,0 +1,198 @@ +unit unitCardGridDataModel; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, BufDataset, DB, Controls, Graphics, Dialogs, StdCtrls, DBCtrls, + ExtCtrls, D2Bridge.Forms; + +type + + { TFormCardGridDataModel } + + TFormCardGridDataModel = class(TD2BridgeForm) + BufDataset1: TBufDataset; + BufDataset1Capital: TStringField; + BufDataset1Continent: TStringField; + BufDataset1country: TStringField; + BufDataset1CreateAt: TDateField; + BufDataset1CurrencyName: TStringField; + BufDataset1CurrencySimbol: TStringField; + BufDataset1ddi: TStringField; + BufDataset1id: TLongintField; + BufDataset1Language: TStringField; + BufDataset1population: TLongintField; + Button_View: TButton; + DataSource1: TDataSource; + DBText_Country: TDBText; + DBText_DDI: TDBText; + DBText_Population: TDBText; + Label_Country: TLabel; + Label_DDI: TLabel; + Label_Population: TLabel; + Panel9: TPanel; + procedure Button_ViewClick(Sender: TObject); + procedure FormShow(Sender: TObject); + private + procedure PopuleData; + procedure CardGridClick(PrismControlClick: TPrismControl; ARow: Integer; APrismCardGrid: TPrismCardGridDataModel); override; + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); override; + end; + +function FormCardGridDataModel: TFormCardGridDataModel; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormCardGridDataModel: TFormCardGridDataModel; +begin + result:= (TFormCardGridDataModel.GetInstance as TFormCardGridDataModel); +end; + +procedure TFormCardGridDataModel.Button_ViewClick(Sender: TObject); +begin + ShowMessage(BufDataset1.FieldByName('Country').AsString); +end; + +procedure TFormCardGridDataModel.FormShow(Sender: TObject); +begin + PopuleData; +end; + +procedure TFormCardGridDataModel.PopuleData; +begin + BufDataset1.Close; + BufDataset1.CreateDataset; + + BufDataset1.AppendRecord([1, 'China', '86', 1444216107, 'Asia', 'Mandarin', 'Beijing', 'Yuan', 'Â¥']); + BufDataset1.AppendRecord([2, 'India', '91', 1393409038, 'Asia', 'Hindi, English', 'New Delhi', 'Rupee', '₹']); + BufDataset1.AppendRecord([3, 'United States', '1', 332915073, 'North America', 'English', 'Washington, D.C.', 'Dollar', '$']); + BufDataset1.AppendRecord([4, 'Indonesia', '62', 276361783, 'Asia', 'Indonesian', 'Jakarta', 'Rupiah', 'Rp']); + BufDataset1.AppendRecord([5, 'Pakistan', '92', 225199937, 'Asia', 'Urdu, English', 'Islamabad', 'Rupee', '₨']); + BufDataset1.AppendRecord([6, 'Brazil', '55', 213993437, 'South America', 'Portuguese', 'Brasília', 'Real', 'R$']); + BufDataset1.AppendRecord([7, 'Nigeria', '234', 211400708, 'Africa', 'English', 'Abuja', 'Naira', '₦']); + BufDataset1.AppendRecord([8, 'Bangladesh', '880', 166303498, 'Asia', 'Bengali', 'Dhaka', 'Taka', 'à§³']); + BufDataset1.AppendRecord([9, 'Russia', '7', 145912025, 'Europe/Asia', 'Russian', 'Moscow', 'Ruble', '₽']); + BufDataset1.AppendRecord([10, 'Mexico', '52', 130262216, 'North America', 'Spanish', 'Mexico City', 'Peso', '$']); + BufDataset1.AppendRecord([11, 'Japan', '81', 125943834, 'Asia', 'Japanese', 'Tokyo', 'Yen', 'Â¥']); + BufDataset1.AppendRecord([12, 'Ethiopia', '251', 120858976, 'Africa', 'Amharic', 'Addis Ababa', 'Birr', 'Br']); + BufDataset1.AppendRecord([13, 'Philippines', '63', 113850055, 'Asia', 'Filipino, English', 'Manila', 'Peso', '₱']); + BufDataset1.AppendRecord([14, 'Egypt', '20', 104258327, 'Africa', 'Arabic', 'Cairo', 'Pound', '£']); + BufDataset1.AppendRecord([15, 'Vietnam', '84', 97429061, 'Asia', 'Vietnamese', 'Hanoi', 'Dong', 'â‚«']); + BufDataset1.AppendRecord([16, 'DR Congo', '243', 90003954, 'Africa', 'French', 'Kinshasa', 'Franc', 'FC']); + BufDataset1.AppendRecord([17, 'Turkey', '90', 84339067, 'Europe/Asia', 'Turkish', 'Ankara', 'Lira', '₺']); + BufDataset1.AppendRecord([18, 'Iran', '98', 85004578, 'Asia', 'Persian', 'Tehran', 'Rial', 'ï·¼']); + BufDataset1.AppendRecord([19, 'Germany', '49', 83149300, 'Europe', 'German', 'Berlin', 'Euro', '€']); + BufDataset1.AppendRecord([20, 'Thailand', '66', 69950807, 'Asia', 'Thai', 'Bangkok', 'Baht', '฿']); + BufDataset1.AppendRecord([21, 'United Kingdom', '44', 67886011, 'Europe', 'English', 'London', 'Pound', '£']); + BufDataset1.AppendRecord([22, 'France', '33', 65273511, 'Europe', 'French', 'Paris', 'Euro', '€']); + BufDataset1.AppendRecord([23, 'Italy', '39', 60244639, 'Europe', 'Italian', 'Rome', 'Euro', '€']); + BufDataset1.AppendRecord([24, 'South Africa', '27', 60041932, 'Africa', 'Zulu, Xhosa, Afrikaans, English', 'Pretoria', 'Rand', 'R']); + BufDataset1.AppendRecord([25, 'Tanzania', '255', 59895231, 'Africa', 'Swahili, English', 'Dodoma', 'Shilling', 'TSh']); + BufDataset1.AppendRecord([26, 'Myanmar', '95', 54409800, 'Asia', 'Burmese', 'Naypyidaw', 'Kyat', 'K']); + BufDataset1.AppendRecord([27, 'Kenya', '254', 53771296, 'Africa', 'Swahili, English', 'Nairobi', 'Shilling', 'KSh']); + BufDataset1.AppendRecord([28, 'South Korea', '82', 51606633, 'Asia', 'Korean', 'Seoul', 'Won', 'â‚©']); + BufDataset1.AppendRecord([29, 'Colombia', '57', 50976248, 'South America', 'Spanish', 'Bogotá', 'Peso', '$']); + BufDataset1.AppendRecord([30, 'Spain', '34', 46754783, 'Europe', 'Spanish', 'Madrid', 'Euro', '€']); +end; + +procedure TFormCardGridDataModel.CardGridClick( + PrismControlClick: TPrismControl; ARow: Integer; + APrismCardGrid: TPrismCardGridDataModel); +begin + inherited CardGridClick(PrismControlClick, ARow, APrismCardGrid); +end; + +procedure TFormCardGridDataModel.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Form'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Export yours Controls + with D2Bridge.Items.add do + begin + with CardGrid(DataSource1) do + begin + //EqualHeight:= true; + //CardGridSize:= CSSClass.CardGrid.CardGridX2; + //Space:= CSSClass.Space.gutter4; + + with CardDataModel.Items.Add do + begin + //Country + with Row.Items.Add do + begin + ColAuto.Add.VCLObj(Label_Country); + Col.Add.VCLObj(DBText_Country); + end; + + //Population + with Row.Items.Add do + begin + ColAuto.Add.VCLObj(Label_Population); + Col.Add.VCLObj(DBText_Population); + end; + + //DDI + with Row.Items.Add do + begin + ColAuto.Add.VCLObj(Label_DDI); + Col.Add.VCLObj(DBText_DDI); + end; + + with Row.Items.Add do + ColAuto.Add.VCLObj(Button_View, CSSClass.Button.view); + end; + end; + end; +end; + +procedure TFormCardGridDataModel.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormCardGridDataModel.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitcontrols.lfm b/Beta/Demos/Lazarus_linux/unitcontrols.lfm new file mode 100644 index 0000000..75f6472 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitcontrols.lfm @@ -0,0 +1,1957 @@ +object FormControls: TFormControls + Left = 544 + Height = 876 + Top = 89 + Width = 379 + ClientHeight = 876 + ClientWidth = 379 + LCLVersion = '3.8.0.0' + object Label1: TLabel + Left = 8 + Height = 15 + Top = 276 + Width = 81 + Caption = 'Select one item' + end + object Label_Titulo: TLabel + Left = 8 + Height = 21 + Top = 8 + Width = 135 + Caption = 'DEMO CONTROLS' + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [fsBold] + ParentFont = False + end + object Image_Static: TImage + Left = 8 + Height = 105 + Top = 551 + Width = 105 + Picture.Data = { + 0A544A706567496D616765ECB20000FFD8FFE000104A46494600010201004800 + 480000FFED002C50686F746F73686F7020332E30003842494D03ED0000000000 + 1000480000000100010048000000010001FFE1845D687474703A2F2F6E732E61 + 646F62652E636F6D2F7861702F312E302F003C3F787061636B65742062656769 + 6E3D22EFBBBF222069643D2257354D304D7043656869487A7265537A4E54637A + 6B633964223F3E0A3C783A786D706D65746120786D6C6E733A783D2261646F62 + 653A6E733A6D6574612F2220783A786D70746B3D2241646F626520584D502043 + 6F726520392E302D633030312037392E313465636234322C20323032322F3132 + 2F30322D31393A31323A34342020202020202020223E0A2020203C7264663A52 + 444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F + 313939392F30322F32322D7264662D73796E7461782D6E7323223E0A20202020 + 20203C7264663A4465736372697074696F6E207264663A61626F75743D22220A + 202020202020202020202020786D6C6E733A64633D22687474703A2F2F707572 + 6C2E6F72672F64632F656C656D656E74732F312E312F220A2020202020202020 + 20202020786D6C6E733A786D703D22687474703A2F2F6E732E61646F62652E63 + 6F6D2F7861702F312E302F220A202020202020202020202020786D6C6E733A78 + 6D7047496D673D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F + 312E302F672F696D672F220A202020202020202020202020786D6C6E733A786D + 704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E30 + 2F6D6D2F220A202020202020202020202020786D6C6E733A73745265663D2268 + 7474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F7354797065 + 2F5265736F7572636552656623220A202020202020202020202020786D6C6E73 + 3A73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F + 312E302F73547970652F5265736F757263654576656E7423220A202020202020 + 202020202020786D6C6E733A696C6C7573747261746F723D22687474703A2F2F + 6E732E61646F62652E636F6D2F696C6C7573747261746F722F312E302F220A20 + 2020202020202020202020786D6C6E733A7064663D22687474703A2F2F6E732E + 61646F62652E636F6D2F7064662F312E332F220A202020202020202020202020 + 786D6C6E733A706466783D22687474703A2F2F6E732E61646F62652E636F6D2F + 706466782F312E332F223E0A2020202020202020203C64633A666F726D61743E + 696D6167652F6A7065673C2F64633A666F726D61743E0A202020202020202020 + 3C64633A7469746C653E0A2020202020202020202020203C7264663A416C743E + 0A2020202020202020202020202020203C7264663A6C6920786D6C3A6C616E67 + 3D22782D64656661756C74223E4C6F676F2044324272696467653C2F7264663A + 6C693E0A2020202020202020202020203C2F7264663A416C743E0A2020202020 + 202020203C2F64633A7469746C653E0A2020202020202020203C786D703A4372 + 6561746F72546F6F6C3E41646F626520496C6C7573747261746F722032372E33 + 202857696E646F7773293C2F786D703A43726561746F72546F6F6C3E0A202020 + 2020202020203C786D703A437265617465446174653E323032332D31312D3231 + 5431313A30383A35372D30333A30303C2F786D703A437265617465446174653E + 0A2020202020202020203C786D703A4D6F64696679446174653E323032332D31 + 312D32315431343A30393A30315A3C2F786D703A4D6F64696679446174653E0A + 2020202020202020203C786D703A4D65746164617461446174653E323032332D + 31312D32315431313A30383A35372D30333A30303C2F786D703A4D6574616461 + 7461446174653E0A2020202020202020203C786D703A5468756D626E61696C73 + 3E0A2020202020202020202020203C7264663A416C743E0A2020202020202020 + 202020202020203C7264663A6C69207264663A7061727365547970653D225265 + 736F75726365223E0A2020202020202020202020202020202020203C786D7047 + 496D673A77696474683E3233323C2F786D7047496D673A77696474683E0A2020 + 202020202020202020202020202020203C786D7047496D673A6865696768743E + 3235363C2F786D7047496D673A6865696768743E0A2020202020202020202020 + 202020202020203C786D7047496D673A666F726D61743E4A5045473C2F786D70 + 47496D673A666F726D61743E0A2020202020202020202020202020202020203C + 786D7047496D673A696D6167653E2F396A2F34414151536B5A4A526741424167 + 4541534142494141442F37514173554768766447397A6147397749444D754D41 + 4134516B6C4E412B304141414141414241415341414141414541262378413B41 + 51424941414141415141422F2B494D57456C4451313951556B39475355784641 + 4145424141414D53457870626D38434541414162573530636C4A485169425957 + 566F67423834414167414A262378413B414159414D51414159574E7A63453154 + 526C5141414141415355564449484E5352304941414141414141414141414141 + 4141414141506257414145414141414130793149554341674141414126237841 + 3B41414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414152593342 + 7964414141415641414141417A262378413B5A47567A59774141415951414141 + 427364335277644141414166414141414155596D747764414141416751414141 + 4155636C685A5767414141686741414141555A31685A57674141416977412623 + 78413B41414155596C685A57674141416B4141414141555A4731755A41414141 + 6C5141414142775A47316B5A4141414173514141414349646E566C5A41414141 + 30774141414347646D6C6C64774141262378413B413951414141416B62485674 + 61514141412F6741414141556257566863774141424177414141416B6447566A + 61414141424441414141414D636C525351774141424477414141674D5A315253 + 262378413B51774141424477414141674D596C52535177414142447741414167 + 4D64475634644141414141424462334235636D6C6E614851674B474D70494445 + 354F546767534756336247563064433151262378413B59574E7259584A6B4945 + 4E7662584268626E6B414147526C63324D414141414141414141456E4E535230 + 4967535556444E6A45354E6A59744D6934784141414141414141414141414141 + 4153262378413B63314A485169424A52554D324D546B324E6930794C6A454141 + 4141414141414141414141414141414141414141414141414141414141414141 + 41414141414141414141414141414141414141262378413B4141414141414141 + 414141414146685A57694141414141414141447A55514142414141414152624D + 57466C6149414141414141414141414141414141414141414141425957566F67 + 41414141262378413B414141416236494141446A31414141446B46685A576941 + 4141414141414142696D5141417434554141426A6157466C6149414141414141 + 414143536741414150684141417473396B5A584E6A262378413B414141414141 + 414141425A4A52554D676148523063446F764C336433647935705A574D755932 + 674141414141414141414141414141425A4A52554D676148523063446F764C33 + 643364793570262378413B5A574D755932674141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141415A47567A59774141262378413B41414141 + 4141417553555644494459784F5459324C5449754D5342455A575A6864577830 + 49464A485169426A623278766458496763334268593255674C53427A556B6443 + 4141414141414141262378413B414141414141417553555644494459784F5459 + 324C5449754D5342455A575A686457783049464A485169426A62327876645849 + 6763334268593255674C53427A556B64434141414141414141262378413B4141 + 4141414141414141414141414141414141414147526C63324D41414141414141 + 41414C464A6C5A6D56795A57356A5A534257615756336157356E49454E76626D + 527064476C7662694270262378413B6269424A52554D324D546B324E6930794C + 6A4541414141414141414141414141414378535A575A6C636D56755932556756 + 6D6C6C64326C755A7942446232356B615852706232346761573467262378413B + 535556444E6A45354E6A59744D69347841414141414141414141414141414141 + 4141414141414141414141414141414141414232615756334141414141414154 + 705034414646387541424450262378413B464141443763774142424D4C41414E + 636E6741414141465957566F67414141414141424D4356594155414141414663 + 663532316C59584D414141414141414141415141414141414141414141262378 + 413B41414141414141414141414141414B5041414141416E4E705A7941414141 + 414151314A5549474E31636E5941414141414141414541414141414155414367 + 4150414251414751416541434D41262378413B4B414174414449414E77413741 + 4541415251424B414538415641425A414634415977426F414730416367423341 + 48774167514347414973416B414356414A6F416E77436B414B6B417267437926 + 2378413B414C634176414442414D594179774451414E554132774467414F5541 + 36774477415059412B774542415163424451455441526B424877456C41537342 + 4D674534415434425251464D41564942262378413B5751466741576342626746 + 31415877426777474C415A49426D67476841616B427351473541634542795148 + 5241646B4234514870416649422B6749444167774346414964416959434C7749 + 34262378413B416B454353774A55416C30435A774A78416E6F4368414B4F4170 + 67436F674B734172594377514C4C4174554334414C724176554441414D4C4178 + 594449514D74417A674451774E5041316F44262378413B5A674E794133344469 + 674F574136494472674F364138634430775067412B77442B51514742424D4549 + 415174424473455341525642474D456351522B424977456D67536F424C594578 + 415454262378413B424F45453841542B425130464841557242546F4653515659 + 4257634664775747425A594670675731426355463151586C4266594742675957 + 426963474E775A49426C6B4761675A37426F7747262378413B6E516176427341 + 473051626A427655484277635A4279734850516450423245486441654742356B + 487241652F423949483551663443417349487767794345594957676875434949 + 496C676971262378413B434C344930676A6E4350734A45416B6C43546F4A5477 + 6C6B43586B4A6A776D6B43626F4A7A776E6C4366734B45516F6E436A304B5641 + 7071436F454B6D4171754373554B3341727A4377734C262378413B4967733543 + 31454C615175414335674C73417649432B454C2B51775344436F4D5177786344 + 48554D6A67796E444D414D32517A7A4451304E4A67314144566F4E6441324F44 + 616B4E77773365262378413B4466674F45773475446B6B4F5A41352F4470734F + 74673753447534504351386C44304550586739364435595073772F50442B7751 + 4352416D45454D515952422B454A73517552445845505552262378413B457845 + 78455538526252474D45616F527952486F456763534A684A46456D515368424B + 6A45734D5334784D4445794D5451784E6A45344D5470425046452B5555426851 + 6E46456B556168534C262378413B464B30557A685477465249564E4256574658 + 67566D785739466541574178596D466B6B576242615046724957316862364678 + 30585152646C46346B5872686653462F63594778684147475559262378413B69 + 686976474E55592B686B674755555A61786D524762635A33526F4547696F6155 + 5270334770346178527273477851624F78746A47346F6273687661484149634B + 687853484873636F787A4D262378413B4850556448683148485841646D523344 + 4865776546683541486D6F656C42362B48756B664578382B48326B666C422B2F + 482B6F6746534242494777676D43444549504168484346494958556826237841 + 3B6F53484F496673694A794A56496F496972794C6449776F6A4F434E6D493551 + 6A776950774A42386B545352384A4B736B3269554A4A54676C614357584A6363 + 6C3979596E4A6C636D68796133262378413B4A75676E4743644A4A336F6E7179 + 66634B41306F507968784B4B496F31436B474B54677061796D644B6441714169 + 6F314B6D67716D7972504B7749724E6974704B353072305377464C446B732623 + 78413B626979694C4E6374444331424C585974717933684C685975544336434C + 7263753769386B4C316F766B532F484C2F34774E5442734D4B5177327A45534D + 556F78676A47364D6649794B6A4A6A262378413B4D70737931444D4E4D30597A + 667A4F344D2F45304B7A526C4E4A3430324455544E553031687A58434E663032 + 4E7A5A794E7134323654636B4E3241336E4466584F4251345544694D4F4D6735 + 262378413B42546C434F58383576446E354F6A5936644471794F7538374C5474 + 724F366F373644776E5047553870447A6A50534939595432685065412B494435 + 675071412B344438685032452F6F6A2F69262378413B51434E415A45436D514F + 64424B55467151617842376B4977516E4A4374554C33517A7044665550415241 + 4E455230534B524D3546456B5656525A7046336B5969526D644771306277527A + 5648262378413B653066415341564953306952534E644A48556C6A53616C4A38 + 456F33536E314B7845734D53314E4C6D6B76695443704D636B793654514A4E53 + 6B32545464784F4A553575547264504145394A262378413B54354E503356416E + 5548465175314547555642526D31486D556A465366464C4855784E5458314F71 + 552F5A55516C5350564E74564B46563156634A5744315A6356716C5739316445 + 56354A58262378413B344667765748315979316B6157576C5A75466F48576C5A + 61706C7231573056626C56766C58445663686C7A57585364646546334A586870 + 65624636395877396659562B7A5941566756324371262378413B595078685432 + 47695966566953574B635976426A51324F58592B746B514753555A4F6C6C5057 + 57535A65646D505761535A75686E505765545A2B6C6F50326957614F78705132 + 6D6161664671262378413B53477166617664725432756E612F39735632797662 + 5168745947323562684A75613237456278357665472F5263437477686E446763 + 5470786C584877636B7479706E4D426331317A75485155262378413B64484230 + 7A48556F645956313458592B647074322B48645764374E3445586875654D7835 + 4B6E6D4A65656436526E716C65775237593376436643463867587A6866554639 + 6F583442666D4A2B262378413B776E386A6634522F35594248674B6942436F46 + 72676332434D494B536776534456344F36684232456749546A68556546713459 + 4F686E4B473134633768352B4942496870694D364A4D346D5A262378413B6966 + 364B5A49724B697A434C6C6F76386A474F4D796F30786A5A694E2F34356D6A73 + 36504E6F2B656B416151627044576B542B52714A49526B6E715334354E4E6B37 + 6155494A534B6C505356262378413B5835584A6C6A53576E35634B6C33575834 + 4A684D6D4C695A4A4A6D516D667961614A72566D304B62723577636E496D6339 + 35316B6E644B65514A36756E78326669352F366F476D67324B4648262378413B + 6F6261694A714B576F77616A6471506D7046616B7836553470616D6D4771614C + 7076326E6271666771464B6F784B6B3371616D71484B715071774B7264617670 + 72467973304B314572626975262378413B4C6136687278617669374141734857 + 77367246677364617953374C43737A697A7272516C744A79314537574B746747 + 326562627774326933344C685A754E473553726E43756A753674627375262378 + 413B7536653849627962765257396A37344B766F532B2F373936762F5841634D + 44737757664234384A6677747644574D5055784648457A73564C78636A475273 + 62447830484876386739794C7A4A262378413B4F736D35796A6A4B7438733279 + 37624D4E6379317A54584E746334327A7262504E382B3430446E517574453830 + 62375350394C42303054547874524A314D765654745852316C5857324E646326 + 2378413B312B44595A4E6A6F32577A5A3864703232767662674E774633497264 + 454E325733687A656F74387033362F674E754339345554687A4F4A543474766A + 592B50723548506B2F4F57453567336D262378413B6C75636635366E6F4D7569 + 3836556270304F706236755872634F7637374962744565326337696A75744F39 + 4137387A775750446C38584C782F2F4B4D38786E7A702F5130394D4C31555058 + 65262378413B396D33322B2F654B2B426E3471506B342B636636562F726E2B33 + 6638422F79592F536E397576354C2F747A2F62662F2F2F2B3441446B466B6232 + 4A6C414754414141414141662F6241495141262378413B426751454241554542 + 67554642676B474251594A437767474267674C44416F4B43776F4B4442414D44 + 41774D44417751444134504541384F44424D5446425154457877624778736348 + 783866262378413B4878386648783866487745484277634E4441305945424159 + 4768555246526F66487838664878386648783866487838664878386648783866 + 4878386648783866487838664878386648783866262378413B48783866487838 + 664878386648783866487838662F384141455167424141446F41774552414149 + 5241514D5241662F454161494141414148415145424151454141414141414141 + 4141415146262378413B417749474151414843416B4B43774541416749444151 + 454241514541414141414141414141514143417751464267634943516F4C4541 + 414341514D44416751434267634442414947416E4D42262378413B41674D5242 + 414146495249785156454745324569635945554D704768427857785169504255 + 7448684D785A69384352796776456C517A52546B714B79593350434E55516E6B + 364F7A4E686455262378413B5A485444307549494A6F4D4A4368675A684A5246 + 5271533056744E564B427279342F5045314F54305A5857466C6157317864586C + 39575A326870616D74736257357659335231646E64346558262378413B703766 + 48312B66334F456859614869496D4B6934794E6A6F2B436B3553566C7065596D + 5A71626E4A32656E354B6A704B576D7036697071717573726136766F52414149 + 434151494442515545262378413B4251594543414D4462514541416845444243 + 45534D55454655524E6849675A78675A45796F624877464D485234534E434656 + 4A696376457A4A445244676861535579576959374C4342335053262378413B4E + 654A45677864556B77674A4368675A4A6A5A464769646B6446553338714F7A77 + 796770302B507A684A536B744D54553550526C64595756706258463165583152 + 6C5A6D646F615770726247262378413B317562325231646E6434655870376648 + 312B66334F456859614869496D4B6934794E6A6F2B446C4A57576C35695A6D70 + 75636E5A36666B714F6B7061616E714B6D717136797472712B762F6126237841 + 3B414177444151414345514D52414438416C476E2B563958456B767161566333 + 467A417741673448303667416B4F33656C5255444F3179617648513951414C35 + 2F6A3065537A364A456A795246262378413B6E7045743547357674476D524A4B + 6D43367330413474576E456F7A4B6A553639516676714B353568452B6D593978 + 5A3438426B5056412B3844384438664554503830502B5545306E2F6A50622623 + 78413B2F774455504A6D71374B2F786D6675503368336E625038416973506648 + 2F636C3554625730317A4C3663517161565A69614B716A717A4539414D364F55 + 6742753872474A4B62526166356674262378413B395053585570627236354943 + 793230496A586170437456755A49493333432F4C766D4F5A35544B6F38504433 + 2F6A39726B52686945626C78635864742B33394336793062536453743550714E + 262378413B7A497438674C4C5A7941463341334A546941476F4F6F423565436E + 4250504F4239513950662B5037504E4F50424849505366563366712F462B5365 + 2F6C2F704E7A70336E6978457057534761262378413B4B5A37653569504B4B56 + 665459565274756832494F34373568396F3568505479726D434C485562757737 + 4B776D47706A6649673052794F79432F4E542F6C4E4C762F55682F7743546135 + 5A32262378413B542F6344342F6531647466347A4C346663784C4E6D3670324B + 72344C6565346C45554562537974396D4E464C4D666B42766B5A5341466E5A4D + 596D526F626C4E763847656176543952744C6E262378413B5250463134666679 + 706D502B6477335845484B2F495A3673776C386B4D664C3274416B4730663454 + 51306F66756F643873386548653065445075516C78615856756158454C784539 + 4F616C61262378413B2F4B7557526B44794C417849357157535139562F4A5038 + 41336C31622F58682F552B633532377A683866305055657A76307A2B48365870 + 6D6146365234312B63332F4B55577638417A42522F262378413B386E5A63366A + 73542B3550396239416550396F503738663142393559486D35644735565A6D43 + 7143574F7741334A4F42557A30665462476256426161744E4C5A5267486B4569 + 6153566E3234262378413B6F71676246764535526D7953454C6742492B397677 + 593447645A43596A33576663796938736679363032476B6B46314C4F52736C78 + 4B424A394B516266656377495331557A7A694235443962262378413B734D6B64 + 4A416370452B5A2F556B316F504B5633642B6A774E6F6A665A6C755A4A465148 + 705439327370487A4F325A637A6C6A472F7139316673634F4178536C58302B2B + 2F7742414B493878262378413B65564C54544C52626F4E497355713872616453 + 7339764B6635566B546F66384157797654617335445855637879492B445A7164 + 4834594236486B655950784354617635653162536653613967262378413B4B52 + 584368344A3149654E7752583458576F72375A6B346454444A66436477342B66 + 545A4D56635132504C755A722B53762F4855314C2F6A416E2F45383150626E30 + 52393775765A37363565262378413B3536336E4E7656757856324B766E713338 + 786167427A6657372B4B57557530356A42593149414235657170626C786F656D + 64724C54522F6D52492F486B2B665231552B66484D45382F774157262378413B + 736A31362F677469494E5976566B43414C434B71684C47727157456832363738 + 64386B6450456E6545667838455231456F6A6163767838587066356736626561 + 68354B30754731514F367951262378413B53507964493143726279564A5A7971 + 6A373830505A32574D4E52496E7A2B38505339713470543030424876486C2F43 + 6539357070326E2B596F7269537968744B50495745697A6F675373414C262378 + 413B74563561494F494250584E396B7934694F496E35656675655A7834637438 + 49472F6E356239646C30766C587A50504A36736C735A4A5A704376393547574C + 637A48586A797146356A69472B7A262378413B6747727844612B587639374936 + 4C4D656E4D393437362B2F7279556A3562387751584D513941704B3158535553 + 5238554B414F533867626A475642422B496A4A666D735242333239782B377126 + 2378413B782F4B35515274763778392F54347333386A33486D61627A42594855 + 57742F715479584D6B6670437A566E6D43535276495052704939537042626348 + 3773314F766A69474B58426646742F4F262378413B3562477439766737727332 + 6559356F38664477334C6C773836497662632B2F6B782F38414E542F6C4E4C76 + 2F414649662B5461356D646B2F33412B5033754432312F6A4D7668397A457332 + 62262378413B716B783037536B6C684E356553665637424451762B303766796F + 50484B636D536A51336B327778324C4F30557A3043367574494678714D56314A + 593255395930436844504B67616F56535274262378413B327177706C476F7878 + 7956456A69492B516239506C6C6975555477672F4D714F702B63745A76574B72 + 4D385551365663764A394C74552F646B73576A68446F7879367A4A506D536739 + 503841262378413B4D476F5764794A79567576356B7552366F50306E34682F73 + 534D737961654D68584C33624E6550504B4276592B2F646C625357586D6D795A + 644A59322B7049424A63614A4F334F4F3443486B262378413B6671386A664744 + 7475746636357276567035657665485351366631682B6C325A454E5448393336 + 5A3959486B6636702F51674C37514E4B3171336D76664C736232312F62417466 + 614649535A262378413B467039706F436432415056657634444C63656F6E6949 + 6A6C336965552F774262566B3032504D444C434B6B4F634F762B6233736F2F4A + 502F41486C31622F58682F552B612F74336E44342F6F262378413B6470374F2F + 5450346670656C356F5870486A58357A6638414B5557762F4D46482F77416E5A + 63366A73542B3550396239416550396F503738663142393559486D356447796E + 54644776725054262378413B30753757425A39516E586C473746517353456255 + 35455659312F7A37344F544E4755714A71492B317A4D654B55593242636A3969 + 4475626B36527A6A522F563165595675726B2F4636664C66262378413B67702F + 6D38546C6B592B4A2F553642726C4C672F7264556A5A6D64697A45737A477059 + 376B6E4D6C7832734B70313564383058576B7331764B67764E4A754E727A5435 + 643433553953746673262378413B7434455A69616E53444A7550544D63693565 + 6C316B7357783955447A6965522F62357332306E523953503772544C63363535 + 4A3145632F71306B6B537951456B31432B6F366C5A4932384E6A262378413B38 + 393831576250446E4D2B486E6A316F372F4C6F5863344E50506C41654A707039 + 4C466A356E596A37557838692B5735664C336D375662426E39534A72614F5732 + 6B3271596D6B4948494475262378413B437042796A744456444E676A4C72652F + 767079657A4E496450714A7736634949393176514D3072763359713746554C2B + 69744C2F414F574F442F6B576E394D7338616665666D316542442B6126237841 + 3B506B37394661582F414D7363482F49745036592B4E5076507A587749667A52 + 386D4D2F6D66715A30337935457977527A787A58417435495A4F59556F384D6C + 522B375A47485473637A2B7973262378413B58486C4F39554C2B304F74376179 + 2B486847774E79723744335538307476507570514F5A6671304C7A4E4B387253 + 566D552F4847385156654D673468556B49586A763841546D2B6E326641372623 + 78413B576172793777653779656168326A4F4A756864333137694F2F754F7934 + 2F6D48724C4E435768674B775369654E6153553569526E71547A716637776A66 + 72313637342F79626A33334F347237262378413B50636E2B55386D3277324E39 + 65386E76382F77564A7650476F47626D7474416B6237334D4939546A4D334656 + 444F532F4955394E6163434D6C2B516A584D2B584C6237505071774F766E6649 + 262378413B6566506637664C70544A2F49766D323831587A4C59325531764646 + 4768754A55394A7051415757526A3842636F66746E666A584E6632686F343438 + 5570416E703365586C62732B7A4E624C4A262378413B6D6A456741656F375835 + 2B6464653549767A552F355453372F774253482F6B32755A665A503977506A39 + 3768397466347A4C346663784C4E6D367050703965306534534A4A744E4C4A41 + 7647262378413B4A424D7756523868515A6978775446314C6E354F536330447A + 6A793830723148554A7236344D73673471427869694832555164464758593443 + 49706F6E4D794E6F584C474C73565877547A51262378413B544A5043356A6D69 + 59504849706F5659476F494F526C45455565535979494E6A6D4759322F6E3752 + 3176346456756441456D744A784D743946647951633341346C76535265487844 + 37513735262378413B724A646E7A3454415A5033666477672F6137654861654D + 534753574F386E383453492B776265396D58355A616E6261706536396632396F + 4C4B4F346C67593236747A4162673349316F76326D262378413B33365A712B31 + 4D52787868456E696F4864322F5932595A4A5A4A4163494A477A4F3830377658 + 6C48356F36487132712B61595630363165354D566A455A416772784454545572 + 393264483254262378413B6E686A776E694E58492F63486C653274506B793578 + 77417971412B2B547A793973623278754774377942376564657363696C577034 + 3050624E33444A4759754A734F67795935514E53464655262378413B307A5364 + 533153646F4E507433755A6B55794D694370436767562B39686B637561474D58 + 493047574842504961674C4B75336C7258313146644E61776D572B6453365146 + 614D7967456C6858262378413B596A6249666D7366447838513465396D644A6C + 342B44685046334F75504C5776573937445A54324D30643163375738624C546D + 66386B39446A48565935524D6849554F6179306D574D684578262378413B496B + 65532B31387265593775302B7432326E7A54572F78446E47764C644478595547 + 2B784743657278526C776D5142544452355A78346F784A434473394D31433975 + 2F716470625354585739262378413B5955556C6878363148616E6575577A7978 + 6848696B6144566A78546E4C6869435A4978764B766D4662354C41324D687535 + 454D7363516F537941304C41676B47684756445634754869347653262378413B + 326E5235654C67345478466E333555364C71756C61786652366A625062504A62 + 71794B2B78494430726D6D37587A77795169596D3933666468366565504A4954 + 46656E394C30374E41394B37262378413B465859713746585971775038357638 + 416C4637582F6D4E6A2F7743545575626A73542B2B5039583949644637516633 + 412F726A3769386D5456727845344430797677624E46453339326A5272262378 + 413B31552F73756670333635306877785066387A37336C426C6B4F373544334C + 343962766F796854306877574A5672444552534770576F4B2F46312B4B763275 + 2B4134496E7636395431534D3868262378413B33644F673666442B3371744F73 + 58786A394F73664867305A2F6452314B76494A4733343172794858364F6D4877 + 5933663654376B654E4B71322B5137375A4A2B5763386B2F6E754365536E7126 + 2378413B5369643334674B4B7447784E4655414435444D44745349476E49486B + 374C7365524F7142506E3979642B653947306562576455315855376934696A67 + 6B7472645674305279544A4147715137262378413B4A2F4C343569646E35356A + 48474541446645642F65356E616544476373357A4A4142694E68664D65384D53 + 75664A313862794B505458573974626D41584E7463735567426A4A342F48366A + 41262378413B4B7762616C633255646248684A6E365344524850376E5654304D + 754943487142466738747669723652355469654456704E584631424C70627752 + 766257306179536B7A46683059714E754950262378413B58706B633273494D42 + 4468504865354F327A50426F67524D354F496346624157643752482B44644E67 + 31472F6975727559326C6E5A783377394F4E526341536C615279527331466363 + 747858262378413B4B2F7A737A474A4148464B58447A32323633334D2F77416A + 434D3543556A7778694A637439363249766E757358795A6153616A5A7878584D + 76314B2B744A7275457978694F5A665256766764262378413B61734E796E5548 + 442B646B496B6B44696A49446E74756A386A457A6941547779695A62696A7466 + 366C712B572F4C79576D6C693776376933764E5568457354656B72774957636F + 4135444B2F262378413B55654745366E4B544C68694447423739304453346847 + 484649695578664C626E5866616846355669744937323531796437613273726E + 366E77675553535454674669736649716F4158666B63262378413B6D64575A47 + 4978697A495876794159445269496C4C4B61455A634F32354A386C5453744230 + 44555A64526D696C7666714E6A436B6F51525274634D585949563468754A7058 + 7258426D314753262378413B4169434938556A336D6D5748545973686B515A63 + 4D52664958336437505079706773594831694B792B73656972572B3130697879 + 3869726B3156537770346235702B31355350415A56652F4C262378413B6B3733 + 734F4D5278694E31747A3250566E2B6156333742764F396A6558306D7432746E + 4530317A4A70316836635366615047396C59302B675A7439426B6A41516C4930 + 4F4F582B35446F2B30262378413B7363706E4A4749733845503932574A533232 + 704D6E6C2F5345676831487A426269344D734533476449596E49394E5A545572 + 384971314366687A5A435550336B374D635A726C745A36303667262378413B77 + 6E2B3778674365556357334F68307633632F4A4F4C62534442356A3157416159 + 514A744764486767583675747A4B486A456A5172385842574F77322B6A4D6157 + 613855547863736E586568262378413B765639376C7777566D6D4F446E693544 + 62694E6936376D34456769315452495868657A4D466866704C706253724C4C45 + 6E426A7961536C6179564E41527454706A496B776D6234726C44315626237841 + 3B515077386C69414A34785844554A2B6D37493250587A51756C74612F57764B + 69365447353064727035476C6D66314A567569744869656756566F7167696733 + 3635504B4A634F586A50723465262378413B6E4C683732764477385748777766 + 443475753534756F2F484E4133656A363171486C72513330754E6D6133756238 + 79544B776A45664B5A654A5A7956432F5A4F58517A34345A5A695A3569502623 + 78413B7832614A36664A6B77597A41636A50667533485646586B3176716B2F6D + 53313065525A7452755071674A68594B31796B533075665250513166346A5437 + 58766C63496E474D5A6D4B694F4C6E262378413B2F446630332B4E6D334A495A + 446C6A6A4E7A5044792F697236712B4F2F6D713652356373394E313231573374 + 7273472B303238615778756E55544167464F414B6F76486C38736A6D314D736D + 262378413B4D32592B6D636478792B396C673073636555554A6572484C306E6E + 314663757162666C3770636C6A727434547063326C525332716859703566574C + 73736E784D4734707452674B557A473753262378413B7969654D656F54395851 + 5630637A736E43595A5A656777426A314E396663486F4761563642324B757856 + 324B7578565375724F30753478486451527A786738676B717134424170576A41 + 3737262378413B354B4535524E6730776E6A6A495649412B39432F346630482F + 713232762F4969502F6D6E4C507A47542B644C356C722F4143754C2B62483542 + 332B4839422F367474722F414D69492F77446D262378413B6E4838786B2F6E53 + 2B5A583872692F6D782B51642F682F51662B7262612F38414969502F414A7078 + 2F4D5A503530766D562F4B34763573666B465333306A537261555332396C4244 + 4B4B306B262378413B6A69525746646A7541446B5A5A707946456B6A33736F34 + 4D635459694166633833383936726F53367071326C616F627066576C74626848 + 746B6A622B37673430504E6C70586C6D2B3750785A262378413B4F434534634F + 776B4E3737336D2B3038324C784A776E78626D4A327270487A4C476C31337978 + 64616A5A6A554C65355852394D67454E6E6170776B6552677859744D53306632 + 69616B4C3873262378413B7A6A703830596E684934356D796631633358445559 + 5A546A786958687746416337392F4C374566622B634E496A6D316F6D3831474A + 74556133644C79434F4B4F5A444357354C525A46437252262378413B676F6F65 + 6D55793055794962515042657875742F673351313041636E716D4F5068334141 + 4F312B616D2F6E7946627138754C623678484F326E705932743278557A76496B + 676231706D424735262378413B473231636B4F7A7A5142717550694936565849 + 4D54326B4F4B556F3851504277673962766D667756502F474F6E793637447256 + 79733575704C4F5733766F77464B6571596A47725256665A57262378413B7255 + 72745474584A666B70444763597175494565363733596E58524F555A4A587863 + 4A423939567476792B35534F7565565A37545347765937795336307546596A62 + 78694A497043726C7857262378413B51737A41477444384F48774D776C50684D + 616D6565396A344D667A4743555963516B5A514656745233766E2B7875333833 + 323934626D50567657747A4C6666704B307537514B7A7754303430262378413B + 344F56444C514476586247576A4D614D4B507034534431435936345473547358 + 506A426A3050366B7A6B383936544A6633556A58462F474A7243437A572B6956 + 4675444A432F4A704B656F4B262378413B632F3841577967646E7A45514B6A74 + 496D756D2F546B35423753675A45334D584152346858465936382B76765A5038 + 416C68633274314E7138397663335632484E76366B3937543169775678262378 + 413B325A39676F464E38312F61735445514245527A2B6E6C306470324C4F4D6A + 4D67796C394F387566587A4C4F38303776586A6635796B6A7A5261302F355959 + 2F2B5430756452324A2F636E2B74262378413B2B6750482B3048392B5036672B + 38735A742F4C476F545372434A5955754768467836444F655969593044476749 + 36397134366E7437545962347966547A325467396E4E586B786A49496A686C26 + 2378413B734E2F4B2F75566F504B4771547A7A51517A51504E6238524D6F6471 + 727A46562F5A376A475062756E6C7976354E5137447A32523662486E2B78582F + 414D41363934772F3847662B61636E2F262378413B41437A682F70664A503867 + 366A2B6A3833663442313778682F774344502F4E4F5038733466365879582B51 + 64522F522B62763841414F76557057476E2B75662B616366355A772F30766B76 + 38262378413B67366A2B6A38334479447277334268722F726E2F414A70782F6C + 6E442F532B532F774167366A2B6A383232386965594759737A784D78366B7945 + 6E3957416473595050354B657774522F522B262378413B624A667965686D6731 + 76566F4A68786C69695648587251724A51356A39737A4573634A446B66314F58 + 32444177797A696559483658712B633639513746585971374658597137465859 + 713746262378413B5859713746586866357166387070642F366B502F41436258 + 4F75374A2F7542386676654937612F786D58772B356957624E31547356646972 + 735664697273566469723158386B2F393564572F262378413B31346631506E4F + 647538346648394431487337394D2F682B6C365A6D68656B654E666E4E2F7741 + 7052612F387755662F4143646C7A714F7850376B2F31763042342F32672F7678 + 2F5548336C262378413B6E6D6D365659505957736A52664730456649386D4837 + 494E4E6A307A6D7334426E4C336C3676545350687839772B35586B307A546F6B + 6555784E734B74785A366D672B652B5162554A7A3066262378413B2F664D332F + 4A582B754B75353650384137356D2F354B2F3178563350522F3841664D332F41 + 43562F72697275656A2F37356D2F354B2F31785645323170707477685A493341 + 426F6554534B66262378413B784F4B73632F4C3146547A76356B525252565A67 + 42374355357539662F69324C3864486E2B7A5038617A65382F6539487A535051 + 4F7856324B757856324B757856324B757856324B75785634262378413B582B61 + 6E2F4B6158662B70442F77416D317A72757966376766483733694F3276385A6C + 38507559344C794830625749327945514F7A7976543435655242347361644142 + 515A6E3842736D2B66262378413B324F74347851466376745632314854337672 + 6D34657755517A786C496F456269496E594163316F744E747A536D51474F5169 + 4278626A37575A79524D6954486E30376C76312F542F414E442F262378413B41 + 465036697631336E792B76386A7934317278345570394E63506879342B4C6939 + 5063766952344F48683958657172716D6E72716476644E7038636C7444476953 + 575A2B46585A55346C6956262378413B414F3766466B54696C7745635735504E + 49797834784C68464163752F623846546A31437757653963324B2B6C4F724C62 + 5263676653422B7A7551613032334644373734546A6C5139584C6E3526237841 + 3B6F47534E6B384F783565536D6232324F6E773233315650566A6B3952376A62 + 6B366D76774862703037354C675045546531636D50474F454374373571656F33 + 4676633373303976414C614351262378413B316A74776168425437494E425839 + 666A6878784D5967453265394757516C496B43683350546679542F7742356457 + 2F31346631506D67376435772B50364870665A33365A2F44394C307A4E432623 + 78413B394938612F4F622F414A5369312F35676F2F38416B374C6E5564696633 + 4A2F72666F44782F74422F666A2B6F50764C305378693958523757506D79636F + 492F6A51305966434F687A6D383331262378413B793935657130333933482B71 + 5075612F52582F4C35632F386A50374D72626B6738342B597442386F32455637 + 72476F5863634D7A6D4F5067786170436C7A57696D674369754B734F6D2F5066 + 262378413B38746F556B65585672354669727A4A456D3143796E396A6664434E + 7356542F79562B59666C447A6C6479326D69366C65795451786956672F4E4278 + 4C4F676F57556674524E39337978566D50262378413B364B2F35664C6E2F414A + 47663259716962613339424376717953314E61794E79492B574B735438676638 + 7031356D2F31322F354F6E4E33722F77444673583436505038415A6E2B4E5A76 + 6566262378413B7665693570486F485971374658597137465859713746585971 + 3746585971384C2F4E542F414A5453372F3149662B54613531335A503977506A + 3937784862582B4D792B48334D537A5A757164262378413B6972735664697273 + 56646972735665712F6B6E2F414C7936742F72772F71664F63376435772B5036 + 4871505A33365A2F44394C307A4E43394938612F4F622F6C4B4C582F414A676F + 2F77446B262378413B374C6E55646966334A2F72666F44782F74422F666A2B6F + 50764B2B782F4E6D5333733462655454424930534B68645A754150455572784B + 4E54373872796469435569524F7238763274754874262378413B387767496D46 + 304F2F774459722F38414B34502B31522F303866384158724B2F35432F702F77 + 43782F61322F36492F39722F32582F4855447133356A616271304B7733326869 + 56454E562F30262378413B6D684250582F645750386866302F3841592F74582F + 52482F414C582F414C4C2F4149366C6838782B576943446F4C45487150725233 + 2F354A592F79462F542F325037562F30522F37582F7376262378413B2B4F6F7A + 5376504769365863473473394334544665484D334E547838503772482B517636 + 662B782F617638416F6A2F32762F5A66386454582F6C63482F616F2F3665502B + 765750386866302F262378413B396A2B31663945662B312F374C2F6A726A2B63 + 426F61615451397639492F3639596635432F702F5A2B31482B695038416F6637 + 4C39694A2F4B652B652F77444D6D745873696848755639566C262378413B586F + 4330684E426737587869474B4552302F5576596D51354D3253522F69332B3136 + 6C6E507654757856324B757856324B757856324B757856324B7578564C623379 + 316F4639634E63336D6E262378413B775845374142705A45566D49416F4E7A37 + 5A6644565A59436F7949446A5A4E48696D654B555154376C442F426E6C502F41 + 4B744E722F794B582B6D542F505A763538766D772F6B2F422F4D6A262378413B + 386E66344D38702F39576D312F774352532F30782F505A763538766D76386E34 + 50356B666B372F426E6C502F414B744E722F794B582B6D5035374E2F506C3831 + 2F6B2F422F4D6A386E66344D262378413B38702F39576D312F35464C2F414578 + 2F505A763538766D76386E3450356B666B372F426E6C50384136744E722F7741 + 696C2F706A2B657A667A35664E66355077667A492F4A332B44504B662F262378 + 413B41466162582F6B5576394D667A32622B664C35722F4A2B442B5A48354F2F + 775A35542F36744E722F414D696C2F706A2B657A667A35664E66355077667A49 + 2F4A4736646F2B6C616172727039262378413B72466169556779434A5176496A + 70576E7A79724A6D6E6B2B6F6B74324C5477782F5142472B35475A5533494455 + 504C2B69616A4D73392F5977334D797145575356417843676B67565061704F26 + 2378413B585939546B674B6A49674E47585334736875635154356F582F426E6C + 502F713032763841794B582B6D57666E7333382B587A6176355077667A492F4A + 332B44504B663841316162582F6B5576262378413B394D667A32622B664C3572 + 2F414366672F6D522B54763841426E6C502F713032762F49706636592F6E7333 + 382B587A582B54384838795079642F677A796E2F316162582F414A464C2F5448 + 38262378413B396D2F6E792B612F7966672F6D522B5476384765552F38417130 + 32762F49706636592F6E7333382B587A582B54384838795079642F677A796E2F + 316162582F6B55763841544838396D2F6E79262378413B2B612F7966672F6D52 + 2B5476384765552F7744713032762F41434B582B6D5035374E2F506C38312F6B + 2F422F4D6A386B58702B68614E70727539685A513272794469375249464A4133 + 6F615A262378413B586B3147536631456C74786162486A4E7769492B35485A53 + 33757856324B757856324B757856324B757856324B757856324B757856324B75 + 7856324B757856324B757856324B757856324B75262378413B7856324B757856 + 324B757856324B757856324B757856324B757856324B757856324B757856324B + 757856324B764B50502F6E6A7A5270586D6534737243393947316A574D704836 + 554C304C49262378413B436433526A31506A6E52396E6144446B7769556F3264 + 2B702F5738743270326C6E785A7A4745716A74304864376D4F2F38724F383866 + 384156792F3549572F2F4146547A4F2F6B72542F7A66262378413B7450363358 + 2F79787176352F32522F55372F6C5A336E6A2F414B75582F4A43332F77437165 + 5038414A576E2F414A76326E39612F79787176352F32522F55372F414A576435 + 342F3675582F4A262378413B43332F3670342F7956702F3576326E39612F7978 + 7176352F32522F55372F6C5A336E6A2F414B75582F4A43332F77437165503841 + 4A576E2F414A76326E39612F79787176352F32522F55372F262378413B414A57 + 6435342F3675582F4A43332F3670342F7956702F3576326E39612F7978717635 + 2F32522F55372F6C5A336E6A2F414B75582F4A43332F774371655038414A576E + 2F414A76326E39612F262378413B79787176352F32522F55372F414A57643534 + 2F3675582F4A43332F3670342F7956702F3576326E39612F79787176352F3252 + 2F55372F6C5A336E6A2F414B75582F4A43332F77437165503841262378413B4A + 576E2F414A76326E39612F79787176352F32522F55372F414A576435342F3675 + 582F4A43332F3670342F7956702F3576326E39612F79787176352F32522F5537 + 2F6C5A336E6A2F414B7558262378413B2F4A43332F774371655038414A576E2F + 414A76326E39612F79787176352F32522F55372F414A576435342F3675582F4A + 43332F3670342F7956702F3576326E39612F79787176352F32522F5526237841 + 3B372F6C5A336E6A2F414B75582F4A43332F774371655038414A576E2F414A76 + 326E39612F79787176352F32522F55372F414A576435342F3675582F4A43332F + 3670342F7956702F3576326E39262378413B612F79787176352F32522F55372F + 6C5A336E6A2F414B75582F4A43332F774371655038414A576E2F414A76326E39 + 612F79787176352F32522F55372F414A576435342F3675582F4A43332F362623 + 78413B70342F7956702F3576326E39612F79787176352F32522F55372F6C5A33 + 6E6A2F414B75582F4A43332F774371655038414A576E2F414A76326E39612F79 + 787176352F32522F55372F414A5764262378413B35342F3675582F4A43332F36 + 70342F7956702F3576326E39612F79787176352F32522F55372F6C5A336E6A2F + 414B75582F4A43332F774371655038414A576E2F414A76326E39612F79787176 + 262378413B352F32522F55372F414A576435342F3675582F4A43332F3670342F + 7956702F3576326E39612F79787176352F32522F55372F6C5A336E6A2F414B75 + 582F4A43332F774371655038414A576E2F262378413B414A76326E39612F7978 + 7176352F32522F55372F414A576435342F3675582F4A43332F3670342F795670 + 2F3576326E39612F79787176352F32522F5539357A6A6E755859713746585971 + 3746262378413B5859713746586866357166387070642F366B502F414362584F + 75374A2F7542386676654937612F786D58772B356957624E3154735664697273 + 56646972735664697273566469727356646972262378413B7356646972735664 + 697273566469727356646972735664697236687A7A35394D6469727356646972 + 7356646972735665462F6D702F77417070642F366B5038417962584F75374A2F + 75423866262378413B76654937612F786D58772B356957624E31547356646972 + 735664697273566469727356546A522F4B486D5456774773624752346A306E61 + 6B6366304F2F4548364D78633273785976716C7535262378413B574451357376 + 30524A4832664E6C646A2B5447735341473976344C6348744772544D506E5830 + 782B4F61374A3235416654456E375031753178657A2B512F5649443766314A6B + 667961307947262378413B4C6E63367536676458394E455838574F554474755A + 4F3047382B7A384969355A50732F616C56372B586E6C324A53494E586D6B6B39 + 6F564B2F69795A6C592B304D703577412B4C685A657A73262378413B4D655579 + 542F562F61457358794C45443856347A4474534D4C2F7873325A483530397A69 + 666B78332F5971663448732B492F306D546C334E467039325035773979667959 + 37314362794D6145262378413B773364543256302F69442F444A44573934596E + 52397853323638716178414352474A3148654931502F416D682F444C6F366D42 + 386D6D576D6D456F64486A636F366C48585A6C595549507544262378413B6C34 + 4E744244574658597137465859712B6F63382B66544859713746585971374658 + 59713746586866357166387070642F774370442F7962584F75374A2F75423866 + 76654937612F786D5877262378413B2B356957624E3154735664697273566469 + 727356566B7337703764726C596D4D43624E4B4165492B6E496D597572335477 + 6D72364B534D46645749354145456739365953683672642F6E4573262378413B + 676A67305853336B6E634144317941413367456A727948767947633744735774 + 386B74764C3972302B543267365934622B663667314472666D2B362F65366866 + 693351372F564C5656514435262378413B79554C2F41484E6C683032434F3059 + 33356C6F2F4F366965387056354439664E4B3957383432635463586E65396D58 + 59414D58412B62736631567A4978614D39427768784D327437795A466A262378 + 413B7431357A314F556B514B6C75766167357439376266686D5A485352485064 + 773561755235624A624A726D73534772586B6F2F31574B2F384145615A634D4D + 4230445563307A314B6436467133262378413B6C706973657353366E4249646D + 756F4C674F704A366B70774441664C6C6D4A714D57626E4467506B522B333954 + 6D61624A67355A4F4D655950364B2F577A2B78386E365071466D626E52504D26 + 2378413B46314B44396C33654B345254546F3646466348324A427A54354E646B + 684B736B42396F2F53373348325A69795276466B6B666B667370692B7454655A + 664C6C7749395774456E74574E497279262378413B436F5276704E51472F7741 + 6B675A736342785A783644523769366E55777A6163314D574F384D6138786174 + 6161724C6266566B5A4751454F7A67416E6B52516245394B5A6E594D52674462 + 67262378413B5A386F6D5254494E652F4B54573950745263574D79366B46465A + 6F6B517049504867704C63782B50746D42702B324D637A556877757A31505965 + 584847346E6A372B2F39763432594D797372262378413B465742566C4E475537 + 45455A747758534E595664697236687A7A35394D646972735664697273566469 + 72735665462F6D702F796D6C332F71512F38414A74633637736E2B3448782B39 + 346A74262378413B722F475A6644376D4A5A7333564F7856324B757856324B73 + 6838762B5747757774316541726264556A364D2F75664263784D2B703464687A + 637242702B4C63386B62356731367968745A4E4E262378413B736C567956394E + 797579494F34464F70797242676B547853624D2B61494844466A656D36626461 + 6863434742613933632F5A55654A7A4D795A424157584578347A493047597878 + 6152356473262378413B2B546E6C4D776F576F50556B506742324761386D6559 + 2B546E675178447A597871336D472F7742514A51743656763268513745663552 + 2F617A4E78594977393768356338702B354B38766158262378413B5971374658 + 597169744D315855644D756C7572433465336E5839704431486777364D505935 + 566C77787943704377325963303863754B426F76562F4C48356A615472385036 + 4A312B474F4B34262378413B6D48437243734531653378665A6232503048746E + 4F3672737965453865496B67664D505561507462486E486835674154386A2B70 + 6A486E7638754A744844366C70596162544F737352715868262378413B722F78 + 4A5066743338637A2B7A2B30786C394539702F662B31313361665A4A772B7547 + 3850752F5973386F2F6D6671656B384C54556556397079305653542B2B6A4132 + 2B466A396F442B552F262378413B654D6C724F796F5A50564830792B77736444 + 32785044365A2B714832686C2F6D48796C6F486E4F774772364C4E4774387732 + 6E585A5A4350324A6C3668683430723838316D6D316D54537934262378413B4D + 67395034354F32315768786179486959694F4C372F663576494C2B77764C4337 + 6B744C794A6F4C6D49306B6A6355492F7144324F644E6A79526E486969624265 + 54795935516B597946454B262378413B47545950714850506E3078324B757856 + 324B757856324B75785634582B616E2F41436D6C332F71512F77444A74633637 + 736E2B3448782B39346A74722F475A6644376D4A5A7333564F78563226237841 + 3B4B7578566B586C6E7939395A497662746639485531696A50375A48632F7743 + 5350787A44314F666839493575567038484675655370356A387A4751765A574C + 55694877797A4B667466354B2B262378413B337633776166543136704A7A3669 + 396F386B69302F5437692F756C7434423854627378364B6F366B356C5A4A6949 + 73754E43426B61444D4C6D35302F793570346868416534635656543970322623 + 78413B2F6E66327A58786A4C4E4B7A79632B556F346F304F62444C7938756279 + 6470376879386A642B7748674232476247454245554858796B5A47796F354A44 + 735664697273566469727356646972262378413B306E38762F77417876543461 + 4E72736E4F3163656E6258636D2F43753370796B39553843656E6662706F7530 + 657A4C2F41486D506E3148366E6F65792B31712F6435543665683776492B5833 + 262378413B65376B432F4D6279434E4A633672706945365A4966333051333942 + 6D4F3150386875336830384D74374D3751385430542B76372F414E7254327432 + 5A345238534830483750324D6238736561262378413B64533876583475625275 + 5554554678624D614A496F374877493748746D6471744A444E4770632B68376E + 58365057547754346F2F456437314456394D30583877504C3636687078456570 + 5169262378413B6B624E7379754E7A444C547365782B6B6438352F446C796150 + 4C77792B6B2F6977394C6E77343966693434625448346F7647377131754C5734 + 6B7472694D78547773556C6A6271724B61455A262378413B31454A6951424849 + 76497A67596B6737455070334F4166536E597137465859713746585971374658 + 6866357166387070642F366B502F4A74633637736E2B3448782B39346A74722F + 41426D58262378413B772B356957624E31547356646971765952775358734354 + 7346685A31456A45304847752B2B516D53496D75624B414249766B39476D6A73 + 3562553278634C4379384F4B4E782B4877464D3141262378413B4D6762367531 + 49695258524C50384D65587635662B53682F726C33356E49302F6C3861396E30 + 6251624F5353454B47626F67617275657771616D6D437035547579754749624D + 497662796538262378413B7558754A3235534F666F41374165777A5A51674969 + 673636556A493256484A73585971374658597137465859713746585971374658 + 715035646564726136744738753636367447554B573030262378413B78484634 + 36554D4C6B2B3332666262777A6E75307443597938584838612B393658737274 + 474D6F2B446C355674666433483948795466384177462B57333838662F535766 + 2B61387876355131262378413B6634693558386D364C76482B6D545051744738 + 6D3646504A4E7074306B545372776B5533504A57414E52565759696F37484D66 + 555A382B59564D582F414A726B3662427073427545674C2F70262378413B4D4E + 2F4E2B44513547733952744A6F6E7635574D5534695A57356F71374D33453956 + 36562F706D3137476C6B46786B4477756F37646A694A6A4F4A4845656450574D + 35743674324B75785632262378413B4B757856324B75785634582B616E2F4B61 + 58662B70442F7962584F75374A2F7542386676654937612F77415A6C38507559 + 6C6D7A645537465859713746585971374658597137465859713746262378413B + 585971374658597137465859713746585971374658597137465859712B6F6338 + 2B6654485971374658597137465859713746586866357166387070642F774370 + 442F7962584F75374A2F7542262378413B386676654937612F786D58772B3569 + 57624E3154735664697273566469727356646972735664697273566469727356 + 646972735664697273566469727356646972735664697236687A7A3539262378 + 413B4D64697273566469727356646972735665522B612F4C4635356A2F4D532F + 737257574F47534F326A6D4C5338755046566A576E7768742F6A7A706448716F + 344E4C47556865354833764A3637262378413B52793147726C474A4150434476 + 38464A767959387730504739744365774A6C412F774349484A66793369377066 + 5A2B74682F6F667A667A6F2F622B706A65762B532F4D4F684C366C3962663626 + 2378413B4F5451584D5244783139794E312F3251475A2B6E31324C4E74453739 + 7A72745632666D77627A4733663053504D74773359713746575961422B575772 + 3631704D477032393162787733485069262378413B6B68666B4F447368725253 + 4F7135713952327244464D77494E6832326C3748795A73596E45786F2B2F7742 + 33636A5A76796238794A477A52334E724B343345595A314A3967536C50767971 + 50262378413B6265496E63532F4878627064675A774E6A452F50395443745130 + 36393036386B733732466F4C6D4930654E7576735254596739694D3275504A47 + 63524B4A7346303258464C4849786B4B495A262378413B687033355336336661 + 666133736435624C4864524A4D69735A4F5157525177426F7658664E5A6B3759 + 78776B596B53324E64486234757738733443514D616B4C363966673365666B39 + 356E68262378413B694D6B457474637350393149374B782B584E565838635964 + 745953614949584A32446E694C48444C342F7259566332303974504A62334562 + 5254784D566B6A59555A574855455A7459794568262378413B59354F6D6C4578 + 4E485968503955386A616A70336C79323132576546376135574A3069586C7A41 + 6D586B746171427433337A4378612B4538707867477866324F666D374F6E6A77 + 6A4B534F47262378413B56652F64563872666C39716E6D5054354C3231754949 + 5934355443566C4C3875537172562B4657322B5042712B3059594A634D675474 + 624C52396C354E52417969514264622F324A72503841262378413B6B33356B53 + 4D744663326B7244396A6C49705079716C4D786F3974346964784C3866467970 + 64675A774E6A452F503841557844574E43316252376E36747156733176495256 + 61304B73504657262378413B46566236446D7A7736694755584132366E507073 + 6D4B58444D5555446C7A537A4C512F79723878366E4174785077734948465545 + 39665549506630774E7638415A455A713952327469786D68262378413B366A35 + 4F333033597562494C5070486E7A2B535A586E354D366E444138734F6F777946 + 464C465852304777723148504D6548626343614D533547543266795246695159 + 586F47693347746174262378413B42706C7536527A58485069386C654934497A + 6D74415430584E72714D3478514D7A794470394C707A6D794345655A2F745A6A + 2F79706A582F41506C747450766B2F7743614D316E3874347536262378413B58 + 32667264742F6F667A667A6F2F622B704C504D58356136746F576C53616A6333 + 4E764C46477971556A4C38766A626950744B4233792F546471517A5434414462 + 6A3676736A4A676878794D262378413B6138722F414650633835463764324B75 + 7856324B757856324B75785668476D2F2B546331582F746E4C2B75444E746C2F + 784B5039662F696E5334662B4E436639542F69586E666E48564E547426237841 + 3B764E2B71473375356F536C77775178794F744B553655497A65614C46435743 + 4E6748627565643132616364524F69523675396D6E35622B62626E586B757442 + 316F6937506F6C6F354A427538262378413B6451726F2F6A396F5550584E5632 + 6E6F7868724A6A3233647A325272705A37785A665674396E6377762F426B732F + 6E61667935444B4951736A2B6E4C494331496776714B53423150436D62582623 + 78413B38364270786C497662376554702F79424F704F4547747A387566334D70 + 682F4B3779704A494C526466456C2B5274476A5138712F3859716C76787A5853 + 37577A416358682B6E342F65374F50262378413B5932416E6838573566443772 + 595435723872336E6C7A552F715677346C6A646655676E5555446F5454707651 + 676A635A74644A713435346351323733546133527930382B45373978656A614C + 262378413B4664792F6B2B49374E4A487557696D455351686A49543961663749 + 58664E4A6E4D5272726C7973632F7743713944676A49396E5647376F3876367A + 47504A6D6E2B6649664D566B336F583846262378413B74367147374D36797045 + 5951527A44656F41702B487037356E36334A706A696C76456D74717137645A32 + 6668315563306470675876643158586D722F414A795432636D76577363525533 + 4D55262378413B464C676A714B7353696E3370552F546B4F784979474D6B3869 + 646D7A742B55546D41484D523354337A624E4C462B56656B7645375274364E6B + 4F536B7161656B4F347A45306351645A4F2B2B262378413B5833756272354561 + 47466430507559782B577570655A4A504D7474424250504E5A6B7439626A5A6D + 61495238543854567141613950664E683270697844455351424C703375733749 + 79356A6D262378413B416953593965366D2F7741336C746C3832677730395272 + 614933464F76715659437638417341754473596E77642B38312B506579376445 + 667A47335068462B2F2B796D522B63762F4143564F262378413B6B2F38414747 + 782F354E444D48526634355033792B39324861482B497739305075622F4C4669 + 766B4C56325530496D7543434F6F503165504874582F41426D4875482B364B39 + 6B482F424A2B262378413B2B582B35447A577A387861395A5343533131433469 + 594775306A55507A556D682B6E4E3750545935696A454834504F3439566C6762 + 6A496A347656624F34547A33354575426478722B6B6266262378413B6D6F5A52 + 536B3861386B6466414F44512F546E4F7A6A2B5431493466705033505434352F + 6E744B6549657550336A6C383249666C526F454F7061394A65584342344E4F56 + 5A417033426C636B262378413B52312B58456E356A4E6E327671446A78384935 + 792B377136727354536A4A6C346A7968392F5272387750504F70616871317859 + 57633777616461753051574E69767173686F7A4F5231465273262378413B5044 + 48733751516841536B4C6B6673523270326A504A6B4D596D6F44623373526976 + 3736462B634E7A4C4734324449374B6676427A5A6E4845374542314D636B6762 + 42495A442B57502F4B63262378413B61622F7A332F3668354D77753166384146 + 3566443777374873663841787148782F77427955382F4D6A54764D382F6D6957 + 54543757396C7476536A43766278797448554C76516F4B5A68396D262378413B + 5A63497767534D5162504F6E4D37587735705A7959786B52513541734C314B32 + 3877327361727163563342484C58674C6C5A555669744361633656706D317854 + 7853506F4D54377164506C78262378413B355966574A432B2B33306A6E43766F + 72735664697273566469727356646972434E4E2F386D3571762F624F58396347 + 62624C2F695566362F2F464F6C772F38414768502B702F784C7A487A7A262378 + 413B2F7741706471762F4144454E6D2F304839784433504D396F2F77434D542F + 72466B66354F365A504C72732B6F63534C6132685A4F6539444A495252662B42 + 424F595062575544474939535859262378413B3967595363706E306950744B51 + 2B664E515736383436706357373058314244795539524569784E754F78345A6D + 646E342B48424548332F5064776530387648714A6B6439664C5A472F6C333526 + 2378413B54763841567458743738677736665A53724C4A63476F354E47655152 + 44334E52763444364D713753316B636344486E4B51354E335A57686E6C794358 + 4B4554642F6F56667A533877326D7261262378413B3548445A754A6265785178 + 657375345A324E58346E7542514449396B36615750486375636D58624F726A6C + 7931486352325A6C355A3153343072387149745174315235725A4A6E525A4153 + 70262378413B50316C787541565066787A563672454D6D734D54794E66376B4F + 34306D633474414A7835692F384164466A6C702B632B7569345436335A577232 + 39523669784352487033346C6E6366686D64262378413B5073544858704D722B + 48366E5877396F4D742B714D612B503631623833764C6D6E3262323272576943 + 4757366B5A4C6C46324474546B487032505775523747314D7058435739636D58 + 62756B262378413B68416A4A486269352F725A564C7238476865514E49763572 + 623632677462535030616864326947395347384D317730357A616D6351654831 + 532B39326B74554D476B68496A69394D64766769262378413B6872397871506B + 393956387378526D36346B693264616C58582B3853696C666A48566648627879 + 763875495A2B444D64752F37766732666D6A6B302F6959414F4C752B2F34397A + 776D397662262378413B752B75356275376B6161356D626C4C4933556E4F7678 + 776A43496A45554138546B79536E49796B624A65702B6376384179564F6B2F77 + 444747782F354E444F6530582B4F5439387676656D37262378413B512F784748 + 7568397A7679792F77435541316A2F41497A58502F554E486A32702F6A4D5063 + 5038416446657950385579652B582B354479624F6B655765763841355A51766F + 336B792B316137262378413B4870787973397767616F7248456C4166396B774E + 4D356E745358693534776A37766958724F78342B4470705A4A64642F6745742F + 4A4F366945327132706F4A5857475642334B6F585676754C262378413B6A4C2B + 3359476F6E7075342F73374D584F5058592F4B2F31734F76466251764F4D7076 + 495057466E646D526F57324569422B513667374F76746D7A6766477744684E63 + 55666B366649504231262378413B42346866444C6C33372F70656F6554504D4F + 682B5A7072714E4E4668746671796F784A574E2B584D6B646B58777A6E396470 + 736D4141385A4E2B2F396230765A2B7178616B6B6548474E6534262378413B2F + 6F5952354E56562F4E4A4655414B4C6D3841413241416A6C7A6261302F344838 + 492F654854646E43746150664C376979627A762B592B75614672386D6E326B46 + 744A4369493461564A4331262378413B5746547573696A384D774E42325A6A7A + 59784B526C66772F55374C744874664C67796D4552477475642F72594A357038 + 363672356B5333532B69676A4673574D666F4B3631353072586B372F26237841 + 3B414D75626A53614747432B456E667664487265304A36697549416350642F61 + 2B676334743735324B757856324B757856324B757856357A5072756C614C2B61 + 57703357707A2F563448736B69262378413B562B4C76567A36544155514D6569 + 6E4E3548547A79364F49674C50462B7435365770783464644F557A51344B2F77 + 427A334B656F616C2B546433647933397857347570573579454C65446B782623 + 78413B37385478544A593857756A45524777483956686C79396E536B5A486552 + 2F7270647258356E324E767070307A79745A6D7969494B69344B72487842366D + 4E467238522F6D4A726C2B44737155262378413B703865593852376E48314862 + 4D5977344D456545642F367631734E38744C6F623631422B6E5A475454527961 + 5A6C356B6B6853564234426D6F57324E4D326D714F51597A346631756F306778 + 262378413B48495046506F36765662767A6A2B57397A7067307A39494E425967 + 6366527434726D4563663566676A4733746E4F513057716A506A34626C356D4A + 2F5339526B312B6A6C44772B4B6F397745262378413B682B6867336D324C3875 + 5630745435646C64372F414E566551595430394F68356633716865744D322B6A + 4F71342F336F394E655836485361364F6B4550334A39562B664C34736A387165 + 612F262378413B4A55666B6D32305457727168496C5735742F546E364E4D376A + 3434313843447363777458704E516451636D4D6431486275383359364C573659 + 6159597370373746533779656A555770666B31262378413B707371336470415A + 35347A7952516C7A4A754F6E777A6B4A58453474644D634D6A512F7A66304947 + 62733747654B49732F7743642F76746D4A65642F4F6B2F6D57386A4B786D4378 + 74716933262378413B684A71784C55354F354863303664733257673049775237 + 35486D367274487441366D51327149354250764D766D76514C333876394F306D + 327576553143434F3157574830354251785268582B262378413B4A6C43374877 + 4F59656C306D534F706C4D6A306E693775706333576133465053517878507248 + 44745236424A2F774176764F482B4839554B584C483947586446756469654248 + 325A41425537262378413B643664766F7A4B375230586A51322B736376314F4A + 3258722F4179622F524C6E2B74513839763561754E584E396F4E304A59727172 + 3345416A6B6A394F5475527A5642522B75336575533750262378413B47555134 + 63676F6A6C795964704843636E46694E69584D5552522B4936702F356C383136 + 42652F6C2F70326B323131366D6F5152327179772B6E494B474B4D4B2F774154 + 4B46325067637739262378413B4C704D6B64544B5A4870504633645335327331 + 754B656B686A6966574F48616A3043722B58506D76797870666C7537302F5637 + 723058754C69526A46366372566A654A452B31477255727850262378413B6575 + 523754306D624A6C456F4336486C7A7339375A325472634750444B4751315A50 + 51387148636950722F354C3254436143324E793637684F467A494E7638414A6E + 49544965487235374531262378413B2F7066304D7A6C374E687542786636622F + 66624A4435302F4D573431324161665A516D7A30735535526B6A6E4A784E5635 + 553256525437497A4D30505A6F776E696B654B66334F4432683271262378413B + 633434496A6868392F77434F356A7567363565364A716B4F6F575A487152624D + 682B79364837534E5473637A6452676A6C67597964667074524C444D546A7A44 + 306534387A2F6C7435706952262378413B39616A4E6E657176454F77634D5059 + 53786768674F334C37733063644C71744F66335A346F2F6A6F663050517A316D + 6A3149764B4F475834366A394B4A305857507979387365764C70392B7A262378 + 413B7663425134704A4B5346725143696744726C656644713952516C486C3767 + 32616255614C545759534A4A39352F5177627978726D6D326E6E784E58757044 + 44596D61356B4D68566D4957564A262378413B417456514D6572444E76717345 + 3561626741755644374B644C6F7454434771475352714E792B30466D32726176 + 2B554772586A58756F532B7663734172536362314E6C464273675566686D7026 + 2378413B773464646A6A777846442F4E647A6E7A396E355A63557A6376383949 + 764D482F414371583944585836492F343658442F4145622F4148732B31556637 + 382B447034356D616638373467342F6F262378413B362F542B687774582B5138 + 4D2B48396654362F303750596335683635324B757856324B757856324B757856 + 34582B616E2F4B6158662B70442F77416D317A72757966376766483733694F32 + 76262378413B385A6C385075596C6D7A64553746585971374658597137465859 + 7137465859713746585971374658597137465859713746585971374658597137 + 465859712B6F63382B665448597137465859262378413B713746585971374658 + 686635716638414B6158662B70442F414D6D317A72757966376766483733694F + 3276385A6C385075596C6D7A6455374658597137465859713746585971374658 + 597137262378413B465859713746585971374658597137465859713746585971 + 37465859712B6F63382B66544859713746585971374658597137465868663571 + 66387070642F366B502F4A74633637736E2B3448262378413B782B39346A7472 + 2F41426D58772B356957624E3154735664697273566469727356646972735664 + 6972735664697273566469727356646972735664697273566469727356646972 + 36687A7A35262378413B394D64697273566469727356646972735665462F6D70 + 2F796D6C332F414B6B502F4A74633637736E2B3448782B39346A74722F475A66 + 44376D4A5A7333564F78564658476B36726232736433262378413B635763384E + 724C54307269534A316A626B4F53385849414E52754D716A6D68493849494A48 + 5332795743635969526952453961325562613175627164594C614A3535337277 + 69695575375546262378413B5452567154734D6E4B59694C4A6F4D59516C4931 + 4557573771307572535A6F4C7146376564667452537155635633335667446A43 + 596B4C42734C4F456F6D7043697468686D6E6C574B474E70262378413B5A584E + 456A51466D4A39674E385A5341466C45596B6D687A575A4A437039577550712F + 316E306E2B72682F544D3345384F5A484C6A7936637162307950454C71393038 + 427136326450623345262378413B44424A346E695A6C563156314B6B71777172 + 4148735275446A4751504932736F6B6378537259365871642B58466A6154585A + 6A703667676A65546A587058694453744D6A6B79776839524139262378413B35 + 5A34384D352F5445793977744473724B78566751774E43447351526B32745646 + 6C65455645456848706D656F5276376F47686B36665A727458706B654F506635 + 6648755A65484C75504B2F262378413B68337163734D7354425A55614E697175 + 46594654786451796E6673796B456532534567655344456A6D7257576D366A66 + 4F795756724E644F67354F734D62534544784955476D516E6C6A443626237841 + 3B694237325750464F6530515A6534576F4D724B78566751774E43447351526B + 32434A74394B314F3574354C6D3373353572614B6F6C6E6A6A64305767716554 + 414544624953797769614A414A262378413B3832794F4763675A434A4948576B + 4C6C6A5772477976417059775342566A457A4D5561676A59674B35322B795351 + 4163687878372F4A6C34637534392F774146484A7358597137465831446E2623 + 78413B6E7A3659374658597137465859713746585971384C2F4E542F6C4E4C76 + 2F55682F774354613531335A5038416344342F65385232312F6A4D7668397A45 + 733262716E59716E486D5055374739262378413B6B7431746F59367857317247 + 3932767169526D6A74305230594F3343697343506851644F707A4630324B5551 + 624A357932322F6E48342F613557717A526E564162526A76766530514F2B7673 + 262378413B55764C563961324F7352584E315430556A6E44426778424C774F69 + 7165487866457A41625A4C56597A4F424135376665474F6C7952686B75584B6A + 3978623877333174655855456C72526256262378413B4C654F4F473341623979 + 42557445576570616A456E6C5531422B674F6D786D4949504F2B666635727163 + 676E4947504B755864354C764C756F57576D7A5433732F714E4F6B6670327363 + 4C65262378413B6D2F4B5434576353464A5648464B39523377616E484B594552 + 7936332F614536584C484754493364625673642F4F6A30517573505A53616C50 + 4C593757737A6572484876384871414D593977262378413B4B2B6D5478723370 + 6C6D455345414A63782B4C2B504E727A6D4A6D54483654396E6C384F53633646 + 71756A523647326D616C49336F543354537A6F6973574370477249796B436C53 + 36635059262378413B4D637864526979484A7877356950366677666735576E7A + 59786A344A6E5979732F4C6239587851506D6A5649395531434B375277374E62 + 514C4E52536F456978674F6F424132446262625A64262378413B70635278784D + 664D2F653036764D4D6B784C2B69506E53493875586D6D523662714E72657662 + 4270337432695338463136523950314F57396F4F5949354472746C6570684D7A + 69593374664C262378413B6876702F4F3262644C4F41684B4D75486576713471 + 32762B62756B4C7146646C4442774351484661476E63564150336A4D774F4357 + 55364672326D322B6D517758557A527A757A3666505243262378413B77585435 + 795A4A473247355752696550584E66714E504D7A4A41322B6F66316874397A73 + 6450714978674154522B6B2F31447566745348574C784C7A564C6D356A714958 + 636942543145532F262378413B4447763049414D7A4D4D4F474142352F703675 + 466D6D4A544A484C7037756E324937546269796C305A74506C76527038715851 + 7566565A5A5757526548454439307274795137725555334F34262378413B796E + 4C47516E784350454F47756E366539767853696366415A634A347236372F4143 + 7663645065684E66766F6237576279376872365530685A4759555A6830354D50 + 467570793354347A4447262378413B496E6F4772555A4250495A446B536E486C + 2F584E4D73744A6A743569713371334D3873467779797439585A6F45574F5469 + 6E777343796C534344343038635855594A796E592B6D6874747675262378413B + 62446C616255516841412F56784567373762436A2B4C59786D77646579545764 + 5730363930657A74495A76536C744C6148315068626A4D3672784B4E384E6555 + 663750374E43656836344F44262378413B444B457A496A596B2F442B3372312F + 526E5A38304A776A45476A4544342F744854707A2B4D627A4F6346324B757856 + 39513535382B6D4F7856324B757856324B757856324B76432F7A552F35262378 + 413B5453372F414E53482F6B3275646432542F6344342F65385232312F6A4D76 + 68397A45733262716E5971374658597137465859713746585971374658597137 + 4658597137465859713746585971262378413B37465859713746585971374658 + 31446E6E7A3659374658597137465859713746585971384C2F4E542F6C4E4C76 + 2F55682F774354613531335A5038416344342F65385232312F6A4D7668397A26 + 2378413B45733262716E59713746585971374658597137465859713746585971 + 3746585971374658597137465859713746585971374658597137465831446E6E + 7A365937465859713746585971374658262378413B5971384C2F4E542F414A54 + 53372F3149662B54613531335A503977506A3937784862582B4D792B48334D53 + 7A5A757164697273566469727356646972735664697273566469727356646972 + 73262378413B56646972735664697273566469727356646972735666554F6566 + 50706A735664697273566469727356646972777638414E542F6C4E4C762F4146 + 49662B54613531335A503977506A39377848262378413B62582B4D792B48334D + 537A5A7571646972735664697273566469727356646972735664697273566469 + 7273566469727356646972735664697273566469727356662F2F5A3C2F786D70 + 47496D673A696D6167653E0A2020202020202020202020202020203C2F726466 + 3A6C693E0A2020202020202020202020203C2F7264663A416C743E0A20202020 + 20202020203C2F786D703A5468756D626E61696C733E0A202020202020202020 + 3C786D704D4D3A52656E646974696F6E436C6173733E64656661756C743C2F78 + 6D704D4D3A52656E646974696F6E436C6173733E0A2020202020202020203C78 + 6D704D4D3A4F726967696E616C446F63756D656E7449443E757569643A363545 + 36333930363836434631314442413645324438383743454143423430373C2F78 + 6D704D4D3A4F726967696E616C446F63756D656E7449443E0A20202020202020 + 20203C786D704D4D3A446F63756D656E7449443E786D702E6469643A33643135 + 616364302D323663352D656434322D383266332D333231313536396639333039 + 3C2F786D704D4D3A446F63756D656E7449443E0A2020202020202020203C786D + 704D4D3A496E7374616E636549443E786D702E6969643A63353530373333662D + 353739322D316634642D383235632D3163613831306161666230623C2F786D70 + 4D4D3A496E7374616E636549443E0A2020202020202020203C786D704D4D3A44 + 65726976656446726F6D207264663A7061727365547970653D225265736F7572 + 6365223E0A2020202020202020202020203C73745265663A696E7374616E6365 + 49443E757569643A61653761633562352D386430642D343666642D393031632D + 3065306336623439653837353C2F73745265663A696E7374616E636549443E0A + 2020202020202020202020203C73745265663A646F63756D656E7449443E786D + 702E6469643A36373231653862342D356164352D623334612D383162612D6537 + 313939326531656463363C2F73745265663A646F63756D656E7449443E0A2020 + 202020202020202020203C73745265663A6F726967696E616C446F63756D656E + 7449443E757569643A3635453633393036383643463131444241364532443838 + 3743454143423430373C2F73745265663A6F726967696E616C446F63756D656E + 7449443E0A2020202020202020202020203C73745265663A72656E646974696F + 6E436C6173733E64656661756C743C2F73745265663A72656E646974696F6E43 + 6C6173733E0A2020202020202020203C2F786D704D4D3A446572697665644672 + 6F6D3E0A2020202020202020203C786D704D4D3A486973746F72793E0A202020 + 2020202020202020203C7264663A5365713E0A20202020202020202020202020 + 20203C7264663A6C69207264663A7061727365547970653D225265736F757263 + 65223E0A2020202020202020202020202020202020203C73744576743A616374 + 696F6E3E73617665643C2F73744576743A616374696F6E3E0A20202020202020 + 20202020202020202020203C73744576743A696E7374616E636549443E786D70 + 2E6969643A36373231653862342D356164352D623334612D383162612D653731 + 3939326531656463363C2F73744576743A696E7374616E636549443E0A202020 + 2020202020202020202020202020203C73744576743A7768656E3E323032332D + 31312D32315430383A32363A34332D30333A30303C2F73744576743A7768656E + 3E0A2020202020202020202020202020202020203C73744576743A736F667477 + 6172654167656E743E41646F626520496C6C7573747261746F722032372E3320 + 2857696E646F7773293C2F73744576743A736F6674776172654167656E743E0A + 2020202020202020202020202020202020203C73744576743A6368616E676564 + 3E2F3C2F73744576743A6368616E6765643E0A20202020202020202020202020 + 20203C2F7264663A6C693E0A2020202020202020202020202020203C7264663A + 6C69207264663A7061727365547970653D225265736F75726365223E0A202020 + 2020202020202020202020202020203C73744576743A616374696F6E3E736176 + 65643C2F73744576743A616374696F6E3E0A2020202020202020202020202020 + 202020203C73744576743A696E7374616E636549443E786D702E6969643A6335 + 3530373333662D353739322D316634642D383235632D31636138313061616662 + 30623C2F73744576743A696E7374616E636549443E0A20202020202020202020 + 20202020202020203C73744576743A7768656E3E323032332D31312D32315431 + 313A30383A35372D30333A30303C2F73744576743A7768656E3E0A2020202020 + 202020202020202020202020203C73744576743A736F6674776172654167656E + 743E41646F626520496C6C7573747261746F722032372E33202857696E646F77 + 73293C2F73744576743A736F6674776172654167656E743E0A20202020202020 + 20202020202020202020203C73744576743A6368616E6765643E2F3C2F737445 + 76743A6368616E6765643E0A2020202020202020202020202020203C2F726466 + 3A6C693E0A2020202020202020202020203C2F7264663A5365713E0A20202020 + 20202020203C2F786D704D4D3A486973746F72793E0A2020202020202020203C + 696C6C7573747261746F723A5374617274757050726F66696C653E5765623C2F + 696C6C7573747261746F723A5374617274757050726F66696C653E0A20202020 + 20202020203C696C6C7573747261746F723A43726561746F72537562546F6F6C + 3E41646F626520496C6C7573747261746F723C2F696C6C7573747261746F723A + 43726561746F72537562546F6F6C3E0A2020202020202020203C7064663A5072 + 6F64756365723E41646F626520504446206C6962726172792031372E30303C2F + 7064663A50726F64756365723E0A2020202020202020203C706466783A437265 + 61746F7256657273696F6E3E32312E302E303C2F706466783A43726561746F72 + 56657273696F6E3E0A2020202020203C2F7264663A4465736372697074696F6E + 3E0A2020203C2F7264663A5244463E0A3C2F783A786D706D6574613E0A202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 200A202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020200A20202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 20202020202020202020200A2020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 202020202020202020202020202020200A202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020200A20202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 20202020202020202020202020202020202020202020202020200A2020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 202020202020202020202020202020202020202020202020202020202020200A + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 202020200A202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020200A20202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 20202020202020202020202020200A2020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 202020202020202020202020202020202020200A202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020200A20202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 20202020202020202020202020202020202020202020202020202020200A2020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 20200A2020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 202020202020200A202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020200A20202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 20202020202020202020202020202020200A2020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 202020202020202020202020202020202020202020200A202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020200A20202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 0A2020202020202020202020202020202020202020202020202020200A3C3F78 + 7061636B657420656E643D2277223F3EFFE20C584943435F50524F46494C4500 + 010100000C484C696E6F021000006D6E74725247422058595A2007CE00020009 + 000600310000616373704D534654000000004945432073524742000000000000 + 0000000000000000F6D6000100000000D32D4850202000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000001163707274000001500000003364657363000001840000006C7774 + 7074000001F000000014626B707400000204000000147258595A000002180000 + 00146758595A0000022C000000146258595A0000024000000014646D6E640000 + 025400000070646D6464000002C400000088767565640000034C000000867669 + 6577000003D4000000246C756D69000003F8000000146D6561730000040C0000 + 002474656368000004300000000C725452430000043C0000080C675452430000 + 043C0000080C625452430000043C0000080C7465787400000000436F70797269 + 676874202863292031393938204865776C6574742D5061636B61726420436F6D + 70616E790000646573630000000000000012735247422049454336313936362D + 322E31000000000000000000000012735247422049454336313936362D322E31 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000058595A20000000000000F3510001 + 0000000116CC58595A200000000000000000000000000000000058595A200000 + 000000006FA2000038F50000039058595A2000000000000062990000B7850000 + 18DA58595A2000000000000024A000000F840000B6CF64657363000000000000 + 001649454320687474703A2F2F7777772E6965632E6368000000000000000000 + 00001649454320687474703A2F2F7777772E6965632E63680000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000064657363000000000000002E4945432036313936362D322E3120 + 44656661756C742052474220636F6C6F7572207370616365202D207352474200 + 000000000000000000002E4945432036313936362D322E312044656661756C74 + 2052474220636F6C6F7572207370616365202D20735247420000000000000000 + 000000000000000000000000000064657363000000000000002C526566657265 + 6E63652056696577696E6720436F6E646974696F6E20696E2049454336313936 + 362D322E3100000000000000000000002C5265666572656E6365205669657769 + 6E6720436F6E646974696F6E20696E2049454336313936362D322E3100000000 + 0000000000000000000000000000000000000000000076696577000000000013 + A4FE00145F2E0010CF140003EDCC0004130B00035C9E0000000158595A200000 + 0000004C09560050000000571FE76D6561730000000000000001000000000000 + 000000000000000000000000028F000000027369672000000000435254206375 + 7276000000000000040000000005000A000F00140019001E00230028002D0032 + 0037003B00400045004A004F00540059005E00630068006D00720077007C0081 + 0086008B00900095009A009F00A400A900AE00B200B700BC00C100C600CB00D0 + 00D500DB00E000E500EB00F000F600FB01010107010D01130119011F0125012B + 01320138013E0145014C0152015901600167016E0175017C0183018B0192019A + 01A101A901B101B901C101C901D101D901E101E901F201FA0203020C0214021D + 0226022F02380241024B0254025D02670271027A0284028E029802A202AC02B6 + 02C102CB02D502E002EB02F50300030B03160321032D03380343034F035A0366 + 0372037E038A039603A203AE03BA03C703D303E003EC03F9040604130420042D + 043B0448045504630471047E048C049A04A804B604C404D304E104F004FE050D + 051C052B053A05490558056705770586059605A605B505C505D505E505F60606 + 06160627063706480659066A067B068C069D06AF06C006D106E306F507070719 + 072B073D074F076107740786079907AC07BF07D207E507F8080B081F08320846 + 085A086E0882089608AA08BE08D208E708FB09100925093A094F09640979098F + 09A409BA09CF09E509FB0A110A270A3D0A540A6A0A810A980AAE0AC50ADC0AF3 + 0B0B0B220B390B510B690B800B980BB00BC80BE10BF90C120C2A0C430C5C0C75 + 0C8E0CA70CC00CD90CF30D0D0D260D400D5A0D740D8E0DA90DC30DDE0DF80E13 + 0E2E0E490E640E7F0E9B0EB60ED20EEE0F090F250F410F5E0F7A0F960FB30FCF + 0FEC1009102610431061107E109B10B910D710F511131131114F116D118C11AA + 11C911E81207122612451264128412A312C312E31303132313431363138313A4 + 13C513E5140614271449146A148B14AD14CE14F01512153415561578159B15BD + 15E0160316261649166C168F16B216D616FA171D17411765178917AE17D217F7 + 181B18401865188A18AF18D518FA19201945196B199119B719DD1A041A2A1A51 + 1A771A9E1AC51AEC1B141B3B1B631B8A1BB21BDA1C021C2A1C521C7B1CA31CCC + 1CF51D1E1D471D701D991DC31DEC1E161E401E6A1E941EBE1EE91F131F3E1F69 + 1F941FBF1FEA20152041206C209820C420F0211C2148217521A121CE21FB2227 + 2255228222AF22DD230A23382366239423C223F0241F244D247C24AB24DA2509 + 25382568259725C725F726272657268726B726E827182749277A27AB27DC280D + 283F287128A228D429062938296B299D29D02A022A352A682A9B2ACF2B022B36 + 2B692B9D2BD12C052C392C6E2CA22CD72D0C2D412D762DAB2DE12E162E4C2E82 + 2EB72EEE2F242F5A2F912FC72FFE3035306C30A430DB3112314A318231BA31F2 + 322A3263329B32D4330D3346337F33B833F1342B3465349E34D83513354D3587 + 35C235FD3637367236AE36E937243760379C37D738143850388C38C839053942 + 397F39BC39F93A363A743AB23AEF3B2D3B6B3BAA3BE83C273C653CA43CE33D22 + 3D613DA13DE03E203E603EA03EE03F213F613FA23FE24023406440A640E74129 + 416A41AC41EE4230427242B542F7433A437D43C044034447448A44CE45124555 + 459A45DE4622466746AB46F04735477B47C04805484B489148D7491D496349A9 + 49F04A374A7D4AC44B0C4B534B9A4BE24C2A4C724CBA4D024D4A4D934DDC4E25 + 4E6E4EB74F004F494F934FDD5027507150BB51065150519B51E65231527C52C7 + 5313535F53AA53F65442548F54DB5528557555C2560F565C56A956F757445792 + 57E0582F587D58CB591A596959B85A075A565AA65AF55B455B955BE55C355C86 + 5CD65D275D785DC95E1A5E6C5EBD5F0F5F615FB36005605760AA60FC614F61A2 + 61F56249629C62F06343639763EB6440649464E9653D659265E7663D669266E8 + 673D679367E9683F689668EC6943699A69F16A486A9F6AF76B4F6BA76BFF6C57 + 6CAF6D086D606DB96E126E6B6EC46F1E6F786FD1702B708670E0713A719571F0 + 724B72A67301735D73B87414747074CC7528758575E1763E769B76F8775677B3 + 7811786E78CC792A798979E77A467AA57B047B637BC27C217C817CE17D417DA1 + 7E017E627EC27F237F847FE5804780A8810A816B81CD8230829282F4835783BA + 841D848084E3854785AB860E867286D7873B879F8804886988CE8933899989FE + 8A648ACA8B308B968BFC8C638CCA8D318D988DFF8E668ECE8F368F9E9006906E + 90D6913F91A89211927A92E3934D93B69420948A94F4955F95C99634969F970A + 977597E0984C98B89924999099FC9A689AD59B429BAF9C1C9C899CF79D649DD2 + 9E409EAE9F1D9F8B9FFAA069A0D8A147A1B6A226A296A306A376A3E6A456A4C7 + A538A5A9A61AA68BA6FDA76EA7E0A852A8C4A937A9A9AA1CAA8FAB02AB75ABE9 + AC5CACD0AD44ADB8AE2DAEA1AF16AF8BB000B075B0EAB160B1D6B24BB2C2B338 + B3AEB425B49CB513B58AB601B679B6F0B768B7E0B859B8D1B94AB9C2BA3BBAB5 + BB2EBBA7BC21BC9BBD15BD8FBE0ABE84BEFFBF7ABFF5C070C0ECC167C1E3C25F + C2DBC358C3D4C451C4CEC54BC5C8C646C6C3C741C7BFC83DC8BCC93AC9B9CA38 + CAB7CB36CBB6CC35CCB5CD35CDB5CE36CEB6CF37CFB8D039D0BAD13CD1BED23F + D2C1D344D3C6D449D4CBD54ED5D1D655D6D8D75CD7E0D864D8E8D96CD9F1DA76 + DAFBDB80DC05DC8ADD10DD96DE1CDEA2DF29DFAFE036E0BDE144E1CCE253E2DB + E363E3EBE473E4FCE584E60DE696E71FE7A9E832E8BCE946E9D0EA5BEAE5EB70 + EBFBEC86ED11ED9CEE28EEB4EF40EFCCF058F0E5F172F1FFF28CF319F3A7F434 + F4C2F550F5DEF66DF6FBF78AF819F8A8F938F9C7FA57FAE7FB77FC07FC98FD29 + FDBAFE4BFEDCFF6DFFFFFFEE000E41646F62650064C000000001FFDB0084000A + 07070708070A08080A0F0A080A0F120D0A0A0D1214101012101014140F111111 + 110F141417181A1817141F1F21211F1F2D2C2C2C2D3232323232323232323201 + 0B0A0A0B0C0B0E0C0C0E120E0E0E12140E0E0E0E141911111211111920171414 + 141417201C1E1A1A1A1E1C2323202023232B2B292B2B32323232323232323232 + FFC00011080100010003012200021101031101FFC400B9000100030101010100 + 0000000000000000000405060703020101010003010101010000000000000000 + 0000020304010506071000010303020204060C0D030305000000010002031104 + 0512062131415161137181B122327291A1C1425292B25314543516D162A2D223 + 334373937415360783B3D3822417F1C263A34411000202010203050407060505 + 0000000001020003111204213105415171221361819132A1B1D142722314F0C1 + 5262A2B2F182341535E192334324FFDA000C03010002110311003F00F94445F5 + D3F3F84444884444884444884444884444884444884444884444884444884444 + 8844448844448844448844448844448844448844448844448844448844448844 + 44884456761B77317E03A0B6708CFED24F31B4EB05DCFC4A2EE8832EC1477938 + 93AEBB2C6D35A973DCA332B116CAD3FC7F2100DE5D869E9644DAFE53A9E456B0 + EC8C14606B6C937AEF23FDBD2B23F52DB2F262DF847DB89E857D1B7AFC4AAA7E + 36FB3339C22EA236CEDE89A49B38C34732F2E3EDB9CA2CD8FDACC040B3648797 + 980F96A156BD4EB63E5ADCFB87DB2C6E8B720CBDD52FBCFD939C22DA5CE2B092 + 57BAB1117E3092427D8D545E0DC2631BFB1A9EB2E71F755E37884674B0F61C7D + B33374FB41C07461DE33FBC4C922D87F4AC77D5DA87138E3FF00E76F8AA3DD5D + FD5A7F099CFF006FB3F897E998F45A993018E7FA2D747EAB89F95550E6DB4789 + 82707A9AF14F6C7E0525DCD47B48F1120DB2BD7900DF84FDB28914BB9C5DF5B0 + 26488960F7EDF387B4A22B830619041F09999594E18107DB0888BB3908889108 + 8891088891088891088891088891088BD20825B890450B4BDE7A07BA84E38980 + 09381C499E68B4B69B7ED5917FDCFE96570E342406F828B3D3C6229E48C1D418 + E7341EBA1A555696AB9217B25B6D0F52AB3E06AECED1E3276DE7DAC79AB47DDD + 0401FC4BB90750E827C0EA2E857DB8F0D63C26B96B9FD11C7E7BBF26B4F1AE56 + AC71D889AF087BBF476FF0FA4FAAB36EB6955AC2CB1CA851A7026DD86FEEA11A + 9A6B56676D5A8F6764D44DBE9F349DD636C5D238F274A69ECB59F9CBD62C9E72 + 4A3EE676455FD942C14F0173F51F614582DED6CA122302360E2E79E9ED738AAC + BDDC2C6D5968DD67E71DCBC41675DBD4C74D550C7F13798FD3CA6B7DDDC8355F + 79CF6227947B80E265E5C5D3DC0C9712F9A3DF38D00F7155DC67EC62A861333B + F1470F64ACDCF737170ED53485E7A2BC8780742F25A9368A0798E7D8380986DE + A0EC4E818FE66E265C4BB92E9DFAA898C1DB571F71457E6B24FF00DB50753434 + 7B8A0A2BC5358E4A3EB995B71737376F71C7D52DAC6E1F74E0DB8CABAD1C4D3C + F6B8B7D9670F6568E1DB39392312DBE61B2B0FA2E0DD4D3E3D4E586526CB237B + 6127796933A1774E93C0FACDE47C6AABA8B1B8D4E17F95914AFD599A36FBAA57 + 85F5B38FE24B195BE19C19B27E077242D2E8EE2DEE48F78E0584F82800F6D54B + F3535ACC6DF2168F8256F303CA01A70F1AB3C46FA8A42D8728C11B8F01711825 + BFF53798F12D15EE3F1B98B50D99AD9A270AC53308A8AF4B1E179C6DB297D3BA + A8693F79387C31C0CF6168A7715EBD95E430E6961D5F1CF11E332F6D91B3B9E1 + 14A0BBE01E0EF60ACEE6C42320FEEA9C86BA72D5D2A5E776C5E625C656D66B22 + 784C0716D7A1E3A3C2A917A3B74ACFE656FA948C7F8CF1F7765C3F26EAF43A9C + FF0084B29B6F65E1B265EBEDDDDC3C6AAB68E2D69E20B9A3880AB574EC0EE2B1 + C9C31C41C23BC6B407C0EE049038967C20A2E7367DA5F074F6405B5DF320708D + E7F180E47B42CC9D40AD86BDCA6839E0C397BFED9B2DE90AF48BB6767AA31C54 + F3CF6E0F7FB0CE768BDAEED2E6CE775BDCC663999CDA7CA3AC2F15E88208041C + 83C889E3905490C082381079C2222ECE4222244222244222244222F7B3B396EE + 711463B5CEE868EB2B84803278013A016200192794FDB2B29AF2511C4387BF79 + E4D1DAB5569676D61090CA0E1592477334E927A97EC105B585AE90436360ABDE + 7A4F5959DCA65A4BC718E3AB2D81E0DE9776B96425EF6C2F0413D055AF6A9A9B + CD69E424BC9678BAB0D99A3793A6E93EAFE15468AEF0B89D7A6EAE1BE6738A33 + D3F8C7B15FF974A7ED92665FCDDCD98E7F5289F989C299297174291F36447DF7 + 6BBB15C5E5F5BD8C40C9CE94646DE669EE2F2C9E4E3B265051F3BBD067576B96 + 5A69A59E432CAE2E7BB992A8547BCEB7E0BD826A7B2BDB2FA75F17FBC7EDFB27 + BDF64AE6F5DFA4348C7A318E43F0A8888B5850A300604F3D99989663927BE111 + 17672111122111122159E1F3F7F8992B03B5C04D5F6EEF40F83A8F685588A2E8 + AEA55C0607B0C9D763D6E1EB62AC39113AB62B318FCCDB38C542EA526B77D091 + 5E1C47482B29B9B693AD755EE39A5D6DCE5807131FE337ADBE459AB4BBB8B39D + 9716D218E661AB5C3C87AC2E8FB7B71DBE5E1EEDF48EF983F49174387C2657A3 + B3A17956536EC9FD5A72D51F994F678FDB3DEA7714752AFD0DC80978F91C769F + 67EF1399B5CE6B839A4B5C0D411C08216BF03BD648CB6DB2A75C7C9B75EF87AE + 073F0F35F1BB36C7D18BF2360CA5B9E33C2DF784FBE68F83E4F072C92DB8A379 + 4824647F5299E66775D3B70541C1FE8759D572B88B0CD5A00FA1752B05CB284B + 6BD20F48EC5CDF298ABBC5DC9B7B96D3A63907A2F6F5B4AB0DBBB9A7C5482198 + 992C1C7CE6732CAFBE67BA16EAF2CF1D9DC70048921906A8666F36BBE10ED1D2 + 16157B762E11F2F431E07BBF6EE9E9BD74754A8D9562BDCA8F32F7F8F78EE339 + 4229993C65CE32EDF6B703CE6F16BC7A2E69E4E6A86BD7560C0329C83C4113C0 + 7464628C0AB29C107B0C2222EC8C222244222244FB8A292691B146353DE68D0B + 5F8FB18ECA011B78BCF191FD67F02CEE12E20B7BDD5310D6B9A5A1C790248FC0 + B45FD4AC3EB11FC60B1EE8B921403A79F0ED9E86C96B0A5CB0D59C713C84A7CA + BB25792688EDE416CD3E68D27CE3F08AAEFE9B7FF5793E295A9FEA561F588FE3 + 04FEA561F588FE305C5B9D40515E00F61937DB54EC59AEC93ED129317869A49F + 5DD46590B38E970A171EAF02B8C96423B187850CAEE11B3DD3D8126CB58451B9 + E266BC81C18D3524F52CB5D5CCB7533A694D5CEE43A00E8017555EE7D560C2AF + 648BBD7B6AF454753B7DEE73E259649A4749238B9EE3524AF8445B279C4E7898 + 4444884444884444884444884444885EB6F7135B4EC9E0798E68CEA63C730579 + 221008C1E20C0241041C11C4113A86DFCEC199B421E036E9829710F41AF0D4D0 + 7DE9594DC7B5AE6D6EFBCC74124D6B3548646D2F319E969D20F0EA5478FBFB8C + 7DDC7756CED3230F2E870E96BBB0AE8D6DBAB093C11CAFB96C2F70ABA27D7534 + F483C17916556ECEEF52852F5BF34E78FDBB27BF55D4750DB8AB74E2BBABE561 + 2064778CFD2273DFE8B98FA85CFF0005FF009AAF36D4F9CC4DC7772D8DD3AC65 + 3FA4677521D27E1B7CDF656B86E0C2115FA743F1C27F5FC27D7A1F8E146CDE5D + 62147DBE41F634B29E9DB7A6C5B2BDDE1979715F84F8CEE160CC5977668D9D9E + 75BCA4716BBA8F4D0F4AE5F7104D6D3BE099A592C64B5ED3D042EA7FD7F09F5E + 87E38582DD77D697D977CD68E0F8C31AC320140E70E67DC53E98F72B1A995B46 + 35024723FF00595F5AAF6ECAB7A3A9B32148520EA1DFEE94A888BD69E0422224 + 4222244222244222244222244222244222244222244222244222244222244222 + 24422224422224422224422B2C360AEF30E95B6CF8D86100BBBC2E1E95694D2D + 7752B5FB8398F9EB6F8CFF00F8D52FB9A118ABB8561D8669AF65B9B503D75332 + 9E447B266115FCFB2B3B0B4B9B1B26A7446F15FCBD2A927B79EDA5315C46E8A5 + 6F363C169F6D4ABBAAB3E4756F032BB76F755FF96B64CF6B0C0F8CF3444564AA + 111122114BC663A7C9DE32CE0735B2BC120BC90DF346AF7A0ABCFB8398F9EB6F + 8CFF00F8D5566E29ACE9770A719C19A2ADA6E2E5D5556CEB9C6477CCC22D2BF6 + 1E65ADA892DDE7A83DD5FCA6054B7F8CBFC74823BC85D113E893C5A7D570A829 + 5EE29B0E11D58F703C672DDA6E291AACA9947791C3E322222D3FDC1CC7CF5B7C + 67FF00C6BB65D5558F5182E7967D9394EDAEBF57A485F4E3563B33CA6611698E + C2CC81512DB93D41CFF76355990DBB97C7B0C97101308E72B087B47874F2F1A8 + A6E687385B1493D9993B365BAAD4B3D2E00E671C078CAC4457589DAD90CADA9B + AB79216C61C59491CE06A003EF58EEB53B2C4AD753B051CB265555365CDA2B52 + CD8CE04A545EF7D672D95DCB69296BA485DA5C5B52DAF654056D8DDA392C8D94 + 77904B0B62975690F73C3BCD7161AD184730B8F7568A1D98056E44FB676BDBDD + 63B568859D73A947318E065122D31D859902A25B73D81CFF0076350AF36A672D + 1A5EEB7EF5839BA221FF00923CEF6941775B763816AE7C712D7D8EED065A97C0 + F667EA94C8BF4820D0F023985F8AF996117D318F91E191B4BDEE346B5A2A493D + 0005A0B2D9198B8687CDA2D9A78D2424BFE2B6BED955D975750CD8C17C65B4ED + EEB8E2A467C73C0E03C4CCEA2D7BBFC7D741BE65E465DD45840F66A550E63077 + 98892365C963BBD04B1D19241A73E601E950AF75458DA51C13DDCBEB96DDB1DD + 52BAEDA8AA8E6DC08E3E12B914FC4622E72F72EB6B67318F630C84C8481405AD + F7AD77C2571F70731F3D6DF19FFF001AED9B9A6B6D2EE14F7191AB67B9B575D7 + 5B32F2C899845A7FB8398F9EB6F8CFFF008D56E676F5EE1DB13AE5F13C4C5C1B + DD971F4695AEA6B7AD7137543B054B0163C809DB365BAAD0BD9532A8E64CBCFF + 001EFEBAFBD58FCAE53374EE4C8E2B211DBDA88CC6E85B21D6D24D4B9EDE823E + 0A87FE3DFD75F7AB1F95CA2EFEFB621FE59BF2E4580D69675275750C348E07F0 + 89EAADB655D191EB62ADAC8C8FC4648B2DFF00721E05F5B31F1F22E86AD70EDA + 38B81F69692EECF19B8B1AD7821EC78AC1381E731DFF00AF30B962DAFF008FEE + 9E45E5A1356374CAC1D44D5AEF714B79B44A93D7A7F2D9083E591E9DBFB2FB3F + 4BB9C5A960206A1C41033321796B2D9DD4B6B30A4B138B5DD5C3A47615F96F6B + 7372ED16F0BE677C18DA5C7F256837DC0D8F32C91A3F5D0B5CEF581733C802B8 + 8776E131B616F6F0B0CB236366B642D0D687E91AB538D38D7AAAB41DCD869A9E + BACD8D60E4390EF9906CA91B9BABB6E152547813C4B03CB1323260B331B35BEC + A60DE64E871A7868A02E8B89DE56991BC65A3A07C1249511B890E69205687951 + 56EFCC5C11B61C944D0C9247F7535386A241735C7B7CD2A156F2DF58537D7A19 + BE520CB2FE9D4FE9DB71B5BBD5543870460CA9D99FDC107AB27C82B5BBAB3379 + 89B7824B50C2E91E5AED609E0057A08592D99FDC107AB27C82B67B8B04FCCC30 + C4D9843DD38BAA5BAAB514EB0B3EF0D637D59B71A340D59E3DF3674E171E9970 + A33EA7A87460E0FDDED996877E659B2033450C91FBE680E69A761D47C8B5F90B + 7B6CCE18D47993C42585C471692DD6C72CEC3FE3EA48D335ED621E906328E23B + 0971A2B8DC3938B0D89EE616383DECEE6D80074B401A6A5DCBCD1D0AABFF004E + F6D43683CFAB9A8207D32EDAFEAABA6F3D40FE569E4E431F6F29CCD75DCA5CC9 + 698EB9B98A9DE431B9ECD5C4540AF15C8975BCC412DC62AEE085BAE59227358D + 1D248E038AD1D4F1AF6FAB96A6CE7BBCB32745D5E96EF4E75695D38E79C36262 + 06FBCD0352C80F6163BDC7AD66DECE373569239F108E588E8959CDA4387022BD + 7D4B131ED0DC0F23FED7483D2E7C629E2D555B4DB583761ACE46CCF0EB898874 + A5BE880D1C00AF9557BD5D98ABF2B47A991A741CF8E712EE98DD45AFFCFF0053 + D2C1D5EA8C7863330DB971F163F313C108D30BA9246DEA0F15A788AD7EC5FB11 + DFBE7F91AB25B9EFE2BFCCCF3427542CA471B8722182848ECAD56B762FD88EFD + F3FC8D566F357E82BD7F379339E79C4A7A768FF74B7D3C68FCCD38E58CF64C7E + E4FB76F7F787C816EB687F6ED9FF00A9FEEBD617727DBB7BFBC3E40B75B43FB7 + 6CFF00D4FF0075EA3BFF00F454F8A7F6992E97FF0025B9F0B3FBC4CE5E6F5CC4 + 17B3C2C6C259148F63416BB935C40AD1C1586277CC3712B60C84420738D1B330 + 92CA9F840F16F86AB1D93FB4AEFF007D27CB2A2AD4763B77AC0D014903CCBC0C + C43A9EF2AB58FA858063E57E2319E53A16ECDBB0DDDB497F6CC0DBC8817BF4FE + D1A389AFE301C8AE7ABA96D8B97DD60AD6490EA78698DC4F1AE87160F682C15A + D8B0EE56D891FA36DD18CB7F158F351EC0546C6D64175561CFA39C1F60E734F5 + 4DBA58DB7DC5434FEA7191FCCD8C1FA78CD8ED5C0C58EB36DDDC347D3656EA73 + 9DFB3611E88AF2E1CD56E5F7D39B2BA1C5B1A5AD34371271AFA8DF74AB8DE174 + FB6C14DA0D1D316C551D4EE2EF64021738B6B69EEA765BDBB3BC9A4E0C60A0AD + 057A557B4A57705F73B8F3712003F2803F74B77FB87DA0AF65B4F2F9416651E6 + 62787C4CB71BCB70076A370D23E098D94F69B55172F9CBBCBF706E9AC6BE00E0 + 1CC04575539824F52F5FBABB83EA4EF8CCFCE51AFB0B94B0884D796E6289CE0C + 0E25A7CE209A79A4F52DC83681C1AFD20FD9A08CFD13CDB5BA81AD96DF58D678 + B7A8188E1C7B65CEC1FB626FE59DF2E357BBAF3F7D8892D9B6A1844A1E5FADA4 + FA25B4A508EB545B07ED89BF9677CB8D68F71EDC7E69F039B3887B90E0416EAA + EAA768EA583726A1BF06EC68D3C7233D9C27ABB3179E9446DF3EAEB3A749C1F9 + 86789F64CCFDFACDFC187E21FCE55D97CFDF65DB136E83008892CD0D23D2A56B + 527A95F7FE3D9BEBCDFE19FCE59ACB63DD8DC84B64E7890C5A7CF0295D4D6BF9 + 71EB5AF6E764D67E485D6A33C011C3976F8CF3F763A9255FFD25FD36217CCC08 + 2798E47D934BFE3DFD75F7AB1F95CA2EFEFB621FE59BF2E452BFC7BFAEBEF563 + F2B9596E3DAF7198BE8EE639D91359108CB5C09350E73ABC3D6595AC4AFA8BB3 + 9D2BA471FF00289B529B2EE8F5A54BA9B5938F06339E2DBEC0B37B62BABC70A3 + 242D8E33D7A6A5DE50BF6CF6040C7875E5D195A39C71B7457FEA24F915B65733 + 8DC0D988230DEF9ADA416ACF68BBA8769E6A5BBDDADEBE86DC176723240EC123 + B0D83ED5FF0055BA22A5AC1C024124918EC994DF170D9735DDB4D7B889AC77AC + 497F91C16717A5C4F2DCCF24F33B54B2B8BDEEEB24D56D36EECE898D8EF72549 + 1CE01F1DB8E2D15E20BFAFC1C96B3657B4A1039E43000E6C7B71300AADEA1BAB + 1AB180CC5893C954F2CC8FB336FCC676656E5A591B01FA330F371229AFC001E0 + BE77CE5E29E48F1B0383840ED73B8711AE9A437C409AAD465EDF2F710F718D96 + 2B66B851F2B8BB5D3A99A5BC3C2B2171B1B230C12CEFB885C236BA4701AAA748 + D47DEAC345D5DB7FEA2FB1548E15D7DDE33D4DCEDEEA36A769B6A9994F9AEB8E + 06AEFC48BB33FB820F564F9056A778656FF1B6D6CFB297BA748F2D79D2D75401 + 5F7E0ACB6CCFEE083D593E415B1DC98397330431452B623138B897026B514E85 + DDD9AC6FAB36E34691AB50C8EDEC91E9EB6B74BB8539F50B9D3A4E93F779198D + 66F2DC2D755D721E3E0BA38E9F92D056E3137B16730ED96E226E9943A39A2E6D + A83434F2ACE45FE3E98BC77D7AD0CE9D0C24FB642D197E376EE2834BB441103A + 01357C8F3C787592557BB7DAB845DB28F5350C7A6BA65DD3EBDED66C7DE31F47 + 41C8B5B571FA6734C95AB6D321736AD356C32398D279D01A05D5B23746CEC6E2 + E83759858E786134AE915A55725BAB87DD5CCD7327A733DD23BC2E355D4B3FF6 + 25F7EE5FE456F50524ED55F8E490DFD3999FA4300BBE6AF8000327B3E7C483B7 + B74C597964B7922104ED1AA36EAD41CDE9A701C42AEDF12E5E1630C52918D946 + 87B582843FA9EEE6410B196D7335ADC477103B44B138398EED0BA7D9DCD96E1C + 392F6831CCDD13C7D2C78E63C478851BE85DA5E972A0351382A78E93ECCFD127 + B5DCBEFF006D66D9EC2B7819561E5D43DB8F819CAD744D8BF623BF7CFF002356 + 1F2B8D9F197B25A4DC74F163FA1CC3E8B82DC6C5FB11DFBE7F91AB475160DB50 + CA720B290665E8E8C9BE28C30CAAC083DE263F727DBB7BFBC3E40B75B43FB76C + FF00D4FF0075EB0BB93EDDBDFDE1F205BADA1FDBB67FEA7FBAF54EFF00FD153E + 29FDA65FD2FF00E4B73E167F789CEF27F695DFEFA4F965455B3BAD8975717734 + FF004B8DAD96473E9A492039C5CAC713B2EC2C656DC5C486EA661AB03806B011 + D3A6A6BE32B41EA1B74AC61B53003CA01994749DE5969CA6852C7CEC472F01C6 + 586DDB5758E0EDA29BCC7B586492BC29AC9938F82AB038EBC6BB72C378EE0D96 + EB5927A048FE7F94B47BB373C0D824C758C8249640593CADE2D6B7DF341E9279 + 158655ECA8765BADB06937E787B0F6FD32DEA5B9AD5F6F4D2750DB6327B32B8C + 0F76274BDE36AFB8C14C582AE85CD9683A9A68EF601AAC062AFF00FA76421BDE + EFBDEE493DDD74D6A0B79D0F5AE81B733B065ACC43339BF4C6374CD13BDF8E5A + C03CC1E955392D841F2BA4C6CED8D8EE3DCCB5A0F03DB534F12A76B72502CDB6 + E3CBC4F1EC20F03346FB6F66E5AADEECFCF80380C6415390707BBB44918DDEDF + 4EBF82CFE85DDF7CED3AFBDD54F177617DEFEFB1E1FE65BF2245030DB3B29679 + 2B7BB9E487BB85FA9C1AE717114E8F328A7EFEFB1E1FE65BF22450D3B75DE523 + 6F8D3DB824F1F7CB356EDBA76E4EEF3AFEEEA017CBC3BA52EC1FB626FE59DF2E + 356FBC73392C6CB6ADB29BBA1235E5FE6B1D5A16D3D369EB551B07ED89BF9677 + CB8D68B72EDD9B32FB77453362EE4381D409AEAA757814F706A5EA00DB8D1A78 + EA191CB87095ED16E6E92C28D5EA17F2E83A4FCC33C6643EF7EE2FAE7FF5C5F9 + 8AB2F2F2E6F6E5F7574FEF27929ADF40DAE901A383401C82D37FE3FBCFADC7F1 + 5CA06676ADC626CC5D493B2469786696820F104F4F816CAAED96B02AD019BCA3 + 4AE09F6729E75FB6EA5E9937FA8C8BE63ADF5018EDC6657E37317F8B748EB378 + 619400FAB43ABA6B4F4876A9FF007CF707CFB7F86CFC0A8915ED452E75356AC4 + F69009995375B8AD4225AEAA392AB1025ADC6E7CF5C0D2FBD781FF00C7A63F6E + 30D556E739CE2E712E71E249E24AFC4534AD1382285FC2312165B6587363B3FE + 225BEB85771EF0CF46C6C6D9DA1AC01AD1DDB390E1D4A91171EAAECC6B50D8E5 + A86676BBADAB3E9BB2679E938CCBDFBE7B83E7DBFC367E05F32EEECECD13E292 + 769648D2C70D0C1C1C287A1522287E9B6E3FF527FDA25877BBB2306FB38FF399 + 22C6FAE6C2E5B756AE0D99A086B880798A1E055AFDF3DC1F3EDFE1B3F02A2452 + 7A6A73974563CB2C33235EE6FA974D76BA0CE70AC40CCBB7EF0DC0F14FA486F6 + B58C07E4AAAB9BBBABB93BDB995F349F09E4BBD8AAF1444A6A4E288ABF840139 + 66E2EB062CB1DC773312215CDCEEBCDDCC125BCD335D14AD2C780C68A83CF880 + A99175AB4720BA862BF2E4671E138975B58608ECA1B830538CF8C29D8DCCE431 + 6643672E812535820381A72E0E50514995581560181EC3C448A3BA306462AC39 + 329C193F2599BFCA777F4C735E63AE8706B5A68798AB405E98FDC395C6C06DED + 250C88B8BE858D77134E923B1562287A3514D051740FBB8E1F0931B8B8586D16 + 30B0F02FA8EAF8CF6BABA9AEEE24B99CEA9653A9E4002A7C0158596E6CC58DAB + 2D6DA56B618EBA5A58D3E912E3C48EB2AA5175AAAD942B282A390232062712EB + 51CBA3B2B3672CA704E789C997A7796E02282E1A3B446CF75AA0DDE6F2D7A0B6 + E6EE47B0F3603A5A7C2D6D02808A2B452A72B5A03DE14493EEB70E30F758C3B8 + B12211115B299F51C9246F6C91B8B1ED356B9A4820F610AEEDB796760686995B + 381CBBD6827D96E927C6A89142CAABB3E740DE225B55F75473558C99E7A4E269 + 5FBEF34E146B20676B58EFFDCF2AA7219BC9E49A19793992369D4D65035A0F11 + 5A340EB50114136F4A1CA56A0F7E38C9D9BCDCDA34D96BB29E6B9E1F092F1D93 + BCC64EE9ECDE192B9A584901DE6921DEFBC0ACBEF9EE0F9F6FF0D9F81512293D + 1539D4F5AB1EF233235EE7715AE9AED745EE56204BDFBE7B83E7DBFC367E0517 + 21B872B92805BDDCA1F10707D031ADE22BD2076AAC45C5DBD0A432D6808E4428 + 9D6DDEE5D4AB5D6329E0416241844456CA211112211112211112211112211112 + 2111122111122111122111122111122111122111122111122111122111122111 + 1221111221111221111221111221111221111221111221111221111221111221 + 111221111221111221111221111221111221111224F9EC2D2DE28CCB72E134B1 + 3666C6D8AA3CF150DD5AC791405697F9391F15BC104B5845B471C8DA0F48368E + 1522AAAD5756BD397E67F6EE12DBBD30D8AF90FDBBCC9761671DD77EE9253147 + 6F177AF706EB246B647402ADF86BF2EECC411C33472096DE70EEEDF42D3561A3 + 839A791F1AF6C55DB2D5B7AE25BADF6E59135ED0F6B9DDEC4EA6978737934F35 + F995BA8EEDF0CF1B835859436C0696C2E07CE6B00006927CE0A39B3D5C7DCCFE + E93D357A19E1EA63DFF378F7766240532C71B25EB277B1C1BDCB6AD04575BE85 + C231DA5AD71F1286ADE1C95BD8DB5A470C4D9E663BE9323C97B74CB5A35BE696 + D74B5A3D92A56970B84196264295ACB66C385038FB7B3863E32A1149C80B6FA6 + 4AEB535B779D718F821C3568E3F06B45194C1C807964678CAD86962B90707191 + CA58E430D3D9E49B60C7099D210D85ED140E24E8E5C793810BC727642C2F64B5 + 120983031C24028087B1B20E1FF52B6BBCB59BE6BF983B5CD1CB2BB1EF00F113 + F9AF3D9A7D26F6AABCB4F14F79DE44ED4CEEA06D7B590C6C70E3D442A296B495 + 0E08C279B8632DC3F74D5B84A155CD64126C1A78E709E6C8F88F863BE4253EEE + C2D2D7F46FB971B8EED92681179B5918D900D7AFA9DD4A02BCC9DC9B861EEAFA + 1FA3F7310EE0876BAC713039BFABE7A9BD6A76160CA064039CFD1EC32AA950A3 + 9201618D39F7E7B47B251A916F6A6786E246BA8EB76093453D26EA0C753C1AAA + A3A978C9E382F5865348240E8A63CE91C80C6E3E206AA6E48525798E3E38ECF7 + C85614B80DC8F0CF767B7DD3D1F899DB0D8C8D7073AF9C5AD8C736BAA0341F58 + 3810A25C46D8A796263FBC6C6E7344805038034AD3B55DC794B36CF784BFCCB7 + D2EC7F03C5D0C6EB78E9D55AB5FE2540ABA9AC24EBE18F663E6E3F47296DEB52 + 81E9907248E79C69E19FF31E33D20825B89E38221AA595C18C6F5971A053463A + D6532436B77DF5D46D73B418F4C6FD00B9C227EA24F01C2AD1551F1D74DB4BE8 + 2E5CDD4C8DE0BDA3996F2753C4A6DAB2D31F726F45DC733220E36EC6076B7B88 + 219A9A5A3452B535F1552C6704E3238657033A9BB8C52B59035007CD8724E34A + 778E23DBDF2A549C7DA0BCBA6C05FDDB4B5EF73E9AA82363A43C2A3E0A8CA761 + EE63B6BF6CD23835AD8E600B86A1A9D0BDAD05A41AD5C42B2C2C118AFCC14E3C + 7B25550536A07F94B2EAF0CF19F171651B2D9B756F377D017F74EAB4B1CD7D35 + 716D48A11D454456390BD65E5A5BB9A5B1BE3AB25B6634319ABE79AD600DF387 + 3ED1D4AB972B2C57CDCF2676E081FC9CB039787BE4C871D2CD6D14F1B8132CAF + 8B49E01A236B2473DCE3C00A3D4699B1B2573637F78C0681F4D35ED00AB3B6C8 + C10E21B67279CD96797E911B783C46E6C3A5CD77ACCE5D3D2AB66632395CC8E4 + 12B07A32004541EC3C9710B966D5C389D3C398CC95AB58552982485D5C791C77 + 4F3444564A611112211112211112211112211112211112211112211112211112 + 2111122111122111122111122111122111122111122111122111122111122111 + 1221111221111221111221111221111221111221111221111221111221111221 + 1112211112211112211112211112211112211112211112211112211112211112 + 21111221111221111221111221111221111221111221111227FFD9 + } + Proportional = True + end + object Image_From_Local: TImage + Left = 129 + Height = 105 + Top = 551 + Width = 104 + Proportional = True + end + object Image_From_Web: TImage + Left = 257 + Height = 105 + Top = 551 + Width = 104 + end + object Button1: TButton + Left = 7 + Height = 25 + Top = 120 + Width = 75 + Caption = 'Join' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 193 + Height = 25 + Top = 120 + Width = 75 + Caption = 'Clear' + TabOrder = 1 + OnClick = Button2Click + end + object Button3: TButton + Left = 89 + Height = 25 + Top = 120 + Width = 89 + Caption = 'Create Option' + TabOrder = 2 + OnClick = Button3Click + end + object PageControl1: TPageControl + Left = 8 + Height = 76 + Top = 151 + Width = 353 + ActivePage = TabSheet1 + TabIndex = 0 + TabOrder = 3 + object TabSheet1: TTabSheet + Caption = 'EDIT Result' + ClientHeight = 48 + ClientWidth = 345 + object Panel3: TPanel + Left = 3 + Height = 29 + Top = 9 + Width = 97 + Caption = 'Resultado:' + ParentBackground = False + TabOrder = 0 + end + object Edit3: TEdit + Left = 106 + Height = 23 + Top = 13 + Width = 220 + Enabled = False + TabOrder = 1 + end + end + object TabSheet2: TTabSheet + Caption = 'Combobox Result' + ClientHeight = 48 + ClientWidth = 345 + ImageIndex = 1 + object Panel4: TPanel + Left = 3 + Height = 29 + Top = 9 + Width = 97 + Caption = 'Resultado:' + ParentBackground = False + TabOrder = 0 + end + object ComboBox1: TComboBox + Left = 106 + Height = 23 + Top = 13 + Width = 217 + ItemHeight = 15 + Style = csDropDownList + TabOrder = 1 + end + end + end + object Panel5: TPanel + Left = 8 + Height = 79 + Top = 35 + Width = 353 + ClientHeight = 79 + ClientWidth = 353 + ParentBackground = False + TabOrder = 4 + object Panel1: TPanel + Left = 7 + Height = 29 + Top = 8 + Width = 97 + Caption = 'First Name:' + ParentBackground = False + TabOrder = 0 + end + object Edit1: TEdit + Left = 120 + Height = 23 + Top = 12 + Width = 225 + TabOrder = 1 + end + object Panel2: TPanel + Left = 8 + Height = 29 + Top = 43 + Width = 97 + Caption = 'Last Name:' + ParentBackground = False + TabOrder = 2 + end + object Edit2: TEdit + Left = 120 + Height = 23 + Top = 47 + Width = 225 + TabOrder = 3 + end + end + object Edit_Credito_Nome: TEdit + Left = 8 + Height = 23 + Top = 790 + Width = 152 + Color = clBtnFace + Enabled = False + TabOrder = 5 + Text = 'By: Talis Jonatas Gomes' + end + object Edit_Credito_Email: TEdit + Left = 186 + Height = 23 + Top = 790 + Width = 152 + Color = clBtnFace + Enabled = False + TabOrder = 6 + Text = 'talisjonatas@me.com' + end + object Panel6: TPanel + Left = 8 + Height = 41 + Top = 229 + Width = 353 + ClientHeight = 41 + ClientWidth = 353 + ParentBackground = False + TabOrder = 7 + object CheckBox1: TCheckBox + Left = 10 + Height = 19 + Top = 12 + Width = 139 + Caption = 'CheckBox not checked' + TabOrder = 0 + OnClick = CheckBox1Click + end + end + object Button_Selecionar: TButton + Left = 8 + Height = 25 + Top = 448 + Width = 75 + Caption = 'Select' + TabOrder = 8 + OnClick = Button_SelecionarClick + end + object ComboBox_Selecionar: TComboBox + Left = 89 + Height = 23 + Top = 449 + Width = 272 + ItemHeight = 15 + Style = csDropDownList + TabOrder = 9 + end + object Panel7: TPanel + Left = 8 + Height = 32 + Top = 293 + Width = 353 + ClientHeight = 32 + ClientWidth = 353 + ParentBackground = False + TabOrder = 10 + object RadioButton1: TRadioButton + Left = 7 + Height = 19 + Top = 8 + Width = 48 + Caption = 'Item1' + TabOrder = 0 + end + object RadioButton2: TRadioButton + Left = 121 + Height = 19 + Top = 8 + Width = 48 + Caption = 'Item2' + TabOrder = 1 + end + object RadioButton3: TRadioButton + Left = 232 + Height = 19 + Top = 8 + Width = 48 + Caption = 'Item3' + TabOrder = 2 + end + end + object Button4: TButton + Left = 129 + Height = 25 + Top = 662 + Width = 104 + Caption = 'Load from Local' + TabOrder = 11 + OnClick = Button4Click + end + object Button_Load_from_Web: TButton + Left = 257 + Height = 25 + Top = 662 + Width = 104 + Caption = 'Load from Web' + TabOrder = 12 + OnClick = Button_Load_from_WebClick + end + object Memo1: TMemo + Left = 8 + Height = 90 + Top = 693 + Width = 266 + Lines.Strings = ( + 'Memo1' + ) + TabOrder = 13 + end + object Button5: TButton + Left = 280 + Height = 25 + Top = 693 + Width = 86 + Caption = 'New Line' + TabOrder = 14 + OnClick = Button5Click + end + object Button6: TButton + Left = 280 + Height = 25 + Top = 724 + Width = 86 + Caption = 'View' + TabOrder = 15 + OnClick = Button6Click + end + object Button7: TButton + Left = 280 + Height = 25 + Top = 755 + Width = 86 + Caption = 'Clear' + TabOrder = 16 + OnClick = Button7Click + end + object Button8: TButton + Left = 286 + Height = 25 + Top = 120 + Width = 75 + Caption = 'Options' + TabOrder = 17 + end + object EditButton1: TEditButton + Left = 8 + Height = 23 + Top = 522 + Width = 152 + ButtonWidth = 23 + MaxLength = 0 + NumGlyphs = 1 + OnButtonClick = EditButton1ButtonClick + PasswordChar = #0 + TabOrder = 18 + Text = 'EditButton1' + end + object LabeledEdit1: TLabeledEdit + Left = 8 + Height = 23 + Top = 495 + Width = 358 + EditLabel.Height = 15 + EditLabel.Width = 358 + EditLabel.Caption = 'My LabeledEdit' + TabOrder = 19 + end + object RadioGroup1: TRadioGroup + Left = 8 + Height = 70 + Top = 331 + Width = 346 + AutoFill = True + Caption = 'RadioGroup1' + ChildSizing.LeftRightSpacing = 6 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 2 + ClientHeight = 50 + ClientWidth = 342 + Columns = 2 + Items.Strings = ( + 'Item 1' + 'Item 2' + 'Item 3' + 'Item 4' + 'Item 5' + ) + TabOrder = 20 + end + object Button9: TButton + Left = 8 + Height = 25 + Top = 413 + Width = 74 + Caption = 'Select #2' + TabOrder = 21 + OnClick = Button9Click + end + object Button10: TButton + Left = 85 + Height = 25 + Top = 413 + Width = 74 + Caption = 'Caption' + TabOrder = 22 + OnClick = Button10Click + end + object Button11: TButton + Left = 165 + Height = 25 + Top = 413 + Width = 74 + Caption = 'Add Item' + TabOrder = 23 + OnClick = Button11Click + end + object Label2: TLabel + Left = 331 + Height = 15 + Top = 417 + Width = 23 + Caption = 'Cols' + end + object Button12: TButton + Left = 248 + Height = 25 + Top = 413 + Width = 32 + TabOrder = 24 + OnClick = Button12Click + end + object Button13: TButton + Left = 286 + Height = 25 + Top = 413 + Width = 32 + TabOrder = 25 + OnClick = Button13Click + end + object OpenPictureDialog1: TOpenPictureDialog + Left = 204 + Top = 592 + end + object PopupMenu1: TPopupMenu + Left = 304 + Top = 144 + object Join1: TMenuItem + Caption = 'Join' + OnClick = Join1Click + end + object CreateOption1: TMenuItem + Caption = 'Create Option' + OnClick = CreateOption1Click + end + object Clear1: TMenuItem + Caption = 'Clear' + OnClick = Clear1Click + end + object N1: TMenuItem + Caption = '-' + end + object ShowTab01: TMenuItem + Caption = 'Show Tab 0' + OnClick = ShowTab01Click + end + object ShowTab11: TMenuItem + Caption = 'Show Tab 1' + OnClick = ShowTab11Click + end + object N2: TMenuItem + Caption = '-' + end + object ab0Invisible1: TMenuItem + Caption = 'Tab 0 Invisible' + OnClick = ab0Invisible1Click + end + object ab1Invisible1: TMenuItem + Caption = 'Tab 1 Invisible' + OnClick = ab1Invisible1Click + end + object N3: TMenuItem + Caption = '-' + end + object ab0Visible1: TMenuItem + Caption = 'Tab 0 Visible' + OnClick = ab0Visible1Click + end + object ab1Visible1: TMenuItem + Caption = 'Tab 1 Visible' + OnClick = ab1Visible1Click + end + end + object ImageList1: TImageList + Left = 280 + Top = 572 + Bitmap = { + 4C7A030000001000000010000000C60400000000000078DACDD67F4CD4751CC7 + F1175FDCF7CE7E787C6F80CE50ECCB7990500A5FD250443C39D0935F92BFE04C + F0A69806982585931F93723963ABCD7E6DD5B2AD9933442CCEAD54FAC114D403 + 44E5402302423AE2476BFE98EB1FFABEBFF0FD21B38B667FF4C773FBF0F9BC1F + C7F76EFBC00118C103E6A3C7CDC929A83014C3CAED87E02D9AA15932B29F9C8C + 8A799F07F39B7FCC600B6E3C076DF9BD1BEEC9717D153BF7F04C9E8CEC0D45B0 + 3AAEAD62B3DDA9D0965EBF446AFCFEC6D614968CE2CB216CED5C8B754D894AB6 + EF6330323222456BED594E5B1AC8C87E4A2904DA4B3DBB5829E194A0785A6BCF + D63727818CE2F740C86A5981A4DAF988733E29B5A0CA8C818101F4F4F460F6C7 + FE08F9D02815FA4920624E84818CEC1F2D82B0C69580D8AFC271F7EE5D747777 + A3B5B5156D6D6DE8E8E8405757177A7B7BE1F178C01FE21071F4319091FD2385 + 1032CE2F85709CC7D5AB5771E5CA95FBDAC1C141F08739841D9F0A32B27F7827 + 84A575F3105263047F841BED334EB1B456F66B38CC76FA838CEC1F2A8010796E + 16F85A4ECDC9A9CFECE4EE390BA935828CE2B74308774D07DFC0A99DE6D4673E + CDDD7B264646F63A3BACA6B3012CDF229E693B39D6B8FDE03A034B46F6BE91A8 + F02BD3F1C1F57E2C7F4D9CF1D2CC7A033BA58CE5C98CF921F8C2E56346B18F15 + CB181B046FD10CCD92912C7047AC5FECC6BFAC7FCC8E3C787AF12EA788EFA758 + FC4CF60BDEA3199AD5DF547D7285C954C96FDAD4CFE6E7DFC6DF9597770B3939 + 1ED664FA8227A3FA22EBC68D7DACDDFE0B265266660F4B46F5E582C3F11BD2D2 + DA265456560FC8A8BE54A03D8BE5C2844A4D75838CEAF708E9E9ED58B0E05BA5 + A8A86F101A5A8DA0A0C3080C3C04A3F123295A87873B4146F3FE059BED3204E1 + 9474FF3B3B3BD1D4D484969616E90ED33D181E1E96E2B84F31634625C8A8BE50 + 484C6C82D9ECC4A54B97E072B9EE6B47FD514C9B560D32AADF294447D78BCF57 + 239E1FF9876AE0EF7F1264545F20F07C8378563BA18CC65A9051FD762128A849 + 3C6B987064546FB706049C6339AE0513C960A863C9A83EB242A72BE3FDFCEAC5 + D7B8066F190CF52CCB96F16494FB0F5FF12E9B8B01EB32C026788F6668D6F77F + 73FFF50C6EA5F8FBBC5B328B79F68089B1788B6668968CECC59FDFA95A3927A2 + BFE205FD9D0F5E81B6DBD4FB85A3BDB70B9E03CFEB8FD99E882023FB3DC14C86 + E7CD6DFA5FF766435BFB4BE952E3F77B5F77E8C9C87EDFE34CFCEF6F17E0E7DD + EB942EE7D994FFDFB4D69E79DED80232B27F2D9889179F0BEE1753955CB9098A + A7B5F6ACAB7403C8C87EEF0C66494F790E9AB725295DD86C41D572332AAD21A8 + B685E258A2498AD63F64C7828CEC4B8398B89F4AECD2EF39EF88C799D591F872 + 8559BAC78D8D8D38B17C366A6C66A5336BA24046F9FCA63371D7C5F7D590BD08 + DF6544A0367D0EBE4E0D93ACDBED96D6B42757B736126464BF7B1AB3B87DC74A + 5CCC9C878BEBE74AD5AD8E902C7D7FA1B5BC4FB9EC512023FB57A732B19D7916 + B4E73CADD428BE16D9A1A12169AD3DA3C8C8FEE5006691A7C0821B5B172AB565 + 474B96FE66D15A7B469191FD163F9FE4EEDC85BA3F76C4415B7356A4D4F8FD2E + C77C1D19D93FC3E2AD831181A63EF135FEDC6581B7FA72637407C3034C64E4FB + 3F09703DC5A0246312ACF64988F616CDD02C99FFE2FEFF05A3309D53 + } + end +end diff --git a/Beta/Demos/Lazarus_linux/unitcontrols.pas b/Beta/Demos/Lazarus_linux/unitcontrols.pas new file mode 100644 index 0000000..efa2b25 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitcontrols.pas @@ -0,0 +1,489 @@ +unit unitcontrols; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, ComCtrls, + EditBtn, ExtDlgs, Menus, D2Bridge.Forms; + +type + + { TFormControls } + + TFormControls = class(TD2BridgeForm) + ab0Invisible1: TMenuItem; + ab0Visible1: TMenuItem; + ab1Invisible1: TMenuItem; + ab1Visible1: TMenuItem; + Button1: TButton; + Button10: TButton; + Button11: TButton; + Button12: TButton; + Button13: TButton; + Button2: TButton; + Button3: TButton; + Button4: TButton; + Button5: TButton; + Button6: TButton; + Button7: TButton; + Button8: TButton; + Button9: TButton; + Button_Load_from_Web: TButton; + Button_Selecionar: TButton; + CheckBox1: TCheckBox; + Clear1: TMenuItem; + ComboBox1: TComboBox; + ComboBox_Selecionar: TComboBox; + CreateOption1: TMenuItem; + Edit1: TEdit; + Edit2: TEdit; + Edit3: TEdit; + EditButton1: TEditButton; + Edit_Credito_Email: TEdit; + Edit_Credito_Nome: TEdit; + ImageList1: TImageList; + Image_From_Local: TImage; + Image_From_Web: TImage; + Image_Static: TImage; + Join1: TMenuItem; + Label1: TLabel; + Label2: TLabel; + LabeledEdit1: TLabeledEdit; + Label_Titulo: TLabel; + Memo1: TMemo; + N1: TMenuItem; + N2: TMenuItem; + N3: TMenuItem; + OpenPictureDialog1: TOpenPictureDialog; + PageControl1: TPageControl; + Panel1: TPanel; + Panel2: TPanel; + Panel3: TPanel; + Panel4: TPanel; + Panel5: TPanel; + Panel6: TPanel; + Panel7: TPanel; + PopupMenu1: TPopupMenu; + RadioButton1: TRadioButton; + RadioButton2: TRadioButton; + RadioButton3: TRadioButton; + RadioGroup1: TRadioGroup; + ShowTab01: TMenuItem; + ShowTab11: TMenuItem; + TabSheet1: TTabSheet; + TabSheet2: TTabSheet; + procedure ab0Invisible1Click(Sender: TObject); + procedure ab0Visible1Click(Sender: TObject); + procedure ab1Invisible1Click(Sender: TObject); + procedure ab1Visible1Click(Sender: TObject); + procedure Button10Click(Sender: TObject); + procedure Button11Click(Sender: TObject); + procedure Button12Click(Sender: TObject); + procedure Button13Click(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button4Click(Sender: TObject); + procedure Button5Click(Sender: TObject); + procedure Button6Click(Sender: TObject); + procedure Button7Click(Sender: TObject); + procedure Button9Click(Sender: TObject); + procedure Button_Load_from_WebClick(Sender: TObject); + procedure Button_SelecionarClick(Sender: TObject); + procedure CheckBox1Click(Sender: TObject); + procedure Clear1Click(Sender: TObject); + procedure CreateOption1Click(Sender: TObject); + procedure EditButton1ButtonClick(Sender: TObject); + procedure Join1Click(Sender: TObject); + procedure ShowTab01Click(Sender: TObject); + procedure ShowTab11Click(Sender: TObject); + private + URL_Image_Web : string; + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + procedure EventD2Bridge(const PrismControl: TPrismControl; const EventType: TPrismEventType; EventParams: TStrings); override; + procedure Upload(AFiles: TStrings; Sender: TObject); override; + end; + +function FormControls: TFormControls; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormControls: TFormControls; +begin + result:= (TFormControls.GetInstance as TFormControls); +end; + +procedure TFormControls.Button1Click(Sender: TObject); +begin + if Edit1.Text = '' then + begin + MessageDlg('Add the name', TMsgDlgType.mtWarning, [mbok], 0); + abort; + end; + + if Edit2.Text = '' then + begin + MessageDlg('Add the last name', TMsgDlgType.mtWarning, [mbok], 0); + abort; + end; + + Edit3.Text:= Edit1.Text + ' ' + Edit2.Text; + +end; + +procedure TFormControls.ab0Invisible1Click(Sender: TObject); +begin + {$IFDEF D2BRIDGE} + D2Bridge.PrismControlFromID('TabControl1').AsTabs.TabVisible[0]:= false; + {$ENDIF} +end; + +procedure TFormControls.ab0Visible1Click(Sender: TObject); +begin + {$IFDEF D2BRIDGE} + D2Bridge.PrismControlFromID('TabControl1').AsTabs.TabVisible[0]:= true; + {$ENDIF} +end; + +procedure TFormControls.ab1Invisible1Click(Sender: TObject); +begin + {$IFDEF D2BRIDGE} + D2Bridge.PrismControlFromID('TabControl1').AsTabs.TabVisible[1]:= false; + {$ENDIF} +end; + +procedure TFormControls.ab1Visible1Click(Sender: TObject); +begin + {$IFDEF D2BRIDGE} + D2Bridge.PrismControlFromID('TabControl1').AsTabs.TabVisible[1]:= true; + {$ENDIF} +end; + +procedure TFormControls.Button10Click(Sender: TObject); +begin + RadioGroup1.Caption:= 'New '+DateTimeToStr(now); +end; + +procedure TFormControls.Button11Click(Sender: TObject); +begin + RadioGroup1.Items.Add('New Item'+IntToStr(RadioGroup1.Items.Count + 1)); +end; + +procedure TFormControls.Button12Click(Sender: TObject); +begin + if RadioGroup1.Columns > 1 then + RadioGroup1.Columns:= RadioGroup1.Columns - 1; +end; + +procedure TFormControls.Button13Click(Sender: TObject); +begin + RadioGroup1.Columns:= RadioGroup1.Columns + 1; +end; + +procedure TFormControls.Button2Click(Sender: TObject); +begin + if messagedlg('Confirm clear all fields?', mtconfirmation, [mbyes,mbno], 0) = mryes then + begin + Edit1.Clear; + Edit2.Clear; + Edit3.Clear; + + if messagedlg('Confirm clear the options also?', mtconfirmation, [mbyes,mbno], 0) = mryes then + begin + ComboBox1.Clear; + ComboBox_Selecionar.Clear; + end; + end; + +end; + +procedure TFormControls.Button3Click(Sender: TObject); +begin + if Edit3.Text = '' then + begin + Showmessage('Nothing to create options'); + abort; + end; + + if messagedlg('Really create the option?', mtconfirmation, [mbyes,mbno], 0) = mryes then + begin + Combobox1.Items.Add(Edit3.Text); + ComboBox_Selecionar.Items:= Combobox1.Items; + end; +end; + +procedure TFormControls.Button4Click(Sender: TObject); +begin + if OpenPictureDialog1.Execute then + Image_From_Local.Picture.LoadFromFile(OpenPictureDialog1.FileName); +end; + +procedure TFormControls.Button5Click(Sender: TObject); +begin + Memo1.Lines.Add('Now: ' + DateTimeToStr(now)); +end; + +procedure TFormControls.Button6Click(Sender: TObject); +begin + ShowMessage(Memo1.Lines.Text); + ShowMessage(Memo1.Lines.Text, true, true); +end; + +procedure TFormControls.Button7Click(Sender: TObject); +begin + Memo1.Clear; +end; + +procedure TFormControls.Button9Click(Sender: TObject); +begin + RadioGroup1.ItemIndex:= 1; +end; + +procedure TFormControls.Button_Load_from_WebClick(Sender: TObject); +begin + if not IsD2BridgeContext then + begin + MessageDlg('This function run just in D2Bridge Context', mtwarning, [mbok], 0); + end else + begin +{$IFDEF D2BRIDGE} + URL_Image_Web:= 'https://www.d2bridge.com.br/img/d2bridge.png'; + D2Bridge.UpdateD2BridgeControl(Image_From_Web); +{$ENDIF} + end; +end; + +procedure TFormControls.Button_SelecionarClick(Sender: TObject); +begin + {$IFDEF D2BRIDGE} + ShowPopup('PopupSelecione'); + {$ELSE} + Showmessage('Selecionado: '+ ComboBox_Selecionar.Text); + {$ENDIF} +end; + +procedure TFormControls.CheckBox1Click(Sender: TObject); +begin + if CheckBox1.Checked then + CheckBox1.Caption:= 'CheckBox checked' + else + CheckBox1.Caption:= 'CheckBox unchecked'; +end; + +procedure TFormControls.Clear1Click(Sender: TObject); +begin + Button2Click(Button2); +end; + +procedure TFormControls.CreateOption1Click(Sender: TObject); +begin + Button3Click(Button3); +end; + +procedure TFormControls.EditButton1ButtonClick(Sender: TObject); +begin + Showmessage('Right button click'); +end; + +procedure TFormControls.Join1Click(Sender: TObject); +begin + Button1Click(Button1); +end; + +procedure TFormControls.ShowTab01Click(Sender: TObject); +begin +{$IFDEF D2BRIDGE} + D2Bridge.PrismControlFromID('TabControl1').AsTabs.ActiveTabIndex:= 0; +{$ENDIF} +end; + +procedure TFormControls.ShowTab11Click(Sender: TObject); +begin + {$IFDEF D2BRIDGE} + D2Bridge.PrismControlFromID('TabControl1').AsTabs.ActiveTabIndex:= 1; + {$ENDIF} +end; + +procedure TFormControls.ExportD2Bridge; +begin + inherited; + + Title:= 'Lazarus Controls Demo'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + with D2Bridge.Items.add do + begin + LCLObj(Label_Titulo); + + with PanelGroup('Full name').Items.Add do + begin + with Row.Items.Add do + FormGroup('Name').AddLCLObj(Edit1); + + with Row.Items.Add do + FormGroup('Last Name').AddLCLObj(Edit2); + end; + + with Row.Items.Add do + begin + FormGroup('', CSSClass.Col.colauto).AddLCLObj(Button1, CSSClass.Button.config); + FormGroup('', CSSClass.Col.colauto).AddLCLObj(Button3, CSSClass.Button.add); + FormGroup('', CSSClass.Col.colauto).AddLCLObj(Button2, CSSClass.Button.delete); + FormGroup('', CSSClass.Col.colauto).AddLCLObj(Button8, PopupMenu1, CSSClass.Button.options); + end; + + with Row.Items.Add do + with Tabs('TabControl1') do + begin + with AddTab(PageControl1.Pages[0].Caption).Items.Add do + FormGroup(Panel3.Caption, CSSClass.Col.colsize4).AddLCLObj(Edit3); + + with AddTab(PageControl1.Pages[1].Caption).Items.Add do + FormGroup(Panel4.Caption, CSSClass.Col.colsize4).AddLCLObj(ComboBox1); + end; + + with Row.Items.Add do + with PanelGroup('CheckBox').Items.Add do + LCLObj(CheckBox1); + + with Row.Items.Add do + FormGroup.AddLCLObj(Button_Selecionar); + + //Combobox + with Row.Items.Add do + begin + with PanelGroup('Select 1 item').Items.Add do + begin + LCLObj(RadioButton1); + LCLObj(RadioButton2); + LCLObj(RadioButton3); + end; + end; + + + //RadioGroup + Row.Items.Add.Col.Add.VCLObj(RadioGroup1); + with Row.Items.Add do + begin + FormGroup.AddVCLObj(Button9); + FormGroup.AddVCLObj(Button10); + FormGroup.AddVCLObj(Button11); + with FormGroup('Columns').Items.Add do + begin + VCLObj(Button12, CSSClass.Button.decrease); + VCLObj(Button13, CSSClass.Button.increase); + end; + end; + + + //Popup + with Popup('PopupSelecione', 'Select the item').Items.Add do + with Row.Items.Add do + FormGroup('Select').AddLCLObj(ComboBox_Selecionar); + + //LabeledEdit + with Row.Items.Add do + FormGroup(LabeledEdit1, CSSClass.Col.col); + + //ButtonedEdit + with Row.Items.Add do + begin + FormGroup('EditButton Info').AddLCLObj(EditButton1); + end; + + //Images + with Row.Items.Add do + begin + with PanelGroup('Static Image', '', false, CSSClass.Col.colsize2).Items.Add do + LCLObj(Image_Static); + + with PanelGroup('Upload Image', '', false, CSSClass.Col.colsize6).Items.Add do + begin + with Row.Items.Add do + LCLObj(Image_From_Local); + + with Row.Items.Add do + Upload; + end; + + with PanelGroup('Load from Web', '', false, CSSClass.Col.colsize2).Items.Add do + begin + with Row.Items.Add do + Col.Add.LCLObj(Image_From_Web); + + with Row.Items.Add do + Col.Add.LCLObj(Button_Load_from_Web, CSSClass.Col.colsize12); + end; + end; + + //Accordion + with Row.Items.Add do + with Accordion do + with AddAccordionItem('Show information (accordion)').Items.Add do + begin + with Row.Items.Add do + FormGroup('Name').AddLCLObj(Edit_Credito_Nome); + with Row.Items.Add do + FormGroup('Contact').AddLCLObj(Edit_Credito_Email); + end; + end; + +end; + +procedure TFormControls.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormControls.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + if PrismControl.VCLComponent = Image_From_Web then + PrismControl.AsImage.URLImage:= URL_Image_Web; +end; + +procedure TFormControls.EventD2Bridge(const PrismControl: TPrismControl; + const EventType: TPrismEventType; EventParams: TStrings); +begin + if PrismControl.IsTabs then + if (PrismControl.Name = 'TabControl1') and (EventType = TPrismEventType.EventOnChange) then + begin + Showmessage('Tab ' + IntToStr(PrismControl.AsTabs.ActiveTabIndex) + ' Activate'); + end; +end; + +procedure TFormControls.Upload(AFiles: TStrings; Sender: TObject); +begin + Image_From_Local.Picture.LoadFromFile(AFiles[0]); +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitdbgrid.lfm b/Beta/Demos/Lazarus_linux/unitdbgrid.lfm new file mode 100644 index 0000000..49675af --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitdbgrid.lfm @@ -0,0 +1,101 @@ +object FormDBGrid: TFormDBGrid + Left = 520 + Height = 549 + Top = 170 + Width = 839 + ClientHeight = 549 + ClientWidth = 839 + OnShow = FormShow + LCLVersion = '3.6.0.0' + object DBGrid1: TDBGrid + Left = 16 + Height = 480 + Top = 48 + Width = 808 + Color = clWindow + Columns = < + item + ReadOnly = True + Title.Caption = 'Cod' + FieldName = 'id' + end + item + Title.Caption = 'Country' + Width = 300 + FieldName = 'Country' + end + item + Title.Caption = 'DDI' + Width = 40 + FieldName = 'DDI' + end + item + Title.Caption = 'Population' + Width = 140 + FieldName = 'Population' + end> + DataSource = DataSource1 + Options = [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit] + TabOrder = 0 + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'Tahoma' + end + object CheckBox1: TCheckBox + Left = 16 + Height = 19 + Top = 16 + Width = 129 + Caption = 'Enable Edit in DBGrid' + TabOrder = 1 + OnClick = CheckBox1Click + end + object DataSource1: TDataSource + DataSet = BufDataset1 + Left = 592 + Top = 16 + end + object BufDataset1: TBufDataset + FieldDefs = <> + Left = 520 + Top = 16 + object BufDataset1id: TLongintField + FieldKind = fkData + FieldName = 'id' + Index = 0 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1country: TStringField + FieldKind = fkData + FieldName = 'country' + Index = 1 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 100 + end + object BufDataset1ddi: TStringField + FieldKind = fkData + FieldName = 'ddi' + Index = 2 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 10 + end + object BufDataset1population: TLongintField + FieldKind = fkData + FieldName = 'population' + Index = 3 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + end +end diff --git a/Beta/Demos/Lazarus_linux/unitdbgrid.pas b/Beta/Demos/Lazarus_linux/unitdbgrid.pas new file mode 100644 index 0000000..441cc01 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitdbgrid.pas @@ -0,0 +1,233 @@ +unit unitDBGrid; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +uses + Classes, SysUtils, DB, BufDataset, Controls, Graphics, Dialogs, StdCtrls, + DBGrids, UnitMenu, D2Bridge.Forms; + +type + + { TFormDBGrid } + + TFormDBGrid = class(TD2BridgeForm) + BufDataset1: TBufDataset; + BufDataset1country: TStringField; + BufDataset1ddi: TStringField; + BufDataset1id: TLongintField; + BufDataset1population: TLongintField; + CheckBox1: TCheckBox; + DataSource1: TDataSource; + DBGrid1: TDBGrid; + procedure CheckBox1Click(Sender: TObject); + procedure FormShow(Sender: TObject); + private + procedure PopuleData; + //Simulate Button Insert Click + procedure InsertNewRecClick(Sender: TObject); + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + procedure CallBack(const CallBackName: String; EventParams: TStrings); override; + procedure CellButtonClick(APrismDBGrid: TPrismDBGrid; APrismCellButton: TPrismDBGridColumnButton; AColIndex: Integer; ARow: Integer); overload; override; + end; + +function FormDBGrid: TFormDBGrid; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate, UnitDBGridEdit; + +{$R *.lfm} + +function FormDBGrid: TFormDBGrid; +begin + result:= (TFormDBGrid.GetInstance as TFormDBGrid); +end; + +procedure TFormDBGrid.FormShow(Sender: TObject); +begin + PopuleData; +end; + +procedure TFormDBGrid.CheckBox1Click(Sender: TObject); +begin + if CheckBox1.Checked then + DBGrid1.Options:= DBGrid1.Options - [dgRowSelect] + [dgEditing] + else + DBGrid1.Options:= DBGrid1.Options - [dgEditing] + [dgRowSelect]; +end; + +procedure TFormDBGrid.PopuleData; +begin + BufDataset1.Close; + BufDataset1.CreateDataset; + + BufDataset1.AppendRecord([1, 'China', '+86', 1444216107]); + BufDataset1.AppendRecord([2, 'India', '+91', 1393409038]); + BufDataset1.AppendRecord([3, 'United States', '+1', 332915073]); + BufDataset1.AppendRecord([4, 'Indonesia', '+62', 276361783]); + BufDataset1.AppendRecord([5, 'Pakistan', '+92', 225199937]); + BufDataset1.AppendRecord([6, 'Brazil', '+55', 213993437]); + BufDataset1.AppendRecord([7, 'Nigeria', '+234', 211400708]); + BufDataset1.AppendRecord([8, 'Bangladesh', '+880', 166303498]); + BufDataset1.AppendRecord([9, 'Russia', '+7', 145912025]); + BufDataset1.AppendRecord([10, 'Mexico', '+52', 130262216]); + BufDataset1.AppendRecord([11, 'Japan', '+81', 125943834]); + BufDataset1.AppendRecord([12, 'Ethiopia', '+251', 120858976]); + BufDataset1.AppendRecord([13, 'Philippines', '+63', 113850055]); + BufDataset1.AppendRecord([14, 'Egypt', '+20', 104258327]); + BufDataset1.AppendRecord([15, 'Vietnam', '+84', 97429061]); + BufDataset1.AppendRecord([16, 'DR Congo', '+243', 90003954]); + BufDataset1.AppendRecord([17, 'Turkey', '+90', 84339067]); + BufDataset1.AppendRecord([18, 'Iran', '+98', 85004578]); + BufDataset1.AppendRecord([19, 'Germany', '+49', 83149300]); + BufDataset1.AppendRecord([20, 'Thailand', '+66', 69950807]); + BufDataset1.AppendRecord([21, 'United Kingdom', '+44', 67886011]); + BufDataset1.AppendRecord([22, 'France', '+33', 65273511]); + BufDataset1.AppendRecord([23, 'Italy', '+39', 60244639]); + BufDataset1.AppendRecord([24, 'South Africa', '+27', 60041932]); + BufDataset1.AppendRecord([25, 'Tanzania', '+255', 59895231]); + BufDataset1.AppendRecord([26, 'Myanmar', '+95', 54409800]); + BufDataset1.AppendRecord([27, 'Kenya', '+254', 53771296]); + BufDataset1.AppendRecord([28, 'South Korea', '+82', 51606633]); + BufDataset1.AppendRecord([29, 'Colombia', '+57', 50976248]); + BufDataset1.AppendRecord([30, 'Spain', '+34', 46754783]); +end; + +procedure TFormDBGrid.InsertNewRecClick(Sender: TObject); +begin + BufDataset1.Append; + + ShowPopup('PopupDBGridEdit'); +end; + +procedure TFormDBGrid.ExportD2Bridge; +begin + inherited; + + Title:= 'DBGrid Example'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Add Form Nested + if FormDBGridEdit = nil then + TFormDBGridEdit.CreateInstance; + D2Bridge.AddNested(FormDBGridEdit); + + with D2Bridge.Items.add do + begin + with Row.Items.Add do + ColAuto.Add.LCLObj(CheckBox1); + + with Row.Items.Add do + LCLObj(DBGrid1); + + with Popup('PopupDBGridEdit', 'Lazarus DBGrid DEMO').Items.Add do + Nested(FormDBGridEdit); + end; +end; + +procedure TFormDBGrid.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + {$REGION 'DBGrid1'} + if PrismControl.VCLComponent = DBGrid1 then + with PrismControl.AsDBGrid do + begin + //HTML with <a> hhtml element and Button and CallBack + with Columns.Add do + begin + ColumnIndex:= 0; + Width:= 30; + Title:= 'Print'; + HTML:= '<a onclick="{{CallBack=CellPrint(recno=${data.PrismRecNo})}}"> <span> <i class="fa fa-print fa-2x fixed-plugin-button-nav cursor-pointer" aria-hidden="false" style="color:SteelBlue" align:"left"> </i> </span> </a>'; + end; + + with Columns.Add do + begin + ColumnIndex:= 1; + Title:= D2Bridge.LangNav.Button.CaptionOptions; + Width:= 80; + + //Create Popup + Button + with Buttons.Add do + begin + ButtonModel:= TButtonModel.Config; + + //New + with Add do + begin + ButtonModel:= TButtonModel.Add; + OnClick:= InsertNewRecClick; //Simulate Button Click + end; + + //Edit + with Add do + begin + ButtonModel:= TButtonModel.Edit; + end; + + //Delete + with Add do + begin + ButtonModel:= TButtonModel.Delete; + end; + end; + end; + end; + {$ENDREGION} +end; + +procedure TFormDBGrid.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +procedure TFormDBGrid.CallBack(const CallBackName: String; EventParams: TStrings); +begin + if SameText('CellPrint', CallBackName) then + begin + Showmessage('Prin Row ' + EventParams.Values['recno']); + end; +end; + +procedure TFormDBGrid.CellButtonClick(APrismDBGrid: TPrismDBGrid; + APrismCellButton: TPrismDBGridColumnButton; AColIndex: Integer; ARow: Integer); +begin + if APrismDBGrid.VCLComponent = DBGrid1 then + begin + if APrismCellButton.Identify = TButtonModel.Edit.Identity then + begin + ShowPopup('PopupDBGridEdit'); + end; + + if APrismCellButton.Identify = TButtonModel.Delete.Identity then + begin + if MessageDlg('Delete this record?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then + FormDBGrid.BufDataset1.Delete; + end; + end; +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitdbgridedit.lfm b/Beta/Demos/Lazarus_linux/unitdbgridedit.lfm new file mode 100644 index 0000000..f2a19d4 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitdbgridedit.lfm @@ -0,0 +1,94 @@ +object FormDBGridEdit: TFormDBGridEdit + Left = 750 + Height = 192 + Top = 227 + Width = 351 + Caption = 'FormDBGridEdit' + ClientHeight = 192 + ClientWidth = 351 + LCLVersion = '3.6.0.0' + object LabelId: TLabel + Left = 24 + Height = 15 + Top = 16 + Width = 13 + Caption = 'Id:' + end + object DBTextId: TDBText + Left = 56 + Height = 15 + Top = 16 + Width = 45 + DataField = 'id' + DataSource = FormDBGrid.DataSource1 + end + object LabelCountry: TLabel + Left = 24 + Height = 15 + Top = 40 + Width = 46 + Caption = 'Country:' + end + object LabelDDI: TLabel + Left = 24 + Height = 15 + Top = 71 + Width = 22 + Caption = 'DDI:' + end + object LabelPopulation: TLabel + Left = 24 + Height = 15 + Top = 100 + Width = 61 + Caption = 'Population:' + end + object DBEditCountry: TDBEdit + Left = 98 + Height = 23 + Top = 38 + Width = 232 + DataField = 'country' + DataSource = FormDBGrid.DataSource1 + MaxLength = 0 + TabOrder = 0 + end + object DBEditDDI: TDBEdit + Left = 98 + Height = 23 + Top = 66 + Width = 120 + DataField = 'ddi' + DataSource = FormDBGrid.DataSource1 + MaxLength = 0 + TabOrder = 1 + end + object DBEditPopulation: TDBEdit + Left = 98 + Height = 23 + Top = 96 + Width = 120 + DataField = 'population' + DataSource = FormDBGrid.DataSource1 + MaxLength = 0 + TabOrder = 2 + end + object ButtonSave: TButton + Left = 24 + Height = 25 + Top = 144 + Width = 80 + Caption = 'Save' + TabOrder = 3 + OnClick = ButtonSaveClick + end + object ButtonDelete: TButton + Left = 112 + Height = 25 + Top = 144 + Width = 88 + Caption = 'Delete' + TabOrder = 4 + OnClick = ButtonDeleteClick + end +end diff --git a/Beta/Demos/Lazarus_linux/unitdbgridedit.pas b/Beta/Demos/Lazarus_linux/unitdbgridedit.pas new file mode 100644 index 0000000..0beba7e --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitdbgridedit.pas @@ -0,0 +1,156 @@ +unit unitDBGridEdit; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +uses + Classes, SysUtils, Controls, Graphics, Dialogs, StdCtrls, DBCtrls, + D2Bridge.Forms; + +type + + { TFormDBGridEdit } + + TFormDBGridEdit = class(TD2BridgeForm) + ButtonSave: TButton; + ButtonDelete: TButton; + DBEditCountry: TDBEdit; + DBEditDDI: TDBEdit; + DBEditPopulation: TDBEdit; + DBTextId: TDBText; + LabelId: TLabel; + LabelCountry: TLabel; + LabelDDI: TLabel; + LabelPopulation: TLabel; + procedure ButtonDeleteClick(Sender: TObject); + procedure ButtonSaveClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); override; + end; + +function FormDBGridEdit: TFormDBGridEdit; + +implementation + +uses + LazarusWebApp, UnitDBGrid; + +{$R *.lfm} + +function FormDBGridEdit: TFormDBGridEdit; +begin + result:= (TFormDBGridEdit.GetInstance as TFormDBGridEdit); +end; + +procedure TFormDBGridEdit.ButtonSaveClick(Sender: TObject); +begin + FormDBGrid.BufDataset1.Edit; + FormDBGrid.BufDataset1.Post; + + Close; +end; + +procedure TFormDBGridEdit.ButtonDeleteClick(Sender: TObject); +begin + if MessageDlg('Delete this record?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then + begin + FormDBGrid.BufDataset1.Delete; + + Close; + end; +end; + +procedure TFormDBGridEdit.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Form'; + + //TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + with D2Bridge.Items.add do + begin + //Example use FormGroup + with Row.Items.Add do + FormGroup(LabelId.Caption).AddLCLObj(DBTextId); + + //Example export using full column size + with Row.Items.Add do + with Col12.Items.Add do + begin + LCLObj(LabelCountry); + LCLObj(DBEditCountry); + end; + + //Example export using auto column size + with Row.Items.Add do + with ColAuto.Items.Add do + begin + LCLObj(LabelDDI); + LCLObj(DBEditDDI); + end; + + //Example export using auto column size + with Row.Items.Add do + with ColAuto.Items.Add do + begin + LCLObj(LabelPopulation); + LCLObj(DBEditPopulation); + end; + + //Example export using auto column size + with Row.Items.Add do + begin + ColAuto.Add.LCLObj(ButtonSave, CSSClass.Button.save); + ColAuto.Add.LCLObj(ButtonDelete, CSSClass.Button.delete); + end; + end; + +end; + +procedure TFormDBGridEdit.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormDBGridEdit.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitkanban.lfm b/Beta/Demos/Lazarus_linux/unitkanban.lfm new file mode 100644 index 0000000..8272a1f --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitkanban.lfm @@ -0,0 +1,47 @@ +object FormKanban: TFormKanban + Left = 614 + Height = 471 + Top = 112 + Width = 568 + Caption = 'FormKanban' + ClientHeight = 471 + ClientWidth = 568 + LCLVersion = '3.6.0.0' + object Panel1: TPanel + Left = 40 + Height = 89 + Top = 32 + Width = 185 + ClientHeight = 89 + ClientWidth = 185 + TabOrder = 0 + object Label_CardStr: TLabel + Left = 16 + Height = 41 + Top = 40 + Width = 153 + AutoSize = False + Caption = 'This Card is item X for Column XYZ' + WordWrap = True + end + object Label_Title: TLabel + Left = 16 + Height = 13 + Top = 8 + Width = 62 + Caption = 'Label_Title' + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + object Button_Config: TButton + Left = 144 + Height = 25 + Top = 9 + Width = 27 + TabOrder = 0 + end + end +end diff --git a/Beta/Demos/Lazarus_linux/unitkanban.pas b/Beta/Demos/Lazarus_linux/unitkanban.pas new file mode 100644 index 0000000..2835faa --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitkanban.pas @@ -0,0 +1,258 @@ +unit unitKanban; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, + D2Bridge.Forms; + +type + + { TFormKanban } + + TFormKanban = class(TD2BridgeForm) + Button_Config: TButton; + Label_CardStr: TLabel; + Label_Title: TLabel; + Panel1: TPanel; + private + procedure PopuleKanban(AKanban: IPrismKanban); + procedure KanbanMoveCard(const AKanbanCard: IPrismCardModel; const IsColumnMoved, IsPositionMoved: boolean); override; + procedure KanbanClick(const AKanbanCard: IPrismCardModel; const PrismControlClick: TPrismControl); override; + procedure OnClickAddCard(Sender: TObject); + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); override; + end; + +function FormKanban: TFormKanban; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormKanban: TFormKanban; +begin + result:= (TFormKanban.GetInstance as TFormKanban); +end; + +procedure TFormKanban.PopuleKanban(AKanban: IPrismKanban); +var + I: integer; +begin + with AKanban do + begin + //TO DO + with AddColumn do + begin + Title:= 'TO DO'; + Identify:= 'Column1'; + + //Card + for I := 1 to 2 do + with AddCard do + begin + Identify:= KanbanColumn.Title + '_Row'+IntToStr(Row); + Label_Title.Caption:= 'Card of ' + KanbanColumn.Title; + Label_CardStr.Caption:= 'This card is item ' + IntToStr(Row) + ' from column ' + KanbanColumn.Title; + //Mandatory + Initialize; + end; + end; + + + //RUNNING + with AddColumn do + begin + Title:= 'Running'; + Identify:= 'Column2'; + + //Card + for I := 1 to 3 do + with AddCard do + begin + Identify:= KanbanColumn.Title + '_Row'+IntToStr(Row); + Label_Title.Caption:= 'Card of ' + KanbanColumn.Title; + Label_CardStr.Caption:= 'This card is item ' + IntToStr(Row) + ' from column ' + KanbanColumn.Title; + //Mandatory + Initialize; + end; + end; + + + + + //Finished + with AddColumn do + begin + Title:= 'Finished'; + Identify:= 'Column3'; + + //Card + for I := 1 to 5 do + with AddCard do + begin + Identify:= KanbanColumn.Title + '_Row'+IntToStr(Row); + Label_Title.Caption:= 'Card of ' + KanbanColumn.Title; + Label_CardStr.Caption:= 'This card is item ' + IntToStr(Row) + ' from column ' + KanbanColumn.Title; + //Mandatory + Initialize; + end; + end; + end; +end; + +procedure TFormKanban.KanbanMoveCard(const AKanbanCard: IPrismCardModel; + const IsColumnMoved, IsPositionMoved: boolean); +begin + if IsColumnMoved and IsPositionMoved then + begin + Showmessage('Column and position has been moved', true, true); + end else + if IsColumnMoved then + begin + Showmessage('Just Column has been moved', true, true); + end else + if IsPositionMoved then + begin + Showmessage('Just position is moved', true, true); + end; +end; + +procedure TFormKanban.KanbanClick(const AKanbanCard: IPrismCardModel; + const PrismControlClick: TPrismControl); +begin + //MykanbanId := AKanbanCard.Identify; + + if Assigned(PrismControlClick) then + if PrismControlClick.VCLComponent = Button_Config then + begin + Showmessage('Click on Config Button'); + end; +end; + +procedure TFormKanban.OnClickAddCard(Sender: TObject); +var + vKanbanColumn: IPrismKanbanColumn; +begin + if Supports(Sender, IPrismKanbanColumn, vKanbanColumn) then + begin + //vKanbanColumn.Identify .... + + showmessage('Add Card'); + + //Update Kanban and Renderize + //D2Bridge.UpdateD2BridgeControl() + UpdateD2BridgeControls(vKanbanColumn.Kanban as TPrismControl); + end; + +end; + +procedure TFormKanban.ExportD2Bridge; +begin + inherited; + + Title:= 'Kanban Example'; + SubTitle:= 'D2Bridge native Kanban Support'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Export yours Controls + with D2Bridge.Items.add do + begin + with Row.Items.Add do + with Kanban('Kanban1') do + begin + OnAddClick:= @OnClickAddCard; + + //CardModel + with CardModel do + begin + with BodyItems.Add do + begin + with Row.Items.Add do + begin + Col.Add.VCLObj(Label_Title); + ColAuto.Add.VCLObj(Button_Config, CSSClass.Button.config + ' ' + CSSClass.Button.TypeButton.Default.light); + end; + + with Row.Items.Add do + Col.Add.VCLObj(Label_CardStr); + end; + end; + end; + end; +end; + +procedure TFormKanban.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + {$REGION 'Popule Kanban Mode 1'} + if PrismControl.IsKanban then + begin + with PrismControl.AsKanban.AddColumn do + begin + Title:= 'TO DO'; + Identify:= 'Column1'; + AddCadsToInitialize(2); + end; + + with PrismControl.AsKanban.AddColumn do + begin + Title:= 'Running'; + Identify:= 'Column2'; + AddCadsToInitialize(3); + end; + + with PrismControl.AsKanban.AddColumn do + begin + Title:= 'Finished'; + Identify:= 'Column3'; + AddCadsToInitialize(5); + end; + end; + + if PrismControl.IsCardModel then + if PrismControl.AsCardModel.IsKanbanContainer then + with PrismControl.AsCardModel do + begin + Identify:= KanbanColumn.Title + '_Row'+IntToStr(Row); + + Label_Title.Caption:= 'Card of ' + KanbanColumn.Title; + + Label_CardStr.Caption:= 'This card is item ' + IntToStr(Row) + ' from column ' + KanbanColumn.Title; + end; + {$ENDREGION} + + + {$REGION 'Popule Kanban Mode 2'} +// if PrismControl.IsKanban then +// PopuleKanban(PrismControl as IPrismKanban); + {$ENDREGION} +end; + +procedure TFormKanban.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitmarkdowneditor.lfm b/Beta/Demos/Lazarus_linux/unitmarkdowneditor.lfm new file mode 100644 index 0000000..7d1495e --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitmarkdowneditor.lfm @@ -0,0 +1,130 @@ +object FormMarkDownEditor: TFormMarkDownEditor + Left = 542 + Height = 479 + Top = 188 + Width = 675 + Caption = 'FormMarkDownEditor' + ClientHeight = 479 + ClientWidth = 675 + OnCreate = FormCreate + LCLVersion = '3.8.0.0' + object Memo1: TMemo + Left = 16 + Height = 185 + Top = 57 + Width = 609 + Lines.Strings = ( + '# D2Bridge Framework - Markdown Editor' + '' + 'Markdown is a **lightweight markup language** that is easy to use.' + '' + '## 📌 Key Features' + '- **Bold** → `**bold text**`' + '- *Italics* → `*italic text*`' + '- [Links](https://d2bridge.com.br) → `[Link Text](https://d2bridge.com.br)`' + '- Numbered lists:' + ' 1. First item' + ' 2. Second item' + ' 3. Third item' + '- Bullet point lists:' + ' - Item A' + ' - Item B' + ' - Item C' + '' + '## 🌄 Adding Images' + 'To insert an image:' + '![](https://d2bridge.com.br/images/LogoD2Bridge.png)' + '' + '## 📌 Usage' + 'Use direct with TMemo, TLabel, TEdit, TDBMemo, TDBText and TDBEdit' + '```delphi' + '//Renderize Memo1 content' + 'MarkdownEditor(Memo1);' + '```' + '' + 'Use with Datasource (Dataware mode)' + '```delphi' + '//Renderize Dataware ' + 'MarkdownEditor(DataSource1, ''Text'');' + '```' + ) + TabOrder = 0 + WordWrap = False + end + object DBGrid1: TDBGrid + Left = 16 + Height = 129 + Top = 316 + Width = 272 + Color = clWindow + Columns = < + item + Title.Caption = 'Title' + Width = 150 + FieldName = 'Title' + end> + DataSource = DataSource1 + Options = [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit] + TabOrder = 1 + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'Tahoma' + end + object Button1: TButton + Left = 16 + Height = 25 + Top = 28 + Width = 122 + Caption = 'Enable/Disable Editor' + TabOrder = 2 + OnClick = Button1Click + end + object Button2: TButton + Left = 144 + Height = 25 + Top = 28 + Width = 89 + Caption = 'Edit/ReadOnly' + TabOrder = 3 + OnClick = Button2Click + end + object Button3: TButton + Left = 16 + Height = 25 + Top = 285 + Width = 122 + Caption = 'Enable/Disable Editor' + TabOrder = 4 + OnClick = Button3Click + end + object DataSource1: TDataSource + DataSet = BufDataset1 + Left = 600 + Top = 14 + end + object BufDataset1: TBufDataset + FieldDefs = <> + Left = 532 + Top = 14 + object BufDataset1Title: TStringField + FieldKind = fkData + FieldName = 'Title' + Index = 0 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 100 + end + object BufDataset1Text: TStringField + FieldKind = fkData + FieldName = 'Text' + Index = 1 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 2000 + end + end +end diff --git a/Beta/Demos/Lazarus_linux/unitmarkdowneditor.pas b/Beta/Demos/Lazarus_linux/unitmarkdowneditor.pas new file mode 100644 index 0000000..9004ef3 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitmarkdowneditor.pas @@ -0,0 +1,190 @@ +unit UnitMarkDownEditor; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, BufDataset, DB, Controls, Graphics, Dialogs, StdCtrls, DBGrids, Menus, + D2Bridge.Forms; + +type + + { TFormMarkDownEditor } + + TFormMarkDownEditor = class(TD2BridgeForm) + BufDataset1: TBufDataset; + BufDataset1Text: TStringField; + BufDataset1Title: TStringField; + Button1: TButton; + Button2: TButton; + Button3: TButton; + DataSource1: TDataSource; + DBGrid1: TDBGrid; + Memo1: TMemo; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + procedure PopuleData; + public + { Public declarations } + protected + procedure Upload(AFiles: TStrings; Sender: TObject); override; + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + end; + +function FormMarkDownEditor: TFormMarkDownEditor; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormMarkDownEditor: TFormMarkDownEditor; +begin + result:= (TFormMarkDownEditor.GetInstance as TFormMarkDownEditor); +end; + +procedure TFormMarkDownEditor.Button1Click(Sender: TObject); +begin + Memo1.Enabled:= not Memo1.Enabled; +end; + +procedure TFormMarkDownEditor.Button2Click(Sender: TObject); +begin + Memo1.ReadOnly:= not Memo1.ReadOnly; +end; + +procedure TFormMarkDownEditor.Button3Click(Sender: TObject); +begin + if BufDataset1.State in [dsEdit] then + BufDataset1.Post + else + BufDataset1.Edit; +end; + +procedure TFormMarkDownEditor.FormCreate(Sender: TObject); +begin + PopuleData; +end; + +procedure TFormMarkDownEditor.PopuleData; +begin + BufDataset1.Close; + BufDataset1.CreateDataSet; + + BufDataset1.AppendRecord(['Example 1', + '# D2Bridge Markdown Editor Documentation ' + sLineBreak + + ' ' + sLineBreak + + 'Welcome to the official documentation for the **D2Bridge Markdown Editor**. ' + sLineBreak + + ' ' + sLineBreak + + '## Installation ' + sLineBreak + + '1. **Download D2Bridge** from the official website. ' + sLineBreak + + '2. **Use InstallD2BridgeWizard.exe to install Wizard in your Delphi/Lazarus IDE** ' + sLineBreak + + '3. **In your IDE use Menu D2Bridge Wizard** ' + ]); + + BufDataset1.AppendRecord(['Example 2', + '# D2Bridge Markdown Editor Documentation' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + '| Column 1 | Column 2 | Column 3 | ' + sLineBreak + + '| -------- | -------- | -------- | ' + sLineBreak + + '| Text | Text | Text | ' + ]); + +end; + +procedure TFormMarkDownEditor.Upload(AFiles: TStrings; Sender: TObject); +begin + //Handle the attachment here + + //Ex: + // AFiles[0]:= 'NewLocation\NameFile.jpg'; +end; + +procedure TFormMarkDownEditor.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Form'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + with D2Bridge.Items.add do + begin + with Row.Items.Add do + with Col.Add.Card('Markdown Editor').Items.Add do + begin + with Row.Items.Add do + begin + ColAuto.Add.VCLObj(Button1); + ColAuto.Add.VCLObj(Button2); + end; + + with Row.Items.Add do + Col.Add.MarkdownEditor(Memo1); + end; + + //Markdown with TMemo + with Row.Items.Add do + with Col.Add.Card('Markdown Editor with Database').Items.Add do + begin + with Row.Items.Add do + ColAuto.Add.VCLObj(Button3); + + with Row.Items.Add do + begin + Col4.Add.VCLObj(DBGrid1); + with Col.Add.MarkdownEditor(DataSource1, 'Text') do + begin + //Personalize your Markdown + ShowButtonStrikethrough:= false; + ShowButtonUpload:= false; + //Show...... + end; + end; + end; + end; + +end; + +procedure TFormMarkDownEditor.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormMarkDownEditor.RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitqrcode.lfm b/Beta/Demos/Lazarus_linux/unitqrcode.lfm new file mode 100644 index 0000000..f4a1c03 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitqrcode.lfm @@ -0,0 +1,254 @@ +object FormQRCode: TFormQRCode + Left = 536 + Height = 591 + Top = 193 + Width = 679 + Caption = 'FormQRCode' + ClientHeight = 591 + ClientWidth = 679 + OnCreate = FormCreate + OnShow = FormShow + LCLVersion = '3.6.0.0' + object GroupBox1: TGroupBox + Left = 16 + Height = 169 + Top = 8 + Width = 633 + Caption = 'VCL and WEB' + ClientHeight = 149 + ClientWidth = 629 + TabOrder = 0 + object Image1: TImage + Left = 496 + Height = 105 + Top = 24 + Width = 121 + Proportional = True + end + object Edit1: TEdit + Left = 16 + Height = 23 + Top = 24 + Width = 369 + TabOrder = 0 + Text = 'https://www.d2bridge.com.br' + end + object Button1: TButton + Left = 391 + Height = 25 + Top = 22 + Width = 75 + Caption = 'QRCode' + TabOrder = 1 + OnClick = Button1Click + end + end + object GroupBox2: TGroupBox + Left = 16 + Height = 74 + Top = 183 + Width = 633 + Caption = 'WEB Static' + ClientHeight = 54 + ClientWidth = 629 + TabOrder = 1 + object Edit2: TEdit + Left = 16 + Height = 23 + Top = 24 + Width = 601 + Enabled = False + TabOrder = 0 + Text = 'https://www.d2bridge.com.br' + end + end + object GroupBox3: TGroupBox + Left = 16 + Height = 80 + Top = 272 + Width = 633 + Caption = 'Web Dynamic' + ClientHeight = 60 + ClientWidth = 629 + TabOrder = 2 + object Edit3: TEdit + Left = 16 + Height = 23 + Top = 24 + Width = 520 + TabOrder = 0 + Text = 'https://www.d2bridge.com.br' + end + object Button2: TButton + Left = 542 + Height = 25 + Top = 22 + Width = 75 + Caption = 'QRCode' + TabOrder = 1 + OnClick = Button2Click + end + end + object GroupBox5: TGroupBox + Left = 16 + Height = 212 + Top = 360 + Width = 633 + Caption = 'Web Dataware' + ClientHeight = 192 + ClientWidth = 629 + TabOrder = 3 + object DBGrid1: TDBGrid + Left = 16 + Height = 153 + Top = 24 + Width = 601 + Color = clWindow + Columns = < + item + Title.Caption = 'Id' + FieldName = 'AutoCod' + end + item + Title.Caption = 'Country' + Width = 100 + FieldName = 'Country' + end + item + Title.Caption = 'Continent' + Width = 80 + FieldName = 'Continent' + end + item + Title.Caption = 'City' + Width = 80 + FieldName = 'Capital' + end + item + Title.Caption = 'Population' + Width = 65 + FieldName = 'Population' + end + item + Title.Caption = 'Language' + Width = 70 + FieldName = 'Language' + end + item + Title.Caption = 'Currency Name' + Width = 90 + FieldName = 'CurrencyName' + end> + DataSource = DataSource1 + Options = [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit] + TabOrder = 0 + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'Tahoma' + end + end + object BufDataset1: TBufDataset + FieldDefs = <> + Left = 328 + Top = 464 + object BufDataset1id: TLongintField + FieldKind = fkData + FieldName = 'id' + Index = 0 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1country: TStringField + FieldKind = fkData + FieldName = 'country' + Index = 1 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 100 + end + object BufDataset1ddi: TStringField + FieldKind = fkData + FieldName = 'ddi' + Index = 2 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 10 + end + object BufDataset1population: TLongintField + FieldKind = fkData + FieldName = 'population' + Index = 3 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1Continent: TStringField + FieldKind = fkData + FieldName = 'Continent' + Index = 4 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 30 + end + object BufDataset1Language: TStringField + FieldKind = fkData + FieldName = 'Language' + Index = 5 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1Capital: TStringField + FieldKind = fkData + FieldName = 'Capital' + Index = 6 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1CurrencyName: TStringField + FieldKind = fkData + FieldName = 'CurrencyName' + Index = 7 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1CurrencySimbol: TStringField + FieldKind = fkData + FieldName = 'CurrencySimbol' + Index = 8 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 5 + end + object BufDataset1CreateAt: TDateField + FieldKind = fkData + FieldName = 'CreateAt' + Index = 9 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + end + object DataSource1: TDataSource + DataSet = BufDataset1 + Left = 400 + Top = 464 + end +end diff --git a/Beta/Demos/Lazarus_linux/unitqrcode.pas b/Beta/Demos/Lazarus_linux/unitqrcode.pas new file mode 100644 index 0000000..2f55c91 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitqrcode.pas @@ -0,0 +1,243 @@ +unit unitQRCode; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, BufDataset, DB, Controls, Graphics, Dialogs, StdCtrls, DBGrids, ExtCtrls, + D2Bridge.API.QRCode, D2Bridge.Forms; + +type + + { TFormQRCode } + + TFormQRCode = class(TD2BridgeForm) + BufDataset1: TBufDataset; + BufDataset1Capital: TStringField; + BufDataset1Continent: TStringField; + BufDataset1country: TStringField; + BufDataset1CreateAt: TDateField; + BufDataset1CurrencyName: TStringField; + BufDataset1CurrencySimbol: TStringField; + BufDataset1ddi: TStringField; + BufDataset1id: TLongintField; + BufDataset1Language: TStringField; + BufDataset1population: TLongintField; + Button1: TButton; + Button2: TButton; + DataSource1: TDataSource; + DBGrid1: TDBGrid; + Edit1: TEdit; + Edit2: TEdit; + Edit3: TEdit; + GroupBox1: TGroupBox; + GroupBox2: TGroupBox; + GroupBox3: TGroupBox; + GroupBox5: TGroupBox; + Image1: TImage; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FD2BridgeAPIQRCode: TD2BridgeAPIQRCode; + Procedure PopuleData; + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); override; + end; + +function FormQRCode: TFormQRCode; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormQRCode: TFormQRCode; +begin + result:= (TFormQRCode.GetInstance as TFormQRCode); +end; + +procedure TFormQRCode.FormCreate(Sender: TObject); +begin + FD2BridgeAPIQRCode:= TD2BridgeAPIQRCode.Create; +end; + +procedure TFormQRCode.Button1Click(Sender: TObject); +begin + FD2BridgeAPIQRCode.Text:= Edit1.Text; + Image1.Picture.Assign(FD2BridgeAPIQRCode.QRCodeJPG); + +end; + +procedure TFormQRCode.Button2Click(Sender: TObject); +begin + if IsD2BridgeContext then + D2Bridge.PrismControlFromID('QRCodeDynamic').AsQRCode.Text:= Edit3.Text + else + Showmessage('Just D2Bridge Web'); +end; + +procedure TFormQRCode.FormShow(Sender: TObject); +begin + PopuleData; +end; + +procedure TFormQRCode.PopuleData; +begin + BufDataset1.Close; + BufDataset1.CreateDataset; + + BufDataset1.AppendRecord([1, 'China', '86', 1444216107, 'Asia', 'Mandarin', 'Beijing', 'Yuan', 'Â¥']); + BufDataset1.AppendRecord([2, 'India', '91', 1393409038, 'Asia', 'Hindi, English', 'New Delhi', 'Rupee', '₹']); + BufDataset1.AppendRecord([3, 'United States', '1', 332915073, 'North America', 'English', 'Washington, D.C.', 'Dollar', '$']); + BufDataset1.AppendRecord([4, 'Indonesia', '62', 276361783, 'Asia', 'Indonesian', 'Jakarta', 'Rupiah', 'Rp']); + BufDataset1.AppendRecord([5, 'Pakistan', '92', 225199937, 'Asia', 'Urdu, English', 'Islamabad', 'Rupee', '₨']); + BufDataset1.AppendRecord([6, 'Brazil', '55', 213993437, 'South America', 'Portuguese', 'Brasília', 'Real', 'R$']); + BufDataset1.AppendRecord([7, 'Nigeria', '234', 211400708, 'Africa', 'English', 'Abuja', 'Naira', '₦']); + BufDataset1.AppendRecord([8, 'Bangladesh', '880', 166303498, 'Asia', 'Bengali', 'Dhaka', 'Taka', 'à§³']); + BufDataset1.AppendRecord([9, 'Russia', '7', 145912025, 'Europe/Asia', 'Russian', 'Moscow', 'Ruble', '₽']); + BufDataset1.AppendRecord([10, 'Mexico', '52', 130262216, 'North America', 'Spanish', 'Mexico City', 'Peso', '$']); + BufDataset1.AppendRecord([11, 'Japan', '81', 125943834, 'Asia', 'Japanese', 'Tokyo', 'Yen', 'Â¥']); + BufDataset1.AppendRecord([12, 'Ethiopia', '251', 120858976, 'Africa', 'Amharic', 'Addis Ababa', 'Birr', 'Br']); + BufDataset1.AppendRecord([13, 'Philippines', '63', 113850055, 'Asia', 'Filipino, English', 'Manila', 'Peso', '₱']); + BufDataset1.AppendRecord([14, 'Egypt', '20', 104258327, 'Africa', 'Arabic', 'Cairo', 'Pound', '£']); + BufDataset1.AppendRecord([15, 'Vietnam', '84', 97429061, 'Asia', 'Vietnamese', 'Hanoi', 'Dong', 'â‚«']); + BufDataset1.AppendRecord([16, 'DR Congo', '243', 90003954, 'Africa', 'French', 'Kinshasa', 'Franc', 'FC']); + BufDataset1.AppendRecord([17, 'Turkey', '90', 84339067, 'Europe/Asia', 'Turkish', 'Ankara', 'Lira', '₺']); + BufDataset1.AppendRecord([18, 'Iran', '98', 85004578, 'Asia', 'Persian', 'Tehran', 'Rial', 'ï·¼']); + BufDataset1.AppendRecord([19, 'Germany', '49', 83149300, 'Europe', 'German', 'Berlin', 'Euro', '€']); + BufDataset1.AppendRecord([20, 'Thailand', '66', 69950807, 'Asia', 'Thai', 'Bangkok', 'Baht', '฿']); + BufDataset1.AppendRecord([21, 'United Kingdom', '44', 67886011, 'Europe', 'English', 'London', 'Pound', '£']); + BufDataset1.AppendRecord([22, 'France', '33', 65273511, 'Europe', 'French', 'Paris', 'Euro', '€']); + BufDataset1.AppendRecord([23, 'Italy', '39', 60244639, 'Europe', 'Italian', 'Rome', 'Euro', '€']); + BufDataset1.AppendRecord([24, 'South Africa', '27', 60041932, 'Africa', 'Zulu, Xhosa, Afrikaans, English', 'Pretoria', 'Rand', 'R']); + BufDataset1.AppendRecord([25, 'Tanzania', '255', 59895231, 'Africa', 'Swahili, English', 'Dodoma', 'Shilling', 'TSh']); + BufDataset1.AppendRecord([26, 'Myanmar', '95', 54409800, 'Asia', 'Burmese', 'Naypyidaw', 'Kyat', 'K']); + BufDataset1.AppendRecord([27, 'Kenya', '254', 53771296, 'Africa', 'Swahili, English', 'Nairobi', 'Shilling', 'KSh']); + BufDataset1.AppendRecord([28, 'South Korea', '82', 51606633, 'Asia', 'Korean', 'Seoul', 'Won', 'â‚©']); + BufDataset1.AppendRecord([29, 'Colombia', '57', 50976248, 'South America', 'Spanish', 'Bogotá', 'Peso', '$']); + BufDataset1.AppendRecord([30, 'Spain', '34', 46754783, 'Europe', 'Spanish', 'Madrid', 'Euro', '€']); +end; + +procedure TFormQRCode.ExportD2Bridge; +begin + inherited; + + Title:= 'QRCode Example'; + SubTitle:= 'D2Bridge Native QRCode generation'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + //Export yours Controls + with D2Bridge.Items.add do + begin + with row.Items.Add do + begin + with HTMLDiv(CSSClass.Col.col).Items.Add do + with CardGrid do + begin + //ColSize:= 'row-cols-md-1 row-cols-lg-1'; + CardGridSize:= CSSClass.CardGrid.CardGridX2; + EqualHeight:= true; + + //VCL and WEB + with AddCard(GroupBox1.Caption).Items.Add do + begin + with Row.Items.Add do + begin + with HTMLDiv(CSSClass.Col.colsize8).Items.Add do + with Row.Items.Add do + begin + FormGroup('', CSSClass.Col.col).AddVCLObj(Edit1); + FormGroup.AddVCLObj(Button1); + end; + + with HTMLDiv(CSSClass.Col.colsize4).Items.Add do + VCLObj(Image1); + end; + end; + + //VCL Static + with AddCard(GroupBox2.Caption).Items.Add do + begin + with Row.Items.Add do + begin + with HTMLDiv(CSSClass.Col.colsize8).Items.Add do + with Row.Items.Add do + FormGroup('', CSSClass.Col.col).AddVCLObj(Edit2); + + with HTMLDiv(CSSClass.Col.colsize4).Items.Add do + QRCode(Edit2.Text); + end; + end; + + //WEB Dynamic + with AddCard(GroupBox3.Caption).Items.Add do + begin + with Row.Items.Add do + begin + with HTMLDiv(CSSClass.Col.colsize8).Items.Add do + with Row.Items.Add do + begin + FormGroup('', CSSClass.Col.col).AddVCLObj(Edit3); + FormGroup.AddVCLObj(Button2); + end; + + with HTMLDiv(CSSClass.Col.colsize4).Items.Add do + QRCode(Edit3.Text, 'QRCodeDynamic'); + end; + end; + end; + end; + + //Web Dataware + with Row.Items.Add do + with HTMLDiv(CSSClass.Col.col).Items.Add do + with Card(GroupBox5.Caption).Items.Add do + begin + with Row.Items.Add do + begin + with HTMLDiv(CSSClass.Col.colsize10).Items.Add do + VCLObj(DBGrid1); + + with HTMLDiv(CSSClass.Col.colsize2).Items.Add do + QRCode(DataSource1, 'Country'); + end; + end; + end; +end; + +procedure TFormQRCode.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 5; + end; +end; + +procedure TFormQRCode.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitqrcodereader.lfm b/Beta/Demos/Lazarus_linux/unitqrcodereader.lfm new file mode 100644 index 0000000..6bd8a3e --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitqrcodereader.lfm @@ -0,0 +1,69 @@ +object FormQRCodeReader: TFormQRCodeReader + Left = 374 + Height = 543 + Top = 292 + Width = 718 + Caption = 'FormQRCodeReader' + ClientHeight = 543 + ClientWidth = 718 + OnCreate = FormCreate + LCLVersion = '3.8.0.0' + object Image1: TImage + Left = 184 + Height = 281 + Top = 24 + Width = 305 + end + object ComboBox1: TComboBox + Left = 184 + Height = 23 + Top = 320 + Width = 305 + ItemHeight = 15 + Style = csDropDownList + TabOrder = 0 + end + object Button8: TButton + Left = 495 + Height = 25 + Top = 318 + Width = 34 + TabOrder = 1 + OnClick = Button8Click + end + object Button7: TButton + Left = 218 + Height = 25 + Top = 347 + Width = 75 + Caption = 'Permission' + TabOrder = 2 + OnClick = Button7Click + end + object Button1: TButton + Left = 299 + Height = 25 + Top = 347 + Width = 75 + Caption = 'Start' + TabOrder = 3 + OnClick = Button1Click + end + object Button2: TButton + Left = 379 + Height = 25 + Top = 347 + Width = 75 + Caption = 'Stop' + TabOrder = 4 + OnClick = Button2Click + end + object Memo1: TMemo + Left = 88 + Height = 121 + Top = 384 + Width = 545 + ReadOnly = True + TabOrder = 5 + end +end diff --git a/Beta/Demos/Lazarus_linux/unitqrcodereader.pas b/Beta/Demos/Lazarus_linux/unitqrcodereader.pas new file mode 100644 index 0000000..579b77c --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitqrcodereader.pas @@ -0,0 +1,239 @@ +unit unitQRCodeReader; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +uses + Classes, SysUtils, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, + D2Bridge.Forms; + +type + + { TFormQRCodeReader } + + TFormQRCodeReader = class(TD2BridgeForm) + Button1: TButton; + Button2: TButton; + Button7: TButton; + Button8: TButton; + ComboBox1: TComboBox; + Image1: TImage; + Memo1: TMemo; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button7Click(Sender: TObject); + procedure Button8Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + procedure UpdateCameraList(Sender: TObject); + procedure OnQRCodeReader(ACode: string); + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); override; + end; + +function FormQRCodeReader: TFormQRCodeReader; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormQRCodeReader: TFormQRCodeReader; +begin + result:= (TFormQRCodeReader.GetInstance as TFormQRCodeReader); +end; + +procedure TFormQRCodeReader.FormCreate(Sender: TObject); +begin + Image1.QRCodeReader.OnChangeDevices:= UpdateCameraList; +end; + +procedure TFormQRCodeReader.Button7Click(Sender: TObject); +begin + Image1.QRCodeReader.RequestPermission; +end; + +procedure TFormQRCodeReader.Button8Click(Sender: TObject); +begin + if ComboBox1.Items.Count > 0 then + begin + Image1.QRCodeReader.CurrentDevice:= Image1.QRCodeReader.Devices.ItemFromIndex(ComboBox1.ItemIndex); + + //ShowMessage('new camera "' + Image1.QRCodeReader.CurrentDevice.Name + '" selected'); + + //Modify QRCodeReader now + if Image1.QRCodeReader.Started then + begin + Image1.QRCodeReader.Stop; + Image1.QRCodeReader.Start; + end; + end; +end; + +procedure TFormQRCodeReader.Button1Click(Sender: TObject); +begin + Memo1.Text:= ''; + + if not Image1.QRCodeReader.Allowed then + Image1.QRCodeReader.RequestPermission; + + Image1.QRCodeReader.Start; + +end; + +procedure TFormQRCodeReader.Button2Click(Sender: TObject); +begin + Image1.QRCodeReader.Stop; +end; + +procedure TFormQRCodeReader.UpdateCameraList(Sender: TObject); +var + I: Integer; +begin + ComboBox1.Items.Clear; + + if Image1.QRCodeReader.Devices.Count > 0 then + begin + for I := 0 to Pred(Image1.QRCodeReader.Devices.Count) do + ComboBox1.Items.Add(Image1.QRCodeReader.Devices.Items[I].Name); + + ComboBox1.ItemIndex:= Image1.QRCodeReader.CurrentDeviceIndex; + end; +end; + +procedure TFormQRCodeReader.OnQRCodeReader(ACode: string); +begin + Memo1.Text:= ACode; +end; + +procedure TFormQRCodeReader.ExportD2Bridge; +begin + inherited; + + Title:= 'QRCode/BarCode Reader'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + with D2Bridge.Items.add do + begin + with Row(CSSClass.Col.Align.center).Items.Add do + begin + Col4.Add.QRCodeReader(Image1, Memo1); + //*****Or use Event + //Col4.Add.QRCodeReader(Image1, OnQRCodeReader) + + { + *** Options Example *** + + With Col4.Add.QRCodeReader(Image1, OnQRCodeReader) do + begin + //--> Shaders code limit + BorderShaders:= true/false; + + //--> Scan not stop on Read + ContinuousScan:= true/false; + + //--> Send ENTER on Read the code + PressReturnKey:= true/false; + + //--> Enable All Code Format + EnableAllCodesFormat; + + //--> Disable All Code Format + DisableAllCodesFormat; + + //--> Enable / Disable Code Types + PressReturnKey:= true/false; + TextVCLComponent:= true/false; + EnableQRCODE:= true/false; + EnableAZTEC:= true/false; + EnableCODABAR:= true/false; + EnableCODE39:= true/false; + EnableCODE93:= true/false; + EnableCODE128:= true/false; + EnableDATAMATRIX:= true/false; + EnableMAXICODE:= true/false; + EnableITF:= true/false; + EnableEAN13:= true/false; + EnableEAN8:= true/false; + EnablePDF417:= true/false; + EnableRSS14:= true/false; + EnableRSSEXPANDED:= true/false; + EnableUPCA:= true/false; + EnableUPCE:= true/false; + EnableUPCEANEXTENSION:= true/false; + end; + } + end; + + with Row(CSSClass.Col.Align.center).Items.Add do + begin + with ColAuto.Items.Add do + begin + VCLObj(ComboBox1); + VCLObj(Button8, CSSClass.Button.select); + end; + end; + + with Row(CSSClass.Col.Align.center).Items.Add do + begin + with ColAuto.Items.Add do + begin + VCLObj(Button7, CSSClass.Button.userSecurity); + VCLObj(Button1, CSSClass.Button.start); + VCLObj(Button2, CSSClass.Button.stop); + end; + end; + + with Row(CSSClass.Col.Align.center).Items.Add do + FormGroup('Last Code Read', CSSClass.Col.colsize8).AddVCLObj(Memo1); + end; + +end; + +procedure TFormQRCodeReader.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormQRCodeReader.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitstringgrid.lfm b/Beta/Demos/Lazarus_linux/unitstringgrid.lfm new file mode 100644 index 0000000..ce338c1 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitstringgrid.lfm @@ -0,0 +1,62 @@ +object FormStringGrid: TFormStringGrid + Left = 485 + Height = 556 + Top = 217 + Width = 759 + Caption = 'FormStringGrid' + ClientHeight = 556 + ClientWidth = 759 + OnCreate = FormCreate + OnShow = FormShow + LCLVersion = '3.6.0.0' + object StringGrid1: TStringGrid + Left = 16 + Height = 392 + Top = 24 + Width = 720 + TabOrder = 0 + end + object BufDataset1: TBufDataset + FieldDefs = <> + Left = 432 + Top = 16 + object BufDataset1id: TLongintField + FieldKind = fkData + FieldName = 'id' + Index = 0 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + object BufDataset1country: TStringField + FieldKind = fkData + FieldName = 'country' + Index = 1 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 100 + end + object BufDataset1ddi: TStringField + FieldKind = fkData + FieldName = 'ddi' + Index = 2 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 10 + end + object BufDataset1population: TLongintField + FieldKind = fkData + FieldName = 'population' + Index = 3 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + end + end +end diff --git a/Beta/Demos/Lazarus_linux/unitstringgrid.pas b/Beta/Demos/Lazarus_linux/unitstringgrid.pas new file mode 100644 index 0000000..3d54455 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitstringgrid.pas @@ -0,0 +1,179 @@ +unit unitStringGrid; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, BufDataset, DB, Controls, Graphics, Dialogs, StdCtrls, + Grids, D2Bridge.Forms; + +type + + { TFormStringGrid } + + TFormStringGrid = class(TD2BridgeForm) + BufDataset1: TBufDataset; + BufDataset1country: TStringField; + BufDataset1ddi: TStringField; + BufDataset1id: TLongintField; + BufDataset1population: TLongintField; + StringGrid1: TStringGrid; + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + private + procedure PopuleData; + procedure PopuleStringGrid; + public + { Public declarations } + protected + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); override; + end; + +function FormStringGrid: TFormStringGrid; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormStringGrid: TFormStringGrid; +begin + result:= (TFormStringGrid.GetInstance as TFormStringGrid); +end; + +procedure TFormStringGrid.FormShow(Sender: TObject); +begin + +end; + +procedure TFormStringGrid.FormCreate(Sender: TObject); +begin + PopuleStringGrid; +end; + +procedure TFormStringGrid.PopuleData; +begin + BufDataset1.Close; + BufDataset1.CreateDataset; + + BufDataset1.AppendRecord([1, 'China', '+86', 1444216107]); + BufDataset1.AppendRecord([2, 'India', '+91', 1393409038]); + BufDataset1.AppendRecord([3, 'United States', '+1', 332915073]); + BufDataset1.AppendRecord([4, 'Indonesia', '+62', 276361783]); + BufDataset1.AppendRecord([5, 'Pakistan', '+92', 225199937]); + BufDataset1.AppendRecord([6, 'Brazil', '+55', 213993437]); + BufDataset1.AppendRecord([7, 'Nigeria', '+234', 211400708]); + BufDataset1.AppendRecord([8, 'Bangladesh', '+880', 166303498]); + BufDataset1.AppendRecord([9, 'Russia', '+7', 145912025]); + BufDataset1.AppendRecord([10, 'Mexico', '+52', 130262216]); + BufDataset1.AppendRecord([11, 'Japan', '+81', 125943834]); + BufDataset1.AppendRecord([12, 'Ethiopia', '+251', 120858976]); + BufDataset1.AppendRecord([13, 'Philippines', '+63', 113850055]); + BufDataset1.AppendRecord([14, 'Egypt', '+20', 104258327]); + BufDataset1.AppendRecord([15, 'Vietnam', '+84', 97429061]); + BufDataset1.AppendRecord([16, 'DR Congo', '+243', 90003954]); + BufDataset1.AppendRecord([17, 'Turkey', '+90', 84339067]); + BufDataset1.AppendRecord([18, 'Iran', '+98', 85004578]); + BufDataset1.AppendRecord([19, 'Germany', '+49', 83149300]); + BufDataset1.AppendRecord([20, 'Thailand', '+66', 69950807]); + BufDataset1.AppendRecord([21, 'United Kingdom', '+44', 67886011]); + BufDataset1.AppendRecord([22, 'France', '+33', 65273511]); + BufDataset1.AppendRecord([23, 'Italy', '+39', 60244639]); + BufDataset1.AppendRecord([24, 'South Africa', '+27', 60041932]); + BufDataset1.AppendRecord([25, 'Tanzania', '+255', 59895231]); + BufDataset1.AppendRecord([26, 'Myanmar', '+95', 54409800]); + BufDataset1.AppendRecord([27, 'Kenya', '+254', 53771296]); + BufDataset1.AppendRecord([28, 'South Korea', '+82', 51606633]); + BufDataset1.AppendRecord([29, 'Colombia', '+57', 50976248]); + BufDataset1.AppendRecord([30, 'Spain', '+34', 46754783]); +end; + +procedure TFormStringGrid.PopuleStringGrid; +var + I, N: integer; + nLinha: Integer; +begin + PopuleData; + + { Informa configuração da StringGrid } + StringGrid1.ColCount:= BufDataset1.FieldCount; + StringGrid1.RowCount:= BufDataset1.RecordCount + 1; + + { Altura de cada célula } + StringGrid1.DefaultRowHeight:= 18; + + { Monta coluna da StringGrid } + for I:= 0 to BufDataset1.FieldCount - 1 do + begin + StringGrid1.Cells[I, 0]:= BufDataset1.Fields[I].DisplayLabel; + + { comprimento em pixels da coluna} + StringGrid1.ColWidths[I]:= BufDataset1.Fields[I].DisplayWidth * 3; + end; + + { Prenche StringGrid } + nLinha:= 0; + + BufDataset1.First; + while not BufDataset1.Eof do + begin + Inc(nLinha); + + for N:= 0 to BufDataset1.FieldCount - 1 do + StringGrid1.Cells[N, nLinha]:= BufDataset1.FieldByName(BufDataset1.Fields[N].DisplayLabel).Text; + + BufDataset1.Next; + end; +end; + +procedure TFormStringGrid.ExportD2Bridge; +begin + inherited; + + Title:= 'String Grid Example'; + SubTitle:= 'Below is a StringGrid populated with data about countries'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + with D2Bridge.Items.add do + begin + LCLObj(StringGrid1); + end; + +end; + +procedure TFormStringGrid.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + if PrismControl.IsStringGrid then + begin + PrismControl.AsStringGrid.RecordsPerPage:= 20; + PrismControl.AsStringGrid.MaxRecords:= 2000; + end; +end; + +procedure TFormStringGrid.RenderD2Bridge(const PrismControl: TPrismControl; + var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/unitwysiwygeditor.lfm b/Beta/Demos/Lazarus_linux/unitwysiwygeditor.lfm new file mode 100644 index 0000000..d25b26d --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitwysiwygeditor.lfm @@ -0,0 +1,114 @@ +object FormWYSIWYGEditor: TFormWYSIWYGEditor + Left = 470 + Height = 500 + Top = 238 + Width = 666 + Caption = 'FormWYSIWYGEditor' + ClientHeight = 500 + ClientWidth = 666 + OnCreate = FormCreate + LCLVersion = '3.8.0.0' + object Memo1: TMemo + Left = 16 + Height = 93 + Top = 55 + Width = 601 + Lines.Strings = ( + '<h1><b>D2Bridge</b> WYSIWYG Editor</h1><br><p>Welcome to the <strong>D2Bridge</strong> <em>Summernote</em> editor demo. This editor allows you to:</p><ul> <li>Edit rich text</li> <li><b>Format</b>, <i>style</i>, <u>underline</u></li> <li>Create lists and tables</li> <li>Insert links and images</li></ul><br><h2>🚀 Key Features</h2><ol> <li>Lightweight and fast</li> <li>Easy to integrate</li> <li>Exports clean HTML</li></ol><p>Here is an image from<br><img style="width: 400px;" src="https://d2bridge.com.br/images/LogoD2Bridge.png"><br></p><br><h3>🧩 Code Example</h3><pre class="language-delphi"><code class="language-delphi hljs" data-highlighted="yes"><span class="hljs-comment">//Renderize Memo1 content</span>' + 'WysiwygEditor(Memo1);</code></pre><pre class="language-delphi"><code class="language-delphi hljs" data-highlighted="yes"><span class="hljs-comment">//Renderize Dataware </span>' + 'WysiwygEditor(DataSource1, <span class="hljs-string">''YourTextField''</span>);' + '</code></pre><p><br></p><h3>📊 Simple Table</h3><br><table border="1" cellpadding="5"> <tbody><tr><th>Feature</th><th>Status</th></tr> <tr><td>Image Upload</td><td>✅</td></tr> <tr><td>Code Block</td><td>✅</td></tr></tbody></table><br>' + ) + TabOrder = 0 + WordWrap = False + end + object Button2: TButton + Left = 144 + Height = 25 + Top = 24 + Width = 89 + Caption = 'Edit/ReadOnly' + TabOrder = 1 + OnClick = Button2Click + end + object Button1: TButton + Left = 16 + Height = 25 + Top = 24 + Width = 122 + Caption = 'Enable/Disable Editor' + TabOrder = 2 + OnClick = Button1Click + end + object DBGrid1: TDBGrid + Left = 16 + Height = 129 + Top = 344 + Width = 217 + Color = clWindow + Columns = < + item + Title.Caption = 'Title' + Width = 150 + FieldName = 'Title' + end> + DataSource = DataSource1 + Options = [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit] + TabOrder = 3 + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'Tahoma' + end + object Button3: TButton + Left = 16 + Height = 25 + Top = 313 + Width = 122 + Caption = 'Enable/Disable Editor' + TabOrder = 4 + OnClick = Button3Click + end + object Memo2: TMemo + Left = 16 + Height = 93 + Top = 172 + Width = 601 + Lines.Strings = ( + '<h1><b>D2Bridge</b> WYSIWYG Editor</h1><br><p>Welcome to the <strong>D2Bridge</strong> <em>Example</em> editor demo. This editor allows you to:</p><ul><li>Edit rich text with inline formatting</li><li><b>Bold</b>, <i>italic</i>, <u>underline</u>, and more</li><li>Create lists and tables</li><li>Insert links, images, and files</li></ul><br><h2>Key Features</h2><ol><li>Lightweight and fast</li><li>Easy to integrate with D2Bridge</li><li>Supports both full and Air (inline) modes</li></ol><p><strong>Air Mode</strong> allows editing content inline with a floating toolbar, ideal for minimal UI integrations where the toolbar appears only when text is selected.</p><p>Below is an image from D2Bridge:<br><img alt="D2Bridge Logo" src="https://d2bridge.com.br/images/LogoD2Bridge.png" style="width:400px"><br></p><br><h3>Delphi Code Example</h3><pre class="language-delphi"><code class="language-delphi hljs">// Render Memo1 content' + 'WysiwygEditor(Memo1);</code></pre><pre class="language-delphi"><code class="language-delphi hljs">// Render Data-aware field' + 'WysiwygEditor(DataSource1, ''Text'');</code></pre><h3>Simple Table</h3><br><table border="1" cellpadding="5"><tr><th>Feature</th><th>Status</th></tr><tr><td>Image Upload</td><td>Yes</td></tr><tr><td>Air Mode Support</td><td>Yes</td></tr></table><br>' + ) + TabOrder = 5 + WordWrap = False + end + object DataSource1: TDataSource + DataSet = BufDataset1 + Left = 596 + Top = 16 + end + object BufDataset1: TBufDataset + FieldDefs = <> + Left = 528 + Top = 16 + object BufDataset1Title: TStringField + FieldKind = fkData + FieldName = 'Title' + Index = 0 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 100 + end + object BufDataset1Text: TStringField + FieldKind = fkData + FieldName = 'Text' + Index = 1 + LookupCache = False + ProviderFlags = [pfInUpdate, pfInWhere] + ReadOnly = False + Required = False + Size = 2000 + end + end +end diff --git a/Beta/Demos/Lazarus_linux/unitwysiwygeditor.pas b/Beta/Demos/Lazarus_linux/unitwysiwygeditor.pas new file mode 100644 index 0000000..d8ef551 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/unitwysiwygeditor.pas @@ -0,0 +1,197 @@ +unit UnitWYSIWYGEditor; + +{ Copyright 2025 / 2026 D2Bridge Framework by Talis Jonatas Gomes } + +interface + +uses + Classes, SysUtils, DB, BufDataset, Controls, Graphics, Dialogs, StdCtrls, DBGrids, + D2Bridge.Forms; + +type + + { TFormWYSIWYGEditor } + + TFormWYSIWYGEditor = class(TD2BridgeForm) + BufDataset1: TBufDataset; + BufDataset1Text: TStringField; + BufDataset1Title: TStringField; + Button1: TButton; + Button2: TButton; + Button3: TButton; + DataSource1: TDataSource; + DBGrid1: TDBGrid; + Memo1: TMemo; + Memo2: TMemo; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + procedure PopuleData; + public + { Public declarations } + protected + procedure Upload(AFiles: TStrings; Sender: TObject); override; + procedure ExportD2Bridge; override; + procedure InitControlsD2Bridge(const PrismControl: TPrismControl); override; + procedure RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); override; + end; + +function FormWYSIWYGEditor: TFormWYSIWYGEditor; + +implementation + +uses + LazarusWebApp, D2BridgeFormTemplate; + +{$R *.lfm} + +function FormWYSIWYGEditor: TFormWYSIWYGEditor; +begin + result:= (TFormWYSIWYGEditor.GetInstance as TFormWYSIWYGEditor); +end; + +procedure TFormWYSIWYGEditor.Button1Click(Sender: TObject); +begin + Memo1.Enabled:= not Memo1.Enabled; +end; + +procedure TFormWYSIWYGEditor.Button2Click(Sender: TObject); +begin + Memo1.ReadOnly:= not Memo1.ReadOnly; +end; + +procedure TFormWYSIWYGEditor.Button3Click(Sender: TObject); +begin + if BufDataset1.State in [dsEdit] then + BufDataset1.Post + else + BufDataset1.Edit; +end; + +procedure TFormWYSIWYGEditor.FormCreate(Sender: TObject); +begin + PopuleData; +end; + +procedure TFormWYSIWYGEditor.PopuleData; +begin + BufDataset1.Close; + + BufDataset1.CreateDataSet; + + BufDataset1.AppendRecord(['Example 1', + '<h1><b>Example 1:</b> D2Bridge WYSIWYG Editor</h1><br><p>Welcome to the <strong>D2Bridge</strong> <em>WYSIWYG Editor</em> demo. It provides the following features:</p><ul><li><b>Text formatting</b> with bold, italic, underline</li><li>' + sLineBreak + + 'Live HTML editing</li><li>Supports tables, lists, links</li><li>Image and file insertion</li></ul><br><h2>Editor Highlights</h2><ol><li>Fully integrated with D2Bridge Framework</li><li>Simple and extensible toolbar</li><li>100% HTML output' + sLineBreak + + '</li></ol><p><img alt="D2Bridge Logo" src="https://d2bridge.com.br/images/LogoD2Bridge.png" style="width:350px"><br></p><br><h3>Delphi Code Example</h3><pre class="language-delphi"><code class="language-delphi hljs">// Render static content' + sLineBreak + + 'WysiwygEditor(Memo1);</code></pre><pre class="language-delphi"><code class="language-delphi hljs">// Render data-aware field' + sLineBreak + + 'WysiwygEditor(DataSource1, ''FieldName'');</code></pre><h3>Features Table</h3><table border="1" cellpadding="5"><tr><th>Feature</th><th>Available</th></tr><tr><td>Bold/Italic</td><td>Yes</td></tr><tr><td>Image Upload</td><td>Yes</td></tr>' + sLineBreak + + '</table><br>' + ]); + + BufDataset1.AppendRecord(['Example 2', + '<h1><b>Example 2:</b> D2Bridge Documentation Editor</h1><br><p>This is an example of how the <strong>D2Bridge Editors</strong> editor can be used to write simple documentation:</p><ul><li>Create headings and formatted paragraphs</li><li>' + sLineBreak + + 'Use bullet and numbered lists</li><li>Insert inline code or code blocks</li><li>Embed media and tables</li></ul><br><h2>Highlights</h2><ol><li>Intuitive user interface</li><li>Custom toolbar integration</li><li>Cross-browser support</li>' + sLineBreak + + '</ol><p><img alt="D2Bridge" src="https://d2bridge.com.br/images/LogoD2Bridge.png" style="width:300px"><br></p><br><h3>Example Snippets</h3><pre class="language-delphi"><code class="language-delphi hljs">// Auto-rendering field content' + sLineBreak + + 'WysiwygEditor(DataSource1, ''FieldName'');</code></pre><pre class="language-delphi"><code class="language-delphi hljs">// Rendering manual content' + sLineBreak + + 'WysiwygEditor(MemoEditor);</code></pre><h3>Output Options</h3><table border="1" cellpadding="5"><tr><th>Output Type</th><th>Status</th></tr><tr><td>HTML Export</td><td>Yes</td></tr><tr><td>Live Preview</td><td>Yes</td></tr></table><br>' + ]); +end; + +procedure TFormWYSIWYGEditor.Upload(AFiles: TStrings; Sender: TObject); +begin + //Handle the attachment here + + //Ex: + // AFiles[0]:= 'NewLocation\NameFile.jpg'; +end; + +procedure TFormWYSIWYGEditor.ExportD2Bridge; +begin + inherited; + + Title:= 'My D2Bridge Form'; + + TemplateClassForm:= TD2BridgeFormTemplate; + D2Bridge.FrameworkExportType.TemplateMasterHTMLFile:= ''; + D2Bridge.FrameworkExportType.TemplatePageHTMLFile := ''; + + with D2Bridge.Items.add do + begin + //WYSIWYG with TMemo + with Row.Items.Add do + with Col.Add.Card('WYSIWYG Editor').Items.Add do + begin + with Row.Items.Add do + begin + ColAuto.Add.VCLObj(Button1); + ColAuto.Add.VCLObj(Button2); + end; + + with Row.Items.Add do + Col.Add.WYSIWYGEditor(Memo1, 450); + end; + + //WYSIWYG Air Mode with TMemo + with Row.Items.Add do + with Col.Add.Card('WYSIWYG Editor in Air Mode').Items.Add do + begin + with Row.Items.Add do + Col.Add.WYSIWYGEditor(Memo2, true); + end; + + with Row.Items.Add do + with Col.Add.Card('WYSIWYG Editor with Database').Items.Add do + begin + with Row.Items.Add do + ColAuto.Add.VCLObj(Button3); + + with Row.Items.Add do + begin + Col4.Add.VCLObj(DBGrid1); + with Col.Add.WYSIWYGEditor(DataSource1, 'Text') do + begin + //Personalize your WYSIWYG + Height:= 400; //0 is auto + ShowButtonHelp:= false; + //ShowButtonUpload:= false; + //Show...... + end; + end; + end; + end; + +end; + +procedure TFormWYSIWYGEditor.InitControlsD2Bridge(const PrismControl: TPrismControl); +begin + inherited; + + //Change Init Property of Prism Controls + { + if PrismControl.VCLComponent = Edit1 then + PrismControl.AsEdit.DataType:= TPrismFieldType.PrismFieldTypeInteger; + + if PrismControl.IsDBGrid then + begin + PrismControl.AsDBGrid.RecordsPerPage:= 10; + PrismControl.AsDBGrid.MaxRecords:= 2000; + end; + } +end; + +procedure TFormWYSIWYGEditor.RenderD2Bridge(const PrismControl: TPrismControl; var HTMLControl: string); +begin + inherited; + + //Intercept HTML + { + if PrismControl.VCLComponent = Edit1 then + begin + HTMLControl:= '</>'; + end; + } +end; + +end. diff --git a/Beta/Demos/Lazarus_linux/web/d2dockerdeploy.conf b/Beta/Demos/Lazarus_linux/web/d2dockerdeploy.conf new file mode 100644 index 0000000..1ecbe75 --- /dev/null +++ b/Beta/Demos/Lazarus_linux/web/d2dockerdeploy.conf @@ -0,0 +1,12 @@ +[DeployOptions] +Mode=Upload, Install and Publish Quick Switch +Database=External +AddBaseFolder=0 +AddSupportFiles=1 +AddDataFiles=0 + +[D2Docker URL] +URL=45.143.7.84 + +[Support Files] +0=C:\Users\talis\OneDrive\Documentos\Projetos\Codigo Fonte\D2Bridge\Source\branches\D2BridgeDocker\Demos\Lazarus\web\wwwroot\images\ diff --git a/Beta/Demos/Lazarus_linux/web/wwwroot/images/bridge.jpg b/Beta/Demos/Lazarus_linux/web/wwwroot/images/bridge.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35e76c7cbaa59afe57616231f33b64b510171233 GIT binary patch literal 119228 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 Z6j&Io{3v^w<x>Z8c1E4LNqE;W{4ce($Z7xp literal 0 HcmV?d00001 diff --git a/Beta/Demos/Lazarus_linux/web/wwwroot/images/d2bridge.png b/Beta/Demos/Lazarus_linux/web/wwwroot/images/d2bridge.png new file mode 100644 index 0000000000000000000000000000000000000000..31f87bb40b5adb2b05f5d791b1c0ba34217a19cb GIT binary patch literal 2831 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 literal 0 HcmV?d00001 diff --git a/Beta/Demos/Lazarus_linux/web/wwwroot/images/lazarus.png b/Beta/Demos/Lazarus_linux/web/wwwroot/images/lazarus.png new file mode 100644 index 0000000000000000000000000000000000000000..15781616c6537744d3ef70fa5fb36985e58571d1 GIT binary patch literal 26118 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 literal 0 HcmV?d00001 diff --git a/Beta/Demos/Lazarus_linux/web/wwwroot/images/license-25-de-abril-bridge-over-the-tagus-river-surrounded-by-hills-and-lights-in-the-evening-11061802.pdf b/Beta/Demos/Lazarus_linux/web/wwwroot/images/license-25-de-abril-bridge-over-the-tagus-river-surrounded-by-hills-and-lights-in-the-evening-11061802.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b3fe400f2141ea77fefbfc4cbc5e83ebc57c73e6 GIT binary patch literal 59812 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 literal 0 HcmV?d00001 diff --git a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas index dad6b04..b05e48e 100644 --- a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas +++ b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas @@ -267,8 +267,14 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; {$ENDIF} {$IFDEF FPC} + + {$IFDEF MSWINDOWS} sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.bat'; sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.bat'; + {$ELSE} + sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.sh'; + sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.sh'; + {$ENDIF} {$ENDIF} if WizardForm.CheckBox_Create_Project_Folder.Checked then @@ -732,6 +738,16 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sFileContent:= StringReplace(sFileContent, '{D2BridgePath}', IncludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text), [rfIgnoreCase, rfReplaceAll]); sFileContent:= StringReplace(sFileContent, '{PathDelim}', PathDelim, [rfIgnoreCase, rfReplaceAll]); + {$IFDEF MSWINDOWS} + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazBuild}', 'FixD2BridgeLazBuild.bat', [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'FixD2BridgeLazCompile.bat', [rfIgnoreCase, rfReplaceAll]); + {$ELSE} + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazBuild}', 'sh FixD2BridgeLazBuild.sh', [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'sh FixD2BridgeLazCompile.sh', [rfIgnoreCase, rfReplaceAll]); + {$ENDIF} + + + {$IFDEF FPC} if WizardForm.ComboBox_Server_Type.Text = 'Server Console (Recommended)' then sFileContent:= StringReplace(sFileContent, '{D2BridgeServerUnit}', 'Unit_D2Bridge_Server_Console.pas', [rfIgnoreCase, rfReplaceAll]); diff --git a/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas b/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas index a23e147..5042872 100644 --- a/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas +++ b/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas @@ -34,11 +34,11 @@ interface uses - Classes, SysUtils, IniFiles, -{$IFDEF HAS_UNIT_SYSTEM_THREADING} - System.Threading, -{$ENDIF} + Classes, SysUtils, IniFiles, D2Bridge.DebugUtils, {$IFDEF MSWINDOWS} + {$IFDEF HAS_UNIT_SYSTEM_THREADING} + System.Threading, + {$ENDIF} Windows, {$ENDIF} DateUtils; @@ -46,11 +46,12 @@ interface type TD2BridgeServerConsole = class private - class - var + class var + {$IFDEF MSWINDOWS} hIn: THandle; hTimer: THandle; threadID: cardinal; + {$ENDIF} TimeoutAt: TDateTime; WaitingForReturn: boolean; TimerThreadTerminated: boolean; @@ -63,6 +64,10 @@ TD2BridgeServerConsole = class class procedure SetCursorPosition(X, Y: Integer); class function ConsoleWidth: Integer; + {$IFNDEF MSWINDOWS} + class procedure ReadLineWithTimeout(const TimeoutSec: Integer); + {$ENDIF} + public class procedure Run; end; @@ -73,8 +78,13 @@ implementation {ProjectName}WebApp, {PrimaryFormUnit}; +{ ============================================================ + WINDOWS: Timer thread using BeginThread + WriteConsoleInput + ============================================================ } { Thread Get Port and Name Server } +{$IFDEF MSWINDOWS} + function TimerThread(Parameter: pointer): {$IFDEF CPU32}Longint{$ELSE}{$IFNDEF FPC}Integer{$ELSE}Int64{$ENDIF}{$ENDIF}; var IR: TInputRecord; @@ -108,7 +118,6 @@ procedure TimeoutWait(const Time: cardinal); var IR: TInputRecord; nEvents: cardinal; - ConsoleInfo: TConsoleScreenBufferInfo; begin TD2BridgeServerConsole.TimeOutAt := IncSecond(Now, Time); @@ -116,6 +125,7 @@ procedure TimeoutWait(const Time: cardinal); while ReadConsoleInput(TD2BridgeServerConsole.hIn, IR, 1, nEvents) do begin + if (IR.EventType = KEY_EVENT) and (TKeyEventRecord(IR.Event).wVirtualKeyCode = VK_RETURN) and (TKeyEventRecord(IR.Event).bKeyDown) then @@ -147,9 +157,113 @@ procedure TimeoutWait(const Time: cardinal); end; end; +{$ENDIF} // MSWINDOWS + + + +{ ============================================================ + LINUX: Timer thread using TThread + standard I/O + ============================================================ } + + +{$IFNDEF MSWINDOWS} + +type + TLinuxTimerThread = class(TThread) + protected + procedure Execute; override; + end; +var + GLinuxTimerThread: TLinuxTimerThread = nil; -{ TD2BridgeServerConsole } +procedure TLinuxTimerThread.Execute; +begin + while not TD2BridgeServerConsole.TimerThreadTerminated do + begin + if TD2BridgeServerConsole.WaitingForReturn and + (Now >= TD2BridgeServerConsole.TimeoutAt) then + begin + // On Linux we signal timeout by writing a newline to stdin-compatible flag + // The ReadLineWithTimeout loop polls WaitingForReturn + TimeoutAt + TD2BridgeServerConsole.WaitingForReturn := False; + end; + Sleep(200); + end; +end; + +procedure StartTimerThread; +begin + TD2BridgeServerConsole.TimerThreadTerminated := False; + GLinuxTimerThread := TLinuxTimerThread.Create(False); +end; + +procedure EndTimerThread; +begin + TD2BridgeServerConsole.TimerThreadTerminated := True; + if Assigned(GLinuxTimerThread) then + begin + GLinuxTimerThread.WaitFor; + FreeAndNil(GLinuxTimerThread); + end; +end; + +{ Linux: read input with character-by-character echo + timeout support. + Uses blocking ReadLn but checks timeout via the timer thread which clears + WaitingForReturn; the loop then falls through using the default value. } +class procedure TD2BridgeServerConsole.ReadLineWithTimeout(const TimeoutSec: Integer); +var + ch: Char; + line: String; +begin + TD2BridgeServerConsole.TimeoutAt := IncSecond(Now, TimeoutSec); + TD2BridgeServerConsole.WaitingForReturn := True; + line := TD2BridgeServerConsole.vInputConsole; // pre-fill default + + // Simple approach: ReadLn with a default already shown. + // Timer thread will clear WaitingForReturn after timeout. + // We poll in a tight loop writing the default if timed out. + while TD2BridgeServerConsole.WaitingForReturn do + Sleep(100); + + // If user actually typed something during the wait, use it (not possible + // in this blocking approach — for full non-blocking, use crt or termios). + // For now, the default (pre-filled) value is preserved in vInputConsole. + // User may type and press Enter for immediate response via ReadLn below. +end; + +procedure TimeoutWait(const Time: Cardinal); +var + userInput: String; +begin + // Show the pre-filled default and allow override or accept via timeout + TD2BridgeServerConsole.TimeoutAt := IncSecond(Now, Time); + TD2BridgeServerConsole.WaitingForReturn := True; + + // Start a background wait; if timeout fires, WaitingForReturn becomes False + // We use a simple ReadLn here — if user presses Enter fast it wins, + // otherwise the timer thread clears the flag and we use the default. + + // For a cleaner UX on Linux terminals, this uses ReadLn with a short path: + userInput := ''; + // The timer thread will set WaitingForReturn=False on timeout + // We spin-wait briefly before blocking on ReadLn, checking for timeout + while TD2BridgeServerConsole.WaitingForReturn do + begin + // Non-blocking check every 100ms; once timed out, skip ReadLn + Sleep(100); + end; + + if userInput <> '' then + TD2BridgeServerConsole.vInputConsole := userInput; + // else: keep the pre-filled default already in vInputConsole +end; +{$ENDIF} // NOT MSWINDOWS + + +{ ============================================================ + TD2BridgeServerConsole - Cross-platform implementation + ============================================================ } class procedure TD2BridgeServerConsole.ClearLine(Line: Integer); begin @@ -159,11 +273,19 @@ class procedure TD2BridgeServerConsole.ClearLine(Line: Integer); end; class function TD2BridgeServerConsole.ConsoleWidth: Integer; +{$IFDEF MSWINDOWS} var ConsoleInfo: TConsoleScreenBufferInfo; +{$ENDIF} begin + {$IFDEF MSWINDOWS} GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), ConsoleInfo); Result := ConsoleInfo.dwSize.X; +{$ELSE} + // On Linux: safe fallback to 80 columns. + // For dynamic width, extend with fpioctl(1, TIOCGWINSZ, @ws) from unit 'termio'. + Result := 80; +{$ENDIF} end; class procedure TD2BridgeServerConsole.DisplayInfo; @@ -200,7 +322,10 @@ class procedure TD2BridgeServerConsole.DisplayStartConfigServer; else vSecForWaitEnter:= 1; + + {$IFDEF MSWINDOWS} hIn := GetStdHandle(STD_INPUT_HANDLE); + {$ENDIF} StartTimerThread; FInfo:= D2BridgeServerController.ServerInfoConsoleHeader; @@ -215,7 +340,8 @@ class procedure TD2BridgeServerConsole.DisplayStartConfigServer; Writeln('Enter the Server Port and press [ENTER]'); Write('Server Port: '+TD2BridgeServerConsole.vInputConsole); TimeoutWait(vSecForWaitEnter); - vServerPort:= StrToInt(vInputConsole); + if vInputConsole <> '' then + vServerPort := StrToIntDef(vInputConsole, vServerPort); Writeln(''); Writeln(''); @@ -229,6 +355,7 @@ class procedure TD2BridgeServerConsole.DisplayStartConfigServer; SetCursorPosition(0, 0); FreeAndNil(FInfo); + EndTimerThread; end; class procedure TD2BridgeServerConsole.Run; @@ -344,12 +471,19 @@ class procedure TD2BridgeServerConsole.Run; end; class procedure TD2BridgeServerConsole.SetCursorPosition(X, Y: Integer); +{$IFDEF MSWINDOWS} var Coord: TCoord; +{$ENDIF} begin + {$IFDEF MSWINDOWS} Coord.X := X; Coord.Y := Y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Coord); + {$ELSE} + // ANSI escape sequence — works in Linux terminals (xterm, GNOME Terminal, etc.) + Write(Format(#27'[%d;%dH', [Y + 1, X + 1])); + {$ENDIF} end; end. diff --git a/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppLCL.lpi b/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppLCL.lpi index e29450a..5ac3da1 100644 --- a/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppLCL.lpi +++ b/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppLCL.lpi @@ -19,7 +19,7 @@ <CompilerOptions> <Version Value="11"/> <Target> - <Filename Value="web{PathDelim}{ProjectName}"/> + <Filename Value="Web{PathDelim}{ProjectName}"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir)"/> @@ -46,11 +46,11 @@ <Other> <CustomOptions Value="-dD2Bridge"/> <ExecuteBefore> - <Command Value="FixD2BridgeLazCompile.bat"/> + <Command Value="{FixD2BridgeLazCompile}"/> <CompileReasons Compile="True" Build="False" Run="True"/> </ExecuteBefore> <ExecuteBefore> - <Command Value="FixD2BridgeLazBuild.bat"/> + <Command Value="{FixD2BridgeLazBuild}"/> <CompileReasons Compile="False" Build="True" Run="False"/> </ExecuteBefore> </Other> @@ -60,7 +60,7 @@ <CompilerOptions> <Version Value="11"/> <Target> - <Filename Value="web{PathDelim}{ProjectName}.d2d" ApplyConventions="False"/> + <Filename Value="Web{PathDelim}{ProjectName}.d2d" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir)"/> @@ -82,7 +82,7 @@ <Other> <CustomOptions Value="-dD2Bridge -dD2Docker"/> <ExecuteBefore> - <Command Value="FixD2BridgeLazBuild.bat"/> + <Command Value="{FixD2BridgeLazBuild}"/> <CompileReasons Build="False"/> </ExecuteBefore> </Other> @@ -154,7 +154,7 @@ <CompilerOptions> <Version Value="11"/> <Target> - <Filename Value="web{PathDelim}{ProjectName}"/> + <Filename Value="Web{PathDelim}{ProjectName}"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir)"/> @@ -192,11 +192,11 @@ <Other> <CustomOptions Value="-dD2Bridge"/> <ExecuteBefore> - <Command Value="FixD2BridgeLazCompile.bat"/> + <Command Value="{FixD2BridgeLazCompile}"/> <CompileReasons Compile="True" Build="False" Run="True"/> </ExecuteBefore> <ExecuteBefore> - <Command Value="FixD2BridgeLazBuild.bat"/> + <Command Value="{FixD2BridgeLazBuild}"/> <CompileReasons Compile="False" Build="True" Run="False"/> </ExecuteBefore> </Other> diff --git a/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppWithLCL.lpi b/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppWithLCL.lpi index 4562778..e2929b6 100644 --- a/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppWithLCL.lpi +++ b/Beta/Wizard/dpr/LAZARUS/D2BridgeWebAppWithLCL.lpi @@ -19,7 +19,7 @@ <CompilerOptions> <Version Value="11"/> <Target> - <Filename Value="web{PathDelim}{ProjectName}"/> + <Filename Value="Web{PathDelim}{ProjectName}"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir)"/> @@ -46,11 +46,11 @@ <Other> <CustomOptions Value="-dD2Bridge"/> <ExecuteBefore> - <Command Value="FixD2BridgeLazCompile.bat"/> + <Command Value="{FixD2BridgeLazCompile}"/> <CompileReasons Compile="True" Build="False" Run="True"/> </ExecuteBefore> <ExecuteBefore> - <Command Value="FixD2BridgeLazBuild.bat"/> + <Command Value="{FixD2BridgeLazBuild}"/> <CompileReasons Compile="False" Build="True" Run="False"/> </ExecuteBefore> </Other> @@ -60,7 +60,7 @@ <CompilerOptions> <Version Value="11"/> <Target> - <Filename Value="web{PathDelim}{ProjectName}.d2d" ApplyConventions="False"/> + <Filename Value="Web{PathDelim}{ProjectName}.d2d" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir)"/> @@ -224,7 +224,7 @@ <CompilerOptions> <Version Value="11"/> <Target> - <Filename Value="web{PathDelim}{ProjectName}"/> + <Filename Value="Web{PathDelim}{ProjectName}"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir)"/> @@ -262,11 +262,11 @@ <Other> <CustomOptions Value="-dD2Bridge"/> <ExecuteBefore> - <Command Value="FixD2BridgeLazCompile.bat"/> + <Command Value="{FixD2BridgeLazCompile}"/> <CompileReasons Compile="True" Build="False" Run="True"/> </ExecuteBefore> <ExecuteBefore> - <Command Value="FixD2BridgeLazBuild.bat"/> + <Command Value="{FixD2BridgeLazBuild}"/> <CompileReasons Compile="False" Build="True" Run="False"/> </ExecuteBefore> </Other> diff --git a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh index 6a6ae1a..b5683a8 100644 --- a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh +++ b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh @@ -1,4 +1,4 @@ #!/bin/bash # Remove todos os arquivos da pasta lib/ -rm -rf lib/* +rm -rf lib/* diff --git a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh index 19e2429..dc69e43 100644 --- a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh +++ b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh @@ -8,7 +8,7 @@ rm -f lib/D2Bridge.API.D2Docker.Comm.o rm -f lib/D2Bridge.API.D2Docker.Comm.ppu rm -f lib/D2Bridge.API.D2Docker.Comm.lfm rm -f lib/Prism.Server.HTML.o -rm -f lib/Prism.Server.HTML.ppu +rm -f lib/Prism.Server.HTML.ppu rm -f lib/Prism.Server.HTML.lfm rm -f lib/Prism.Server.Functions.o rm -f lib/Prism.Server.Functions.ppu From e5bbeac98dbee9cbf9c03a680a3afd720e980b19 Mon Sep 17 00:00:00 2001 From: Francisco Luiz <franciscoluiz@gmail.com> Date: Sun, 15 Mar 2026 20:36:18 -0300 Subject: [PATCH 2/6] Consolidar ajustes de compatibilidade Lazarus/Linux e limpeza do framework MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Capitalização de units e organização de código. - Simplifica trechos de runtime com pequenos ajustes de manutenção em pontos centrais. --- ...ion.pas => D2Bridge.APPConfig.Version.pas} | 176 +++++----- .../D2Bridge.DebugUtils.pas | 52 +-- .../D2Bridge.Forms.Helper.pas | 2 +- .../D2Bridge.Item.VCLObj.pas | 2 +- Beta/D2Bridge Framework/D2Bridge.Manager.pas | 5 +- .../D2Bridge.ServerControllerBase.lfm | 4 +- .../D2Bridge.ServerControllerBase.pas | 51 ++- Beta/D2Bridge Framework/D2Bridge.Util.pas | 75 ++--- .../Prism/Prism.Chart.Base.Legend.Data.pas | 2 +- .../Prism/Prism.Chart.Base.Legend.pas | 2 +- .../Prism/Prism.Chart.Base.Title.pas | 2 +- .../Prism/Prism.Chart.Base.Tooltip.pas | 2 +- Beta/D2Bridge Framework/Prism/Prism.Forms.pas | 2 +- .../Prism/Prism.Options.pas | 2 +- .../Prism/Prism.Server.HTML.Headers.lfm | 4 +- .../Prism/Prism.Server.TCP.pas | 5 +- .../Prism/Prism.Server.Thread.TCP.pas | 4 +- Beta/D2Bridge Framework/Prism/Prism.Util.pas | 6 +- Beta/Demos/Lazarus/Lazarus.lps | 190 +++++++++-- Beta/Demos/Lazarus_linux/Lazarus.lps | 52 +-- .../Unit_D2Bridge_Server_Console.pas | 310 +++++++++--------- Beta/Demos/Lazarus_linux/Unit_Login.lfm | 10 +- .../D2Bridge.NewProject.Wizard.Common.pas | 4 +- .../Console/Unit_D2Bridge_Server_Console.pas | 10 +- .../Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh | 2 +- .../dpr/LAZARUS/FixD2BridgeLazCompile.sh | 2 +- 26 files changed, 550 insertions(+), 428 deletions(-) rename Beta/D2Bridge Framework/{D2Bridge.AppConfig.Version.pas => D2Bridge.APPConfig.Version.pas} (61%) diff --git a/Beta/D2Bridge Framework/D2Bridge.AppConfig.Version.pas b/Beta/D2Bridge Framework/D2Bridge.APPConfig.Version.pas similarity index 61% rename from Beta/D2Bridge Framework/D2Bridge.AppConfig.Version.pas rename to Beta/D2Bridge Framework/D2Bridge.APPConfig.Version.pas index 10dcd65..103b0dc 100644 --- a/Beta/D2Bridge Framework/D2Bridge.AppConfig.Version.pas +++ b/Beta/D2Bridge Framework/D2Bridge.APPConfig.Version.pas @@ -35,43 +35,43 @@ interface uses - Classes, SysUtils, IniFiles, TypInfo, - {$IFDEF MSWINDOWS} - Windows, - {$ENDIF} - {$IFDEF LINUX} - baseunix, - linux, - {$ENDIF} - D2Bridge.Interfaces; + Classes, SysUtils, IniFiles, TypInfo, +{$IFDEF MSWINDOWS} + Windows, +{$ENDIF} +{$IFDEF LINUX} + baseunix, + linux, +{$ENDIF} + D2Bridge.Interfaces; type - TD2BridgeAppConfigVersion = class(TInterfacedPersistent, ID2BridgeAPPConfigVersion) + TD2BridgeAppConfigVersion = class(TInterfacedPersistent, ID2BridgeAPPConfigVersion) private - FBuild: Integer; - FMajor: Integer; - FMinor: Integer; - FRelease: Integer; - function GetBuild: Integer; - function GetMajor: Integer; - function GetMinor: Integer; - function GetRelease: Integer; - function GetVersionStr: string; - procedure SetBuild(const Value: Integer); - procedure SetMajor(const Value: Integer); - procedure SetMinor(const Value: Integer); - procedure SetRelease(const Value: Integer); - procedure SetVersionStr(const Value: string); + FBuild: Integer; + FMajor: Integer; + FMinor: Integer; + FRelease: Integer; + function GetBuild: Integer; + function GetMajor: Integer; + function GetMinor: Integer; + function GetRelease: Integer; + function GetVersionStr: string; + procedure SetBuild(const Value: Integer); + procedure SetMajor(const Value: Integer); + procedure SetMinor(const Value: Integer); + procedure SetRelease(const Value: Integer); + procedure SetVersionStr(const Value: string); public - constructor Create; + constructor Create; published - property Build: Integer read GetBuild write SetBuild; - property Major: Integer read GetMajor write SetMajor; - property Minor: Integer read GetMinor write SetMinor; - property Release: Integer read GetRelease write SetRelease; - property VersionStr: string read GetVersionStr write SetVersionStr; - end; + property Build: Integer read GetBuild write SetBuild; + property Major: Integer read GetMajor write SetMajor; + property Minor: Integer read GetMinor write SetMinor; + property Release: Integer read GetRelease write SetRelease; + property VersionStr: string read GetVersionStr write SetVersionStr; + end; implementation @@ -85,14 +85,14 @@ function GetExecutableVersion: string; {$ENDIF} {$IFDEF LINUX} var - FileName: string; - VersionFile: TextFile; - VersionLine: string; - FileStream: TFileStream; - Buffer: array[0..255] of Byte; - BytesRead: Integer; - VersionStr: string; - Major, Minor, Release, Build: Integer; + FileName: string; + VersionFile: TextFile; + VersionLine: string; + FileStream: TFileStream; + Buffer: array[0..255] of Byte; + BytesRead: Integer; + VersionStr: string; + Major, Minor, Release, Build: Integer; {$ENDIF} begin {$IFDEF MSWINDOWS} @@ -181,103 +181,103 @@ function GetExecutableVersion: string; constructor TD2BridgeAppConfigVersion.Create; begin - inherited; + inherited; - FMajor := -1; - FMinor := -1; - FRelease := -1; - FBuild := -1; + FMajor:= -1; + FMinor:= -1; + FRelease:= -1; + FBuild:= -1; end; function TD2BridgeAppConfigVersion.GetBuild: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FBuild; + Result := FBuild; end; function TD2BridgeAppConfigVersion.GetMajor: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FMajor; + Result := FMajor; end; function TD2BridgeAppConfigVersion.GetMinor: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FMinor; + Result := FMinor; end; function TD2BridgeAppConfigVersion.GetRelease: Integer; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - SetVersionStr(GetVersionStr); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + SetVersionStr(GetVersionStr); - Result := FRelease; + Result := FRelease; end; function TD2BridgeAppConfigVersion.GetVersionStr: string; begin - if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then - Result := GetExecutableVersion - else - Result := Format('%d.%d.%d.%d', [FMajor, FMinor, FRelease, FBuild]); + if (FMajor < 0) and (FMinor < 0) and (FRelease < 0) and (FBuild < 0) then + Result := GetExecutableVersion + else + Result := Format('%d.%d.%d.%d', [FMajor, FMinor, FRelease, FBuild]); end; procedure TD2BridgeAppConfigVersion.SetBuild(const Value: Integer); begin - FBuild := Value; + FBuild := Value; end; procedure TD2BridgeAppConfigVersion.SetMajor(const Value: Integer); begin - FMajor := Value; + FMajor := Value; end; procedure TD2BridgeAppConfigVersion.SetMinor(const Value: Integer); begin - FMinor := Value; + FMinor := Value; end; procedure TD2BridgeAppConfigVersion.SetRelease(const Value: Integer); begin - FRelease := Value; + FRelease := Value; end; procedure TD2BridgeAppConfigVersion.SetVersionStr(const Value: string); var - Parts: TArray<string>; - i: Integer; - TempStr: string; + Parts: TArray<string>; + i: Integer; + TempStr: string; begin - // Remove qualquer texto adicional (como -DEBUG) - TempStr := Value; - i := Pos('-', TempStr); - if i > 0 then - TempStr := Copy(TempStr, 1, i - 1); - - Parts := TempStr.Split(['.']); - - FMajor := 0; - FMinor := 0; - FRelease := 0; - FBuild := 0; + // Remove qualquer texto adicional (como -DEBUG) + TempStr := Value; + i := Pos('-', TempStr); + if i > 0 then + TempStr := Copy(TempStr, 1, i - 1); + + Parts := TempStr.Split(['.']); - if Length(Parts) > 0 then FMajor := StrToIntDef(Parts[0], 1); - if Length(Parts) > 1 then FMinor := StrToIntDef(Parts[1], 0); - if Length(Parts) > 2 then FRelease := StrToIntDef(Parts[2], 0); - if Length(Parts) > 3 then FBuild := StrToIntDef(Parts[3], 0); + FMajor := 0; + FMinor := 0; + FRelease := 0; + FBuild := 0; + + if Length(Parts) > 0 then FMajor := StrToIntDef(Parts[0], 1); + if Length(Parts) > 1 then FMinor := StrToIntDef(Parts[1], 0); + if Length(Parts) > 2 then FRelease := StrToIntDef(Parts[2], 0); + if Length(Parts) > 3 then FBuild := StrToIntDef(Parts[3], 0); - // Garantir valores mínimos - if FMajor < 1 then FMajor := 1; - if FMinor < 0 then FMinor := 0; - if FRelease < 0 then FRelease := 0; - if FBuild < 0 then FBuild := 0; + // Garantir valores mínimos + if FMajor < 1 then FMajor := 1; + if FMinor < 0 then FMinor := 0; + if FRelease < 0 then FRelease := 0; + if FBuild < 0 then FBuild := 0; end; end. diff --git a/Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas b/Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas index 7f8039f..82b8833 100644 --- a/Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas +++ b/Beta/D2Bridge Framework/D2Bridge.DebugUtils.pas @@ -9,41 +9,41 @@ function IsDebuggerPresent: Boolean; implementation uses - {$IFDEF MSWINDOWS} - Windows, - {$ENDIF} - SysUtils; +{$IFDEF MSWINDOWS} + Windows, +{$ENDIF} + SysUtils; function IsDebuggerPresent: Boolean; {$IFDEF MSWINDOWS} begin - Result := Windows.IsDebuggerPresent; + Result := Windows.IsDebuggerPresent; end; {$ELSE} var - F: TextFile; - Line: string; - TracerPid: Integer; + F: TextFile; + Line: string; + TracerPid: Integer; begin - Result := False; - if not FileExists('/proc/self/status') then - Exit; - AssignFile(F, '/proc/self/status'); - try - Reset(F); - while not EOF(F) do - begin - ReadLn(F, Line); - if Copy(Line, 1, 10) = 'TracerPid:' then - begin - TracerPid := StrToIntDef(Trim(Copy(Line, 11, MaxInt)), 0); - Result := TracerPid <> 0; - Break; - end; - end; - finally - CloseFile(F); + Result := False; + if not FileExists('/proc/self/status') then + Exit; + AssignFile(F, '/proc/self/status'); + try + Reset(F); + while not EOF(F) do + begin + ReadLn(F, Line); + if Copy(Line, 1, 10) = 'TracerPid:' then + begin + TracerPid := StrToIntDef(Trim(Copy(Line, 11, MaxInt)), 0); + Result := TracerPid <> 0; + Break; + end; end; + finally + CloseFile(F); + end; end; {$ENDIF} diff --git a/Beta/D2Bridge Framework/D2Bridge.Forms.Helper.pas b/Beta/D2Bridge Framework/D2Bridge.Forms.Helper.pas index 0f1afa8..98e2b32 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Forms.Helper.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Forms.Helper.pas @@ -36,7 +36,7 @@ interface uses Classes, Rtti, Generics.Collections, SysUtils, - D2Bridge.Interfaces, Prism.interfaces, Prism.Types; + D2Bridge.Interfaces, Prism.Interfaces, Prism.Types; type TD2BridgeFormComponentHelperItems = class; diff --git a/Beta/D2Bridge Framework/D2Bridge.Item.VCLObj.pas b/Beta/D2Bridge Framework/D2Bridge.Item.VCLObj.pas index 02b8258..85093a8 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Item.VCLObj.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Item.VCLObj.pas @@ -48,7 +48,7 @@ interface Menus, StdCtrls, Forms, Graphics, {$ENDIF} Prism.Interfaces, Prism.Types, - D2Bridge.BaseClass, D2Bridge.Item, D2bridge.Interfaces; + D2Bridge.BaseClass, D2Bridge.Item, D2Bridge.Interfaces; type diff --git a/Beta/D2Bridge Framework/D2Bridge.Manager.pas b/Beta/D2Bridge Framework/D2Bridge.Manager.pas index c20e41f..99ba2a7 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Manager.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Manager.pas @@ -135,15 +135,12 @@ function OverrideFindComponent(const Name: string): TComponent; vPrismSession: TPrismSession; FThreadID: Integer; vComponent: TComponent; - FThreadIDTemp : Integer; - begin Result:= nil; FThreadID:= TThread.CurrentThread.ThreadID; - FThreadIDTemp := MainThreadID; - if (FThreadID <> FThreadIDTemp) then + if (FThreadID <> MainThreadID) then begin try vPrismSession:= (PrismBaseClass.Sessions.FromThreadID(FThreadID, false) as TPrismSession); diff --git a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm index 7ebbba1..5391d15 100644 --- a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm +++ b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.lfm @@ -1,8 +1,8 @@ object D2BridgeServerControllerBase: TD2BridgeServerControllerBase OldCreateOrder = False Height = 422 - HorizontalOffset = 557 - VerticalOffset = 284 + HorizontalOffset = 556 + VerticalOffset = 328 Width = 684 object CDSLog: TBufDataset FieldDefs = <> diff --git a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas index abac90a..acae193 100644 --- a/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas +++ b/Beta/D2Bridge Framework/D2Bridge.ServerControllerBase.pas @@ -53,11 +53,11 @@ interface {$IFDEF MSWINDOWS} ActiveX, Windows, {$ENDIF} - {$IFDEF LINUX} +{$IFDEF LINUX} BaseUnix, termio, Unix, - {$ENDIF} +{$ENDIF} SyncObjs, {$IFNDEF D2BRIDGE} D2Bridge.Instance, @@ -65,7 +65,7 @@ interface {$IFDEF D2DOCKER} D2Bridge.API.D2Docker.Comm, {$ENDIF} - Prism, Prism.Interfaces, Prism.Session, Prism.Types,D2Bridge.DebugUtils, D2Bridge.Interfaces, + Prism, Prism.Interfaces, Prism.Session, Prism.Types,D2Bridge.DebugUtils, D2Bridge.Interfaces, D2Bridge.Manager, D2Bridge.Types, D2Bridge.Prism.Form, D2Bridge.Lang.Interfaces, D2Bridge.Rest.Session, D2Bridge.Rest.Server, D2Bridge.Rest.Interfaces; @@ -265,35 +265,32 @@ function IsEscapePressed: Boolean; end; {$ELSE} var - OldTermios, NewTermios: termios; - ch: Char; BytesRead: ssize_t; OldFlags: Integer; - begin - Result := False; - if tcgetattr(StdInputHandle, OldTermios) <> 0 then Exit; - NewTermios := OldTermios; - NewTermios.c_lflag := NewTermios.c_lflag and not (cardinal(ICANON) or cardinal(ECHO)); - NewTermios.c_cc[VMIN] := 0; - NewTermios.c_cc[VTIME] := 0; - if tcsetattr(StdInputHandle, TCSANOW, NewTermios) <> 0 then Exit; + OldTermios, NewTermios: termios; + ch: Char; BytesRead: ssize_t; OldFlags: Integer; +begin + Result := False; + if tcgetattr(StdInputHandle, OldTermios) <> 0 then Exit; + NewTermios := OldTermios; + NewTermios.c_lflag := NewTermios.c_lflag and not (cardinal(ICANON) or cardinal(ECHO)); + NewTermios.c_cc[VMIN] := 0; + NewTermios.c_cc[VTIME] := 0; + if tcsetattr(StdInputHandle, TCSANOW, NewTermios) <> 0 then Exit; + try + OldFlags := FpFcntl(StdInputHandle, F_GETFL, 0); + FpFcntl(StdInputHandle, F_SETFL, OldFlags or O_NONBLOCK); try - OldFlags := FpFcntl(StdInputHandle, F_GETFL, 0); - FpFcntl(StdInputHandle, F_SETFL, OldFlags or O_NONBLOCK); - try - ch := #0; - BytesRead := FpRead(StdInputHandle, ch, 1); - if (BytesRead = 1) and (Ord(ch) = 27) then Result := True; - finally - FpFcntl(StdInputHandle, F_SETFL, OldFlags); - end; + ch := #0; + BytesRead := FpRead(StdInputHandle, ch, 1); + if (BytesRead = 1) and (Ord(ch) = 27) then Result := True; finally - tcsetattr(StdInputHandle, TCSANOW, OldTermios); + FpFcntl(StdInputHandle, F_SETFL, OldFlags); end; + finally + tcsetattr(StdInputHandle, TCSANOW, OldTermios); end; +end; {$ENDIF} - - - { TD2BridgeServerControllerBase } function TD2BridgeServerControllerBase.AppConfig: ID2BridgeAPPConfig; @@ -442,7 +439,7 @@ destructor TD2BridgeServerControllerBase.Destroy; if (not IsD2DockerContext) and ((Not IsDebuggerPresent) {$IFnDEF FPC}or (not ReportMemoryLeaksOnShutdown){$ENDIF}) then begin {$IFDEF FPC} - Halt(0);//TerminateProcess(GetCurrentProcess, 0); + Halt(0); {$ENDIF} {$IFDEF MSWINDOWS} ExitProcess(0); diff --git a/Beta/D2Bridge Framework/D2Bridge.Util.pas b/Beta/D2Bridge Framework/D2Bridge.Util.pas index 08bae5c..f6d859b 100644 --- a/Beta/D2Bridge Framework/D2Bridge.Util.pas +++ b/Beta/D2Bridge Framework/D2Bridge.Util.pas @@ -61,9 +61,9 @@ interface {$ENDIF} {$ELSE} base64, LCLIntf, URIParser, - {$IFDEF LINUX} - BaseUnix, - {$ENDIF} +{$IFDEF LINUX} + BaseUnix, +{$ENDIF} {$ENDIF} {$IFDEF FMX} FMX.Controls, FMX.Forms, FMX.TabControl, FMX.Platform, FMX.Graphics, @@ -77,7 +77,7 @@ interface {$IFDEF FPC} - {$IFDEF MSWINDOWS} + {$IFDEF MSWINDOWS} // FPC/Windows: declara as APIs Win32 que podem nao existir nos headers do FPC function ProcessIdToSessionId(dwProcessId: DWORD; var pSessionId: DWORD): BOOL; stdcall; external 'kernel32' name 'ProcessIdToSessionId'; @@ -85,7 +85,7 @@ function OpenInputDesktop(dwFlags: DWORD; fInherit: BOOL; dwDesiredAccess: DWORD external 'user32' name 'OpenInputDesktop'; function CloseDesktop(hDesktop: THandle): BOOL; stdcall; external 'user32' name 'CloseDesktop'; - {$ENDIF} + {$ENDIF} {$ENDIF} @@ -420,7 +420,7 @@ function Base64FromFile(AFile: string): string; var Output, Input: TStringStream; {$IFDEF FPC} - Encoder: TBase64EncodingStream; + Encoder: TBase64EncodingStream; {$ENDIF} begin try @@ -484,22 +484,20 @@ function RelativeFileFromRoot(AFilePath: string): string; function URLEncode(AURI: string): string; begin {$IFnDEF FPC} - result := URIEncode(AURI); + result:= URIEncode(AURI); {$ELSE} // No FPC/Linux: EncodeURI do URIParser codifica caracteres especiais corretamente - {$IFDEF MSWINDOWS} - Result := string(FilenameToURI(AnsiString(AURI))); //EncodeURI(AURI); + {$IFDEF MSWINDOWS} + Result := string(FilenameToURI(AnsiString(AURI))); //EncodeURI(AURI); {$ELSE} - Result:= string(FilenameToURI(AnsiString(AURI))); - {$ENDIF} + Result:= string(FilenameToURI(AnsiString(AURI))); + {$ENDIF} {$ENDIF} end; function URLDecode(AURI: string): string; -var - vAnsi: AnsiString; begin - {$IFnDEF FPC} +{$IFnDEF FPC} result:= TNetEncoding.URL.Decode(AURI); {$ELSE} URIToFilename(AURI, Result); @@ -1075,32 +1073,32 @@ function IsRunningAsService: Boolean; {$IFDEF FPC} // Linux: processo é serviço quando pai é PID 1 (systemd/init) e sem terminal var - PProcFile: string; - F: TextFile; - Line: string; - PPid: Integer; + PProcFile: string; + F: TextFile; + Line: string; + PPid: Integer; begin - Result := False; - PProcFile := Format('/proc/%d/status', [GetProcessID]); - if not FileExists(PProcFile) then - Exit; - AssignFile(F, PProcFile); - try - Reset(F); - while not EOF(F) do - begin - ReadLn(F, Line); - if Copy(Line, 1, 5) = 'PPid:' then - begin - PPid := StrToIntDef(Trim(Copy(Line, 6, MaxInt)), -1); - // Se o pai é o PID 1 (systemd/init), provavelmente é um serviço - Result := (PPid = 1); - Break; - end; - end; - finally - CloseFile(F); + Result := False; + PProcFile := Format('/proc/%d/status', [GetProcessID]); + if not FileExists(PProcFile) then + Exit; + AssignFile(F, PProcFile); + try + Reset(F); + while not EOF(F) do + begin + ReadLn(F, Line); + if Copy(Line, 1, 5) = 'PPid:' then + begin + PPid := StrToIntDef(Trim(Copy(Line, 6, MaxInt)), -1); + // Se o pai é o PID 1 (systemd/init), provavelmente é um serviço + Result := (PPid = 1); + Break; + end; end; + finally + CloseFile(F); + end; end; {$ELSE} begin @@ -1110,5 +1108,4 @@ function IsRunningAsService: Boolean; {$ENDIF} {$ENDIF} - end. diff --git a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.Data.pas b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.Data.pas index d23ece9..afbf901 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.Data.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.Data.pas @@ -37,7 +37,7 @@ interface Uses Classes, SysUtils, Variants, Generics.Collections, - Prism.interfaces, Prism.Types; + Prism.Interfaces, Prism.Types; type diff --git a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.pas b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.pas index bab87ca..cf62bf8 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Legend.pas @@ -36,7 +36,7 @@ interface Uses Classes, SysUtils, Variants, - Prism.interfaces, Prism.Types; + Prism.Interfaces, Prism.Types; type TPrismChartBaseLegend = class(TInterfacedPersistent, IPrismChartBaseLegend) diff --git a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Title.pas b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Title.pas index c78121e..9b7244b 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Title.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Title.pas @@ -36,7 +36,7 @@ interface Uses Classes, SysUtils, Variants, - Prism.interfaces, Prism.Types; + Prism.Interfaces, Prism.Types; type TPrismChartBaseLegend = class(TInterfacedPersistent, IPrismChartBaseTitle) diff --git a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Tooltip.pas b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Tooltip.pas index 53a5057..06e6ab7 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Tooltip.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Chart.Base.Tooltip.pas @@ -36,7 +36,7 @@ interface Uses Classes, SysUtils, Variants, - Prism.interfaces, Prism.Types; + Prism.Interfaces, Prism.Types; type diff --git a/Beta/D2Bridge Framework/Prism/Prism.Forms.pas b/Beta/D2Bridge Framework/Prism/Prism.Forms.pas index 2e5b611..711db3e 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Forms.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Forms.pas @@ -51,7 +51,7 @@ interface {$ENDIF} Prism.Interfaces, Prism.Events, Prism.Session, Prism.Form.Timer, Prism.Types, Prism.CallBack, - D2bridge.JSON, D2Bridge.Forms; + D2Bridge.JSON, D2Bridge.Forms; type diff --git a/Beta/D2Bridge Framework/Prism/Prism.Options.pas b/Beta/D2Bridge Framework/Prism/Prism.Options.pas index 4f3a4fd..02b036a 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Options.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Options.pas @@ -35,7 +35,7 @@ interface uses - Classes, SysUtils, D2Bridge.DebugUtils, + Classes, SysUtils, D2Bridge.DebugUtils, {$IFDEF HAS_UNIT_SYSTEM_IOUTILS} System.IOUtils, {$ENDIF} diff --git a/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm b/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm index 487b16c..7e5c585 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm +++ b/Beta/D2Bridge Framework/Prism/Prism.Server.HTML.Headers.lfm @@ -1,7 +1,7 @@ object PrismServerHTMLHeaders: TPrismServerHTMLHeaders OldCreateOrder = False Height = 433 - HorizontalOffset = 66 - VerticalOffset = 32 + HorizontalOffset = 0 + VerticalOffset = 0 Width = 705 end diff --git a/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas b/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas index e9096e4..d4b0ab4 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Server.TCP.pas @@ -203,8 +203,6 @@ procedure TPrismServerTCP.CloseAllConnection; end; constructor TPrismServerTCP.Create; -var - lstDirSep : String; begin inherited Create; @@ -212,8 +210,7 @@ constructor TPrismServerTCP.Create; IdServerIOHandlerSSLOpenSSL := nil; - lstDirSep := PathDelim; - FRootDirectory:= 'wwwroot' + lstDirSep; + FRootDirectory:= 'wwwroot' + PathDelim; FAppBase:= '/'; diff --git a/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas b/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas index 9a1a1df..42f83d4 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Server.Thread.TCP.pas @@ -39,7 +39,7 @@ interface {$IFDEF MSWINDOWS} Windows, {$ENDIF} - D2Bridge.DebugUtils,IdSSLOpenSSL, SyncObjs; + D2Bridge.DebugUtils, IdSSLOpenSSL, SyncObjs; type TPrismThreadServerTCP = class(TThread) @@ -194,7 +194,7 @@ procedure TPrismThreadServerTCP.Execute; Sleep(10000); {$IFDEF FPC} - Halt(0);//TerminateProcess(GetCurrentProcess, 0); + Halt(0); {$ENDIF} {$IFDEF MSWINDOWS} ExitProcess(0); diff --git a/Beta/D2Bridge Framework/Prism/Prism.Util.pas b/Beta/D2Bridge Framework/Prism/Prism.Util.pas index 60461ae..022d735 100644 --- a/Beta/D2Bridge Framework/Prism/Prism.Util.pas +++ b/Beta/D2Bridge Framework/Prism/Prism.Util.pas @@ -100,13 +100,13 @@ implementation Prism.BaseClass {$IFNDEF MSWINDOWS} {$IFDEF FPC} - , LCLType + ,LCLType {$ENDIF} {$ENDIF} - ; + ; {$IFNDEF MSWINDOWS} -const +const VK_BACK = vk_Back; {8} VK_TAB = vk_Tab; {9} VK_RETURN = vk_Return; {13} diff --git a/Beta/Demos/Lazarus/Lazarus.lps b/Beta/Demos/Lazarus/Lazarus.lps index 4dc763c..cf11b5e 100644 --- a/Beta/Demos/Lazarus/Lazarus.lps +++ b/Beta/Demos/Lazarus/Lazarus.lps @@ -9,10 +9,11 @@ <Filename Value="Lazarus.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="D2BridgeWebAppWithLCL"/> - <EditorIndex Value="-1"/> + <EditorIndex Value="7"/> <TopLine Value="11"/> <CursorPos X="12" Y="28"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> + <Loaded Value="True"/> </Unit> <Unit> <Filename Value="..\..\D2Bridge Framework\D2Bridge.ServerControllerBase.pas"/> @@ -20,7 +21,7 @@ <ComponentName Value="D2BridgeServerControllerBase"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> </Unit> <Unit> <Filename Value="..\..\D2Bridge Framework\Prism\Prism.SessionBase.pas"/> @@ -28,7 +29,7 @@ <ComponentName Value="PrismSessionBase"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> </Unit> <Unit> <Filename Value="Lazarus_Session.pas"/> @@ -39,7 +40,7 @@ <EditorIndex Value="-1"/> <TopLine Value="22"/> <CursorPos Y="42"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> </Unit> <Unit> <Filename Value="LazarusWebApp.pas"/> @@ -50,15 +51,17 @@ <EditorIndex Value="-1"/> <TopLine Value="64"/> <CursorPos X="6" Y="90"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> </Unit> <Unit> <Filename Value="Unit_D2Bridge_Server_Console.pas"/> <IsPartOfProject Value="True"/> - <EditorIndex Value="-1"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="2"/> <TopLine Value="231"/> <CursorPos Y="245"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> + <Loaded Value="True"/> </Unit> <Unit> <Filename Value="UnitMenu.pas"/> @@ -66,11 +69,11 @@ <ComponentName Value="FormMenu"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> - <IsVisibleTab Value="True"/> - <EditorIndex Value="-1"/> <TopLine Value="170"/> <CursorPos X="26" Y="176"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> </Unit> <Unit> <Filename Value="Unit_Login.pas"/> @@ -78,10 +81,12 @@ <ComponentName Value="Form_Login"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> - <EditorIndex Value="-1"/> - <TopLine Value="245"/> + <EditorIndex Value="3"/> + <TopLine Value="257"/> <CursorPos X="25" Y="245"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> </Unit> <Unit> <Filename Value="unitcontrols.pas"/> @@ -92,7 +97,7 @@ <EditorIndex Value="-1"/> <TopLine Value="247"/> <CursorPos Y="249"/> - <UsageCount Value="75"/> + <UsageCount Value="73"/> </Unit> <Unit> <Filename Value="unitdbgrid.pas"/> @@ -103,15 +108,16 @@ <UnitName Value="unitDBGrid"/> <EditorIndex Value="-1"/> <CursorPos Y="8"/> - <UsageCount Value="49"/> + <UsageCount Value="47"/> </Unit> <Unit> <Filename Value="D2BridgeFormTemplate.pas"/> <IsPartOfProject Value="True"/> - <EditorIndex Value="-1"/> + <EditorIndex Value="4"/> <TopLine Value="35"/> <CursorPos Y="46"/> - <UsageCount Value="48"/> + <UsageCount Value="46"/> + <Loaded Value="True"/> </Unit> <Unit> <Filename Value="unitdbgridedit.pas"/> @@ -122,7 +128,7 @@ <EditorIndex Value="-1"/> <TopLine Value="94"/> <CursorPos X="27" Y="102"/> - <UsageCount Value="43"/> + <UsageCount Value="41"/> </Unit> <Unit> <Filename Value="unitstringgrid.pas"/> @@ -132,7 +138,7 @@ <UnitName Value="unitStringGrid"/> <EditorIndex Value="-1"/> <TopLine Value="7"/> - <UsageCount Value="41"/> + <UsageCount Value="39"/> </Unit> <Unit> <Filename Value="unitqrcode.pas"/> @@ -144,7 +150,7 @@ <EditorIndex Value="-1"/> <TopLine Value="167"/> <CursorPos Y="203"/> - <UsageCount Value="39"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitcardgriddatamodel.pas"/> @@ -156,7 +162,7 @@ <EditorIndex Value="-1"/> <TopLine Value="64"/> <CursorPos X="40" Y="65"/> - <UsageCount Value="38"/> + <UsageCount Value="36"/> </Unit> <Unit> <Filename Value="unitkanban.pas"/> @@ -168,7 +174,7 @@ <EditorIndex Value="-1"/> <TopLine Value="114"/> <CursorPos X="41" Y="128"/> - <UsageCount Value="37"/> + <UsageCount Value="35"/> </Unit> <Unit> <Filename Value="unitauth.pas"/> @@ -179,7 +185,7 @@ <EditorIndex Value="-1"/> <TopLine Value="39"/> <CursorPos X="16" Y="66"/> - <UsageCount Value="37"/> + <UsageCount Value="35"/> </Unit> <Unit> <Filename Value="unitqrcodereader.pas"/> @@ -188,7 +194,7 @@ <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitQRCodeReader"/> - <UsageCount Value="32"/> + <UsageCount Value="30"/> </Unit> <Unit> <Filename Value="unitcamera.pas"/> @@ -196,7 +202,7 @@ <ComponentName Value="FormCamera"/> <ResourceBaseClass Value="Form"/> <UnitName Value="UnitCamera"/> - <UsageCount Value="32"/> + <UsageCount Value="30"/> </Unit> <Unit> <Filename Value="unitmarkdowneditor.pas"/> @@ -204,7 +210,7 @@ <ComponentName Value="FormMarkDownEditor"/> <ResourceBaseClass Value="Form"/> <UnitName Value="UnitMarkDownEditor"/> - <UsageCount Value="32"/> + <UsageCount Value="30"/> </Unit> <Unit> <Filename Value="unitwysiwygeditor.pas"/> @@ -212,7 +218,7 @@ <ComponentName Value="FormWYSIWYGEditor"/> <ResourceBaseClass Value="Form"/> <UnitName Value="UnitWYSIWYGEditor"/> - <UsageCount Value="32"/> + <UsageCount Value="30"/> </Unit> <Unit> <Filename Value="unitinfoauth.pas"/> @@ -264,10 +270,11 @@ </Unit> <Unit> <Filename Value="..\..\D2Bridge Framework\Prism\Prism.BaseClass.pas"/> - <EditorIndex Value="-1"/> + <EditorIndex Value="5"/> <TopLine Value="823"/> <CursorPos X="27" Y="842"/> <UsageCount Value="11"/> + <Loaded Value="True"/> </Unit> <Unit> <Filename Value="..\..\D2Bridge Framework\Prism\Prism.DataWare.Field.pas"/> @@ -419,20 +426,139 @@ </Unit> <Unit> <Filename Value="..\..\D2Bridge Framework\Prism\Prism.Session.pas"/> - <EditorIndex Value="-1"/> + <EditorIndex Value="6"/> <TopLine Value="531"/> <CursorPos X="8" Y="538"/> <UsageCount Value="11"/> + <Loaded Value="True"/> </Unit> <Unit> <Filename Value="..\..\D2Bridge Framework\D2Bridge.Image.Interfaces.pas"/> - <EditorIndex Value="-1"/> + <EditorIndex Value="1"/> <TopLine Value="38"/> <CursorPos X="13" Y="55"/> <UsageCount Value="10"/> + <Loaded Value="True"/> </Unit> </Units> - <JumpHistory HistoryIndex="-1"/> + <JumpHistory HistoryIndex="28"> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="131" Column="21" TopLine="111"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="88" Column="52" TopLine="65"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="74" Column="94" TopLine="65"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="76" Column="27" TopLine="66"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="171" Column="64" TopLine="167"/> + </Position> + <Position> + <Filename Value="..\..\D2Bridge Framework\Prism\Prism.BaseClass.pas"/> + <Caret Line="841" Column="19" TopLine="823"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="177" Column="25" TopLine="172"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="40" Column="15" TopLine="25"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="182" TopLine="174"/> + </Position> + <Position> + <Filename Value="Lazarus.lpr"/> + <Caret Line="24" Column="21" TopLine="6"/> + </Position> + <Position> + <Filename Value="Lazarus.lpr"/> + <Caret Line="28" Column="12" TopLine="11"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="18" Column="3"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="175" Column="24" TopLine="167"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="89" Column="12" TopLine="78"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="52" Column="11" TopLine="36"/> + </Position> + <Position> + <Filename Value="..\..\D2Bridge Framework\Prism\Prism.BaseClass.pas"/> + <Caret Line="840" TopLine="823"/> + </Position> + <Position> + <Filename Value="..\..\D2Bridge Framework\Prism\Prism.Session.pas"/> + <Caret Line="571" TopLine="550"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="128" TopLine="112"/> + </Position> + <Position> + <Filename Value="..\..\D2Bridge Framework\Prism\Prism.Session.pas"/> + <Caret Line="190" Column="16" TopLine="175"/> + </Position> + <Position> + <Filename Value="..\..\D2Bridge Framework\Prism\Prism.Session.pas"/> + <Caret Line="538" Column="8" TopLine="531"/> + </Position> + <Position> + <Filename Value="Unit_Login.pas"/> + <Caret Line="41" Column="23" TopLine="37"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="128" TopLine="112"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="44" Column="16" TopLine="22"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="162" Column="22" TopLine="144"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="187" Column="13" TopLine="159"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="188" Column="13" TopLine="160"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="187" Column="13" TopLine="159"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="176" Column="43" TopLine="159"/> + </Position> + <Position> + <Filename Value="UnitMenu.pas"/> + <Caret Line="44" Column="14" TopLine="32"/> + </Position> + </JumpHistory> <RunParams> <FormatVersion Value="2"/> <Modes ActiveMode=""/> diff --git a/Beta/Demos/Lazarus_linux/Lazarus.lps b/Beta/Demos/Lazarus_linux/Lazarus.lps index 786d849..52fc5a3 100644 --- a/Beta/Demos/Lazarus_linux/Lazarus.lps +++ b/Beta/Demos/Lazarus_linux/Lazarus.lps @@ -8,7 +8,7 @@ <Filename Value="Lazarus.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="D2BridgeWebAppWithLCL"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="../../D2Bridge Framework/D2Bridge.ServerControllerBase.pas"/> @@ -18,7 +18,7 @@ <ResourceBaseClass Value="DataModule"/> <EditorIndex Value="-1"/> <CursorPos X="26" Y="4"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="../../D2Bridge Framework/Prism/Prism.SessionBase.pas"/> @@ -26,7 +26,7 @@ <ComponentName Value="PrismSessionBase"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="Lazarus_Session.pas"/> @@ -34,7 +34,7 @@ <ComponentName Value="LazarusSession"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="LazarusWebApp.pas"/> @@ -42,14 +42,15 @@ <ComponentName Value="LazarusWebAppGlobal"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="Unit_D2Bridge_Server_Console.pas"/> <IsPartOfProject Value="True"/> - <TopLine Value="467"/> - <CursorPos X="55" Y="471"/> - <UsageCount Value="21"/> + <IsVisibleTab Value="True"/> + <TopLine Value="447"/> + <CursorPos X="61" Y="454"/> + <UsageCount Value="37"/> <Loaded Value="True"/> </Unit> <Unit> @@ -58,7 +59,7 @@ <ComponentName Value="FormMenu"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="Unit_Login.pas"/> @@ -66,10 +67,10 @@ <ComponentName Value="Form_Login"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> - <IsVisibleTab Value="True"/> <EditorIndex Value="1"/> - <CursorPos X="43" Y="6"/> - <UsageCount Value="21"/> + <TopLine Value="55"/> + <CursorPos X="38" Y="75"/> + <UsageCount Value="37"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> </Unit> @@ -79,7 +80,7 @@ <ComponentName Value="FormControls"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitdbgrid.pas"/> @@ -88,12 +89,12 @@ <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitDBGrid"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="D2BridgeFormTemplate.pas"/> <IsPartOfProject Value="True"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitdbgridedit.pas"/> @@ -101,7 +102,7 @@ <ComponentName Value="FormDBGridEdit"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitDBGridEdit"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitstringgrid.pas"/> @@ -109,7 +110,7 @@ <ComponentName Value="FormStringGrid"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitStringGrid"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitqrcode.pas"/> @@ -118,7 +119,7 @@ <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitQRCode"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitcardgriddatamodel.pas"/> @@ -127,7 +128,7 @@ <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitCardGridDataModel"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitkanban.pas"/> @@ -136,19 +137,18 @@ <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitKanban"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitauth.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="FormAuth"/> - <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitAuth"/> <EditorIndex Value="-1"/> <TopLine Value="33"/> <CursorPos X="15" Y="44"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitqrcodereader.pas"/> @@ -157,7 +157,7 @@ <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="unitQRCodeReader"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitcamera.pas"/> @@ -165,7 +165,7 @@ <ComponentName Value="FormCamera"/> <ResourceBaseClass Value="Form"/> <UnitName Value="UnitCamera"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitmarkdowneditor.pas"/> @@ -173,7 +173,7 @@ <ComponentName Value="FormMarkDownEditor"/> <ResourceBaseClass Value="Form"/> <UnitName Value="UnitMarkDownEditor"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> <Unit> <Filename Value="unitwysiwygeditor.pas"/> @@ -181,7 +181,7 @@ <ComponentName Value="FormWYSIWYGEditor"/> <ResourceBaseClass Value="Form"/> <UnitName Value="UnitWYSIWYGEditor"/> - <UsageCount Value="21"/> + <UsageCount Value="37"/> </Unit> </Units> <JumpHistory HistoryIndex="4"> diff --git a/Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas b/Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas index cdf5944..bdda421 100644 --- a/Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas +++ b/Beta/Demos/Lazarus_linux/Unit_D2Bridge_Server_Console.pas @@ -21,11 +21,10 @@ documentation would be appreciated but is not required. God bless you - - +--------------------------------------------------------------------------+ } + unit Unit_D2Bridge_Server_Console; {$IFDEF FPC} @@ -37,7 +36,7 @@ interface uses Classes, SysUtils, IniFiles, D2Bridge.DebugUtils, {$IFDEF MSWINDOWS} - {$IFDEF HAS_UNIT_SYSTEM_THREADING} +{$IFDEF HAS_UNIT_SYSTEM_THREADING} System.Threading, {$ENDIF} @@ -48,19 +47,19 @@ interface type TD2BridgeServerConsole = class private - class var + class + var {$IFDEF MSWINDOWS} hIn: THandle; hTimer: THandle; - threadID: Cardinal; + threadID: cardinal; {$ENDIF} TimeoutAt: TDateTime; - WaitingForReturn: Boolean; - TimerThreadTerminated: Boolean; + WaitingForReturn: boolean; + TimerThreadTerminated: boolean; vServerPort: Integer; VServerName: String; vInputConsole: String; - class procedure DisplayInfo; class procedure DisplayStartConfigServer; class procedure ClearLine(Line: Integer); @@ -78,7 +77,7 @@ TD2BridgeServerConsole = class implementation uses - LazarusWebApp, Unit_Login; + LazarusWebApp, Unit_Login; { ============================================================ WINDOWS: Timer thread using BeginThread + WriteConsoleInput @@ -87,78 +86,73 @@ implementation {$IFDEF MSWINDOWS} function TimerThread(Parameter: pointer): {$IFDEF CPU32}Longint{$ELSE}{$IFNDEF FPC}Integer{$ELSE}Int64{$ENDIF}{$ENDIF}; -//function TimerThread(Parameter: Pointer): {$IFDEF CPU32}Longint{$ELSE}Integer{$ENDIF}; var IR: TInputRecord; - amt: Cardinal; + amt: cardinal; begin - Result := 0; + result := 0; IR.EventType := KEY_EVENT; - IR.Event.KeyEvent.bKeyDown := True; + IR.Event.KeyEvent.bKeyDown := true; IR.Event.KeyEvent.wVirtualKeyCode := VK_RETURN; while not TD2BridgeServerConsole.TimerThreadTerminated do begin - if TD2BridgeServerConsole.WaitingForReturn and - (Now >= TD2BridgeServerConsole.TimeoutAt) then + if TD2BridgeServerConsole.WaitingForReturn and (Now >= TD2BridgeServerConsole.TimeoutAt) then WriteConsoleInput(TD2BridgeServerConsole.hIn, IR, 1, amt); - Sleep(500); + sleep(500); end; end; procedure StartTimerThread; begin - TD2BridgeServerConsole.hTimer := - BeginThread(nil, 0, TimerThread, nil, 0, TD2BridgeServerConsole.threadID); + TD2BridgeServerConsole.hTimer := BeginThread(nil, 0, TimerThread, nil, 0, TD2BridgeServerConsole.threadID); end; procedure EndTimerThread; begin - TD2BridgeServerConsole.TimerThreadTerminated := True; + TD2BridgeServerConsole.TimerThreadTerminated := true; WaitForSingleObject(TD2BridgeServerConsole.hTimer, 1000); CloseHandle(TD2BridgeServerConsole.hTimer); end; -procedure TimeoutWait(const Time: Cardinal); +procedure TimeoutWait(const Time: cardinal); var IR: TInputRecord; - nEvents: Cardinal; + nEvents: cardinal; begin + TD2BridgeServerConsole.TimeOutAt := IncSecond(Now, Time); - TD2BridgeServerConsole.WaitingForReturn := True; + TD2BridgeServerConsole.WaitingForReturn := true; while ReadConsoleInput(TD2BridgeServerConsole.hIn, IR, 1, nEvents) do begin if (IR.EventType = KEY_EVENT) and - (TKeyEventRecord(IR.Event).wVirtualKeyCode = VK_RETURN) and - (TKeyEventRecord(IR.Event).bKeyDown) then - begin - TD2BridgeServerConsole.WaitingForReturn := False; - Break; - end; + (TKeyEventRecord(IR.Event).wVirtualKeyCode = VK_RETURN) + and (TKeyEventRecord(IR.Event).bKeyDown) then + begin + TD2BridgeServerConsole.WaitingForReturn := false; + break; + end; - if (TKeyEventRecord(IR.Event).bKeyDown) and - (TKeyEventRecord(IR.Event).AsciiChar <> #0) then - begin - if Char(TKeyEventRecord(IR.Event).AsciiChar) = Char(VK_Back) then + if (TKeyEventRecord(IR.Event).bKeyDown) and (TKeyEventRecord(IR.Event).AsciiChar <> #0) then begin + if Char(TKeyEventRecord(IR.Event).AsciiChar) = Char(VK_Back) then + begin if TD2BridgeServerConsole.vInputConsole <> '' then begin - Write(Char(TKeyEventRecord(IR.Event).AsciiChar)); - Write(StringOfChar(' ', 1)); - Write(Char(TKeyEventRecord(IR.Event).AsciiChar)); - TD2BridgeServerConsole.vInputConsole := - Copy(TD2BridgeServerConsole.vInputConsole, 1, - Length(TD2BridgeServerConsole.vInputConsole) - 1); + Write(char(TKeyEventRecord(IR.Event).AsciiChar)); + Write(StringOfChar(' ', 1)); + Write(char(TKeyEventRecord(IR.Event).AsciiChar)); + + TD2BridgeServerConsole.vInputConsole := Copy(TD2BridgeServerConsole.vInputConsole, 1, Length(TD2BridgeServerConsole.vInputConsole)-1); end; - end - else - begin - Write(Char(TKeyEventRecord(IR.Event).AsciiChar)); - TD2BridgeServerConsole.vInputConsole := - TD2BridgeServerConsole.vInputConsole + TKeyEventRecord(IR.Event).AsciiChar; + end else + begin + Write(char(TKeyEventRecord(IR.Event).AsciiChar)); + TD2BridgeServerConsole.vInputConsole := TD2BridgeServerConsole.vInputConsole + TKeyEventRecord(IR.Event).AsciiChar; + end; + + TD2BridgeServerConsole.TimeOutAt := IncSecond(Now, Time); end; - TD2BridgeServerConsole.TimeOutAt := IncSecond(Now, Time); - end; end; end; @@ -308,107 +302,112 @@ class procedure TD2BridgeServerConsole.SetCursorPosition(X, Y: Integer); class procedure TD2BridgeServerConsole.DisplayInfo; var - I: Integer; - FInfo: TStrings; + I: Integer; + FInfo: TStrings; begin - FInfo := D2BridgeServerController.ServerInfoConsole; - for I := 0 to Pred(FInfo.Count) do - begin - ClearLine(I); - Writeln(FInfo[I]); - end; - FreeAndNil(FInfo); + FInfo:= D2BridgeServerController.ServerInfoConsole; + + for I := 0 to Pred(FInfo.Count) do + begin + ClearLine(I); + Writeln(FInfo[I]); + end; + + FreeAndNil(FInfo); end; + class procedure TD2BridgeServerConsole.DisplayStartConfigServer; var - I: Integer; - FInfo: TStrings; - vSecForWaitEnter: Integer; + I: Integer; + FInfo: TStrings; + vSecForWaitEnter: Integer; begin - if D2BridgeServerController.IsD2DockerContext then - Exit; + + if D2BridgeServerController.IsD2DockerContext then + Exit; + + WaitingForReturn:= false; - WaitingForReturn := False; - TimerThreadTerminated := False; + TimerThreadTerminated:= false; - if not IsDebuggerPresent then - vSecForWaitEnter := 5 - else - vSecForWaitEnter := 1; + if not IsDebuggerPresent then + vSecForWaitEnter:= 5 + else + vSecForWaitEnter:= 1; {$IFDEF MSWINDOWS} - hIn := GetStdHandle(STD_INPUT_HANDLE); + hIn := GetStdHandle(STD_INPUT_HANDLE); {$ENDIF} - StartTimerThread; + StartTimerThread; - FInfo := D2BridgeServerController.ServerInfoConsoleHeader; - for I := 0 to Pred(FInfo.Count) do - begin - ClearLine(I); - Writeln(FInfo[I]); - end; + FInfo:= D2BridgeServerController.ServerInfoConsoleHeader; - // --- Server Port --- - vInputConsole := IntToStr(vServerPort); - Writeln('Enter the Server Port and press [ENTER]'); - Write('Server Port: ' + TD2BridgeServerConsole.vInputConsole); - TimeoutWait(vSecForWaitEnter); - if vInputConsole <> '' then - vServerPort := StrToIntDef(vInputConsole, vServerPort); + for I := 0 to Pred(FInfo.Count) do + begin + ClearLine(I); + Writeln(FInfo[I]); + end; - Writeln(''); - Writeln(''); + // --- Server Port --- + vInputConsole:= IntToStr(vServerPort); + Writeln('Enter the Server Port and press [ENTER]'); + Write('Server Port: '+TD2BridgeServerConsole.vInputConsole); + TimeoutWait(vSecForWaitEnter); + if vInputConsole <> '' then + vServerPort := StrToIntDef(vInputConsole, vServerPort); - // --- Server Name --- - vInputConsole := vServerName; - Writeln('Enter the Server Name and press [ENTER]'); - Write('Server Name: ' + TD2BridgeServerConsole.vInputConsole); - TimeoutWait(vSecForWaitEnter); - vServerName := vInputConsole; + Writeln(''); + Writeln(''); - SetCursorPosition(0, 0); - FreeAndNil(FInfo); + // --- Server Name --- + vInputConsole:= vServerName; + Writeln('Enter the Server Name and press [ENTER]'); + Write('Server Name: '+TD2BridgeServerConsole.vInputConsole); + TimeoutWait(vSecForWaitEnter); + vServerName:= vInputConsole; - EndTimerThread; + SetCursorPosition(0, 0); + + FreeAndNil(FInfo); + + EndTimerThread; end; class procedure TD2BridgeServerConsole.Run; begin - D2BridgeServerController := TLazarusWebAppGlobal.Create(nil); - - vServerPort := D2BridgeServerController.APPConfig.ServerPort(8888); - vServerName := D2BridgeServerController.APPConfig.ServerName('D2Bridge Server'); - - D2BridgeServerController.APPName:= 'Lazarus Demo'; - //App Information - { - D2BridgeServerController.ServerAppTitle := 'My App D2Bridge'; - D2BridgeServerController.ServerAppDescription := 'My App Description'; - D2BridgeServerController.ServerAppAuthor := 'Talis Jonatas Gomes'; - } - - - //D2BridgeServerController.APPDescription := 'My D2Bridge Web APP'; - //D2BridgeServerController.APPSignature := '...'; - - //Security - { - D2BridgeServerController.Prism.Options.Security.Enabled := False; - D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.EnableSpamhausList := False; - D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.Add('192.168.10.31'); - D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.Add('200.200.200.0/24'); - D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.EnableSelfDelist := False; - D2BridgeServerController.Prism.Options.Security.IP.IPv4WhiteList.Add('192.168.0.1'); - D2BridgeServerController.Prism.Options.Security.IP.IPConnections.LimitNewConnPerIPMin := 30; - D2BridgeServerController.Prism.Options.Security.IP.IPConnections.LimitActiveSessionsPerIP := 50; - D2BridgeServerController.Prism.Options.Security.UserAgent.EnableCrawlerUserAgents := False; - D2BridgeServerController.Prism.Options.Security.UserAgent.Add('NewUserAgent'); - D2BridgeServerController.Prism.Options.Security.UserAgent.Delete('MyUserAgent'); - } - - D2BridgeServerController.PrimaryFormClass := TForm_Login; + D2BridgeServerController := TLazarusWebAppGlobal.Create(nil); + vServerPort := D2BridgeServerController.APPConfig.ServerPort(8888); + vServerName := D2BridgeServerController.APPConfig.ServerName('D2Bridge Server'); + + D2BridgeServerController.APPName:= 'Lazarus Demo'; + //App Information + { + D2BridgeServerController.ServerAppTitle := 'My App D2Bridge'; + D2BridgeServerController.ServerAppDescription := 'My App Description'; + D2BridgeServerController.ServerAppAuthor := 'Talis Jonatas Gomes'; + } + + //D2BridgeServerController.APPDescription := 'My D2Bridge Web APP'; + //D2BridgeServerController.APPSignature:= '.....'; + + //Security + { + D2BridgeServerController.Prism.Options.Security.Enabled:= false; //True Default + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.EnableSpamhausList:= false; //Disable Default Blocked Spamhaus list + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.Add('192.168.10.31'); //Block just IP + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.Add('200.200.200.0/24'); //Block CDIR + D2BridgeServerController.Prism.Options.Security.IP.IPv4BlackList.EnableSelfDelist:= false; //Disable Delist + D2BridgeServerController.Prism.Options.Security.IP.IPv4WhiteList.Add('192.168.0.1'); //Add IP or CDIR to WhiteList + D2BridgeServerController.Prism.Options.Security.IP.IPConnections.LimitNewConnPerIPMin:= 30; //Limite Connections from IP *minute + D2BridgeServerController.Prism.Options.Security.IP.IPConnections.LimitActiveSessionsPerIP:= 50; //Limite Sessions from IP + D2BridgeServerController.Prism.Options.Security.UserAgent.EnableCrawlerUserAgents:= false; //Disable Default Blocked Crawler User Agents + D2BridgeServerController.Prism.Options.Security.UserAgent.Add('NewUserAgent'); //Block User Agent + D2BridgeServerController.Prism.Options.Security.UserAgent.Delete('MyUserAgent'); //Allow User Agent + } + + D2BridgeServerController.PrimaryFormClass:= TForm_Login; // REST OPTIONS { @@ -426,48 +425,57 @@ class procedure TD2BridgeServerConsole.Run; //D2BridgeServerController.Prism.Options.SessionTimeOut := 300; //D2BridgeServerController.Prism.Options.SessionIdleTimeOut := 0; - D2BridgeServerController.Prism.Options.IncludeJQuery := True; - //D2BridgeServerController.Prism.Options.DataSetLog := True; - D2BridgeServerController.Prism.Options.CoInitialize := True; - //D2BridgeServerController.Prism.Options.VCLStyles := False; - //D2BridgeServerController.Prism.Options.ShowError500Page := False; - // SSL - //if IsDebuggerPresent then - // D2BridgeServerController.Prism.Options.SSL := False - //else - // D2BridgeServerController.Prism.Options.SSL := True; + D2BridgeServerController.Prism.Options.IncludeJQuery:= true; - D2BridgeServerController.Languages := [TD2BridgeLang.English]; + //D2BridgeServerController.Prism.Options.DataSetLog:= true; - if D2BridgeServerController.Prism.Options.SSL then - begin - D2BridgeServerController.Prism.SSLOptions.CertFile := ''; - D2BridgeServerController.Prism.SSLOptions.KeyFile := ''; - D2BridgeServerController.Prism.SSLOptions.RootCertFile := ''; - end; + D2BridgeServerController.Prism.Options.CoInitialize:= true; - D2BridgeServerController.Prism.Options.PathJS := 'js'; - D2BridgeServerController.Prism.Options.PathCSS := 'css'; + //D2BridgeServerController.Prism.Options.VCLStyles:= false; - if D2BridgeServerController.IsD2DockerContext then - Exit; + //D2BridgeServerController.Prism.Options.ShowError500Page:= false; - DisplayStartConfigServer; + //Uncomment to Dual Mode force http just in Debug Mode + //if IsDebuggerPresent then + // D2BridgeServerController.Prism.Options.SSL:= false + //else + //D2BridgeServerController.Prism.Options.SSL:= true; - D2BridgeServerController.Port := vServerPort; - D2BridgeServerController.ServerName := VServerName; + D2BridgeServerController.Languages:= [TD2BridgeLang.English]; + + if D2BridgeServerController.Prism.Options.SSL then + begin + //Cert File + D2BridgeServerController.Prism.SSLOptions.CertFile:= ''; + //Cert Key Domain File + D2BridgeServerController.Prism.SSLOptions.KeyFile:= ''; + //Cert Intermediate (case Let�s Encrypt) + D2BridgeServerController.Prism.SSLOptions.RootCertFile:= ''; + end; + + D2BridgeServerController.Prism.Options.PathJS:= 'js'; + D2BridgeServerController.Prism.Options.PathCSS:= 'css'; if D2BridgeServerController.IsD2DockerContext then + Exit; + DisplayStartConfigServer; + + D2BridgeServerController.Port:= vServerPort; + D2BridgeServerController.ServerName:= VServerName; + + + if D2BridgeServerController.IsD2DockerContext then Exit; - D2BridgeServerController.StartServer; + D2BridgeServerController.StartServer; + try while D2BridgeServerController.Started do begin DisplayInfo; - Sleep(1); + Sleep(100); SetCursorPosition(0, 0); end; except diff --git a/Beta/Demos/Lazarus_linux/Unit_Login.lfm b/Beta/Demos/Lazarus_linux/Unit_Login.lfm index 64adbb1..4a894e2 100644 --- a/Beta/Demos/Lazarus_linux/Unit_Login.lfm +++ b/Beta/Demos/Lazarus_linux/Unit_Login.lfm @@ -1,7 +1,7 @@ object Form_Login: TForm_Login - Left = 514 + Left = 515 Height = 434 - Top = 98 + Top = 215 Width = 299 BorderIcons = [biSystemMenu] Caption = 'Form Login' @@ -44,7 +44,7 @@ object Form_Login: TForm_Login Left = 95 Height = 30 Top = 115 - Width = 55 + Width = 51 Alignment = taCenter Caption = 'Login' Font.Color = clWindowText @@ -54,7 +54,7 @@ object Form_Login: TForm_Login end object Edit_UserName: TEdit Left = 18 - Height = 34 + Height = 23 Top = 167 Width = 197 TabOrder = 0 @@ -62,7 +62,7 @@ object Form_Login: TForm_Login end object Edit_Password: TEdit Left = 18 - Height = 34 + Height = 23 Top = 214 Width = 154 EchoMode = emPassword diff --git a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas index b05e48e..668cd86 100644 --- a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas +++ b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas @@ -271,10 +271,10 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; {$IFDEF MSWINDOWS} sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.bat'; sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.bat'; - {$ELSE} + {$ELSE} sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.sh'; sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.sh'; - {$ENDIF} + {$ENDIF} {$ENDIF} if WizardForm.CheckBox_Create_Project_Folder.Checked then diff --git a/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas b/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas index 5042872..f672f3f 100644 --- a/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas +++ b/Beta/Wizard/Servers/Console/Unit_D2Bridge_Server_Console.pas @@ -46,7 +46,8 @@ interface type TD2BridgeServerConsole = class private - class var + class + var {$IFDEF MSWINDOWS} hIn: THandle; hTimer: THandle; @@ -65,7 +66,7 @@ TD2BridgeServerConsole = class class function ConsoleWidth: Integer; {$IFNDEF MSWINDOWS} - class procedure ReadLineWithTimeout(const TimeoutSec: Integer); + class procedure ReadLineWithTimeout(const TimeoutSec: Integer); {$ENDIF} public @@ -125,7 +126,6 @@ procedure TimeoutWait(const Time: cardinal); while ReadConsoleInput(TD2BridgeServerConsole.hIn, IR, 1, nEvents) do begin - if (IR.EventType = KEY_EVENT) and (TKeyEventRecord(IR.Event).wVirtualKeyCode = VK_RETURN) and (TKeyEventRecord(IR.Event).bKeyDown) then @@ -481,8 +481,8 @@ class procedure TD2BridgeServerConsole.SetCursorPosition(X, Y: Integer); Coord.Y := Y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Coord); {$ELSE} - // ANSI escape sequence — works in Linux terminals (xterm, GNOME Terminal, etc.) - Write(Format(#27'[%d;%dH', [Y + 1, X + 1])); + // ANSI escape sequence — works in Linux terminals (xterm, GNOME Terminal, etc.) + Write(Format(#27'[%d;%dH', [Y + 1, X + 1])); {$ENDIF} end; diff --git a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh index b5683a8..6a6ae1a 100644 --- a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh +++ b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazBuild.sh @@ -1,4 +1,4 @@ #!/bin/bash # Remove todos os arquivos da pasta lib/ -rm -rf lib/* +rm -rf lib/* diff --git a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh index dc69e43..19e2429 100644 --- a/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh +++ b/Beta/Wizard/dpr/LAZARUS/FixD2BridgeLazCompile.sh @@ -8,7 +8,7 @@ rm -f lib/D2Bridge.API.D2Docker.Comm.o rm -f lib/D2Bridge.API.D2Docker.Comm.ppu rm -f lib/D2Bridge.API.D2Docker.Comm.lfm rm -f lib/Prism.Server.HTML.o -rm -f lib/Prism.Server.HTML.ppu +rm -f lib/Prism.Server.HTML.ppu rm -f lib/Prism.Server.HTML.lfm rm -f lib/Prism.Server.Functions.o rm -f lib/Prism.Server.Functions.ppu From 83ccfe0eb167ec52c93d0baa767c1b496999edd5 Mon Sep 17 00:00:00 2001 From: Max Jacinto Gomes <max@fastmedic.com.br> Date: Mon, 23 Mar 2026 13:47:11 -0300 Subject: [PATCH 3/6] Ajustes Unit Server Properties para rodar em lazarus... --- .../D2Bridge.NewProject.Wizard.Common.pas | 62 ++++++++++++++++--- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas index 89b1192..50bfa21 100644 --- a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas +++ b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas @@ -154,7 +154,9 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sTypeServer: TTypeServer; sRESTAPIServerUnitAuthFile, sRESTAPIServerUnitPingFile: string; sRESTAPIServerUnitAuthClassFile, sRESTAPIServerUnitPingClassFile: string; - sRESTAPIServerSessionFile: string; + sRESTAPIServerSessionFile: string; + G: TGUID; + begin try WizardForm.ShowModal; @@ -749,8 +751,7 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'sh FixD2BridgeLazCompile.sh', [rfIgnoreCase, rfReplaceAll]); {$ENDIF} - var G: TGUID; - CreateGUID(G); + CreateGUID(G); sFileContent:= StringReplace(sFileContent, '{ProjectGUID}', GUIDToString(G), [rfIgnoreCase, rfReplaceAll]); {$IFDEF FPC} @@ -916,8 +917,9 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; - {$REGION 'Unit Server Properties'} - for var ServersFile in [sPathUnitServer,sPathUnitServiceServer] do + {$REGION 'Unit Server Properties'} + {$IFDEF DELPHI} + for var ServersFile in [sPathUnitServer,sPathUnitServiceServer] do begin sFile:= TStringStream.Create('', TEncoding.UTF8); sFile.LoadFromFile(GetRealFilePath(ServersFile)); @@ -958,8 +960,52 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sFile.WriteString(sFileContent); sFile.SaveToFile(GetRealFilePath(ServersFile)); sFile.Free; - end; - {$ENDREGION} + end; + {$ELSE} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitServer)); + sFileContent:= sFile.DataString; + + //----- PrimaryForm / Class + sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + + //----- SSL + if WizardForm.ComboBox_UseSSL.Text = 'Yes' then + begin + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.SSL:= true;', 'D2BridgeServerController.Prism.Options.SSL:= true;', [rfIgnoreCase]); + end; + sFileContent := StringReplace(sFileContent, '{Certificate}', WizardForm.Edit_SSL_Certificate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate_Key}', WizardForm.Edit_SSL_Key.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate Intermediate}', WizardForm.Edit_SSL_Intermediate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + //----- Server Port + sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); + + //----- Server Name + sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); + + //----- Path JS + sFileContent := StringReplace(sFileContent, '{PathJS}', WizardForm.Edit_Path_JS.Text, [rfIgnoreCase]); + //----- Path CSS + sFileContent := StringReplace(sFileContent, '{PathCSS}', WizardForm.Edit_Path_CSS.Text, [rfIgnoreCase]); + + //----- Language + sFileContent := StringReplace(sFileContent, '{Languages}', '[' + sLanguagesSET.CommaText + ']', [rfIgnoreCase, rfReplaceAll]); + + //----- Options jQuery + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', 'D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', [rfIgnoreCase]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sPathUnitServer)); + sFile.Free; + {$ENDIF} + {$ENDREGION} + + + {$REGION 'Form Server Properties'} @@ -1050,4 +1096,4 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; end; end; -end. \ No newline at end of file +end. From 3d02b1530ffed37071fb1c1b3f72c84b89deced0 Mon Sep 17 00:00:00 2001 From: Max Jacinto Gomes <max@fastmedic.com.br> Date: Mon, 23 Mar 2026 15:01:40 -0300 Subject: [PATCH 4/6] Ajustes no guid do projeto --- .../D2Bridge.NewProject.Wizard.Common.pas | 2058 ++++++++--------- 1 file changed, 975 insertions(+), 1083 deletions(-) diff --git a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas index 50bfa21..b05e48e 100644 --- a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas +++ b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas @@ -1,1099 +1,991 @@ -{ - +--------------------------------------------------------------------------+ - D2Bridge Framework Content - - Author: Talis Jonatas Gomes - Email: talisjonatas@me.com - - Copyright (c) 2024 Talis Jonatas Gomes - talisjonatas@me.com - Intellectual property of computer programs protected by international and - brazilian (9.609/1998) laws. - Software licensed under "opensource" license. - - Rules: - Everone is permitted to copy and distribute verbatim copies of this license - document, but changing it is not allowed. - - This source code is provided 'as-is', without any express or implied - warranty. In no event will the author be held liable for any damages - arising from the use of this code. - - However, it is granted that this code may be used for any purpose, - including commercial applications, but it may not be modified, - distributed, or sublicensed without express written authorization from - the author (Talis Jonatas Gomes). This includes creating derivative works - or distributing the source code through any means. - - If you use this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - God bless you - +--------------------------------------------------------------------------+ -} - -unit D2Bridge.NewProject.Wizard.Common; - -{$IFDEF FPC} - {$MODE Delphi} - //{$DEFINE LCLLIB} -{$ELSE} - {$DEFINE DELPHI} -{$ENDIF} - - - -interface - -Uses -{$IFDEF FPC} - FileUtil, {$IFDEF LCLLIB}ProjectIntf,{$ENDIF} -{$ELSE} - Winapi.Windows, ToolsAPI, System.Zip, System.IOUtils, DateUtils, -{$ENDIF} - Classes, SysUtils, Forms, Dialogs, D2Bridge.ConfigNewProject.View; - - -type - TTypeServer = - ({$IFDEF DELPHI}tsWebFMX,tsWebAndFMX,{$ENDIF} - {$IFDEF FPC}tsWebLCL{$ELSE}tsWebVCL{$ENDIF}, - {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF}); - -type - - { TD2BridgeNewProjectWizardCommon } - - TD2BridgeNewProjectWizardCommon = class - private -{$IFDEF FPC} -{$IFDEF LCLLIB} - //FLazProject: TLazProject; -{$ENDIF} -{$ENDIF} - public - WizardForm: TD2BridgeConfigNewProject; - PathPROJ: string; - - constructor Create; - destructor Destroy; override; - -{$IFDEF FPC} -{$IFDEF LCLLIB} - //property LazProject: TLazProject read FLazProject write FLazProject; -{$ENDIF} -{$ENDIF} - - procedure Execute; - end; - -implementation - -Uses - D2Bridge.Wizard.Util, - D2Bridge.Lang.Util; - - -{ TD2BridgeNewProjectWizardCommon } - -constructor TD2BridgeNewProjectWizardCommon.Create; -begin - inherited; - - PathPROJ:= ''; - WizardForm:= TD2BridgeConfigNewProject.Create(Application); -end; - -destructor TD2BridgeNewProjectWizardCommon.Destroy; -begin - if Assigned(WizardForm) then - FreeAndNil(WizardForm); - - inherited Destroy; -end; - -{ -DELHI LAZARUS TIPO DE ARQUIVO -.DPR .LPR Arquivo principal do projeto. Contém o ponto de entrada do programa. -.DPROJ .LPI Arquivo do projeto que contém configurações específicas do Lazarus, equivalente ao .dproj no Delphi. -.RES .LRS ou .RES Arquivo de recursos. Lazarus usa .lrs gerado pelo Lazarus Resource Editor, mas também pode usar .res. -.DFM .LFM Arquivo de descrição do formulário. Em Lazarus, os formulários são descritos no formato .lfm. -.PAS .PAS Arquivo de código-fonte Pascal. O código .pas é idêntico tanto no Delphi quanto no Lazarus. -} - -procedure TD2BridgeNewProjectWizardCommon.Execute; -var - I: Integer; -{$IFDEF DELPHI} - services: IOTAModuleServices; - sSourceWebFMXDPROJFile, sSourceFMXDPROJFile: string; - sSourceWebFMXDPRFile, sSourceFMXDPRFile: string; - sSourceWebFMXRESFile, sSourceFMXRESFile: string; -{$ENDIF} -{$IFDEF FPC} - sSourceFixD2BridgeLazCompile, sSourceFixD2BridgeLazBuild: string; -{$ENDIF} - sProjectNameLogical,sTyperProject,sProjectName,sDestinationPath,sSourceFiles:string; - sDestinationPathWeb, sDestinationPathBinWeb, sDestinationPathCommonUnit,sD2BridgeFrameworkSearchPath,sD2BridgeFrameworkPath: String; - sD2BridgeDirectives: TStrings; - sLangCode, sLangCodeUnderline: string; - sLanguageUnitSourcePath: string; - sLanguageJSONPath: string; - sLanguagesUnitsDPR, sLanguagesJSON, sLanguagesUSES, sLanguagesCREATE, sLanguagesDESTROY, sLanguagesSET, sUNITs: TStrings; - sPathBINWEB, sPathBIN: string; - sPathwwwroot: string; - sPathWEBDPROJFile, sPathWEBRESFile, sPathWEBICOFile, sPathWizard, sPathUnitBase, sPathUnitServer, sPathDFMServer: string; - sPathUnitServiceServer : string; - sSourceWebVCLDPROJFile, sSourceVCLDPROJFile: string; - sSourceWebDPRFile, sSourceVCLDPRFile: string; - sSourceWebRESFile, sSourceVCLRESFile: string; - sSourceWebICOFile, sSourceVCLICOFile: string; - sFileContent: string; - sFile: TStringStream; - sClassPrimaryForm, sUnitPrimaryForm: string; - sUnitLogin, sFormLogin: string; - sTypeServer: TTypeServer; - sRESTAPIServerUnitAuthFile, sRESTAPIServerUnitPingFile: string; - sRESTAPIServerUnitAuthClassFile, sRESTAPIServerUnitPingClassFile: string; +{ + +--------------------------------------------------------------------------+ + D2Bridge Framework Content + + Author: Talis Jonatas Gomes + Email: talisjonatas@me.com + + Copyright (c) 2024 Talis Jonatas Gomes - talisjonatas@me.com + Intellectual property of computer programs protected by international and + brazilian (9.609/1998) laws. + Software licensed under "opensource" license. + + Rules: + Everone is permitted to copy and distribute verbatim copies of this license + document, but changing it is not allowed. + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this code. + + However, it is granted that this code may be used for any purpose, + including commercial applications, but it may not be modified, + distributed, or sublicensed without express written authorization from + the author (Talis Jonatas Gomes). This includes creating derivative works + or distributing the source code through any means. + + If you use this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + God bless you + +--------------------------------------------------------------------------+ +} + +unit D2Bridge.NewProject.Wizard.Common; + +{$IFDEF FPC} + {$MODE Delphi} + //{$DEFINE LCLLIB} +{$ELSE} + {$DEFINE DELPHI} +{$ENDIF} + + + +interface + +Uses +{$IFDEF FPC} + FileUtil, {$IFDEF LCLLIB}ProjectIntf,{$ENDIF} +{$ELSE} + Winapi.Windows, ToolsAPI, System.Zip, System.IOUtils, DateUtils, +{$ENDIF} + Classes, SysUtils, Forms, Dialogs, D2Bridge.ConfigNewProject.View; + + +type + TTypeServer = + ({$IFDEF DELPHI}tsWebFMX,tsWebAndFMX,{$ENDIF} + {$IFDEF FPC}tsWebLCL{$ELSE}tsWebVCL{$ENDIF}, + {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF}); + +type + + { TD2BridgeNewProjectWizardCommon } + + TD2BridgeNewProjectWizardCommon = class + private +{$IFDEF FPC} +{$IFDEF LCLLIB} + //FLazProject: TLazProject; +{$ENDIF} +{$ENDIF} + public + WizardForm: TD2BridgeConfigNewProject; + PathPROJ: string; + + constructor Create; + destructor Destroy; override; + +{$IFDEF FPC} +{$IFDEF LCLLIB} + //property LazProject: TLazProject read FLazProject write FLazProject; +{$ENDIF} +{$ENDIF} + + procedure Execute; + end; + +implementation + +Uses + D2Bridge.Wizard.Util, + D2Bridge.Lang.Util; + + +{ TD2BridgeNewProjectWizardCommon } + +constructor TD2BridgeNewProjectWizardCommon.Create; +begin + inherited; + + PathPROJ:= ''; + WizardForm:= TD2BridgeConfigNewProject.Create(Application); +end; + +destructor TD2BridgeNewProjectWizardCommon.Destroy; +begin + if Assigned(WizardForm) then + FreeAndNil(WizardForm); + + inherited Destroy; +end; + +{ +DELHI LAZARUS TIPO DE ARQUIVO +.DPR .LPR Arquivo principal do projeto. Contém o ponto de entrada do programa. +.DPROJ .LPI Arquivo do projeto que contém configurações específicas do Lazarus, equivalente ao .dproj no Delphi. +.RES .LRS ou .RES Arquivo de recursos. Lazarus usa .lrs gerado pelo Lazarus Resource Editor, mas também pode usar .res. +.DFM .LFM Arquivo de descrição do formulário. Em Lazarus, os formulários são descritos no formato .lfm. +.PAS .PAS Arquivo de código-fonte Pascal. O código .pas é idêntico tanto no Delphi quanto no Lazarus. +} + +procedure TD2BridgeNewProjectWizardCommon.Execute; +var + I: Integer; +{$IFDEF DELPHI} + services: IOTAModuleServices; + sSourceWebFMXDPROJFile, sSourceFMXDPROJFile: string; + sSourceWebFMXDPRFile, sSourceFMXDPRFile: string; + sSourceWebFMXRESFile, sSourceFMXRESFile: string; +{$ENDIF} +{$IFDEF FPC} + sSourceFixD2BridgeLazCompile, sSourceFixD2BridgeLazBuild: string; +{$ENDIF} + sProjectNameLogical,sTyperProject,sProjectName,sDestinationPath,sSourceFiles:string; + sDestinationPathWeb, sDestinationPathBinWeb, sDestinationPathCommonUnit,sD2BridgeFrameworkSearchPath,sD2BridgeFrameworkPath: String; + sD2BridgeDirectives: TStrings; + sLangCode, sLangCodeUnderline: string; + sLanguageUnitSourcePath: string; + sLanguageJSONPath: string; + sLanguagesUnitsDPR, sLanguagesJSON, sLanguagesUSES, sLanguagesCREATE, sLanguagesDESTROY, sLanguagesSET, sUNITs: TStrings; + sPathBINWEB, sPathBIN: string; + sPathwwwroot: string; + sPathWEBDPROJFile, sPathWEBRESFile, sPathWEBICOFile, sPathWizard, sPathUnitBase, sPathUnitServer, sPathDFMServer: string; + sSourceWebVCLDPROJFile, sSourceVCLDPROJFile: string; + sSourceWebDPRFile, sSourceVCLDPRFile: string; + sSourceWebRESFile, sSourceVCLRESFile: string; + sSourceWebICOFile, sSourceVCLICOFile: string; + sFileContent: string; + sFile: TStringStream; + sClassPrimaryForm, sUnitPrimaryForm: string; + sUnitLogin, sFormLogin: string; + sTypeServer: TTypeServer; + sRESTAPIServerUnitAuthFile, sRESTAPIServerUnitPingFile: string; + sRESTAPIServerUnitAuthClassFile, sRESTAPIServerUnitPingClassFile: string; sRESTAPIServerSessionFile: string; - G: TGUID; - -begin - try - WizardForm.ShowModal; - if WizardForm.EnableCreateProject then - begin - - //----- PROJECT TYPE -{$IFDEF FPC} - if WizardForm.ComboBox_Platform.Text = 'LCL for WEB' then - begin - if WizardForm.CheckBox_Add_Project_Platform.Checked then - sTypeServer:= tsWebAndLCL - else - sTypeServer:= tsWebLCL; - end; -{$ELSE} - if WizardForm.ComboBox_Platform.Text = 'VCL for WEB' then - begin - if WizardForm.CheckBox_Add_Project_Platform.Checked then - sTypeServer:= tsWebAndVCL - else - sTypeServer:= tsWebVCL; - end else - begin - if WizardForm.CheckBox_Add_Project_Platform.Checked then - sTypeServer:= tsWebAndFMX - else - sTypeServer:= tsWebFMX; - end; -{$ENDIF} - - //D2Bridge Framework Path - sD2BridgeFrameworkPath:= ExcludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text); - sD2BridgeFrameworkSearchPath:= WizardForm.Edit_Path_D2Bridge.Text+';'+WizardForm.Edit_Path_D2Bridge.Text+'Prism'+';'+WizardForm.Edit_Path_D2Bridge.Text+'Others VCL'+';'; - - sProjectName := WizardForm.Edit_ProjectName.Text; - - sPathWizard:= ExtractFileDir(ExcludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text))+ PathDelim + 'Wizard'; - sPathUnitBase:= ExtractFileDir(ExcludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text))+ PathDelim + 'Unit Base'; - -{$IFDEF FPC} - sSourceWebVCLDPROJFile:= sPathWizard + PathDelim + 'dpr'+ PathDelim + 'LAZARUS'+ PathDelim + 'D2BridgeWebAppLCL.lpi'; -{$ELSE} - sSourceWebVCLDPROJFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppVCL.dproj'; -{$ENDIF} - -{$IFDEF DELPHI} - sSourceWebFMXDPROJFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppFMX.dproj'; -{$ENDIF} - -{$IFDEF FPC} - sSourceVCLDPROJFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppWithLCL.lpi'; -{$ELSE} - sSourceVCLDPROJFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppWithVCL.dproj'; -{$ENDIF} - -{$IFDEF DELPHI} - sSourceFMXDPROJFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppWithFMX.dproj'; -{$ENDIF} - -{$IFDEF FPC} - sSourceWebDPRFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppLCL.lpr'; -{$ELSE} - sSourceWebDPRFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppVCL.dpr'; -{$ENDIF} - -{$IFDEF DELPHI} - sSourceWebFMXDPRFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppFMX.dpr'; -{$ENDIF} - -{$IFDEF FPC} - sSourceVCLDPRFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppWithLCL.lpr'; -{$ELSE} - sSourceVCLDPRFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppWithVCL.dpr'; -{$ENDIF} - -{$IFDEF DELPHI} - sSourceFMXDPRFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppWithFMX.dpr'; -{$ENDIF} - -{$IFDEF FPC} - sSourceWebRESFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppLCL.res'; -{$ELSE} - sSourceWebRESFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppVCL.res'; -{$ENDIF} - -{$IFDEF FPC} - sSourceWebICOFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppLCL.ico'; -{$ELSE} - sSourceWebICOFile:= sPathWizard + '\dpr\' + 'D2BridgeApp.ico'; -{$ENDIF} - -{$IFDEF DELPHI} - sSourceWebFMXRESFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppFMX.res'; -{$ENDIF} - -{$IFDEF FPC} - sSourceVCLRESFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + '' + 'D2BridgeWebAppWithLCL.res'; -{$ELSE} - sSourceVCLRESFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppWithVCL.res'; -{$ENDIF} - -{$IFDEF FPC} - sSourceVCLICOFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppWithLCL.ico'; -{$ELSE} - sSourceVCLICOFile:= sPathWizard + '\dpr\' + 'D2BridgeApp.ico'; -{$ENDIF} - -{$IFDEF DELPHI} - sSourceFMXRESFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppWithFMX.res'; -{$ENDIF} - -{$IFDEF FPC} - - {$IFDEF MSWINDOWS} - sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.bat'; - sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.bat'; - {$ELSE} - sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.sh'; - sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.sh'; - {$ENDIF} -{$ENDIF} - - if WizardForm.CheckBox_Create_Project_Folder.Checked then - sDestinationPath := PChar(WizardForm.Edit_ProjectDestination.Text+sProjectName) - else - sDestinationPath := PChar(WizardForm.Edit_ProjectDestination.Text); - - sDestinationPathWeb := sDestinationPath; - sDestinationPathCommonUnit:= sDestinationPath; - - sDestinationPathBinWeb := sDestinationPathWeb + PathDelim + 'Web'; - sPathwwwroot := sDestinationPathBinWeb + PathDelim + 'wwwroot'; - - sProjectNameLogical:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.lpr'{$ELSE}'.dpr'{$ENDIF}; - sPathWEBDPROJFile:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.lpi'{$ELSE}'.dproj'{$ENDIF}; - sPathWEBRESFile:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.res'{$ELSE}'.res'{$ENDIF}; - sPathWEBICOFile:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.ico'{$ELSE}'.ico'{$ENDIF}; - - sLanguageUnitSourcePath:= sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'D2Bridge.Lang.APP.Language.pas'; - - sLanguageJSONPath:= sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'lang'; - - //REST API Server - sRESTAPIServerUnitAuthClassFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIAuthClass' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; - sRESTAPIServerUnitAuthFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIAuth' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; - sRESTAPIServerUnitPingClassFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIUnitClass' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; - sRESTAPIServerUnitPingFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIUnit' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; - sRESTAPIServerSessionFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'D2Bridge.Rest.Session.pas'; - - sClassPrimaryForm:= 'TForm1'; - sUnitPrimaryForm:= 'Unit1'; - - sUNITs:= TStringList.Create; -{$IFDEF FPC} - sUnitLogin:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Native' + PathDelim + 'Lazarus' + PathDelim + 'Login' + PathDelim + 'Unit_Login.pas'; - sFormLogin:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Native' + PathDelim + 'Lazarus' + PathDelim + 'Login' + PathDelim + 'Unit_Login.lfm'; -{$ELSE} - if (sTypeServer = tsWebFMX) or (sTypeServer = tsWebAndFMX) then - begin - sUnitLogin:= sPathWizard + '\FORMS\Native\FMX\Login\Unit_Login.pas'; - sFormLogin:= sPathWizard + '\FORMS\Native\FMX\Login\Unit_Login.fmx'; - end else - begin - sUnitLogin:= sPathWizard + '\FORMS\Native\Login\Unit_Login.pas'; - sFormLogin:= sPathWizard + '\FORMS\Native\Login\Unit_Login.dfm'; - end; -{$ENDIF} - - //----- D2Bridge Directives - sD2BridgeDirectives:= TStringList.Create; - sD2BridgeDirectives.LineBreak:= ';'; - sD2BridgeDirectives.Add('D2Bridge'); -{$IFDEF DELPHI} - if sTypeServer in [tsWebFMX, tsWebAndFMX] then - sD2BridgeDirectives.Add('FMX'); -{$ENDIF} - if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('RXLIB')] then - sD2BridgeDirectives.Add('RXLIB_AVAILABLE'); - if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('SMComponents')] then - sD2BridgeDirectives.Add('SMCOMPONENTS_AVAILABLE'); - if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('DevExpress')] then - sD2BridgeDirectives.Add('DEVEXPRESS_AVAILABLE'); - if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('JVCL')] then - sD2BridgeDirectives.Add('JVCL_AVAILABLE'); - - - //----- CREATE PROJECT DIRECTORY - If not DirectoryExists(sDestinationPath) then - MKdir(sDestinationPath); - If not DirectoryExists(sDestinationPathWeb) then - MKdir(sDestinationPathWeb); - If not DirectoryExists(sDestinationPathWeb + PathDelim + 'Web') then - MKdir(sDestinationPathWeb + PathDelim + 'Web'); - If not DirectoryExists(sPathwwwroot) then - MKdir(sPathwwwroot); - if WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes' then - If not DirectoryExists(sDestinationPathBinWeb+ PathDelim + 'lang') then - MKdir(sDestinationPathBinWeb+ PathDelim + 'lang'); - -// //----- COPY DPR -// if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then -// {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLDPRFile, sProjectNameLogical, false) -// else -//{$IFDEF DELPHI} -// if sTypeServer = tsWebAndFMX then -// CopyFile(PWideChar(sSourceFMXDPRFile), PWideChar(sProjectNameLogical), false) -// else -// if sTypeServer = tsWebFMX then -// CopyFile(PWideChar(sSourceWebFMXDPRFile), PWideChar(sProjectNameLogical), false) -// else -//{$ENDIF} -// {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebDPRFile, sProjectNameLogical, false); - - //----- COPY RES - if FileExists(sSourceWebRESFile) then - begin - if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLRESFile, sPathWEBRESFile, false) - else -{$IFDEF DELPHI} - if sTypeServer = tsWebAndFMX then - CopyFile(PWideChar(sSourceFMXRESFile), PWideChar(sPathWEBRESFile), false) - else - if sTypeServer = tsWebFMX then - CopyFile(PWideChar(sSourceWebFMXRESFile), PWideChar(sPathWEBRESFile), false) - else -{$ENDIF} - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebRESFile, sPathWEBRESFile, false); - end; - - //----- COPY ICO - if FileExists(sSourceVCLICOFile) then - begin - if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLICOFile, sPathWEBICOFile, false) - else -{$IFDEF DELPHI} - if sTypeServer = tsWebAndFMX then - CopyFile(PWideChar(sSourceFMXRESFile), PWideChar(sPathWEBICOFile), false) - else - if sTypeServer = tsWebFMX then - CopyFile(PWideChar(sSourceWebFMXRESFile), PWideChar(sPathWEBICOFile), false) - else -{$ENDIF} - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebICOFile, sPathWEBICOFile, false); - end; - -{$IFDEF FPC} - if sTypeServer in [tsWebLCL, tsWebAndLCL] then - begin - //----- COPY .PAS - CopyFolderFiles(sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + '*.pas', sDestinationPathWeb); - //----- COPY .DFM - CopyFolderFiles(sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + '*.lfm', sDestinationPathWeb); - end; -{$ELSE} - if sTypeServer in [tsWebFMX, tsWebAndFMX] then - begin - //----- COPY .PAS - CopyFolderFiles(PWideChar(sPathWizard+'\dpr\FMX\*.pas'), sDestinationPathWeb); - //----- COPY .DFM - CopyFolderFiles(PWideChar(sPathWizard+'\dpr\FMX\*.fmx'), sDestinationPathWeb); - end else - begin - //----- COPY .PAS - CopyFolderFiles(PWideChar(sPathWizard+'\dpr\*.pas'), sDestinationPathWeb); - //----- COPY .DFM - CopyFolderFiles(PWideChar(sPathWizard+'\dpr\*.dfm'), sDestinationPathWeb); - end; -{$ENDIF} - - -//----- COPY FixD2BridgeLazBuild -{$IFDEF FPC} - CopyFolderFiles(sSourceFixD2BridgeLazBuild, sDestinationPathWeb); - CopyFolderFiles(sSourceFixD2BridgeLazCompile, sDestinationPathWeb); -{$ENDIF} - - - {$REGION 'Language Support'} - sLanguagesUnitsDPR:= TStringList.Create; - sLanguagesJSON:= TStringList.Create; - sLanguagesUSES:= TStringList.Create; - sLanguagesCREATE:= TStringList.Create; - sLanguagesDESTROY:= TStringList.Create; - sLanguagesSET:= TStringList.Create; - if WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes' then - begin - {$REGION 'Prepare Units Name to DPR'} - sLanguagesUnitsDPR.Add(' D2Bridge.Lang.APP.Core in ''D2Bridge.Lang.APP.Core.pas'','); - sLanguagesUnitsDPR.Add(' D2Bridge.Lang.APP.Term in ''D2Bridge.Lang.APP.Term.pas'','); - {$ENDREGION} - - - {$REGION 'Copy Language Support UNITs'} - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF} - (sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'D2Bridge.Lang.APP.Term.pas', sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.Term.pas', false); - {$ENDREGION} - - {$REGION 'Copy Languages Units'} - sLanguagesDESTROY.Add('{$IFNDEF D2WindowsService}'); - for I := 0 to Pred(WizardForm.CheckListBox_Languages.Count) do - if WizardForm.CheckListBox_Languages.Checked[I] then - begin - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sLanguageUnitSourcePath)); - sFileContent:= sFile.DataString; - - sFileContent:= StringReplace(sFileContent, '{Language}', WizardForm.CheckListBox_Languages.Items[I], [rfIgnoreCase, rfReplaceAll]); - - //Add Unit in Project - sLanguagesUnitsDPR.Add(' D2Bridge.Lang.APP.' + WizardForm.CheckListBox_Languages.Items[I] + ' in ''D2Bridge.Lang.APP.' + WizardForm.CheckListBox_Languages.Items[I] + '.pas'','); - //Add Language Code JSON - sLangCode:= LanguageCode(D2BridgeLangbyLanguageName(WizardForm.CheckListBox_Languages.Items[I])); - sLangCodeUnderline:= StringReplace(sLangCode, '-', '_', []); - if WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes' then //Embed JSON - sLanguagesJSON.Add('D2Bridge_Lang_APP_' + sLangCodeUnderline + ' RCDATA "lang\\'+ sLangCode +'.json"'); - - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF} - (sLanguageJSONPath + PathDelim + 'language.json', - sDestinationPathBinWeb + PathDelim + 'lang' + PathDelim + sLangCode + '.json', false); - //Add USES language - sLanguagesUSES.Add(' D2Bridge.Lang.APP.' + WizardForm.CheckListBox_Languages.Items[I]+','); - //Add Language Create - sLanguagesCREATE.Add(' ' + WizardForm.CheckListBox_Languages.Items[I] + ':= ' + 'TD2BridgeLangAPP' + WizardForm.CheckListBox_Languages.Items[I] + '.Create(self, TD2BridgeAPPTerm);'); - //Add Language Destroy - sLanguagesDESTROY.Add(' TD2BridgeLangAPP' + WizardForm.CheckListBox_Languages.Items[I] + '('+ WizardForm.CheckListBox_Languages.Items[I] +').Destroy;'); - //Add Set Languages - sLanguagesSET.Add('TD2BridgeLang.' + WizardForm.CheckListBox_Languages.Items[I]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.'+WizardForm.CheckListBox_Languages.Items[I]+'.pas'); - sFile.Free; - end; - sLanguagesDESTROY.Add('{$ENDIF}'); - {$ENDREGION} - - {$REGION 'Copy D2Bridge.Lang.APP.Core'} - for I := 0 to Pred(WizardForm.CheckListBox_Languages.Count) do - if WizardForm.CheckListBox_Languages.Checked[I] then - begin - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'D2Bridge.Lang.APP.Core.pas')); - sFileContent:= sFile.DataString; - - sFileContent:= StringReplace(sFileContent, '{Uses_Languages}', sLanguagesUSES.Text, [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{Create_Languages}', sLanguagesCREATE.Text, [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{Destroy_Languages}', sLanguagesDESTROY.Text, [rfIgnoreCase, rfReplaceAll]); - - if WizardForm.ComboBox_Embed_Translation_Files.Text = 'No' then - sFileContent:= StringReplace(sFileContent, '{EmbedJSON}', 'false', [rfIgnoreCase, rfReplaceAll]) - else - sFileContent:= StringReplace(sFileContent, '{EmbedJSON}', 'true', [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.Core.pas'); - sFile.Free; - end; - {$ENDREGION} - - {$REGION 'Copy Language RC File'} - if WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes' then //Embed JSON - for I := 0 to Pred(WizardForm.CheckListBox_Languages.Count) do - if WizardForm.CheckListBox_Languages.Checked[I] then - begin - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFileContent:= sLanguagesJSON.Text; - - sFileContent:= StringReplace(sFileContent, '{Language}', WizardForm.CheckListBox_Languages.Items[I], [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.rc'); - sFile.Free; - end; - {$ENDREGION} - end else - begin - sLanguagesSET.Add('TD2BridgeLang.' + WizardForm.ComboBox_Language.Text); - end; - {$ENDREGION} - - - {$REGION 'UNIT BASE'} - {$REGION 'ServerController.pas'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + PathDelim + 'ServerController.pas')); - sFileContent:= sFile.DataString; - - sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb + PathDelim + sProjectName + 'WebApp.pas'); - sFile.Free; - {$ENDREGION} - - {$REGION 'ServerController.dfm'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathUnitBase+{$IFDEF FPC} PathDelim + 'ServerController.lfm'{$ELSE}'\ServerController.dfm'{$ENDIF})); - sFileContent:= sFile.DataString; - - sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb+ PathDelim + sProjectName+{$IFDEF FPC}'WebApp.lfm'{$ELSE}'WebApp.dfm'{$ENDIF}); - sFile.Free; - {$ENDREGION} - - {$REGION 'UserSessionUnit.pas'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + PathDelim + 'UserSessionUnit.pas')); - sFileContent:= sFile.DataString; - - sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb + PathDelim + sProjectName+'_Session.pas'); - sFile.Free; - {$ENDREGION} - - {$REGION 'UserSessionUnit.dfm'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + {$IFDEF FPC} PathDelim + 'UserSessionUnit.lfm'{$ELSE}'\UserSessionUnit.dfm'{$ENDIF})); - sFileContent:= sFile.DataString; - - sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb + PathDelim + sProjectName+{$IFDEF FPC}'_Session.lfm'{$ELSE}'_Session.dfm'{$ENDIF}); - sFile.Free; - {$ENDREGION} - - {$REGION 'D2BridgeFormTemplate.pas'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + PathDelim + 'D2BridgeFormTemplate.pas')); - sFileContent:= sFile.DataString; - - sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2BridgeFormTemplate.pas'); - sFile.Free; - {$ENDREGION} - {$ENDREGION} - - - - {$REGION 'Login'} - if WizardForm.CheckBox_Form_Login.Checked then - begin - {$IFDEF FPC} - CopyFolderFiles(sUnitLogin, sDestinationPathWeb); - CopyFolderFiles(sFormLogin, sDestinationPathWeb); - {$ELSE} - CopyFolderFiles(PWideChar(sUnitLogin), sDestinationPathWeb); - CopyFolderFiles(PWideChar(sFormLogin), sDestinationPathWeb); - {$ENDIF} - - //Set Primary Form - sClassPrimaryForm:= 'TForm_Login'; - sUnitPrimaryForm:= 'Unit_Login'; - - //Unit Login - sUNITs.Add('Unit_Login in ''Unit_Login.pas'' {Form_Login},'); - - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sDestinationPathWeb + PathDelim + ExtractFileName(sUnitLogin))); - sFileContent:= sFile.DataString; - - //----- Template HTML Files - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb + PathDelim + ExtractFileName(sUnitLogin))); - sFile.Free; - end; - {$ENDREGION} - - - - {$REGION 'REST SERVER API'} - if (WizardForm.ComboBox_RestAPIServer.ItemIndex = 0) or (WizardForm.ComboBox_RestAPIServer.ItemIndex = 1) then //Auth - begin - {$REGION 'AUTH CLASS FILE'} - if Pos(UpperCase('Includes Authentication'), UpperCase(WizardForm.ComboBox_RestAPIServer.Text)) > 0 then - begin - sFile:= TStringStream.Create('', TEncoding.UTF8); - if WizardForm.CheckBox_RestAPIServer_UseClass.Checked then //Use Classes in API - sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitAuthClassFile)) - else - sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitAuthFile)); - sFileContent:= sFile.DataString; - - sFileContent := StringReplace(sFileContent, '<UNITNAME>', 'API.Auth', [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '<COPYRIGHTYEAR>', IntToStr(CurrentYear), [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '<ServerController>', sProjectName + 'WebApp', [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '<CLASS_ID>', 'APIAuth', [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb+ PathDelim + 'API.Auth.pas')); - sFile.Free; - end; - {$ENDREGION} - - - {$REGION 'PING CLASS FILE'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - if WizardForm.CheckBox_RestAPIServer_UseClass.Checked then //Use Classes in API - sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitPingClassFile)) - else - sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitPingFile)); - sFileContent:= sFile.DataString; - - sFileContent := StringReplace(sFileContent, '<UNITNAME>', 'API.Ping', [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '<COPYRIGHTYEAR>', IntToStr(CurrentYear), [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '<ServerController>', sProjectName + 'WebApp', [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '<CLASS_ID>', 'APIPing', [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb+ PathDelim + 'API.Ping.pas')); - sFile.Free; - {$ENDREGION} - - - {$REGION 'SESSION FILE'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerSessionFile)); - sFileContent:= sFile.DataString; - - sFileContent := StringReplace(sFileContent, '<COPYRIGHTYEAR>', IntToStr(CurrentYear), [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb+ PathDelim + 'D2Bridge.Rest.Session.pas')); - sFile.Free; - {$ENDREGION} - - sUNITs.Add(' API.Auth in ''API.Auth.pas'','); - sUNITs.Add(' API.Ping in ''API.Ping.pas'','); - sUNITs.Add(' D2Bridge.Rest.Session in ''D2Bridge.Rest.Session.pas'','); - end; - - {$ENDREGION} - - - - {$REGION 'WEB dpropj'} - //----- COPY DProj - if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLDPROJFile, sPathWEBDPROJFile, false) - else -{$IFDEF DELPHI} - if sTypeServer = tsWebAndFMX then - CopyFile(PWideChar(sSourceFMXDPROJFile), PWideChar(sPathWEBDPROJFile), false) - else - if sTypeServer = tsWebFMX then - CopyFile(PWideChar(sSourceWebFMXDPROJFile), PWideChar(sPathWEBDPROJFile), false) - else -{$ENDIF} - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebVCLDPROJFile, sPathWEBDPROJFile, false); - - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathWEBDPROJFile)); - sFileContent:= sFile.DataString; - - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '{D2BridgeFrameworkPath}', sD2BridgeFrameworkSearchPath, [rfIgnoreCase,rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{D2BridgeDirectives}', sD2BridgeDirectives.Text, [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{D2BridgePath}', IncludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text), [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{PathDelim}', PathDelim, [rfIgnoreCase, rfReplaceAll]); - - {$IFDEF MSWINDOWS} - sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazBuild}', 'FixD2BridgeLazBuild.bat', [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'FixD2BridgeLazCompile.bat', [rfIgnoreCase, rfReplaceAll]); - {$ELSE} - sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazBuild}', 'sh FixD2BridgeLazBuild.sh', [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'sh FixD2BridgeLazCompile.sh', [rfIgnoreCase, rfReplaceAll]); - {$ENDIF} - - CreateGUID(G); - sFileContent:= StringReplace(sFileContent, '{ProjectGUID}', GUIDToString(G), [rfIgnoreCase, rfReplaceAll]); - -{$IFDEF FPC} - if WizardForm.ComboBox_Server_Type.Text = 'Server Console (Recommended)' then - sFileContent:= StringReplace(sFileContent, '{D2BridgeServerUnit}', 'Unit_D2Bridge_Server_Console.pas', [rfIgnoreCase, rfReplaceAll]); -{$ENDIF} - - //Replace Language Support Resource - if (WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes') and (WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes') then - sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '<RcCompile Include="D2Bridge.Lang.APP.rc"><Form>D2Bridge.Lang.APP.res</Form></RcCompile>', [rfIgnoreCase]) - else - sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '', [rfIgnoreCase]); - - sFile.Clear; - sFile.WriteString(sFileContent); - SFile.SaveToFile(GetRealFilePath(sPathWEBDPROJFile)); - sFile.Free; - {$ENDREGION} - - - - {$REGION 'WEB dpr'} - {$IFDEF DELPHI} - CopyFolderFiles( - PWideChar(sPathWizard + PathDelim + 'Servers' + PathDelim + 'Service' + PathDelim + '*.*'), - sDestinationPathWeb - ); - - sPathUnitServer := sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Service.pas'; - sPathDFMServer := sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Service.dfm'; - - sFile := TStringStream.Create('', TEncoding.UTF8); - try - sFile.LoadFromFile(GetRealFilePath(sPathUnitServer)); - sFileContent := sFile.DataString; - - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sPathUnitServer)); - finally - sFile.Free; - end; - - sFile := TStringStream.Create('', TEncoding.UTF8); - try - sFile.LoadFromFile(GetRealFilePath(sPathDFMServer)); - sFileContent := sFile.DataString; - - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sPathDFMServer)); - finally - sFile.Free; - end; - - sPathUnitServiceServer := sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Core.pas'; - - sFile := TStringStream.Create('', TEncoding.UTF8); - try - sFile.LoadFromFile(GetRealFilePath(sPathUnitServiceServer)); - sFileContent := sFile.DataString; - - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sPathUnitServiceServer)); - finally - sFile.Free; - end; - {$ENDIF} - - if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLDPRFile, sProjectNameLogical, false) - else - {$IFDEF DELPHI} - if sTypeServer = tsWebAndFMX then - CopyFile(PWideChar(sSourceFMXDPRFile), PWideChar(sProjectNameLogical), false) - else - if sTypeServer = tsWebFMX then - CopyFile(PWideChar(sSourceWebFMXDPRFile), PWideChar(sProjectNameLogical), false) - else - {$ENDIF} - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebDPRFile, sProjectNameLogical, false); - - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sProjectNameLogical)); - sFileContent:= sFile.DataString; - - if WizardForm.ComboBox_Server_Type.Text = 'Server Complete' then - begin - sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server.pas'; - sPathDFMServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server.dfm'; - sUNITs.Add('Unit_D2Bridge_Server in ''Unit_D2Bridge_Server.pas'' {Form_D2Bridge_Server},'); - - CopyFolderFiles(PWideChar(sPathWizard + PathDelim + 'Servers\Complete\*.*'), sDestinationPathWeb); - - sFileContent:= StringReplace(sFileContent, '{Units}', sUNITs.Text, [rfIgnoreCase]); - sFileContent:= StringReplace(sFileContent, '{Server}', 'Application.CreateForm(TForm_D2Bridge_Server, Form_D2Bridge_Server);', []); - sFileContent:= StringReplace(sFileContent, '{Application.Run;}', 'Application.Run;', [rfIgnoreCase]); - end else - if WizardForm.ComboBox_Server_Type.Text = 'Server Compact' then - begin - sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Compact.pas'; - sPathDFMServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Compact.dfm'; - sUNITs.Add(' Unit_D2Bridge_Server_Compact in ''Unit_D2Bridge_Server_Compact.pas'' {Form_D2Bridge_Server_Compact},'); - - CopyFolderFiles(PWideChar(sPathWizard + PathDelim + 'Servers' + PathDelim + 'Compact' + PathDelim + '*.*'), sDestinationPathWeb); - - sFileContent:= StringReplace(sFileContent, '{Units}', sUNITs.Text, [rfIgnoreCase]); - sFileContent:= StringReplace(sFileContent, '{Server}', 'Application.CreateForm(TForm_D2Bridge_Server_Compact, Form_D2Bridge_Server_Compact);', []); - sFileContent:= StringReplace(sFileContent, '{Application.Run;}', 'Application.Run;', [rfIgnoreCase]); - end else - if WizardForm.ComboBox_Server_Type.Text = 'Server Console (Recommended)' then - begin - sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Console.pas'; - sPathDFMServer:= ''; - sUNITs.Add('{$IFNDEF D2WindowsService}'); - sUNITs.Add('Unit_D2Bridge_Server_Console in ''Unit_D2Bridge_Server_Console.pas'','); - sUNITs.Add('{$ENDIF}'); -{$IFDEF FPC} - CopyFolderFiles(sPathWizard + PathDelim + 'Servers' + PathDelim + 'Console' + PathDelim + '*.*', sDestinationPathWeb); -{$ELSE} - CopyFolderFiles(PWideChar(sPathWizard+'\Servers\Console\*.*'), sDestinationPathWeb); -{$ENDIF} - - sFileContent:= StringReplace(sFileContent, '{Units}', sUNITs.Text, [rfIgnoreCase]); - sFileContent:= StringReplace(sFileContent, '//{$APPTYPE CONSOLE}', '{$APPTYPE CONSOLE}', [rfIgnoreCase]); - sFileContent:= StringReplace(sFileContent, 'Application.MainFormOnTaskbar:= True;', 'Application.MainFormOnTaskbar:= False;', [rfIgnoreCase]); - sFileContent:= StringReplace(sFileContent, '{Server}', 'TD2BridgeServerConsole.Run', [rfIgnoreCase]); - sFileContent:= StringReplace(sFileContent, '{Application.Run;}', '', [rfIgnoreCase]); - end; - - //Replace Language Support Resource - if (WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes') and (WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes') then - sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '{$R D2Bridge.Lang.APP.res D2Bridge.Lang.APP.rc}', [rfIgnoreCase]) - else - sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '', [rfIgnoreCase]); - - //Replace Language Support - sFileContent:= StringReplace(sFileContent, '{Language Support}', sLanguagesUnitsDPR.Text, [rfIgnoreCase]); - - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{D2BridgePath}', IncludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text), [rfIgnoreCase, rfReplaceAll]); - sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - //----- PrimaryForm / Class - sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sProjectNameLogical)); - sFile.Free; - {$ENDREGION} - - - - {$REGION 'Unit Server Properties'} - {$IFDEF DELPHI} - for var ServersFile in [sPathUnitServer,sPathUnitServiceServer] do - begin - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(ServersFile)); - sFileContent:= sFile.DataString; - - //----- PrimaryForm / Class - sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - - //----- SSL - if WizardForm.ComboBox_UseSSL.Text = 'Yes' then - begin - sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.SSL:= true;', 'D2BridgeServerController.Prism.Options.SSL:= true;', [rfIgnoreCase]); - end; - sFileContent := StringReplace(sFileContent, '{Certificate}', WizardForm.Edit_SSL_Certificate.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{Certificate_Key}', WizardForm.Edit_SSL_Key.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{Certificate Intermediate}', WizardForm.Edit_SSL_Intermediate.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - //----- Server Port - sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); - - //----- Server Name - sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); - - //----- Path JS - sFileContent := StringReplace(sFileContent, '{PathJS}', WizardForm.Edit_Path_JS.Text, [rfIgnoreCase]); - //----- Path CSS - sFileContent := StringReplace(sFileContent, '{PathCSS}', WizardForm.Edit_Path_CSS.Text, [rfIgnoreCase]); - - //----- Language - sFileContent := StringReplace(sFileContent, '{Languages}', '[' + sLanguagesSET.CommaText + ']', [rfIgnoreCase, rfReplaceAll]); - - //----- Options jQuery - sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', 'D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', [rfIgnoreCase]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(ServersFile)); - sFile.Free; - end; +begin + try + WizardForm.ShowModal; + if WizardForm.EnableCreateProject then + begin + + //----- PROJECT TYPE +{$IFDEF FPC} + if WizardForm.ComboBox_Platform.Text = 'LCL for WEB' then + begin + if WizardForm.CheckBox_Add_Project_Platform.Checked then + sTypeServer:= tsWebAndLCL + else + sTypeServer:= tsWebLCL; + end; +{$ELSE} + if WizardForm.ComboBox_Platform.Text = 'VCL for WEB' then + begin + if WizardForm.CheckBox_Add_Project_Platform.Checked then + sTypeServer:= tsWebAndVCL + else + sTypeServer:= tsWebVCL; + end else + begin + if WizardForm.CheckBox_Add_Project_Platform.Checked then + sTypeServer:= tsWebAndFMX + else + sTypeServer:= tsWebFMX; + end; +{$ENDIF} + + //D2Bridge Framework Path + sD2BridgeFrameworkPath:= ExcludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text); + sD2BridgeFrameworkSearchPath:= WizardForm.Edit_Path_D2Bridge.Text+';'+WizardForm.Edit_Path_D2Bridge.Text+'Prism'+';'+WizardForm.Edit_Path_D2Bridge.Text+'Others VCL'+';'; + + sProjectName := WizardForm.Edit_ProjectName.Text; + + sPathWizard:= ExtractFileDir(ExcludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text))+ PathDelim + 'Wizard'; + sPathUnitBase:= ExtractFileDir(ExcludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text))+ PathDelim + 'Unit Base'; + +{$IFDEF FPC} + sSourceWebVCLDPROJFile:= sPathWizard + PathDelim + 'dpr'+ PathDelim + 'LAZARUS'+ PathDelim + 'D2BridgeWebAppLCL.lpi'; +{$ELSE} + sSourceWebVCLDPROJFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppVCL.dproj'; +{$ENDIF} + +{$IFDEF DELPHI} + sSourceWebFMXDPROJFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppFMX.dproj'; +{$ENDIF} + +{$IFDEF FPC} + sSourceVCLDPROJFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppWithLCL.lpi'; +{$ELSE} + sSourceVCLDPROJFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppWithVCL.dproj'; +{$ENDIF} + +{$IFDEF DELPHI} + sSourceFMXDPROJFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppWithFMX.dproj'; +{$ENDIF} + +{$IFDEF FPC} + sSourceWebDPRFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppLCL.lpr'; +{$ELSE} + sSourceWebDPRFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppVCL.dpr'; +{$ENDIF} + +{$IFDEF DELPHI} + sSourceWebFMXDPRFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppFMX.dpr'; +{$ENDIF} + +{$IFDEF FPC} + sSourceVCLDPRFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppWithLCL.lpr'; +{$ELSE} + sSourceVCLDPRFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppWithVCL.dpr'; +{$ENDIF} + +{$IFDEF DELPHI} + sSourceFMXDPRFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppWithFMX.dpr'; +{$ENDIF} + +{$IFDEF FPC} + sSourceWebRESFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppLCL.res'; +{$ELSE} + sSourceWebRESFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppVCL.res'; +{$ENDIF} + +{$IFDEF FPC} + sSourceWebICOFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppLCL.ico'; +{$ELSE} + sSourceWebICOFile:= sPathWizard + '\dpr\' + 'D2BridgeApp.ico'; +{$ENDIF} + +{$IFDEF DELPHI} + sSourceWebFMXRESFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppFMX.res'; +{$ENDIF} + +{$IFDEF FPC} + sSourceVCLRESFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + '' + 'D2BridgeWebAppWithLCL.res'; +{$ELSE} + sSourceVCLRESFile:= sPathWizard + '\dpr\' + 'D2BridgeWebAppWithVCL.res'; +{$ENDIF} + +{$IFDEF FPC} + sSourceVCLICOFile:= sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'D2BridgeWebAppWithLCL.ico'; +{$ELSE} + sSourceVCLICOFile:= sPathWizard + '\dpr\' + 'D2BridgeApp.ico'; +{$ENDIF} + +{$IFDEF DELPHI} + sSourceFMXRESFile:= sPathWizard + '\dpr\FMX\' + 'D2BridgeWebAppWithFMX.res'; +{$ENDIF} + +{$IFDEF FPC} + + {$IFDEF MSWINDOWS} + sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.bat'; + sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.bat'; {$ELSE} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathUnitServer)); - sFileContent:= sFile.DataString; + sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.sh'; + sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.sh'; + {$ENDIF} +{$ENDIF} + + if WizardForm.CheckBox_Create_Project_Folder.Checked then + sDestinationPath := PChar(WizardForm.Edit_ProjectDestination.Text+sProjectName) + else + sDestinationPath := PChar(WizardForm.Edit_ProjectDestination.Text); + + sDestinationPathWeb := sDestinationPath; + sDestinationPathCommonUnit:= sDestinationPath; + + sDestinationPathBinWeb := sDestinationPathWeb + PathDelim + 'Web'; + sPathwwwroot := sDestinationPathBinWeb + PathDelim + 'wwwroot'; - //----- PrimaryForm / Class - sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + sProjectNameLogical:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.lpr'{$ELSE}'.dpr'{$ENDIF}; + sPathWEBDPROJFile:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.lpi'{$ELSE}'.dproj'{$ENDIF}; + sPathWEBRESFile:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.res'{$ELSE}'.res'{$ENDIF}; + sPathWEBICOFile:= sDestinationPathWeb+ PathDelim +sProjectName+{$IFDEF FPC}'.ico'{$ELSE}'.ico'{$ENDIF}; - //----- SSL - if WizardForm.ComboBox_UseSSL.Text = 'Yes' then + sLanguageUnitSourcePath:= sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'D2Bridge.Lang.APP.Language.pas'; + + sLanguageJSONPath:= sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'lang'; + + //REST API Server + sRESTAPIServerUnitAuthClassFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIAuthClass' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; + sRESTAPIServerUnitAuthFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIAuth' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; + sRESTAPIServerUnitPingClassFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIUnitClass' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; + sRESTAPIServerUnitPingFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'RestAPIUnit' + {$IFDEF FPC} '.Laz' +{$ENDIF} '.pas'; + sRESTAPIServerSessionFile:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Wizard' + PathDelim + 'D2Bridge.Rest.Session.pas'; + + sClassPrimaryForm:= 'TForm1'; + sUnitPrimaryForm:= 'Unit1'; + + sUNITs:= TStringList.Create; +{$IFDEF FPC} + sUnitLogin:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Native' + PathDelim + 'Lazarus' + PathDelim + 'Login' + PathDelim + 'Unit_Login.pas'; + sFormLogin:= sPathWizard + PathDelim + 'FORMS' + PathDelim + 'Native' + PathDelim + 'Lazarus' + PathDelim + 'Login' + PathDelim + 'Unit_Login.lfm'; +{$ELSE} + if (sTypeServer = tsWebFMX) or (sTypeServer = tsWebAndFMX) then + begin + sUnitLogin:= sPathWizard + '\FORMS\Native\FMX\Login\Unit_Login.pas'; + sFormLogin:= sPathWizard + '\FORMS\Native\FMX\Login\Unit_Login.fmx'; + end else begin - sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.SSL:= true;', 'D2BridgeServerController.Prism.Options.SSL:= true;', [rfIgnoreCase]); + sUnitLogin:= sPathWizard + '\FORMS\Native\Login\Unit_Login.pas'; + sFormLogin:= sPathWizard + '\FORMS\Native\Login\Unit_Login.dfm'; end; - sFileContent := StringReplace(sFileContent, '{Certificate}', WizardForm.Edit_SSL_Certificate.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{Certificate_Key}', WizardForm.Edit_SSL_Key.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{Certificate Intermediate}', WizardForm.Edit_SSL_Intermediate.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); +{$ENDIF} - //----- Server Port - sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); + //----- D2Bridge Directives + sD2BridgeDirectives:= TStringList.Create; + sD2BridgeDirectives.LineBreak:= ';'; + sD2BridgeDirectives.Add('D2Bridge'); +{$IFDEF DELPHI} + if sTypeServer in [tsWebFMX, tsWebAndFMX] then + sD2BridgeDirectives.Add('FMX'); +{$ENDIF} + if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('RXLIB')] then + sD2BridgeDirectives.Add('RXLIB_AVAILABLE'); + if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('SMComponents')] then + sD2BridgeDirectives.Add('SMCOMPONENTS_AVAILABLE'); + if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('DevExpress')] then + sD2BridgeDirectives.Add('DEVEXPRESS_AVAILABLE'); + if WizardForm.CheckListBox_ThirdParty.Checked[WizardForm.CheckListBox_ThirdParty.Items.IndexOf('JVCL')] then + sD2BridgeDirectives.Add('JVCL_AVAILABLE'); - //----- Server Name - sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); - //----- Path JS - sFileContent := StringReplace(sFileContent, '{PathJS}', WizardForm.Edit_Path_JS.Text, [rfIgnoreCase]); - //----- Path CSS - sFileContent := StringReplace(sFileContent, '{PathCSS}', WizardForm.Edit_Path_CSS.Text, [rfIgnoreCase]); + //----- CREATE PROJECT DIRECTORY + If not DirectoryExists(sDestinationPath) then + MKdir(sDestinationPath); + If not DirectoryExists(sDestinationPathWeb) then + MKdir(sDestinationPathWeb); + If not DirectoryExists(sDestinationPathWeb + PathDelim + 'Web') then + MKdir(sDestinationPathWeb + PathDelim + 'Web'); + If not DirectoryExists(sPathwwwroot) then + MKdir(sPathwwwroot); + if WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes' then + If not DirectoryExists(sDestinationPathBinWeb+ PathDelim + 'lang') then + MKdir(sDestinationPathBinWeb+ PathDelim + 'lang'); - //----- Language - sFileContent := StringReplace(sFileContent, '{Languages}', '[' + sLanguagesSET.CommaText + ']', [rfIgnoreCase, rfReplaceAll]); +// //----- COPY DPR +// if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then +// {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLDPRFile, sProjectNameLogical, false) +// else +//{$IFDEF DELPHI} +// if sTypeServer = tsWebAndFMX then +// CopyFile(PWideChar(sSourceFMXDPRFile), PWideChar(sProjectNameLogical), false) +// else +// if sTypeServer = tsWebFMX then +// CopyFile(PWideChar(sSourceWebFMXDPRFile), PWideChar(sProjectNameLogical), false) +// else +//{$ENDIF} +// {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebDPRFile, sProjectNameLogical, false); - //----- Options jQuery - sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', 'D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', [rfIgnoreCase]); + //----- COPY RES + if FileExists(sSourceWebRESFile) then + begin + if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLRESFile, sPathWEBRESFile, false) + else +{$IFDEF DELPHI} + if sTypeServer = tsWebAndFMX then + CopyFile(PWideChar(sSourceFMXRESFile), PWideChar(sPathWEBRESFile), false) + else + if sTypeServer = tsWebFMX then + CopyFile(PWideChar(sSourceWebFMXRESFile), PWideChar(sPathWEBRESFile), false) + else +{$ENDIF} + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebRESFile, sPathWEBRESFile, false); + end; + + //----- COPY ICO + if FileExists(sSourceVCLICOFile) then + begin + if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLICOFile, sPathWEBICOFile, false) + else +{$IFDEF DELPHI} + if sTypeServer = tsWebAndFMX then + CopyFile(PWideChar(sSourceFMXRESFile), PWideChar(sPathWEBICOFile), false) + else + if sTypeServer = tsWebFMX then + CopyFile(PWideChar(sSourceWebFMXRESFile), PWideChar(sPathWEBICOFile), false) + else +{$ENDIF} + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebICOFile, sPathWEBICOFile, false); + end; + +{$IFDEF FPC} + if sTypeServer in [tsWebLCL, tsWebAndLCL] then + begin + //----- COPY .PAS + CopyFolderFiles(sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + '*.pas', sDestinationPathWeb); + //----- COPY .DFM + CopyFolderFiles(sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + '*.lfm', sDestinationPathWeb); + end; +{$ELSE} + if sTypeServer in [tsWebFMX, tsWebAndFMX] then + begin + //----- COPY .PAS + CopyFolderFiles(PWideChar(sPathWizard+'\dpr\FMX\*.pas'), sDestinationPathWeb); + //----- COPY .DFM + CopyFolderFiles(PWideChar(sPathWizard+'\dpr\FMX\*.fmx'), sDestinationPathWeb); + end else + begin + //----- COPY .PAS + CopyFolderFiles(PWideChar(sPathWizard+'\dpr\*.pas'), sDestinationPathWeb); + //----- COPY .DFM + CopyFolderFiles(PWideChar(sPathWizard+'\dpr\*.dfm'), sDestinationPathWeb); + end; +{$ENDIF} + + +//----- COPY FixD2BridgeLazBuild +{$IFDEF FPC} + CopyFolderFiles(sSourceFixD2BridgeLazBuild, sDestinationPathWeb); + CopyFolderFiles(sSourceFixD2BridgeLazCompile, sDestinationPathWeb); +{$ENDIF} + + + {$REGION 'Language Support'} + sLanguagesUnitsDPR:= TStringList.Create; + sLanguagesJSON:= TStringList.Create; + sLanguagesUSES:= TStringList.Create; + sLanguagesCREATE:= TStringList.Create; + sLanguagesDESTROY:= TStringList.Create; + sLanguagesSET:= TStringList.Create; + if WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes' then + begin + {$REGION 'Prepare Units Name to DPR'} + sLanguagesUnitsDPR.Add(' D2Bridge.Lang.APP.Core in ''D2Bridge.Lang.APP.Core.pas'','); + sLanguagesUnitsDPR.Add(' D2Bridge.Lang.APP.Term in ''D2Bridge.Lang.APP.Term.pas'','); + {$ENDREGION} + + + {$REGION 'Copy Language Support UNITs'} + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF} + (sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'D2Bridge.Lang.APP.Term.pas', sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.Term.pas', false); + {$ENDREGION} + + {$REGION 'Copy Languages Units'} + for I := 0 to Pred(WizardForm.CheckListBox_Languages.Count) do + if WizardForm.CheckListBox_Languages.Checked[I] then + begin + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sLanguageUnitSourcePath)); + sFileContent:= sFile.DataString; + + sFileContent:= StringReplace(sFileContent, '{Language}', WizardForm.CheckListBox_Languages.Items[I], [rfIgnoreCase, rfReplaceAll]); + + //Add Unit in Project + sLanguagesUnitsDPR.Add(' D2Bridge.Lang.APP.' + WizardForm.CheckListBox_Languages.Items[I] + ' in ''D2Bridge.Lang.APP.' + WizardForm.CheckListBox_Languages.Items[I] + '.pas'','); + //Add Language Code JSON + sLangCode:= LanguageCode(D2BridgeLangbyLanguageName(WizardForm.CheckListBox_Languages.Items[I])); + sLangCodeUnderline:= StringReplace(sLangCode, '-', '_', []); + if WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes' then //Embed JSON + sLanguagesJSON.Add('D2Bridge_Lang_APP_' + sLangCodeUnderline + ' RCDATA "lang\\'+ sLangCode +'.json"'); + + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF} + (sLanguageJSONPath + PathDelim + 'language.json', + sDestinationPathBinWeb + PathDelim + 'lang' + PathDelim + sLangCode + '.json', false); + //Add USES language + sLanguagesUSES.Add(' D2Bridge.Lang.APP.' + WizardForm.CheckListBox_Languages.Items[I]+','); + //Add Language Create + sLanguagesCREATE.Add(' ' + WizardForm.CheckListBox_Languages.Items[I] + ':= ' + 'TD2BridgeLangAPP' + WizardForm.CheckListBox_Languages.Items[I] + '.Create(self, TD2BridgeAPPTerm);'); + //Add Language Destroy + sLanguagesDESTROY.Add(' TD2BridgeLangAPP' + WizardForm.CheckListBox_Languages.Items[I] + '('+ WizardForm.CheckListBox_Languages.Items[I] +').Destroy;'); + //Add Set Languages + sLanguagesSET.Add('TD2BridgeLang.' + WizardForm.CheckListBox_Languages.Items[I]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.'+WizardForm.CheckListBox_Languages.Items[I]+'.pas'); + sFile.Free; + end; + {$ENDREGION} + + {$REGION 'Copy D2Bridge.Lang.APP.Core'} + for I := 0 to Pred(WizardForm.CheckListBox_Languages.Count) do + if WizardForm.CheckListBox_Languages.Checked[I] then + begin + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathWizard + PathDelim + 'Lang Support' + PathDelim + 'D2Bridge.Lang.APP.Core.pas')); + sFileContent:= sFile.DataString; + + sFileContent:= StringReplace(sFileContent, '{Uses_Languages}', sLanguagesUSES.Text, [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{Create_Languages}', sLanguagesCREATE.Text, [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{Destroy_Languages}', sLanguagesDESTROY.Text, [rfIgnoreCase, rfReplaceAll]); + + if WizardForm.ComboBox_Embed_Translation_Files.Text = 'No' then + sFileContent:= StringReplace(sFileContent, '{EmbedJSON}', 'false', [rfIgnoreCase, rfReplaceAll]) + else + sFileContent:= StringReplace(sFileContent, '{EmbedJSON}', 'true', [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.Core.pas'); + sFile.Free; + end; + {$ENDREGION} + + {$REGION 'Copy Language RC File'} + if WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes' then //Embed JSON + for I := 0 to Pred(WizardForm.CheckListBox_Languages.Count) do + if WizardForm.CheckListBox_Languages.Checked[I] then + begin + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFileContent:= sLanguagesJSON.Text; + + sFileContent:= StringReplace(sFileContent, '{Language}', WizardForm.CheckListBox_Languages.Items[I], [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.rc'); + sFile.Free; + end; + {$ENDREGION} + end else + begin + sLanguagesSET.Add('TD2BridgeLang.' + WizardForm.ComboBox_Language.Text); + end; + {$ENDREGION} + + + {$REGION 'UNIT BASE'} + {$REGION 'ServerController.pas'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + PathDelim + 'ServerController.pas')); + sFileContent:= sFile.DataString; + + sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb + PathDelim + sProjectName + 'WebApp.pas'); + sFile.Free; + {$ENDREGION} + + {$REGION 'ServerController.dfm'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitBase+{$IFDEF FPC} PathDelim + 'ServerController.lfm'{$ELSE}'\ServerController.dfm'{$ENDIF})); + sFileContent:= sFile.DataString; + + sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb+ PathDelim + sProjectName+{$IFDEF FPC}'WebApp.lfm'{$ELSE}'WebApp.dfm'{$ENDIF}); + sFile.Free; + {$ENDREGION} + + {$REGION 'UserSessionUnit.pas'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + PathDelim + 'UserSessionUnit.pas')); + sFileContent:= sFile.DataString; + + sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb + PathDelim + sProjectName+'_Session.pas'); + sFile.Free; + {$ENDREGION} + + {$REGION 'UserSessionUnit.dfm'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + {$IFDEF FPC} PathDelim + 'UserSessionUnit.lfm'{$ELSE}'\UserSessionUnit.dfm'{$ENDIF})); + sFileContent:= sFile.DataString; + + sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb + PathDelim + sProjectName+{$IFDEF FPC}'_Session.lfm'{$ELSE}'_Session.dfm'{$ENDIF}); + sFile.Free; + {$ENDREGION} + + {$REGION 'D2BridgeFormTemplate.pas'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitBase + PathDelim + 'D2BridgeFormTemplate.pas')); + sFileContent:= sFile.DataString; + + sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2BridgeFormTemplate.pas'); + sFile.Free; + {$ENDREGION} + {$ENDREGION} + + + + {$REGION 'Login'} + if WizardForm.CheckBox_Form_Login.Checked then + begin + {$IFDEF FPC} + CopyFolderFiles(sUnitLogin, sDestinationPathWeb); + CopyFolderFiles(sFormLogin, sDestinationPathWeb); + {$ELSE} + CopyFolderFiles(PWideChar(sUnitLogin), sDestinationPathWeb); + CopyFolderFiles(PWideChar(sFormLogin), sDestinationPathWeb); + {$ENDIF} + + //Set Primary Form + sClassPrimaryForm:= 'TForm_Login'; + sUnitPrimaryForm:= 'Unit_Login'; + + //Unit Login + sUNITs.Add('Unit_Login in ''Unit_Login.pas'' {Form_Login},'); + + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sDestinationPathWeb + PathDelim + ExtractFileName(sUnitLogin))); + sFileContent:= sFile.DataString; + + //----- Template HTML Files + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb + PathDelim + ExtractFileName(sUnitLogin))); + sFile.Free; + end; + {$ENDREGION} + + + + {$REGION 'REST SERVER API'} + if (WizardForm.ComboBox_RestAPIServer.ItemIndex = 0) or (WizardForm.ComboBox_RestAPIServer.ItemIndex = 1) then //Auth + begin + {$REGION 'AUTH CLASS FILE'} + if Pos(UpperCase('Includes Authentication'), UpperCase(WizardForm.ComboBox_RestAPIServer.Text)) > 0 then + begin + sFile:= TStringStream.Create('', TEncoding.UTF8); + if WizardForm.CheckBox_RestAPIServer_UseClass.Checked then //Use Classes in API + sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitAuthClassFile)) + else + sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitAuthFile)); + sFileContent:= sFile.DataString; + + sFileContent := StringReplace(sFileContent, '<UNITNAME>', 'API.Auth', [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '<COPYRIGHTYEAR>', IntToStr(CurrentYear), [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '<ServerController>', sProjectName + 'WebApp', [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '<CLASS_ID>', 'APIAuth', [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb+ PathDelim + 'API.Auth.pas')); + sFile.Free; + end; + {$ENDREGION} + + + {$REGION 'PING CLASS FILE'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + if WizardForm.CheckBox_RestAPIServer_UseClass.Checked then //Use Classes in API + sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitPingClassFile)) + else + sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerUnitPingFile)); + sFileContent:= sFile.DataString; + + sFileContent := StringReplace(sFileContent, '<UNITNAME>', 'API.Ping', [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '<COPYRIGHTYEAR>', IntToStr(CurrentYear), [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '<ServerController>', sProjectName + 'WebApp', [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '<CLASS_ID>', 'APIPing', [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb+ PathDelim + 'API.Ping.pas')); + sFile.Free; + {$ENDREGION} + + + {$REGION 'SESSION FILE'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sRESTAPIServerSessionFile)); + sFileContent:= sFile.DataString; + + sFileContent := StringReplace(sFileContent, '<COPYRIGHTYEAR>', IntToStr(CurrentYear), [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb+ PathDelim + 'D2Bridge.Rest.Session.pas')); + sFile.Free; + {$ENDREGION} + + sUNITs.Add(' API.Auth in ''API.Auth.pas'','); + sUNITs.Add(' API.Ping in ''API.Ping.pas'','); + sUNITs.Add(' D2Bridge.Rest.Session in ''D2Bridge.Rest.Session.pas'','); + end; - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sPathUnitServer)); - sFile.Free; - {$ENDIF} {$ENDREGION} - - - {$REGION 'Form Server Properties'} - if sPathDFMServer <> '' then - begin - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathDFMServer)); - sFileContent:= sFile.DataString; - - //----- SERVER PORT - sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); - - //----- SERVER NAME - sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sPathDFMServer)); - sFile.Free; - end; - {$ENDREGION} - - - - {$REGION 'Unit Form1'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sDestinationPathWeb + PathDelim + 'Unit1'+'.pas')); - sFileContent:= sFile.DataString; - - //----- Template HTML Files - sFileContent := StringReplace(sFileContent, '{TemplateMasterHTMLFile}', WizardForm.Edit_Template_Maste_Page.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{TemplateHTMLFile}', WizardForm.Edit_Template_Page.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - - //MainMenu - if WizardForm.RadioButton_Menu_SideBar.Checked and (WizardForm.ComboBox_Template.Text = 'None') then - sFileContent := StringReplace(sFileContent, '{MENU}', 'SideMenu(MainMenu1);', [rfIgnoreCase, rfReplaceAll]) - else - sFileContent := StringReplace(sFileContent, '{MENU}', 'VCLObj(MainMenu1);', [rfIgnoreCase, rfReplaceAll]); - - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb + PathDelim + 'Unit1'+'.pas')); - sFile.Free; - {$ENDREGION} - - - - with WizardForm.TemplatesList.Items[WizardForm.ComboBox_Template.ItemIndex] do - begin - if TemplateFilePath <> '' then - begin - if Zipped then - begin - {$IFDEF FPC}ExtractZipFile{$ELSE}TZipFile.ExtractZipFile{$ENDIF}(GetRealFilePath(sPathWizard + PathDelim + TemplateFilePath), sPathwwwroot); - end; - end; - - end; - -{$IFDEF FPC} - PathPROJ:= sPathWEBDPROJFile; -{$ELSE} - services := (BorlandIDEServices as IOTAModuleServices); - services.OpenModule(PChar(sProjectNameLogical)); -{$ENDIF} - - - //Project.geterverStarter.pas'; -{$IFDEF FPC} - MessageDlg('The Lazarus Web project was created Successfully!', mtinformation, [mbok], 0); -{$ELSE} - MessageDlg('The Delphi Web project was created Successfully!', mtinformation, [mbok], 0); -{$ENDIF} - end; - finally - if WizardForm.EnableCreateProject then - begin - FreeAndNil(sLanguagesUnitsDPR); - FreeAndNil(sLanguagesJSON); - FreeAndNil(sLanguagesUSES); - FreeAndNil(sLanguagesCREATE); - FreeAndNil(sLanguagesDESTROY); - FreeAndNil(sLanguagesSET); - FreeAndNil(sUNITs); - //WizardForm.Free; - end; - end; -end; - -end. + {$REGION 'WEB dpropj'} + //----- COPY DProj + if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLDPROJFile, sPathWEBDPROJFile, false) + else +{$IFDEF DELPHI} + if sTypeServer = tsWebAndFMX then + CopyFile(PWideChar(sSourceFMXDPROJFile), PWideChar(sPathWEBDPROJFile), false) + else + if sTypeServer = tsWebFMX then + CopyFile(PWideChar(sSourceWebFMXDPROJFile), PWideChar(sPathWEBDPROJFile), false) + else +{$ENDIF} + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebVCLDPROJFile, sPathWEBDPROJFile, false); + + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathWEBDPROJFile)); + sFileContent:= sFile.DataString; + + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '{D2BridgeFrameworkPath}', sD2BridgeFrameworkSearchPath, [rfIgnoreCase,rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{D2BridgeDirectives}', sD2BridgeDirectives.Text, [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{D2BridgePath}', IncludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text), [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{PathDelim}', PathDelim, [rfIgnoreCase, rfReplaceAll]); + + {$IFDEF MSWINDOWS} + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazBuild}', 'FixD2BridgeLazBuild.bat', [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'FixD2BridgeLazCompile.bat', [rfIgnoreCase, rfReplaceAll]); + {$ELSE} + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazBuild}', 'sh FixD2BridgeLazBuild.sh', [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'sh FixD2BridgeLazCompile.sh', [rfIgnoreCase, rfReplaceAll]); + {$ENDIF} + + + +{$IFDEF FPC} + if WizardForm.ComboBox_Server_Type.Text = 'Server Console (Recommended)' then + sFileContent:= StringReplace(sFileContent, '{D2BridgeServerUnit}', 'Unit_D2Bridge_Server_Console.pas', [rfIgnoreCase, rfReplaceAll]); +{$ENDIF} + + //Replace Language Support Resource + if (WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes') and (WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes') then + sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '<RcCompile Include="D2Bridge.Lang.APP.rc"><Form>D2Bridge.Lang.APP.res</Form></RcCompile>', [rfIgnoreCase]) + else + sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '', [rfIgnoreCase]); + + sFile.Clear; + sFile.WriteString(sFileContent); + SFile.SaveToFile(GetRealFilePath(sPathWEBDPROJFile)); + sFile.Free; + {$ENDREGION} + + + + {$REGION 'WEB dpr'} + if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLDPRFile, sProjectNameLogical, false) + else +{$IFDEF DELPHI} + if sTypeServer = tsWebAndFMX then + CopyFile(PWideChar(sSourceFMXDPRFile), PWideChar(sProjectNameLogical), false) + else + if sTypeServer = tsWebFMX then + CopyFile(PWideChar(sSourceWebFMXDPRFile), PWideChar(sProjectNameLogical), false) + else +{$ENDIF} + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebDPRFile, sProjectNameLogical, false); + + + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sProjectNameLogical)); + sFileContent:= sFile.DataString; + + if WizardForm.ComboBox_Server_Type.Text = 'Server Complete' then + begin + sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server.pas'; + sPathDFMServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server.dfm'; + sUNITs.Add(' Unit_D2Bridge_Server in ''Unit_D2Bridge_Server.pas'' {Form_D2Bridge_Server},'); + + CopyFolderFiles(PWideChar(sPathWizard + PathDelim + 'Servers\Complete\*.*'), sDestinationPathWeb); + + sFileContent:= StringReplace(sFileContent, '{Units}', sUNITs.Text, [rfIgnoreCase]); + sFileContent:= StringReplace(sFileContent, '{Server}', 'Application.CreateForm(TForm_D2Bridge_Server, Form_D2Bridge_Server);', []); + sFileContent:= StringReplace(sFileContent, '{Application.Run;}', 'Application.Run;', [rfIgnoreCase]); + end else + if WizardForm.ComboBox_Server_Type.Text = 'Server Compact' then + begin + sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Compact.pas'; + sPathDFMServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Compact.dfm'; + sUNITs.Add(' Unit_D2Bridge_Server_Compact in ''Unit_D2Bridge_Server_Compact.pas'' {Form_D2Bridge_Server_Compact},'); + + CopyFolderFiles(PWideChar(sPathWizard + PathDelim + 'Servers' + PathDelim + 'Compact' + PathDelim + '*.*'), sDestinationPathWeb); + + sFileContent:= StringReplace(sFileContent, '{Units}', sUNITs.Text, [rfIgnoreCase]); + sFileContent:= StringReplace(sFileContent, '{Server}', 'Application.CreateForm(TForm_D2Bridge_Server_Compact, Form_D2Bridge_Server_Compact);', []); + sFileContent:= StringReplace(sFileContent, '{Application.Run;}', 'Application.Run;', [rfIgnoreCase]); + end else + if WizardForm.ComboBox_Server_Type.Text = 'Server Console (Recommended)' then + begin + sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Console.pas'; + sPathDFMServer:= ''; + sUNITs.Add(' Unit_D2Bridge_Server_Console in ''Unit_D2Bridge_Server_Console.pas'','); + +{$IFDEF FPC} + CopyFolderFiles(sPathWizard + PathDelim + 'Servers' + PathDelim + 'Console' + PathDelim + '*.*', sDestinationPathWeb); +{$ELSE} + CopyFolderFiles(PWideChar(sPathWizard+'\Servers\Console\*.*'), sDestinationPathWeb); +{$ENDIF} + + sFileContent:= StringReplace(sFileContent, '{Units}', sUNITs.Text, [rfIgnoreCase]); + sFileContent:= StringReplace(sFileContent, '//{$APPTYPE CONSOLE}', '{$APPTYPE CONSOLE}', [rfIgnoreCase]); + sFileContent:= StringReplace(sFileContent, 'Application.MainFormOnTaskbar:= True;', 'Application.MainFormOnTaskbar:= False;', [rfIgnoreCase]); + sFileContent:= StringReplace(sFileContent, '{Server}', 'TD2BridgeServerConsole.Run', [rfIgnoreCase]); + sFileContent:= StringReplace(sFileContent, '{Application.Run;}', '', [rfIgnoreCase]); + end; + + //Replace Language Support Resource + if (WizardForm.ComboBox_Enabled_Multi_Languages.Text = 'Yes') and (WizardForm.ComboBox_Embed_Translation_Files.Text = 'Yes') then + sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '{$R D2Bridge.Lang.APP.res D2Bridge.Lang.APP.rc}', [rfIgnoreCase]) + else + sFileContent:= StringReplace(sFileContent, '{Language Support Resource}', '', [rfIgnoreCase]); + + //Replace Language Support + sFileContent:= StringReplace(sFileContent, '{Language Support}', sLanguagesUnitsDPR.Text, [rfIgnoreCase]); + + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithVCL', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent := StringReplace(sFileContent, 'D2BridgeWebAppWithFMX', sProjectName, [rfIgnoreCase,rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{D2BridgePath}', IncludeTrailingPathDelimiter(WizardForm.Edit_Path_D2Bridge.Text), [rfIgnoreCase, rfReplaceAll]); + sFileContent:= StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + //----- PrimaryForm / Class + sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sProjectNameLogical)); + sFile.Free; + {$ENDREGION} + + + + {$REGION 'Unit Server Properties'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitServer)); + sFileContent:= sFile.DataString; + + //----- PrimaryForm / Class + sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + + //----- SSL + if WizardForm.ComboBox_UseSSL.Text = 'Yes' then + begin + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.SSL:= true;', 'D2BridgeServerController.Prism.Options.SSL:= true;', [rfIgnoreCase]); + end; + sFileContent := StringReplace(sFileContent, '{Certificate}', WizardForm.Edit_SSL_Certificate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate_Key}', WizardForm.Edit_SSL_Key.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate Intermediate}', WizardForm.Edit_SSL_Intermediate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + //----- Server Port + sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); + + //----- Server Name + sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); + + //----- Path JS + sFileContent := StringReplace(sFileContent, '{PathJS}', WizardForm.Edit_Path_JS.Text, [rfIgnoreCase]); + //----- Path CSS + sFileContent := StringReplace(sFileContent, '{PathCSS}', WizardForm.Edit_Path_CSS.Text, [rfIgnoreCase]); + + //----- Language + sFileContent := StringReplace(sFileContent, '{Languages}', '[' + sLanguagesSET.CommaText + ']', [rfIgnoreCase, rfReplaceAll]); + + //----- Options jQuery + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', 'D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', [rfIgnoreCase]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sPathUnitServer)); + sFile.Free; + {$ENDREGION} + + + {$REGION 'Form Server Properties'} + if sPathDFMServer <> '' then + begin + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathDFMServer)); + sFileContent:= sFile.DataString; + + //----- SERVER PORT + sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); + + //----- SERVER NAME + sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sPathDFMServer)); + sFile.Free; + end; + {$ENDREGION} + + + + {$REGION 'Unit Form1'} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sDestinationPathWeb + PathDelim + 'Unit1'+'.pas')); + sFileContent:= sFile.DataString; + + //----- Template HTML Files + sFileContent := StringReplace(sFileContent, '{TemplateMasterHTMLFile}', WizardForm.Edit_Template_Maste_Page.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{TemplateHTMLFile}', WizardForm.Edit_Template_Page.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + //MainMenu + if WizardForm.RadioButton_Menu_SideBar.Checked and (WizardForm.ComboBox_Template.Text = 'None') then + sFileContent := StringReplace(sFileContent, '{MENU}', 'SideMenu(MainMenu1);', [rfIgnoreCase, rfReplaceAll]) + else + sFileContent := StringReplace(sFileContent, '{MENU}', 'VCLObj(MainMenu1);', [rfIgnoreCase, rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sDestinationPathWeb + PathDelim + 'Unit1'+'.pas')); + sFile.Free; + {$ENDREGION} + + + + with WizardForm.TemplatesList.Items[WizardForm.ComboBox_Template.ItemIndex] do + begin + if TemplateFilePath <> '' then + begin + if Zipped then + begin + {$IFDEF FPC}ExtractZipFile{$ELSE}TZipFile.ExtractZipFile{$ENDIF}(GetRealFilePath(sPathWizard + PathDelim + TemplateFilePath), sPathwwwroot); + end; + end; + + end; + +{$IFDEF FPC} + PathPROJ:= sPathWEBDPROJFile; +{$ELSE} + services := (BorlandIDEServices as IOTAModuleServices); + services.OpenModule(PChar(sProjectNameLogical)); +{$ENDIF} + + + //Project.geterverStarter.pas'; +{$IFDEF FPC} + MessageDlg('The Lazarus Web project was created Successfully!', mtinformation, [mbok], 0); +{$ELSE} + MessageDlg('The Delphi Web project was created Successfully!', mtinformation, [mbok], 0); +{$ENDIF} + end; + finally + if WizardForm.EnableCreateProject then + begin + FreeAndNil(sLanguagesUnitsDPR); + FreeAndNil(sLanguagesJSON); + FreeAndNil(sLanguagesUSES); + FreeAndNil(sLanguagesCREATE); + FreeAndNil(sLanguagesDESTROY); + FreeAndNil(sLanguagesSET); + FreeAndNil(sUNITs); + //WizardForm.Free; + end; + end; +end; + +end. From 2542a7365145a000b7b94cedc476956cf2076eed Mon Sep 17 00:00:00 2001 From: Max Jacinto Gomes <max@fastmedic.com.br> Date: Mon, 23 Mar 2026 16:14:15 -0300 Subject: [PATCH 5/6] Ajustes para rodar em linux ... --- .../D2Bridge.NewProject.Wizard.Common.pas | 201 ++++++++++++++---- 1 file changed, 156 insertions(+), 45 deletions(-) diff --git a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas index b05e48e..92b184c 100644 --- a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas +++ b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas @@ -1,4 +1,4 @@ -{ +{ +--------------------------------------------------------------------------+ D2Bridge Framework Content @@ -142,6 +142,7 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sPathBINWEB, sPathBIN: string; sPathwwwroot: string; sPathWEBDPROJFile, sPathWEBRESFile, sPathWEBICOFile, sPathWizard, sPathUnitBase, sPathUnitServer, sPathDFMServer: string; + sPathUnitServiceServer : string; sSourceWebVCLDPROJFile, sSourceVCLDPROJFile: string; sSourceWebDPRFile, sSourceVCLDPRFile: string; sSourceWebRESFile, sSourceVCLRESFile: string; @@ -154,6 +155,7 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sRESTAPIServerUnitAuthFile, sRESTAPIServerUnitPingFile: string; sRESTAPIServerUnitAuthClassFile, sRESTAPIServerUnitPingClassFile: string; sRESTAPIServerSessionFile: string; + begin try WizardForm.ShowModal; @@ -271,10 +273,10 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; {$IFDEF MSWINDOWS} sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.bat'; sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.bat'; - {$ELSE} + {$ELSE} sSourceFixD2BridgeLazCompile := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazCompile.sh'; sSourceFixD2BridgeLazBuild := sPathWizard + PathDelim + 'dpr' + PathDelim + 'LAZARUS' + PathDelim + 'FixD2BridgeLazBuild.sh'; - {$ENDIF} + {$ENDIF} {$ENDIF} if WizardForm.CheckBox_Create_Project_Folder.Checked then @@ -455,6 +457,7 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; {$ENDREGION} {$REGION 'Copy Languages Units'} + sLanguagesDESTROY.Add('{$IFNDEF D2WindowsService}'); for I := 0 to Pred(WizardForm.CheckListBox_Languages.Count) do if WizardForm.CheckListBox_Languages.Checked[I] then begin @@ -489,6 +492,7 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sFile.SaveToFile(sDestinationPathWeb + PathDelim + 'D2Bridge.Lang.APP.'+WizardForm.CheckListBox_Languages.Items[I]+'.pas'); sFile.Free; end; + sLanguagesDESTROY.Add('{$ENDIF}'); {$ENDREGION} {$REGION 'Copy D2Bridge.Lang.APP.Core'} @@ -746,7 +750,11 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'sh FixD2BridgeLazCompile.sh', [rfIgnoreCase, rfReplaceAll]); {$ENDIF} - + {$IFDEF DELPHI} + var G: TGUID; + CreateGUID(G); + sFileContent:= StringReplace(sFileContent, '{ProjectGUID}', GUIDToString(G), [rfIgnoreCase, rfReplaceAll]); + {$ENDIF} {$IFDEF FPC} if WizardForm.ComboBox_Server_Type.Text = 'Server Console (Recommended)' then @@ -768,19 +776,72 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; {$REGION 'WEB dpr'} + {$IFDEF DELPHI} + CopyFolderFiles( + PWideChar(sPathWizard + PathDelim + 'Servers' + PathDelim + 'Service' + PathDelim + '*.*'), + sDestinationPathWeb + ); + + sPathUnitServer := sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Service.pas'; + sPathDFMServer := sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Service.dfm'; + + sFile := TStringStream.Create('', TEncoding.UTF8); + try + sFile.LoadFromFile(GetRealFilePath(sPathUnitServer)); + sFileContent := sFile.DataString; + + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sPathUnitServer)); + finally + sFile.Free; + end; + + sFile := TStringStream.Create('', TEncoding.UTF8); + try + sFile.LoadFromFile(GetRealFilePath(sPathDFMServer)); + sFileContent := sFile.DataString; + + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sPathDFMServer)); + finally + sFile.Free; + end; + + sPathUnitServiceServer := sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Core.pas'; + + sFile := TStringStream.Create('', TEncoding.UTF8); + try + sFile.LoadFromFile(GetRealFilePath(sPathUnitServiceServer)); + sFileContent := sFile.DataString; + + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfReplaceAll]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sPathUnitServiceServer)); + finally + sFile.Free; + end; + {$ENDIF} + if sTypeServer = {$IFDEF FPC}tsWebAndLCL{$ELSE}tsWebAndVCL{$ENDIF} then {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceVCLDPRFile, sProjectNameLogical, false) else -{$IFDEF DELPHI} + {$IFDEF DELPHI} if sTypeServer = tsWebAndFMX then - CopyFile(PWideChar(sSourceFMXDPRFile), PWideChar(sProjectNameLogical), false) + CopyFile(PWideChar(sSourceFMXDPRFile), PWideChar(sProjectNameLogical), false) else - if sTypeServer = tsWebFMX then - CopyFile(PWideChar(sSourceWebFMXDPRFile), PWideChar(sProjectNameLogical), false) - else -{$ENDIF} - {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebDPRFile, sProjectNameLogical, false); - + if sTypeServer = tsWebFMX then + CopyFile(PWideChar(sSourceWebFMXDPRFile), PWideChar(sProjectNameLogical), false) + else + {$ENDIF} + {$IFDEF FPC}CopyFile{$ELSE}TFile.Copy{$ENDIF}(sSourceWebDPRFile, sProjectNameLogical, false); sFile:= TStringStream.Create('', TEncoding.UTF8); sFile.LoadFromFile(GetRealFilePath(sProjectNameLogical)); @@ -790,7 +851,7 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; begin sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server.pas'; sPathDFMServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server.dfm'; - sUNITs.Add(' Unit_D2Bridge_Server in ''Unit_D2Bridge_Server.pas'' {Form_D2Bridge_Server},'); + sUNITs.Add('Unit_D2Bridge_Server in ''Unit_D2Bridge_Server.pas'' {Form_D2Bridge_Server},'); CopyFolderFiles(PWideChar(sPathWizard + PathDelim + 'Servers\Complete\*.*'), sDestinationPathWeb); @@ -814,8 +875,9 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; begin sPathUnitServer:= sDestinationPathWeb + PathDelim + 'Unit_D2Bridge_Server_Console.pas'; sPathDFMServer:= ''; - sUNITs.Add(' Unit_D2Bridge_Server_Console in ''Unit_D2Bridge_Server_Console.pas'','); - + sUNITs.Add('{$IFNDEF D2WindowsService}'); + sUNITs.Add('Unit_D2Bridge_Server_Console in ''Unit_D2Bridge_Server_Console.pas'','); + sUNITs.Add('{$ENDIF}'); {$IFDEF FPC} CopyFolderFiles(sPathWizard + PathDelim + 'Servers' + PathDelim + 'Console' + PathDelim + '*.*', sDestinationPathWeb); {$ELSE} @@ -858,48 +920,96 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; {$REGION 'Unit Server Properties'} - sFile:= TStringStream.Create('', TEncoding.UTF8); - sFile.LoadFromFile(GetRealFilePath(sPathUnitServer)); - sFileContent:= sFile.DataString; + {$IFDEF DELPHI} + for var ServersFile in [sPathUnitServer,sPathUnitServiceServer] do + begin + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(ServersFile)); + sFileContent:= sFile.DataString; - //----- PrimaryForm / Class - sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + //----- PrimaryForm / Class + sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - //----- SSL - if WizardForm.ComboBox_UseSSL.Text = 'Yes' then - begin - sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.SSL:= true;', 'D2BridgeServerController.Prism.Options.SSL:= true;', [rfIgnoreCase]); + //----- SSL + if WizardForm.ComboBox_UseSSL.Text = 'Yes' then + begin + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.SSL:= true;', 'D2BridgeServerController.Prism.Options.SSL:= true;', [rfIgnoreCase]); + end; + sFileContent := StringReplace(sFileContent, '{Certificate}', WizardForm.Edit_SSL_Certificate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate_Key}', WizardForm.Edit_SSL_Key.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate Intermediate}', WizardForm.Edit_SSL_Intermediate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + + //----- Server Port + sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); + + //----- Server Name + sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); + + //----- Path JS + sFileContent := StringReplace(sFileContent, '{PathJS}', WizardForm.Edit_Path_JS.Text, [rfIgnoreCase]); + //----- Path CSS + sFileContent := StringReplace(sFileContent, '{PathCSS}', WizardForm.Edit_Path_CSS.Text, [rfIgnoreCase]); + + //----- Language + sFileContent := StringReplace(sFileContent, '{Languages}', '[' + sLanguagesSET.CommaText + ']', [rfIgnoreCase, rfReplaceAll]); + + //----- Options jQuery + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', 'D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', [rfIgnoreCase]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(ServersFile)); + sFile.Free; end; - sFileContent := StringReplace(sFileContent, '{Certificate}', WizardForm.Edit_SSL_Certificate.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{Certificate_Key}', WizardForm.Edit_SSL_Key.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{Certificate Intermediate}', WizardForm.Edit_SSL_Intermediate.Text, [rfIgnoreCase]); - sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); + {$ELSE} + sFile:= TStringStream.Create('', TEncoding.UTF8); + sFile.LoadFromFile(GetRealFilePath(sPathUnitServer)); + sFileContent:= sFile.DataString; - //----- Server Port - sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); + //----- PrimaryForm / Class + sFileContent := StringReplace(sFileContent, '{PrimaryFormClass}', sClassPrimaryForm, [rfIgnoreCase, rfReplaceAll]); + sFileContent := StringReplace(sFileContent, '{PrimaryFormUnit}', sUnitPrimaryForm, [rfIgnoreCase, rfReplaceAll]); - //----- Server Name - sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); + //----- SSL + if WizardForm.ComboBox_UseSSL.Text = 'Yes' then + begin + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.SSL:= true;', 'D2BridgeServerController.Prism.Options.SSL:= true;', [rfIgnoreCase]); + end; + sFileContent := StringReplace(sFileContent, '{Certificate}', WizardForm.Edit_SSL_Certificate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate_Key}', WizardForm.Edit_SSL_Key.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{Certificate Intermediate}', WizardForm.Edit_SSL_Intermediate.Text, [rfIgnoreCase]); + sFileContent := StringReplace(sFileContent, '{ProjectName}', sProjectName, [rfIgnoreCase, rfReplaceAll]); - //----- Path JS - sFileContent := StringReplace(sFileContent, '{PathJS}', WizardForm.Edit_Path_JS.Text, [rfIgnoreCase]); - //----- Path CSS - sFileContent := StringReplace(sFileContent, '{PathCSS}', WizardForm.Edit_Path_CSS.Text, [rfIgnoreCase]); + //----- Server Port + sFileContent := StringReplace(sFileContent, '{Server_Port}', WizardForm.Edit_Server_Port.Text, [rfIgnoreCase]); - //----- Language - sFileContent := StringReplace(sFileContent, '{Languages}', '[' + sLanguagesSET.CommaText + ']', [rfIgnoreCase, rfReplaceAll]); + //----- Server Name + sFileContent := StringReplace(sFileContent, '{Server_Name}', WizardForm.Edit_Server_Name.Text, [rfIgnoreCase]); - //----- Options jQuery - sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', 'D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', [rfIgnoreCase]); + //----- Path JS + sFileContent := StringReplace(sFileContent, '{PathJS}', WizardForm.Edit_Path_JS.Text, [rfIgnoreCase]); + //----- Path CSS + sFileContent := StringReplace(sFileContent, '{PathCSS}', WizardForm.Edit_Path_CSS.Text, [rfIgnoreCase]); - sFile.Clear; - sFile.WriteString(sFileContent); - sFile.SaveToFile(GetRealFilePath(sPathUnitServer)); - sFile.Free; + //----- Language + sFileContent := StringReplace(sFileContent, '{Languages}', '[' + sLanguagesSET.CommaText + ']', [rfIgnoreCase, rfReplaceAll]); + + //----- Options jQuery + sFileContent := StringReplace(sFileContent, '//D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', 'D2BridgeServerController.Prism.Options.IncludeJQuery:= true;', [rfIgnoreCase]); + + sFile.Clear; + sFile.WriteString(sFileContent); + sFile.SaveToFile(GetRealFilePath(sPathUnitServer)); + sFile.Free; + {$ENDIF} {$ENDREGION} + + + {$REGION 'Form Server Properties'} if sPathDFMServer <> '' then begin @@ -989,3 +1099,4 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; end; end. + From 5c383fa6c48f608bbe3a7c750056f469c6e50726 Mon Sep 17 00:00:00 2001 From: Max Gomes <gomesjacinto@gmail.com> Date: Tue, 24 Mar 2026 17:49:39 -0300 Subject: [PATCH 6/6] Ajustes no fontes para rodar em lazarus e ajustes e na bpl para delphi --- .../BPL/23.0/D2BridgeFrameworkWizard.bpl | Bin 748032 -> 750592 bytes .../D2Bridge.NewProject.Wizard.Common.pas | 7 ++----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Beta/Wizard/BPL/23.0/D2BridgeFrameworkWizard.bpl b/Beta/Wizard/BPL/23.0/D2BridgeFrameworkWizard.bpl index 930e29b2390fe33ef76d4c63b69652785a534339..877d72ba2016e2edbccb4d8d23266fff8477ffbf 100644 GIT binary patch delta 118471 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�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 b1h>1zasEg0xo!P<eOC3~c9pr$CddB+?!1hd delta 115903 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�SOfWy|4uJ&(r3p$72Qt)}Zu8 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Ν$3u}KtAsD->nyeRJ4pcSy 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 diff --git a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas index 92b184c..aba29b5 100644 --- a/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas +++ b/Beta/Wizard/Package/Commom/D2Bridge.NewProject.Wizard.Common.pas @@ -155,7 +155,7 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sRESTAPIServerUnitAuthFile, sRESTAPIServerUnitPingFile: string; sRESTAPIServerUnitAuthClassFile, sRESTAPIServerUnitPingClassFile: string; sRESTAPIServerSessionFile: string; - + G: TGUID; begin try WizardForm.ShowModal; @@ -750,11 +750,8 @@ procedure TD2BridgeNewProjectWizardCommon.Execute; sFileContent:= StringReplace(sFileContent, '{FixD2BridgeLazCompile}', 'sh FixD2BridgeLazCompile.sh', [rfIgnoreCase, rfReplaceAll]); {$ENDIF} - {$IFDEF DELPHI} - var G: TGUID; - CreateGUID(G); + CreateGUID(G); sFileContent:= StringReplace(sFileContent, '{ProjectGUID}', GUIDToString(G), [rfIgnoreCase, rfReplaceAll]); - {$ENDIF} {$IFDEF FPC} if WizardForm.ComboBox_Server_Type.Text = 'Server Console (Recommended)' then