From 43b0ec7e2012d5ad3f3e7e6705ba00d08ee88a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Thu, 18 Jul 2019 11:48:11 +0200 Subject: [PATCH] Update to CEF 75.1.4 - Fixed issue #179 : Added a new EditorBrowser demo. - Fixed issue #195 : Added VizDisplayCompositor to the disabled features list - Fixed issue #206 : Added a context menu option to show the DevTools in SimpleFMXBrowser. Added TCEFFMXChromium.ShowDevTools and TCEFFMXChromium.CloseDevTools. - Added a new menu option to MiniBrowser to simulate key presses in normal mode. --- bin/EditorBrowser.html | 11 + .../SimpleFMXBrowser/SimpleFMXBrowser.dpr | 3 +- .../SimpleFMXBrowser/uSimpleFMXBrowser.fmx | 2 + .../SimpleFMXBrowser/uSimpleFMXBrowser.pas | 33 + .../ConsoleBrowser/OSRDLLBrowser.dpr | 1 + .../ConsoleBrowser/OSRSubProcess.dpr | 1 + .../EditorBrowser/00-DeleteDCUs.bat | 18 + .../EditorBrowser/EditorBrowser.dpr | 73 ++ .../EditorBrowser/EditorBrowser.dproj | 654 ++++++++++ demos/Delphi_VCL/EditorBrowser/cef.inc | 409 ++++++ .../EditorBrowser/uEditorBrowser.dfm | 1125 +++++++++++++++++ .../EditorBrowser/uEditorBrowser.pas | 512 ++++++++ .../KioskOSRBrowser/uKioskOSRBrowser.pas | 1 + demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm | 4 + demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas | 36 + .../uOSRExternalPumpBrowser.pas | 1 + demos/Delphi_VCL/PopupBrowser/uMainForm.dfm | 1 - demos/Delphi_VCL/PopupBrowser/uMainForm.pas | 2 +- .../SimpleOSRBrowser/uSimpleOSRBrowser.pas | 1 + demos/Lazarus/EditorBrowser/00-Delete.bat | 2 + demos/Lazarus/EditorBrowser/EditorBrowser.dpr | 81 ++ demos/Lazarus/EditorBrowser/EditorBrowser.lpi | 91 ++ demos/Lazarus/EditorBrowser/EditorBrowser.lps | 69 + demos/Lazarus/EditorBrowser/cef.inc | 409 ++++++ .../Lazarus/EditorBrowser/uEditorBrowser.lfm | 990 +++++++++++++++ .../Lazarus/EditorBrowser/uEditorBrowser.pas | 508 ++++++++ .../OSRExternalPumpBrowser.lps | 2 +- .../uOSRExternalPumpBrowser.pas | 4 +- demos/Lazarus/PopupBrowser/PopupBrowser.lps | 2 +- demos/Lazarus/PopupBrowser/uMainForm.pas | 2 +- .../SimpleOSRBrowser/SimpleOSRBrowser.lps | 2 +- .../SimpleOSRBrowser/usimplelazosrbrowser.pas | 2 +- packages/CEF4Delphi_FMX.res | Bin 676 -> 724 bytes packages/cef4delphi_lazarus.lpk | 2 +- source/uCEFApplication.pas | 4 +- source/uCEFChromium.pas | 22 +- source/uCEFChromiumEvents.pas | 2 +- source/uCEFFMXChromium.pas | 66 +- source/uCEFInterfaces.pas | 5 +- source/uCEFRequestContext.pas | 6 + source/uCEFRequestHandler.pas | 58 +- source/uCEFTypes.pas | 3 +- update_CEF4Delphi.json | 6 +- 43 files changed, 5155 insertions(+), 71 deletions(-) create mode 100644 bin/EditorBrowser.html create mode 100644 demos/Delphi_VCL/EditorBrowser/00-DeleteDCUs.bat create mode 100644 demos/Delphi_VCL/EditorBrowser/EditorBrowser.dpr create mode 100644 demos/Delphi_VCL/EditorBrowser/EditorBrowser.dproj create mode 100644 demos/Delphi_VCL/EditorBrowser/cef.inc create mode 100644 demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm create mode 100644 demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas create mode 100644 demos/Lazarus/EditorBrowser/00-Delete.bat create mode 100644 demos/Lazarus/EditorBrowser/EditorBrowser.dpr create mode 100644 demos/Lazarus/EditorBrowser/EditorBrowser.lpi create mode 100644 demos/Lazarus/EditorBrowser/EditorBrowser.lps create mode 100644 demos/Lazarus/EditorBrowser/cef.inc create mode 100644 demos/Lazarus/EditorBrowser/uEditorBrowser.lfm create mode 100644 demos/Lazarus/EditorBrowser/uEditorBrowser.pas diff --git a/bin/EditorBrowser.html b/bin/EditorBrowser.html new file mode 100644 index 00000000..1912d790 --- /dev/null +++ b/bin/EditorBrowser.html @@ -0,0 +1,11 @@ + + + +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor +incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis +nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. +Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore +eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt +in culpa qui officia deserunt mollit anim id est laborum.

+ + \ No newline at end of file diff --git a/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dpr b/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dpr index f4fda280..22644e8a 100644 --- a/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dpr +++ b/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dpr @@ -18,7 +18,8 @@ uses {$ENDIF} begin - GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.DisableFeatures := 'NetworkService'; // In case you want to use custom directories for the CEF3 binaries, cache, cookies and user data. // If you don't set a cache directory the browser will use in-memory cache. diff --git a/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.fmx b/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.fmx index 35b3876d..5b87152b 100644 --- a/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.fmx +++ b/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.fmx @@ -53,6 +53,8 @@ object SimpleFMXBrowserFrm: TSimpleFMXBrowserFrm Top = 129 end object FMXChromium1: TFMXChromium + OnBeforeContextMenu = FMXChromium1BeforeContextMenu + OnContextMenuCommand = FMXChromium1ContextMenuCommand OnBeforePopup = FMXChromium1BeforePopup OnAfterCreated = FMXChromium1AfterCreated OnBeforeClose = FMXChromium1BeforeClose diff --git a/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas b/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas index 6c1f8023..80a48670 100644 --- a/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas +++ b/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas @@ -50,6 +50,9 @@ uses FMX.Edit, FMX.Controls.Presentation, uCEFFMXWindowParent, uCEFFMXChromium, uCEFInterfaces, uCEFConstants, uCEFTypes; +const + MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 1; + type TSimpleFMXBrowserFrm = class(TForm) AddressPnl: TPanel; @@ -78,6 +81,13 @@ type procedure FormResize(Sender: TObject); procedure FMXChromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); + procedure FMXChromium1BeforeContextMenu(Sender: TObject; + const browser: ICefBrowser; const frame: ICefFrame; + const params: ICefContextMenuParams; const model: ICefMenuModel); + procedure FMXChromium1ContextMenuCommand(Sender: TObject; + const browser: ICefBrowser; const frame: ICefFrame; + const params: ICefContextMenuParams; commandId: Integer; + eventFlags: Cardinal; out Result: Boolean); protected // Variables to control when can we destroy the form safely @@ -147,6 +157,13 @@ begin PostCustomMessage(WM_CLOSE); end; +procedure TSimpleFMXBrowserFrm.FMXChromium1BeforeContextMenu( + Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; + const params: ICefContextMenuParams; const model: ICefMenuModel); +begin + model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools'); +end; + procedure TSimpleFMXBrowserFrm.FMXChromium1BeforePopup( Sender : TObject; const browser : ICefBrowser; const frame : ICefFrame; @@ -172,6 +189,22 @@ begin aAction := cbaDelay; end; +procedure TSimpleFMXBrowserFrm.FMXChromium1ContextMenuCommand( + Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; + const params: ICefContextMenuParams; commandId: Integer; + eventFlags: Cardinal; out Result: Boolean); +var + TempPoint : TPoint; +begin + if (commandId = MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS) then + begin + TempPoint.x := params.XCoord; + TempPoint.y := params.YCoord; + + FMXChromium1.ShowDevTools(TempPoint); + end; +end; + function TSimpleFMXBrowserFrm.PostCustomMessage(aMessage, wParam : cardinal; lParam : integer) : boolean; {$IFDEF MSWINDOWS} var diff --git a/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr b/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr index f7116599..4bb0a252 100644 --- a/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr +++ b/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr @@ -113,6 +113,7 @@ begin GlobalCEFApp.BrowserSubprocessPath := 'OSRSubProcess.exe'; GlobalCEFApp.ExternalMessagePump := False; GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; // This demo uses a different EXE for the subprocesses. // With this configuration it's not necessary to have the diff --git a/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr b/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr index f0d17bd2..7ecfa813 100644 --- a/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr +++ b/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr @@ -78,6 +78,7 @@ begin GlobalCEFApp.SetCurrentDir := True; GlobalCEFApp.ExternalMessagePump := False; GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; GlobalCEFApp.StartSubProcess; GlobalCEFApp.Free; diff --git a/demos/Delphi_VCL/EditorBrowser/00-DeleteDCUs.bat b/demos/Delphi_VCL/EditorBrowser/00-DeleteDCUs.bat new file mode 100644 index 00000000..a9a84095 --- /dev/null +++ b/demos/Delphi_VCL/EditorBrowser/00-DeleteDCUs.bat @@ -0,0 +1,18 @@ +del /s /q *.dcu +del /s /q *.exe +del /s /q *.res +del /s /q *.rsm +del /s /q *.log +del /s /q *.dsk +del /s /q *.identcache +del /s /q *.stat +del /s /q *.local +del /s /q *.~* +rmdir Win32\Debug +rmdir Win32\Release +rmdir Win32 +rmdir Win64\Debug +rmdir Win64\Release +rmdir Win64 +rmdir __history +rmdir __recovery diff --git a/demos/Delphi_VCL/EditorBrowser/EditorBrowser.dpr b/demos/Delphi_VCL/EditorBrowser/EditorBrowser.dpr new file mode 100644 index 00000000..96aacd17 --- /dev/null +++ b/demos/Delphi_VCL/EditorBrowser/EditorBrowser.dpr @@ -0,0 +1,73 @@ +// ************************************************************************ +// ***************************** CEF4Delphi ******************************* +// ************************************************************************ +// +// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based +// browser in Delphi applications. +// +// The original license of DCEF3 still applies to CEF4Delphi. +// +// For more information about CEF4Delphi visit : +// https://www.briskbard.com/index.php?lang=en&pageid=cef +// +// Copyright © 2018 Salvador Díaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + +program EditorBrowser; + +{$I cef.inc} + +uses + {$IFDEF DELPHI16_UP} + Vcl.Forms, + WinApi.Windows, + {$ELSE} + Forms, + Windows, + {$ENDIF } + uCEFApplication, + uEditorBrowser in 'uEditorBrowser.pas' {Form1}; + +{$R *.res} + +// CEF3 needs to set the LARGEADDRESSAWARE flag which allows 32-bit processes to use up to 3GB of RAM. +// If you don't add this flag the rederer process will crash when you try to load large images. +{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} + +begin + CreateGlobalCEFApp; + + if GlobalCEFApp.StartMainProcess then + begin + Application.Initialize; + {$IFDEF DELPHI11_UP} + Application.MainFormOnTaskbar := True; + {$ENDIF} + Application.CreateForm(TForm1, Form1); + Application.Run; + end; + + DestroyGlobalCEFApp; +end. diff --git a/demos/Delphi_VCL/EditorBrowser/EditorBrowser.dproj b/demos/Delphi_VCL/EditorBrowser/EditorBrowser.dproj new file mode 100644 index 00000000..8e4200f5 --- /dev/null +++ b/demos/Delphi_VCL/EditorBrowser/EditorBrowser.dproj @@ -0,0 +1,654 @@ + + + {55E00327-9D98-4DA3-A4E1-844942A01C6B} + 18.5 + VCL + EditorBrowser.dpr + True + Debug + Win32 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 3082 + EditorBrowser + $(BDS)\bin\delphi_PROJECTICON.ico + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + .\$(Platform)\$(Config) + false + false + false + false + false + ..\..\..\bin + + + DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;frxe23;vclFireDAC;emsclientfiredac;DataSnapFireDAC;svnui;tethering;Componentes;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;Intraweb;DBXOracleDriver;inetdb;Componentes_Int;CEF4Delphi;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyProtocols230;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;frxTee23;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;vcl;DBXSybaseASEDriver;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;Componentes_UI;TeeDB;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Componentes_Misc;ibxpress;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;Componentes_RTF;DBXInformixDriver;bindcompvcl;frxDB23;Componentes_vCard;TeeUI;IndyCore230;vclribbon;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;IndySystem230;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;frx23;fmxase;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + true + $(BDS)\bin\default_app.manifest + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;emsclientfiredac;DataSnapFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyProtocols230;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;vcl;DBXSybaseASEDriver;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;bindcompvcl;TeeUI;IndyCore230;vclribbon;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;IndySystem230;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;fmxase;$(DCC_UsePackage) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + true + 1033 + true + false + Debug + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + PerMonitor + + + true + true + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitor + + + true + PerMonitorV2 + + + + MainSource + + +
Form1
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Application + + + + EditorBrowser.dpr + + + IP Abstraction Indy Implementation Design Time + DBExpress Enterprise Data Explorer Integration + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + EditorBrowser.exe + true + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\values-v21 + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + True + True + + + 12 + + + + +
diff --git a/demos/Delphi_VCL/EditorBrowser/cef.inc b/demos/Delphi_VCL/EditorBrowser/cef.inc new file mode 100644 index 00000000..8334dc78 --- /dev/null +++ b/demos/Delphi_VCL/EditorBrowser/cef.inc @@ -0,0 +1,409 @@ +// ************************************************************************ +// ***************************** CEF4Delphi ******************************* +// ************************************************************************ +// +// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based +// browser in Delphi applications. +// +// The original license of DCEF3 still applies to CEF4Delphi. +// +// For more information about CEF4Delphi visit : +// https://www.briskbard.com/index.php?lang=en&pageid=cef +// +// Copyright © 2017 Salvador Diaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + + // The complete list of compiler versions is here : + // http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiler_Versions + +{$DEFINE DELPHI_VERSION_UNKNOW} + +// Delphi 5 +{$IFDEF VER130} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} +{$ENDIF} + +// Delphi 6 +{$IFDEF VER140} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} +{$ENDIF} + +// Delphi 7 +{$IFDEF VER150} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} +{$ENDIF} + +// Delphi 8 +{$IFDEF VER160} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} +{$ENDIF} + +// Delphi 2005 +{$IFDEF VER170} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} +{$ENDIF} + +{$IFDEF VER180} + {$UNDEF DELPHI_VERSION_UNKNOW} + // Delphi 2007 + {$IFDEF VER185} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + // Delphi 2006 + {$ELSE} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$ENDIF} +{$ENDIF} + +// Delphi 2009 +{$IFDEF VER200} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} +{$ENDIF} + +//Delphi 2010 +{$IFDEF VER210} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} +{$ENDIF} + +// Delphi XE +{$IFDEF VER220} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} +{$ENDIF} + +// Delphi XE2 (First FireMonkey and 64bit compiler) +{$IFDEF VER230} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} +{$ENDIF} + +// Delphi XE3 +{$IFDEF VER240} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} +{$ENDIF} + +// Delphi XE4 +{$IFDEF VER250} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} +{$ENDIF} + +// Delphi XE5 +{$IFDEF VER260} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} +{$ENDIF} + +// Delphi XE6 +{$IFDEF VER270} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} +{$ENDIF} + +// Delphi XE7 +{$IFDEF VER280} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} +{$ENDIF} + +// Delphi XE8 +{$IFDEF VER290} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} +{$ENDIF VER290} + +// Rad Studio 10 - Delphi Seattle +{$IFDEF VER300} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} +{$ENDIF} + +// Rad Studio 10.1 - Delphi Berlin +{$IFDEF VER310} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} +{$ENDIF} + +// Rad Studio 10.2 - Delphi Tokyo +{$IFDEF VER320} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} + {$DEFINE DELPHI25_UP} +{$ENDIF} + +// Rad Studio 10.3 - Delphi Rio +{$IFDEF VER330} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} + {$DEFINE DELPHI25_UP} + {$DEFINE DELPHI26_UP} +{$ENDIF} + +{$IFDEF FPC} + {$DEFINE SUPPORTS_INLINE} +{$ELSE} + {$IFDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} + {$DEFINE DELPHI25_UP} + {$DEFINE DELPHI26_UP} + {$ENDIF} +{$ENDIF} + +{$IFDEF DELPHI9_UP} + {$DEFINE SUPPORTS_INLINE} +{$ENDIF} + diff --git a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm new file mode 100644 index 00000000..27380698 --- /dev/null +++ b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm @@ -0,0 +1,1125 @@ +object Form1: TForm1 + Left = 0 + Top = 0 + Caption = 'Initializing browser. Please wait...' + ClientHeight = 624 + ClientWidth = 1038 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object CEFWindowParent1: TCEFWindowParent + Left = 0 + Top = 23 + Width = 1038 + Height = 601 + Align = alClient + TabStop = True + TabOrder = 0 + end + object ToolBar1: TToolBar + Left = 0 + Top = 0 + Width = 1038 + Height = 23 + Caption = 'ToolBar1' + Images = ImageList1 + TabOrder = 1 + object NewBtn: TToolButton + Left = 0 + Top = 0 + Hint = 'New document' + Caption = 'NewBtn' + ImageIndex = 8 + ParentShowHint = False + ShowHint = True + OnClick = NewBtnClick + end + object OpenBtn: TToolButton + Left = 23 + Top = 0 + Hint = 'Open document' + Caption = 'OpenBtn' + ImageIndex = 9 + ParentShowHint = False + ShowHint = True + OnClick = OpenBtnClick + end + object SaveBtn: TToolButton + Left = 46 + Top = 0 + Hint = 'Save document' + Caption = 'SaveBtn' + ImageIndex = 5 + ParentShowHint = False + ShowHint = True + OnClick = SaveBtnClick + end + object Separator1: TToolButton + Left = 69 + Top = 0 + Width = 8 + Caption = 'Separator1' + ImageIndex = 2 + Style = tbsSeparator + end + object BoldBtn: TToolButton + Left = 77 + Top = 0 + Hint = 'Bold' + Caption = 'BoldBtn' + ImageIndex = 3 + ParentShowHint = False + ShowHint = True + OnClick = BoldBtnClick + end + object ItalicBtn: TToolButton + Left = 100 + Top = 0 + Hint = 'Italics' + Caption = 'ItalicBtn' + ImageIndex = 4 + ParentShowHint = False + ShowHint = True + OnClick = ItalicBtnClick + end + object UnderlineBtn: TToolButton + Left = 123 + Top = 0 + Hint = 'Underline' + Caption = 'UnderlineBtn' + ImageIndex = 7 + ParentShowHint = False + ShowHint = True + OnClick = UnderlineBtnClick + end + object StrikethroughBtn: TToolButton + Left = 146 + Top = 0 + Hint = 'Strikethrough' + Caption = 'StrikethroughBtn' + ImageIndex = 6 + ParentShowHint = False + ShowHint = True + OnClick = StrikethroughBtnClick + end + object Separator2: TToolButton + Left = 169 + Top = 0 + Width = 8 + Caption = 'Separator2' + ImageIndex = 7 + Style = tbsSeparator + end + object AlignLeftBtn: TToolButton + Left = 177 + Top = 0 + Hint = 'Align left' + Caption = 'AlignLeftBtn' + ImageIndex = 1 + ParentShowHint = False + ShowHint = True + OnClick = AlignLeftBtnClick + end + object AlignCenterBtn: TToolButton + Left = 200 + Top = 0 + Hint = 'Align center' + Caption = 'AlignCenterBtn' + ImageIndex = 0 + ParentShowHint = False + ShowHint = True + OnClick = AlignCenterBtnClick + end + object AlignRightBtn: TToolButton + Left = 223 + Top = 0 + Hint = 'Align right' + Caption = 'AlignRightBtn' + ImageIndex = 2 + ParentShowHint = False + ShowHint = True + OnClick = AlignRightBtnClick + end + object AlignJustifyBtn: TToolButton + Left = 246 + Top = 0 + Hint = 'Justify' + Caption = 'AlignJustifyBtn' + ImageIndex = 12 + ParentShowHint = False + ShowHint = True + OnClick = AlignJustifyBtnClick + end + object Separator3: TToolButton + Left = 269 + Top = 0 + Width = 8 + Caption = 'Separator3' + ImageIndex = 3 + Style = tbsSeparator + end + object LinkBtn: TToolButton + Left = 277 + Top = 0 + Hint = 'Create link' + Caption = 'LinkBtn' + ImageIndex = 10 + ParentShowHint = False + ShowHint = True + OnClick = LinkBtnClick + end + object ImageBtn: TToolButton + Left = 300 + Top = 0 + Hint = 'Insert image' + Caption = 'ImageBtn' + ImageIndex = 11 + ParentShowHint = False + ShowHint = True + OnClick = ImageBtnClick + end + object Separator4: TToolButton + Left = 323 + Top = 0 + Width = 8 + Caption = 'Separator4' + ImageIndex = 12 + Style = tbsSeparator + end + object UnorderedListBtn: TToolButton + Left = 331 + Top = 0 + Hint = 'Create a bulleted unordered list' + Caption = 'UnorderedListBtn' + ImageIndex = 13 + ParentShowHint = False + ShowHint = True + OnClick = UnorderedListBtnClick + end + object OrderedListBtn: TToolButton + Left = 354 + Top = 0 + Hint = 'Create a numbered ordered list' + Caption = 'OrderedListBtn' + ImageIndex = 14 + ParentShowHint = False + ShowHint = True + OnClick = OrderedListBtnClick + end + object Separator5: TToolButton + Left = 377 + Top = 0 + Width = 8 + Caption = 'Separator5' + ImageIndex = 15 + Style = tbsSeparator + end + object TextColorBtn: TToolButton + Left = 385 + Top = 0 + Hint = 'Text color' + Caption = 'TextColorBtn' + ImageIndex = 16 + ParentShowHint = False + ShowHint = True + OnClick = TextColorBtnClick + end + object FillColorBtn: TToolButton + Left = 408 + Top = 0 + Hint = 'Background color' + Caption = 'FillColorBtn' + ImageIndex = 17 + ParentShowHint = False + ShowHint = True + OnClick = FillColorBtnClick + end + object Separator6: TToolButton + Left = 431 + Top = 0 + Width = 8 + Caption = 'Separator6' + ImageIndex = 18 + Style = tbsSeparator + end + object RemoveFormatBtn: TToolButton + Left = 439 + Top = 0 + Hint = 'Remove format' + Caption = 'RemoveFormatBtn' + ImageIndex = 18 + ParentShowHint = False + ShowHint = True + OnClick = RemoveFormatBtnClick + end + object Separator7: TToolButton + Left = 462 + Top = 0 + Width = 8 + Caption = 'Separator7' + ImageIndex = 20 + Style = tbsSeparator + end + object OutdentBtn: TToolButton + Left = 470 + Top = 0 + Hint = 'Outdent' + Caption = 'OutdentBtn' + ImageIndex = 19 + ParentShowHint = False + ShowHint = True + OnClick = OutdentBtnClick + end + object IndentBtn: TToolButton + Left = 493 + Top = 0 + Hint = 'Indent' + Caption = 'IndentBtn' + ImageIndex = 15 + ParentShowHint = False + ShowHint = True + OnClick = IndentBtnClick + end + end + object Timer1: TTimer + Enabled = False + Interval = 300 + OnTimer = Timer1Timer + Left = 56 + Top = 88 + end + object Chromium1: TChromium + OnTextResultAvailable = Chromium1TextResultAvailable + OnLoadEnd = Chromium1LoadEnd + OnAfterCreated = Chromium1AfterCreated + OnBeforeClose = Chromium1BeforeClose + OnClose = Chromium1Close + Left = 56 + Top = 144 + end + object ImageList1: TImageList + Left = 56 + Top = 200 + Bitmap = { + 494C010114001800040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000006000000001002000000000000060 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000A4A4A400A4A4A400A4A4 + A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4 + A400A4A4A400A4A4A400A4A4A4000000000000000000A4A4A400A4A4A400A4A4 + A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4A400A4A4 + A400A4A4A400A4A4A400A4A4A400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000F5F5 + F5004C4C4C00BDBDBD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000393939000000000046464600000000000000000000000000F5F5F5004242 + 4200000000004C4C4C0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000AFAFAF000000 + 0000505050000000000000000000000000000000000000000000000000004B4B + 4B0000000000B3B3B30000000000000000000000000000000000000000000000 + 000000000000979797000D0D0D00989898000000000000000000000000000000 + 0000777777000C0C0C007A7A7A00000000000000000000000000000000000000 + 0000AEAEAE000000000000000000D2D2D20000000000F5F5F500424242000000 + 000042424200F5F5F50000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FAFAFA001515 + 150006060600ECECEC0000000000000000000000000000000000E7E7E7000404 + 040018181800FBFBFB0000000000000000000000000000000000000000000000 + 0000969696000101010000000000010101009696960000000000000000000000 + 0000070707000000000009090900000000000000000000000000000000000000 + 0000FDFDFD0025252500000000005E5E5E00F5F5F50042424200000000004242 + 4200F5F5F5000000000000000000000000000000000000000000000000000000 + 0000DFDFDF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006F6F + 6F000000000093939300000000000000000000000000000000008B8B8B000000 + 0000737373000000000000000000000000000000000000000000000000009696 + 9600010101000000000000000000000000000101010096969600000000000000 + 0000525252000000000054545400000000000000000000000000000000000000 + 0000000000009797970000000000050505003B3B3B000000000042424200F5F5 + F500000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CFCF + CF00000000000000000000000000000000000000000000000000000000000000 + 0000D2D2D2000000000000000000000000000000000000000000969696000101 + 0100000000000000000000000000000000000000000001010100969696000000 + 0000E4E4E4002A2A2A00E4E4E400000000000000000000000000000000000000 + 000000000000F6F6F60015151500000000000000000042424200F5F5F5000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00002F2F2F000000000000000000000000000000000000000000000000003232 + 3200000000000000000000000000000000000000000097979700010101000000 + 0000000000000000000000000000000000000000000000000000010101009898 + 980000000000FBFBFB0000000000000000000000000000000000000000000000 + 000000000000F6F6F600323232000000000042424200F5F5F500000000000000 + 000000000000000000000000000000000000000000007F7F7F00000000000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00008F8F8F00000000007070700000000000000000006C6C6C00000000009292 + 9200000000000000000000000000000000000000000008080800000000000000 + 0000000000000000000000000000000000000000000000000000000000000D0D + 0D00000000000000000000000000000000000000000000000000000000000000 + 0000F6F6F600444444000000000042424200F5F5F50000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F00000000000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000EAEAEA000505050016161600FBFBFB00F9F9F9001313130005050500EBEB + EB00000000000000000000000000000000000000000090909000000000005151 + 5100FAFAFA00000000000000000000000000FAFAFA004E4E4E00000000009494 + 940000000000000000000000000000000000000000000000000000000000F6F6 + F600434343000000000042424200F5F5F500FBFBFB006F6F6F00F9F9F9000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000004F4F4F0000000000B0B0B000AEAEAE0000000000515151000000 + 00000000000000000000000000000000000000000000000000008F8F8F000000 + 000051515100FAFAFA0000000000FAFAFA004F4F4F0000000000949494000000 + 0000000000000000000000000000000000000000000000000000F6F6F6004242 + 42000000000042424200F5F5F5000000000058585800000000009D9D9D000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000AFAFAF0000000000505050004F4F4F0000000000B1B1B1000000 + 0000000000000000000000000000000000000000000000000000000000009090 + 90000000000051515100F5F5F500505050000000000095959500000000000000 + 00000000000000000000000000000000000000000000F6F6F600424242000000 + 000042424200F5F5F5000000000000000000575757000000000029292900FEFE + FE00000000000000000000000000000000000000000000000000000000000000 + 0000DFDFDF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FAFAFA0015151500050505000505050015151500FAFAFA000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000919191000000000016161600000000009595950000000000000000000000 + 0000000000000000000000000000000000000000000084848400000000004242 + 4200F5F5F500FBFBFB0054545400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000006F6F6F00000000000000000070707000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FAFAFA003030300001010100959595000000000000000000000000000000 + 00000000000000000000000000000000000000000000FBFBFB0084848400F5F5 + F500FBFBFB005454540000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000CFCFCF000000000000000000D0D0D000000000000000 + 000000000000000000000000000000000000000000000000000000000000FBFB + FB00515151000101010095959500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FEFE + FE00686868009696960000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000DFDFDF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001F1F1F00DFDFDF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001F1F1F00DFDF + DF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000081818100636363000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001F1F + 1F00DFDFDF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000005E5E5E008686 + 8600000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001F1F + 1F00DFDFDF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000101 + 0100000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001F1F1F00DFDF + DF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001F1F1F00DFDFDF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000DFDFDF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000373737000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003A3A3A0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000037373700000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000003A3A3A00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F000000000000000000000000000000000000000000B4B4B4005757 + 5700404040003F3F3F003F3F3F00CFCFCF00CFCFCF003F3F3F003F3F3F004040 + 400058585800B6B6B6000000000000000000000000000000000029292900F3F3 + F300000000000000000000000000000000000000000000000000000000000000 + 0000F5F5F5002A2A2A0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F00000000000000000000000000000000007B7B7B00000000002A2A + 2A004F4F4F004F4F4F004F4F4F00D3D3D300D3D3D3004F4F4F004F4F4F004F4F + 4F0029292900000000007F7F7F00000000000000000000000000000000005757 + 57000000000000000000DDDDDD009A9A9A000000000000000000000000000000 + 00005F5F5F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F00000000000000000000000000D2D2D200010101007B7B7B000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007676760002020200D4D4D4000000000000000000000000000000 + 000090909000F2F2F2002B2B2B0004040400C3C3C30000000000000000009F9F + 9F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F000000000000000000000000008B8B8B0008080800F9F9F9000000 + 0000000000003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F000000 + 000000000000F6F6F600050505008D8D8D000000000000000000000000000000 + 00000505050038383800000000000000000019191900E7E7E700D5D5D5000A0A + 0A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F000000000000000000000000008D8D8D0007070700F9F9F9000000 + 0000000000003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F000000 + 000000000000F7F7F700050505008C8C8C000000000000000000000000000000 + 000000000000000000000000000000000000000000003E3E3E002A2A2A000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F00000000000000000000000000D3D3D300010101007D7D7D000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007A7A7A0001010100D3D3D3000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007C7C7C00000000002E2E + 2E00535353005353530053535300D4D4D400D4D4D40053535300535353005353 + 53002F2F2F00000000007C7C7C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F + 7F007F7F7F007F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000037373700000000000000000000000000B3B3B3005858 + 5800404040003F3F3F003F3F3F00CFCFCF00CFCFCF003F3F3F003F3F3F004040 + 400055555500B3B3B30000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F + 7F007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007F7F7F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F + 7F00000000000000000000000000000000000000000036363600000000000000 + 00000000000000000000000000007F7F7F000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000363636000000 + 000000000000000000000000000000000000000000007F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D2D2D2004D4D4D003F3F + 3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F + 3F003F3F3F004E4E4E00D5D5D500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004C4C4C00000000000000 + 00000000000000000000000000002A2A2A002A2A2A0000000000000000000000 + 000000000000000000004E4E4E00000000000000000000000000000000000000 + 00000000000000000000C6C6C600919191008A8A8A00A9A9A900F0F0F0000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003F3F3F00000000000000 + 000000000000000000009F9F9F0000000000000000009C9C9C00000000000000 + 000000000000000000003F3F3F00000000000000000000000000000000000000 + 0000E6E6E60039393900000000000000000000000000000000000F0F0F00B3B3 + B300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FDFDFD0024242400000000005D5D5D000000000000000000000000000000 + 000000000000000000000000000000000000000000003F3F3F00000000000000 + 0000000000002C2C2C00000000000000000000000000000000002A2A2A000000 + 000000000000000000003F3F3F00000000000000000000000000000000000000 + 00003C3C3C00000000002C2C2C00A0A0A000B0B0B00051515100000000000F0F + 0F00FBFBFB000000000000000000000000000000000000000000000000000000 + 000000000000B0B0B0003E3E3E000A0A0A000A0A0A003F3F3F00B2B2B2000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000979797000000000005050500E2E2E20000000000000000000000 + 000000000000000000000000000000000000000000003F3F3F00000000000000 + 0000000000002D2D2D00000000000000000000000000000000002A2A2A000000 + 000000000000000000003F3F3F0000000000000000000000000000000000E5E5 + E5000000000000000000D0D0D0000000000000000000E6E6E600000000000000 + 0000D9D9D9000000000000000000000000000000000000000000000000000000 + 0000757575000000000000000000000000000000000000000000000000007878 + 7800000000000000000000000000000000000000000000000000000000000000 + 000000000000F7F7F70016161600000000007272720000000000000000000000 + 000000000000000000000000000000000000000000003F3F3F00000000000000 + 00000000000000000000A3A3A30000000000000000009F9F9F00000000000000 + 000000000000000000003F3F3F0000000000000000000000000000000000F8F8 + F800D7D7D700D7D7D700FEFEFE0000000000F1F1F1006D6D6D00000000000606 + 0600F3F3F300FBFBFB00FCFCFC0000000000000000000000000000000000AEAE + AE000000000000000000141414006D6D6D006D6D6D0013131300000000000000 + 0000B2B2B2000000000000000000000000000000000000000000000000000000 + 0000000000000000000082828200000000000D0D0D00EFEFEF00000000000000 + 000000000000000000000000000000000000000000003F3F3F00000000000000 + 00000000000000000000000000002D2D2D002C2C2C0000000000000000000000 + 000000000000000000003F3F3F0000000000000000003F3F3F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000003F3F3F00000000000000000000000000000000003D3D + 3D000000000014141400E3E3E3000000000000000000E1E1E100131313000000 + 00003F3F3F000000000000000000000000000000000000000000000000000000 + 00000000000000000000EDEDED000B0B0B000000000087878700000000000000 + 000000000000000000000000000000000000000000003F3F3F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000003F3F3F0000000000000000009F9F9F007F7F7F007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F007F7F7F009F9F9F00000000000000000000000000000000000808 + 0800000000006E6E6E00000000000000000000000000000000006D6D6D000000 + 00000A0A0A000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000006D6D6D000000000019191900F8F8F8000000 + 000000000000000000000000000000000000000000003F3F3F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000003F3F3F00000000000000000000000000000000000000 + 00008B8B8B003F3F3F0048484800BFBFBF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DFDFDF0003030300000000009C9C9C000000 + 000000000000000000000000000000000000000000003F3F3F002F2F2F00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF002F2F2F000000 + 000000000000000000003F3F3F00000000000000000000000000000000000000 + 00003434340000000000898989000000000000000000EFEFEF005B5B5B005B5B + 5B00E8E8E8000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000585858000000000028282800FEFE + FE0000000000000000000000000000000000000000003F3F3F003F3F3F000000 + 00000000000000000000000000000000000000000000000000003F3F3F000000 + 0000000000000000000047474700000000000000000000000000000000000000 + 000054545400000000003E3E3E00D8D8D800E5E5E50067676700000000001010 + 1000FBFBFB000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000003F3F3F003F3F3F000000 + 00000000000000000000000000000000000000000000000000003F3F3F000000 + 0000000000001F1F1F00DFDFDF00000000000000000000000000000000000000 + 0000D7D7D700121212000000000000000000000000000000000003030300AAAA + AA00000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000004C4C4C000F0F0F003F3F + 3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F000F0F0F000000 + 00001F1F1F00DFDFDF0000000000000000000000000000000000000000000000 + 000000000000ECECEC0085858500565656004C4C4C0072727200D7D7D7000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000D1D1D1004C4C4C003F3F + 3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F003F3F3F004747 + 4700DFDFDF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000606060047474700DADA + DA00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B1B + 1B00F1F1F1000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000BEBEBE00060606000000 + 00009C9C9C000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F0000000000000000000000000000000000373737000000 + 0000868686000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000C1C1C100070707000000 + 0000C5C5C5000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007373 + 7300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000017171700E0E0 + E000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F000000000000000000F2F2F20052525200000000004242 + 4200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000000000000000000000B7B7B700000000000505 + 0500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F000000000000000000F3F3F30054545400000000002A2A + 2A00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000A7A7 + A700000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000101010028282800A7A7A7000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000600000000100010000000000000300000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000080018001FFFFFFFFFFFFFFFFFFE38001 + FFFFFFFFF1C38001C7E3F8F1F083FFFFC3C3F071F007F7FFE3C7E031F80FE601 + E007C011F81FC601F00F800BF83F87FFF18F800FF07F87FFF00F870FE01FC601 + F81FC21FC11FE601F81FE03F830FF7FFF81FF07F8001FFFFFC3FF0FF80018001 + FC3FE1FFFFFF8001FFFFE3FFFFFFFFFFFFFFFFFFFFFFFFFF8001FFFF8FFF8001 + 8001CC01CC018001FFFFCC01CC01FFFFFFFFFFFF8FFFBFFF8001FFFFFFFF9E01 + 8001FFFF8FFF8E01FFFFCC019C0187FFFFFFCC01CC0187FF8001FFFF8FFF8E01 + 8001FFFFFFFF9E01FFFFFFFFDFFFBFFFFFFFCC01DC01FFFF8001CC01DC018001 + 8001FFFF9FFF8001FFFFFFFFFFFFFFFFC003FFFFFFFF8001C003FFFFFFFF0000 + C0038001FFFF0000C0038001FFFF0000C0038001C0030FF0C003800180010CF0 + C00380011FF80060C003800118180000C003800118180000C00380011FF80000 + C003800180010000C0038001C0030000C007807FFFFF0000C00F80FFFFFF0000 + C01FFFFFFFFF0000C03FFFFFFFFF8001FFFFFFFFFFFFC003FFFF8001FFFFC003 + C03F8001FC1FFFFFC03F8181F00FFFFFF0FF83C1F007F81FF87F83C1E187F00F + F87F8181E101E007FC3F80018001E187FC3F80018001E3C7FE1F8001F0FFE3C7 + FE1F8001F187E3C7FF0F9FC1F007E3C7FC039FC1F00FE3C7FC038003F81FE3C7 + FFFF8007FFFFE3C7FFFFFFFFFFFFE3C7FFFFFFFFFFFFFFFFE007801FF801FFFF + E007801FF801E00FFFFFFFFFFFFFE007FFFFFFFFFFFFE387800180018001E3C7 + 800180018001E387FFFFFFFFFFFFE00FFFFFFFFFFFFFE00FE007801FF801E30F + E007801FF801E38FFFFFFFFFFFFFE30FFFFFFFFFFFFFE00F800180018001E01F + 800180018001FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 000000000000} + end + object OpenDialog1: TOpenDialog + Left = 128 + Top = 88 + end + object SaveDialog1: TSaveDialog + Left = 128 + Top = 144 + end + object ColorDialog1: TColorDialog + Left = 128 + Top = 200 + end +end diff --git a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas new file mode 100644 index 00000000..062495ea --- /dev/null +++ b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas @@ -0,0 +1,512 @@ +// ************************************************************************ +// ***************************** CEF4Delphi ******************************* +// ************************************************************************ +// +// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based +// browser in Delphi applications. +// +// The original license of DCEF3 still applies to CEF4Delphi. +// +// For more information about CEF4Delphi visit : +// https://www.briskbard.com/index.php?lang=en&pageid=cef +// +// Copyright © 2019 Salvador Diaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + +unit uEditorBrowser; + +{$I cef.inc} + +interface + +uses + {$IFDEF DELPHI16_UP} + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ToolWin, Vcl.ComCtrls, + System.ImageList, Vcl.ImgList, + {$ELSE} + Windows, Messages, SysUtils, Variants, Classes, Graphics, + Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ToolWin, ComCtrls, + ImageList, ImgList, + {$ENDIF} + uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, + uCEFWinControl; + +type + TForm1 = class(TForm) + Timer1: TTimer; + Chromium1: TChromium; + CEFWindowParent1: TCEFWindowParent; + ToolBar1: TToolBar; + SaveBtn: TToolButton; + ImageList1: TImageList; + Separator1: TToolButton; + BoldBtn: TToolButton; + ItalicBtn: TToolButton; + UnderlineBtn: TToolButton; + StrikethroughBtn: TToolButton; + Separator2: TToolButton; + AlignLeftBtn: TToolButton; + AlignCenterBtn: TToolButton; + AlignRightBtn: TToolButton; + OpenBtn: TToolButton; + NewBtn: TToolButton; + OpenDialog1: TOpenDialog; + SaveDialog1: TSaveDialog; + Separator3: TToolButton; + LinkBtn: TToolButton; + ImageBtn: TToolButton; + AlignJustifyBtn: TToolButton; + Separator4: TToolButton; + UnorderedListBtn: TToolButton; + OrderedListBtn: TToolButton; + ColorDialog1: TColorDialog; + Separator5: TToolButton; + IndentBtn: TToolButton; + TextColorBtn: TToolButton; + FillColorBtn: TToolButton; + Separator6: TToolButton; + RemoveFormatBtn: TToolButton; + OutdentBtn: TToolButton; + Separator7: TToolButton; + + procedure Timer1Timer(Sender: TObject); + + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + + procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); + procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction : TCefCloseBrowserAction); + procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); + procedure Chromium1TextResultAvailable(Sender: TObject; const aText: ustring); + + procedure BoldBtnClick(Sender: TObject); + procedure ItalicBtnClick(Sender: TObject); + procedure UnderlineBtnClick(Sender: TObject); + procedure StrikethroughBtnClick(Sender: TObject); + procedure AlignLeftBtnClick(Sender: TObject); + procedure AlignCenterBtnClick(Sender: TObject); + procedure AlignRightBtnClick(Sender: TObject); + procedure SaveBtnClick(Sender: TObject); + procedure NewBtnClick(Sender: TObject); + procedure OpenBtnClick(Sender: TObject); + procedure LinkBtnClick(Sender: TObject); + procedure ImageBtnClick(Sender: TObject); + procedure AlignJustifyBtnClick(Sender: TObject); + procedure UnorderedListBtnClick(Sender: TObject); + procedure OrderedListBtnClick(Sender: TObject); + procedure IndentBtnClick(Sender: TObject); + procedure TextColorBtnClick(Sender: TObject); + procedure FillColorBtnClick(Sender: TObject); + procedure RemoveFormatBtnClick(Sender: TObject); + procedure OutdentBtnClick(Sender: TObject); + + protected + // Variables to control when can we destroy the form safely + FCanClose : boolean; // Set to True in TChromium.OnBeforeClose + FClosing : boolean; // Set to True in the CloseQuery event. + + procedure EnableDesignMode; + + // You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. + procedure WMMove(var aMessage : TWMMove); message WM_MOVE; + procedure WMMoving(var aMessage : TMessage); message WM_MOVING; + // You also have to handle these two messages to set GlobalCEFApp.OsmodalLoop + procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; + procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; + + procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; + procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY; + public + { Public declarations } + end; + +var + Form1: TForm1; + +procedure CreateGlobalCEFApp; + +implementation + +{$R *.dfm} + +uses + uCEFApplication, uCefMiscFunctions; + +// This demo shows how to create a simple editor using a browser. + +// It's possible to add many more editor commands available with the JavaScript function called 'execCommand' +// https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand + +// There are several TODO comments with some missing features that all editors should have + +// This demo includes some icons from "Material Design Icons", made by Google ( https://github.com/google/material-design-icons ) + +// Destruction steps +// ================= +// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. +// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. +// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. + +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.DisableFeatures := 'NetworkService'; +end; + +procedure TForm1.FillColorBtnClick(Sender: TObject); +var + TempCode, TempHexColor : string; +begin + if ColorDialog1.execute then + begin + TempHexColor := '#' + IntToHex(GetRValue(ColorDialog1.Color), 2) + + IntToHex(GetGValue(ColorDialog1.Color), 2) + + IntToHex(GetBValue(ColorDialog1.Color), 2); + + TempCode := 'document.execCommand("backColor", false, "' + TempHexColor + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); + end; +end; + +procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + CanClose := FCanClose; + + if not(FClosing) then + begin + FClosing := True; + Visible := False; + Chromium1.CloseBrowser(True); + end; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + FCanClose := False; + FClosing := False; + + Chromium1.DefaultURL := 'file:///EditorBrowser.html'; +end; + +procedure TForm1.FormShow(Sender: TObject); +begin + // You *MUST* call CreateBrowser to create and initialize the browser. + // This will trigger the AfterCreated event when the browser is fully + // initialized and ready to receive commands. + + // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser + // If it's not initialized yet, we use a simple timer to create the browser later. + if not(Chromium1.CreateBrowser(CEFWindowParent1)) then Timer1.Enabled := True; +end; + +procedure TForm1.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); +begin + // Now the browser is fully initialized we can send a message to the main form to load the initial web page. + PostMessage(Handle, CEF_AFTERCREATED, 0, 0); +end; + +procedure TForm1.Chromium1BeforeClose(Sender: TObject; + const browser: ICefBrowser); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + +procedure TForm1.Chromium1Close(Sender: TObject; + const browser: ICefBrowser; var aAction : TCefCloseBrowserAction); +begin + PostMessage(Handle, CEF_DESTROY, 0, 0); + aAction := cbaDelay; +end; + +procedure TForm1.Chromium1LoadEnd(Sender: TObject; + const browser: ICefBrowser; const frame: ICefFrame; + httpStatusCode: Integer); +begin + if (frame <> nil) and not(frame.isMain) then exit; + + // Enable the "designMode" for all loaded files to edit them + EnableDesignMode; +end; + +procedure TForm1.Chromium1TextResultAvailable(Sender: TObject; const aText: ustring); +var + TempLines : TStringList; +begin + // TODO: This function should notify the user if an existing file is replaced + + TempLines := nil; + SaveDialog1.DefaultExt := '.html'; + SaveDialog1.Filter := 'HTML Files (*.html)|*.HTML'; + + if SaveDialog1.Execute then + try + try + TempLines := TStringList.Create; + TempLines.Text := aText; + TempLines.SaveToFile(SaveDialog1.FileName); + except + on e : exception do + if CustomExceptionHandler('TForm1.Chromium1TextResultAvailable', e) then raise; + end; + finally + if (TempLines <> nil) then FreeAndNil(TempLines); + end; +end; + +procedure TForm1.TextColorBtnClick(Sender: TObject); +var + TempCode, TempHexColor : string; +begin + if ColorDialog1.execute then + begin + TempHexColor := '#' + IntToHex(GetRValue(ColorDialog1.Color), 2) + + IntToHex(GetGValue(ColorDialog1.Color), 2) + + IntToHex(GetBValue(ColorDialog1.Color), 2); + + TempCode := 'document.execCommand("foreColor", false, "' + TempHexColor + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); + end; +end; + +procedure TForm1.EnableDesignMode; +var + TempCode : string; +begin + TempCode := 'document.designMode = "on";'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignCenterBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyCenter", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignJustifyBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyFull", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignLeftBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyLeft", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignRightBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyRight", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.BoldBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("bold", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.ImageBtnClick(Sender: TObject); +var + TempCode, TempURL : string; +begin + // TODO: Replace InputBox + TempURL := inputbox('Type the URL used in the image', 'URL : ', 'https://www.briskbard.com/images/logo5.png'); + TempCode := 'document.execCommand("insertImage", false, "' + TempURL + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.IndentBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("indent", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.ItalicBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("italic", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.LinkBtnClick(Sender: TObject); +var + TempCode, TempURL : string; +begin + // TODO: Replace InputBox + TempURL := inputbox('Type the URL used in the link', 'URL : ', 'https://www.briskbard.com'); + TempCode := 'document.execCommand("createLink", false, "' + TempURL + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.SaveBtnClick(Sender: TObject); +begin + Chromium1.RetrieveHTML; +end; + +procedure TForm1.StrikethroughBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("strikeThrough", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.UnderlineBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("underline", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.UnorderedListBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("insertUnorderedList", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.BrowserCreatedMsg(var aMessage : TMessage); +begin + Caption := 'Editor Browser'; +end; + +procedure TForm1.BrowserDestroyMsg(var aMessage : TMessage); +begin + CEFWindowParent1.Free; +end; + +procedure TForm1.Timer1Timer(Sender: TObject); +begin + Timer1.Enabled := False; + if not(Chromium1.CreateBrowser(CEFWindowParent1)) and not(Chromium1.Initialized) then + Timer1.Enabled := True; +end; + +procedure TForm1.OpenBtnClick(Sender: TObject); +begin + OpenDialog1.Filter := 'HTML Files (*.html)|*.HTML'; + + if OpenDialog1.Execute then + Chromium1.LoadURL('file:///' + OpenDialog1.FileName); // TODO: The URL should be encoded +end; + +procedure TForm1.OrderedListBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("insertOrderedList", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.OutdentBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("outdent", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.RemoveFormatBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("removeFormat", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.NewBtnClick(Sender: TObject); +begin + // TODO: Before clearing the document we should notify the user if the document has unsaved changes + Chromium1.LoadURL('about:blank'); + EnableDesignMode; +end; + +procedure TForm1.WMMove(var aMessage : TWMMove); +begin + inherited; + + if (Chromium1 <> nil) then Chromium1.NotifyMoveOrResizeStarted; +end; + +procedure TForm1.WMMoving(var aMessage : TMessage); +begin + inherited; + + if (Chromium1 <> nil) then Chromium1.NotifyMoveOrResizeStarted; +end; + +procedure TForm1.WMEnterMenuLoop(var aMessage: TMessage); +begin + inherited; + + if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := True; +end; + +procedure TForm1.WMExitMenuLoop(var aMessage: TMessage); +begin + inherited; + + if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; +end; + +end. diff --git a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas index 012b3916..05cc2743 100644 --- a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas +++ b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas @@ -174,6 +174,7 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; end; procedure TForm1.AppEventsMessage(var Msg: tagMSG; var Handled: Boolean); diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm index 6e7d980f..e83daa3c 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm @@ -355,6 +355,10 @@ object MiniBrowserFrm: TMiniBrowserFrm Caption = 'Download image...' OnClick = Downloadimage1Click end + object Simulatekeyboardpresses1: TMenuItem + Caption = 'Simulate keyboard presses' + OnClick = Simulatekeyboardpresses1Click + end object N5: TMenuItem Caption = '-' end diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas index 9108798e..5130529b 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas @@ -123,6 +123,7 @@ type N5: TMenuItem; Memoryinfo1: TMenuItem; Downloadimage1: TMenuItem; + Simulatekeyboardpresses1: TMenuItem; procedure FormShow(Sender: TObject); procedure BackBtnClick(Sender: TObject); procedure ForwardBtnClick(Sender: TObject); @@ -220,6 +221,7 @@ type procedure Chromium1DownloadImageFinished(Sender: TObject; const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); + procedure Simulatekeyboardpresses1Click(Sender: TObject); protected FResponse : TStringList; @@ -846,6 +848,40 @@ begin if not(FClosing) then StatusBar1.Panels[1].Text := aText; end; +procedure TMiniBrowserFrm.Simulatekeyboardpresses1Click(Sender: TObject); +const + SIMULATED_KEY_PRESSES = 'QWERTY'; +var + i : integer; + TempKeyEvent : TCefKeyEvent; +begin + // This procedure is extremely simplified. + // Use the SimpleOSRBrowser demo to log the real TCefKeyEvent values + // if you use anything different than uppercase letters. + + for i := 1 to length(SIMULATED_KEY_PRESSES) do + begin + // WM_KEYDOWN + TempKeyEvent.kind := KEYEVENT_RAWKEYDOWN; + TempKeyEvent.modifiers := 0; + TempKeyEvent.windows_key_code := ord(SIMULATED_KEY_PRESSES[i]); + TempKeyEvent.native_key_code := 0; + TempKeyEvent.is_system_key := ord(False); + TempKeyEvent.character := #0; + TempKeyEvent.unmodified_character := #0; + TempKeyEvent.focus_on_editable_field := ord(False); + Chromium1.SendKeyEvent(@TempKeyEvent); + + // WM_CHAR + TempKeyEvent.kind := KEYEVENT_CHAR; + Chromium1.SendKeyEvent(@TempKeyEvent); + + // WM_KEYUP + TempKeyEvent.kind := KEYEVENT_KEYUP; + Chromium1.SendKeyEvent(@TempKeyEvent); + end; +end; + procedure TMiniBrowserFrm.StopBtnClick(Sender: TObject); begin Chromium1.StopLoad; diff --git a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas index ca2d5de5..e55b7813 100644 --- a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas @@ -187,6 +187,7 @@ begin GlobalCEFApp.EnableHighDPISupport := True; GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; end; diff --git a/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm b/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm index d4d08ec6..9385b60c 100644 --- a/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm @@ -61,7 +61,6 @@ object MainForm: TMainForm Height = 594 Align = alClient TabOrder = 1 - ExplicitTop = 31 end object Timer1: TTimer Enabled = False diff --git a/demos/Delphi_VCL/PopupBrowser/uMainForm.pas b/demos/Delphi_VCL/PopupBrowser/uMainForm.pas index d857b752..c4784c7e 100644 --- a/demos/Delphi_VCL/PopupBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/PopupBrowser/uMainForm.pas @@ -149,7 +149,7 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - //GlobalCEFApp.DisableFeatures := 'NetworkService'; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; //GlobalCEFApp.LogFile := 'debug.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; end; diff --git a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas index 76322881..226f4ba8 100644 --- a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas +++ b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas @@ -181,6 +181,7 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; // If you need transparency leave the GlobalCEFApp.BackgroundColor property // with the default value or set the alpha channel to 0 diff --git a/demos/Lazarus/EditorBrowser/00-Delete.bat b/demos/Lazarus/EditorBrowser/00-Delete.bat new file mode 100644 index 00000000..0b5ba5c8 --- /dev/null +++ b/demos/Lazarus/EditorBrowser/00-Delete.bat @@ -0,0 +1,2 @@ +rmdir /S /Q lib +rmdir /S /Q backup diff --git a/demos/Lazarus/EditorBrowser/EditorBrowser.dpr b/demos/Lazarus/EditorBrowser/EditorBrowser.dpr new file mode 100644 index 00000000..100d8f18 --- /dev/null +++ b/demos/Lazarus/EditorBrowser/EditorBrowser.dpr @@ -0,0 +1,81 @@ +// ************************************************************************ +// ***************************** CEF4Delphi ******************************* +// ************************************************************************ +// +// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based +// browser in Delphi applications. +// +// The original license of DCEF3 still applies to CEF4Delphi. +// +// For more information about CEF4Delphi visit : +// https://www.briskbard.com/index.php?lang=en&pageid=cef +// +// Copyright © 2018 Salvador Díaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + +program EditorBrowser; + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +{$I cef.inc} + +uses + {$IFDEF DELPHI16_UP} + Vcl.Forms, + WinApi.Windows, + {$ELSE} +{$IFnDEF FPC} +{$ELSE} + Interfaces, +{$ENDIF} + Forms, + Windows, + {$ENDIF } + uCEFApplication, + uEditorBrowser in 'uEditorBrowser.pas' {Form1}; + +{.$R *.res} + +// CEF3 needs to set the LARGEADDRESSAWARE flag which allows 32-bit processes to use up to 3GB of RAM. +// If you don't add this flag the rederer process will crash when you try to load large images. +{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} + +begin + CreateGlobalCEFApp; + + if GlobalCEFApp.StartMainProcess then + begin + Application.Initialize; + {$IFDEF DELPHI11_UP} + Application.MainFormOnTaskbar := True; + {$ENDIF} + Application.CreateForm(TForm1, Form1); + Application.Run; + end; + + DestroyGlobalCEFApp; +end. diff --git a/demos/Lazarus/EditorBrowser/EditorBrowser.lpi b/demos/Lazarus/EditorBrowser/EditorBrowser.lpi new file mode 100644 index 00000000..07f26c12 --- /dev/null +++ b/demos/Lazarus/EditorBrowser/EditorBrowser.lpi @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0"/> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="CEF4Delphi_Lazarus"/> + </Item1> + <Item2> + <PackageName Value="LCL"/> + </Item2> + </RequiredPackages> + <Units Count="2"> + <Unit0> + <Filename Value="EditorBrowser.dpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="uEditorBrowser.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit1> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="..\..\..\bin\EditorBrowser"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="Delphi"/> + </SyntaxOptions> + </Parsing> + <Linking> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/demos/Lazarus/EditorBrowser/EditorBrowser.lps b/demos/Lazarus/EditorBrowser/EditorBrowser.lps new file mode 100644 index 00000000..05149c6e --- /dev/null +++ b/demos/Lazarus/EditorBrowser/EditorBrowser.lps @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="11"/> + <BuildModes Active="Default"/> + <Units Count="3"> + <Unit0> + <Filename Value="EditorBrowser.dpr"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit0> + <Unit1> + <Filename Value="uEditorBrowser.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="1"/> + <TopLine Value="133"/> + <CursorPos X="69" Y="152"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit1> + <Unit2> + <Filename Value="..\..\..\source\uCEFApplication.pas"/> + <EditorIndex Value="-1"/> + <TopLine Value="43"/> + <CursorPos X="57" Y="60"/> + <UsageCount Value="10"/> + </Unit2> + </Units> + <JumpHistory Count="6" HistoryIndex="5"> + <Position1> + <Filename Value="uEditorBrowser.pas"/> + <Caret Line="248" Column="66" TopLine="229"/> + </Position1> + <Position2> + <Filename Value="uEditorBrowser.pas"/> + <Caret Line="381" Column="23" TopLine="365"/> + </Position2> + <Position3> + <Filename Value="uEditorBrowser.pas"/> + <Caret Line="353" Column="23" TopLine="337"/> + </Position3> + <Position4> + <Filename Value="uEditorBrowser.pas"/> + <Caret Line="381" Column="23" TopLine="354"/> + </Position4> + <Position5> + <Filename Value="uEditorBrowser.pas"/> + <Caret Line="352" Column="42" TopLine="337"/> + </Position5> + <Position6> + <Filename Value="uEditorBrowser.pas"/> + <Caret Line="354" Column="23" TopLine="337"/> + </Position6> + </JumpHistory> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0" ActiveMode=""/> + </RunParams> + </ProjectSession> +</CONFIG> diff --git a/demos/Lazarus/EditorBrowser/cef.inc b/demos/Lazarus/EditorBrowser/cef.inc new file mode 100644 index 00000000..8334dc78 --- /dev/null +++ b/demos/Lazarus/EditorBrowser/cef.inc @@ -0,0 +1,409 @@ +// ************************************************************************ +// ***************************** CEF4Delphi ******************************* +// ************************************************************************ +// +// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based +// browser in Delphi applications. +// +// The original license of DCEF3 still applies to CEF4Delphi. +// +// For more information about CEF4Delphi visit : +// https://www.briskbard.com/index.php?lang=en&pageid=cef +// +// Copyright © 2017 Salvador Diaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest <hgourvest@gmail.com> + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + + // The complete list of compiler versions is here : + // http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiler_Versions + +{$DEFINE DELPHI_VERSION_UNKNOW} + +// Delphi 5 +{$IFDEF VER130} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} +{$ENDIF} + +// Delphi 6 +{$IFDEF VER140} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} +{$ENDIF} + +// Delphi 7 +{$IFDEF VER150} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} +{$ENDIF} + +// Delphi 8 +{$IFDEF VER160} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} +{$ENDIF} + +// Delphi 2005 +{$IFDEF VER170} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} +{$ENDIF} + +{$IFDEF VER180} + {$UNDEF DELPHI_VERSION_UNKNOW} + // Delphi 2007 + {$IFDEF VER185} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + // Delphi 2006 + {$ELSE} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$ENDIF} +{$ENDIF} + +// Delphi 2009 +{$IFDEF VER200} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} +{$ENDIF} + +//Delphi 2010 +{$IFDEF VER210} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} +{$ENDIF} + +// Delphi XE +{$IFDEF VER220} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} +{$ENDIF} + +// Delphi XE2 (First FireMonkey and 64bit compiler) +{$IFDEF VER230} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} +{$ENDIF} + +// Delphi XE3 +{$IFDEF VER240} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} +{$ENDIF} + +// Delphi XE4 +{$IFDEF VER250} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} +{$ENDIF} + +// Delphi XE5 +{$IFDEF VER260} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} +{$ENDIF} + +// Delphi XE6 +{$IFDEF VER270} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} +{$ENDIF} + +// Delphi XE7 +{$IFDEF VER280} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} +{$ENDIF} + +// Delphi XE8 +{$IFDEF VER290} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} +{$ENDIF VER290} + +// Rad Studio 10 - Delphi Seattle +{$IFDEF VER300} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} +{$ENDIF} + +// Rad Studio 10.1 - Delphi Berlin +{$IFDEF VER310} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} +{$ENDIF} + +// Rad Studio 10.2 - Delphi Tokyo +{$IFDEF VER320} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} + {$DEFINE DELPHI25_UP} +{$ENDIF} + +// Rad Studio 10.3 - Delphi Rio +{$IFDEF VER330} + {$UNDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} + {$DEFINE DELPHI25_UP} + {$DEFINE DELPHI26_UP} +{$ENDIF} + +{$IFDEF FPC} + {$DEFINE SUPPORTS_INLINE} +{$ELSE} + {$IFDEF DELPHI_VERSION_UNKNOW} + {$DEFINE DELPHI5_UP} + {$DEFINE DELPHI6_UP} + {$DEFINE DELPHI7_UP} + {$DEFINE DELPHI8_UP} + {$DEFINE DELPHI9_UP} + {$DEFINE DELPHI10_UP} + {$DEFINE DELPHI11_UP} + {$DEFINE DELPHI12_UP} + {$DEFINE DELPHI14_UP} + {$DEFINE DELPHI15_UP} + {$DEFINE DELPHI16_UP} + {$DEFINE DELPHI17_UP} + {$DEFINE DELPHI18_UP} + {$DEFINE DELPHI19_UP} + {$DEFINE DELPHI20_UP} + {$DEFINE DELPHI21_UP} + {$DEFINE DELPHI22_UP} + {$DEFINE DELPHI23_UP} + {$DEFINE DELPHI24_UP} + {$DEFINE DELPHI25_UP} + {$DEFINE DELPHI26_UP} + {$ENDIF} +{$ENDIF} + +{$IFDEF DELPHI9_UP} + {$DEFINE SUPPORTS_INLINE} +{$ENDIF} + diff --git a/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm b/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm new file mode 100644 index 00000000..5837890e --- /dev/null +++ b/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm @@ -0,0 +1,990 @@ +object Form1: TForm1 + Left = 247 + Height = 624 + Top = 149 + Width = 1038 + Caption = 'Initializing browser. Please wait...' + ClientHeight = 624 + ClientWidth = 1038 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnShow = FormShow + Position = poScreenCenter + LCLVersion = '2.0.2.0' + object CEFWindowParent1: TCEFWindowParent + Left = 0 + Height = 599 + Top = 25 + Width = 1038 + Align = alClient + TabStop = True + TabOrder = 0 + end + object ToolBar1: TToolBar + Left = 0 + Height = 25 + Top = 0 + Width = 1038 + Caption = 'ToolBar1' + Images = ImageList1 + TabOrder = 1 + object NewBtn: TToolButton + Left = 1 + Hint = 'New document' + Top = 2 + Caption = 'NewBtn' + ImageIndex = 8 + OnClick = NewBtnClick + ParentShowHint = False + ShowHint = True + end + object OpenBtn: TToolButton + Left = 24 + Hint = 'Open document' + Top = 2 + Caption = 'OpenBtn' + ImageIndex = 9 + OnClick = OpenBtnClick + ParentShowHint = False + ShowHint = True + end + object SaveBtn: TToolButton + Left = 47 + Hint = 'Save document' + Top = 2 + Caption = 'SaveBtn' + ImageIndex = 5 + OnClick = SaveBtnClick + ParentShowHint = False + ShowHint = True + end + object Separator1: TToolButton + Left = 70 + Height = 22 + Top = 2 + Caption = 'Separator1' + ImageIndex = 2 + Style = tbsSeparator + end + object BoldBtn: TToolButton + Left = 78 + Hint = 'Bold' + Top = 2 + Caption = 'BoldBtn' + ImageIndex = 3 + OnClick = BoldBtnClick + ParentShowHint = False + ShowHint = True + end + object ItalicBtn: TToolButton + Left = 101 + Hint = 'Italics' + Top = 2 + Caption = 'ItalicBtn' + ImageIndex = 4 + OnClick = ItalicBtnClick + ParentShowHint = False + ShowHint = True + end + object UnderlineBtn: TToolButton + Left = 124 + Hint = 'Underline' + Top = 2 + Caption = 'UnderlineBtn' + ImageIndex = 7 + OnClick = UnderlineBtnClick + ParentShowHint = False + ShowHint = True + end + object StrikethroughBtn: TToolButton + Left = 147 + Hint = 'Strikethrough' + Top = 2 + Caption = 'StrikethroughBtn' + ImageIndex = 6 + OnClick = StrikethroughBtnClick + ParentShowHint = False + ShowHint = True + end + object Separator2: TToolButton + Left = 170 + Height = 22 + Top = 2 + Caption = 'Separator2' + ImageIndex = 7 + Style = tbsSeparator + end + object AlignLeftBtn: TToolButton + Left = 178 + Hint = 'Align left' + Top = 2 + Caption = 'AlignLeftBtn' + ImageIndex = 1 + OnClick = AlignLeftBtnClick + ParentShowHint = False + ShowHint = True + end + object AlignCenterBtn: TToolButton + Left = 201 + Hint = 'Align center' + Top = 2 + Caption = 'AlignCenterBtn' + ImageIndex = 0 + OnClick = AlignCenterBtnClick + ParentShowHint = False + ShowHint = True + end + object AlignRightBtn: TToolButton + Left = 224 + Hint = 'Align right' + Top = 2 + Caption = 'AlignRightBtn' + ImageIndex = 2 + OnClick = AlignRightBtnClick + ParentShowHint = False + ShowHint = True + end + object AlignJustifyBtn: TToolButton + Left = 247 + Hint = 'Justify' + Top = 2 + Caption = 'AlignJustifyBtn' + ImageIndex = 12 + OnClick = AlignJustifyBtnClick + ParentShowHint = False + ShowHint = True + end + object Separator3: TToolButton + Left = 270 + Height = 22 + Top = 2 + Caption = 'Separator3' + ImageIndex = 3 + Style = tbsSeparator + end + object LinkBtn: TToolButton + Left = 278 + Hint = 'Create link' + Top = 2 + Caption = 'LinkBtn' + ImageIndex = 10 + OnClick = LinkBtnClick + ParentShowHint = False + ShowHint = True + end + object ImageBtn: TToolButton + Left = 301 + Hint = 'Insert image' + Top = 2 + Caption = 'ImageBtn' + ImageIndex = 11 + OnClick = ImageBtnClick + ParentShowHint = False + ShowHint = True + end + object Separator4: TToolButton + Left = 324 + Height = 22 + Top = 2 + Caption = 'Separator4' + ImageIndex = 12 + Style = tbsSeparator + end + object UnorderedListBtn: TToolButton + Left = 332 + Hint = 'Create a bulleted unordered list' + Top = 2 + Caption = 'UnorderedListBtn' + ImageIndex = 13 + OnClick = UnorderedListBtnClick + ParentShowHint = False + ShowHint = True + end + object OrderedListBtn: TToolButton + Left = 355 + Hint = 'Create a numbered ordered list' + Top = 2 + Caption = 'OrderedListBtn' + ImageIndex = 14 + OnClick = OrderedListBtnClick + ParentShowHint = False + ShowHint = True + end + object Separator5: TToolButton + Left = 378 + Height = 22 + Top = 2 + Caption = 'Separator5' + ImageIndex = 15 + Style = tbsSeparator + end + object TextColorBtn: TToolButton + Left = 386 + Hint = 'Text color' + Top = 2 + Caption = 'TextColorBtn' + ImageIndex = 16 + OnClick = TextColorBtnClick + ParentShowHint = False + ShowHint = True + end + object FillColorBtn: TToolButton + Left = 409 + Hint = 'Background color' + Top = 2 + Caption = 'FillColorBtn' + ImageIndex = 17 + OnClick = FillColorBtnClick + ParentShowHint = False + ShowHint = True + end + object Separator6: TToolButton + Left = 432 + Height = 22 + Top = 2 + Caption = 'Separator6' + ImageIndex = 18 + Style = tbsSeparator + end + object RemoveFormatBtn: TToolButton + Left = 440 + Hint = 'Remove format' + Top = 2 + Caption = 'RemoveFormatBtn' + ImageIndex = 18 + OnClick = RemoveFormatBtnClick + ParentShowHint = False + ShowHint = True + end + object Separator7: TToolButton + Left = 463 + Height = 22 + Top = 2 + Caption = 'Separator7' + ImageIndex = 20 + Style = tbsSeparator + end + object OutdentBtn: TToolButton + Left = 471 + Hint = 'Outdent' + Top = 2 + Caption = 'OutdentBtn' + ImageIndex = 19 + OnClick = OutdentBtnClick + ParentShowHint = False + ShowHint = True + end + object IndentBtn: TToolButton + Left = 494 + Hint = 'Indent' + Top = 2 + Caption = 'IndentBtn' + ImageIndex = 15 + OnClick = IndentBtnClick + ParentShowHint = False + ShowHint = True + end + end + object Timer1: TTimer + Enabled = False + Interval = 300 + OnTimer = Timer1Timer + left = 56 + top = 88 + end + object Chromium1: TChromium + OnTextResultAvailable = Chromium1TextResultAvailable + OnLoadEnd = Chromium1LoadEnd + OnAfterCreated = Chromium1AfterCreated + OnBeforeClose = Chromium1BeforeClose + OnClose = Chromium1Close + left = 56 + top = 144 + end + object ImageList1: TImageList + left = 56 + top = 200 + Bitmap = { + 4C69140000001000000010000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF010101FF282828FFA7A7A7FF000000000000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FFA7A7A7FF0000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF0000000000000000F3F3F3FF545454FF000000FF2A2A2AFF0000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000B7B7B7FF000000FF050505FF0000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF0000000000000000F2F2F2FF525252FF000000FF424242FF0000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF171717FFE0E0E0FF0000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF737373FF0000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000C1C1C1FF070707FF000000FFC5C5 + C5FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF00000000000000000000000000000000373737FF000000FF8686 + 86FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000BEBEBEFF060606FF000000FF9C9C + 9CFF000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF1B1B1BFFF1F1 + F1FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF000000FF000000FF000000FF000000FF060606FF474747FFDADADAFF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF0000000000000000000000000000000000000000000000000000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000585858FF000000FF282828FFFEFEFEFF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000DFDFDFFF030303FF000000FF9C9C9CFF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000006D6D6DFF000000FF191919FFF8F8F8FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000EDEDEDFF0B0B0BFF000000FF878787FF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000828282FF000000FF0D0D0DFFEFEFEFFF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000F7F7F7FF161616FF000000FF727272FF0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000979797FF000000FF050505FFE2E2E2FF0000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FDFD + FDFF242424FF000000FF5D5D5DFF000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000D1D1D1FF4C4C4CFF3F3F3FFF3F3F + 3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF474747FFDFDF + DFFF000000000000000000000000000000004C4C4CFF0F0F0FFF3F3F3FFF3F3F + 3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF0F0F0FFF000000FF1F1F + 1FFFDFDFDFFF0000000000000000000000003F3F3FFF3F3F3FFF000000000000 + 000000000000000000000000000000000000000000003F3F3FFF000000FF0000 + 00FF1F1F1FFFDFDFDFFF00000000000000003F3F3FFF3F3F3FFF000000000000 + 000000000000000000000000000000000000000000003F3F3FFF000000FF0000 + 00FF000000FF474747FF00000000000000003F3F3FFF2F2F2FFFBFBFBFFFBFBF + BFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFF2F2F2FFF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF000000FF000000FF2D2D2DFF2C2C2CFF000000FF000000FF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF000000FFA3A3A3FF00000000000000009F9F9FFF000000FF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF2D2D2DFF000000000000000000000000000000002A2A2AFF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF2C2C2CFF000000000000000000000000000000002A2A2AFF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF000000FF9F9F9FFF00000000000000009C9C9CFF000000FF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000004C4C4CFF000000FF000000FF0000 + 00FF000000FF000000FF2A2A2AFF2A2A2AFF000000FF000000FF000000FF0000 + 00FF000000FF4E4E4EFF0000000000000000D2D2D2FF4D4D4DFF3F3F3FFF3F3F + 3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F + 3FFF4E4E4EFFD5D5D5FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000ECECECFF858585FF565656FF4C4C4CFF727272FFD7D7D7FF000000000000 + 000000000000000000000000000000000000000000000000000000000000D7D7 + D7FF121212FF000000FF000000FF000000FF000000FF030303FFAAAAAAFF0000 + 0000000000000000000000000000000000000000000000000000000000005454 + 54FF000000FF3E3E3EFFD8D8D8FFE5E5E5FF676767FF000000FF101010FFFBFB + FBFF000000000000000000000000000000000000000000000000000000003434 + 34FF000000FF898989FF0000000000000000EFEFEFFF5B5B5BFF5B5B5BFFE8E8 + E8FF000000000000000000000000000000000000000000000000000000008B8B + 8BFF3F3F3FFF484848FFBFBFBFFF000000000000000000000000000000000000 + 0000000000000000000000000000000000009F9F9FFF7F7F7FFF7F7F7FFF7F7F + 7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF7F7F7FFF9F9F9FFF00000000000000003F3F3FFF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF3F3F3FFF00000000000000000000000000000000F8F8F8FFD7D7 + D7FFD7D7D7FFFEFEFEFF00000000F1F1F1FF6D6D6DFF000000FF060606FFF3F3 + F3FFFBFBFBFFFCFCFCFF00000000000000000000000000000000E5E5E5FF0000 + 00FF000000FFD0D0D0FF0000000000000000E6E6E6FF000000FF000000FFD9D9 + D9FF000000000000000000000000000000000000000000000000000000003C3C + 3CFF000000FF2C2C2CFFA0A0A0FFB0B0B0FF515151FF000000FF0F0F0FFFFBFB + FBFF00000000000000000000000000000000000000000000000000000000E6E6 + E6FF393939FF000000FF000000FF000000FF000000FF0F0F0FFFB3B3B3FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000C6C6C6FF919191FF8A8A8AFFA9A9A9FFF0F0F0FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000000000007F7F7FFF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000000000007F7F7FFF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000000000007F7F7FFF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000000000007F7F7FFF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000000000007F7F7FFF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000000000007F7F7FFF000000FF0000 + 00FF000000000000000000000000000000000000000000000000000000FF0000 + 00FF7F7F7FFF000000000000000000000000000000007F7F7FFF000000FF0000 + 00FF000000000000000000000000000000000000000000000000080808FF0000 + 00FF6E6E6EFF000000000000000000000000000000006D6D6DFF000000FF0A0A + 0AFF0000000000000000000000000000000000000000000000003D3D3DFF0000 + 00FF141414FFE3E3E3FF0000000000000000E1E1E1FF131313FF000000FF3F3F + 3FFF000000000000000000000000000000000000000000000000AEAEAEFF0000 + 00FF000000FF141414FF6D6D6DFF6D6D6DFF131313FF000000FF000000FFB2B2 + B2FF000000000000000000000000000000000000000000000000000000007575 + 75FF000000FF000000FF000000FF000000FF000000FF000000FF787878FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000B0B0B0FF3E3E3EFF0A0A0AFF0A0A0AFF3F3F3FFFB2B2B2FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000363636FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF7F7F7FFF00000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF7F7F7FFF7F7F7FFF000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF7F7F7FFF7F7F7FFF7F7F7FFF0000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF0000000000000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF7F7F7FFF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF00000000000000000000000000000000373737FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF3A3A3AFF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000363636FF000000FF000000FF0000 + 00FF000000FF000000FF7F7F7FFF000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF7F7F7FFF0000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF373737FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF7F7F7FFF7F7F + 7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF000000FF000000FF0000000000000000000000FF000000FF7F7F7FFF7F7F + 7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF000000FF000000FF0000000000000000000000FF000000FF7F7F7FFF7F7F + 7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF000000FF000000FF0000000000000000000000FF000000FF7F7F7FFF7F7F + 7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF000000FF000000FF0000000000000000000000FF000000FF7F7F7FFF7F7F + 7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF000000FF000000FF0000000000000000000000FF000000FF7F7F7FFF7F7F + 7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F + 7FFF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000373737FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF3A3A3AFF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000B3B3B3FF585858FF4040 + 40FF3F3F3FFF3F3F3FFFCFCFCFFFCFCFCFFF3F3F3FFF3F3F3FFF404040FF5555 + 55FFB3B3B3FF0000000000000000000000007C7C7CFF000000FF2E2E2EFF5353 + 53FF535353FF535353FFD4D4D4FFD4D4D4FF535353FF535353FF535353FF2F2F + 2FFF000000FF7C7C7CFF00000000D3D3D3FF010101FF7D7D7DFF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007A7A7AFF010101FFD3D3D3FF8D8D8DFF070707FFF9F9F9FF000000000000 + 00003F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF000000000000 + 0000F7F7F7FF050505FF8C8C8CFF8B8B8BFF080808FFF9F9F9FF000000000000 + 00003F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF000000000000 + 0000F6F6F6FF050505FF8D8D8DFFD2D2D2FF010101FF7B7B7BFF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000767676FF020202FFD4D4D4FF000000007B7B7BFF000000FF2A2A2AFF4F4F + 4FFF4F4F4FFF4F4F4FFFD3D3D3FFD3D3D3FF4F4F4FFF4F4F4FFF4F4F4FFF2929 + 29FF000000FF7F7F7FFF000000000000000000000000B4B4B4FF575757FF4040 + 40FF3F3F3FFF3F3F3FFFCFCFCFFFCFCFCFFF3F3F3FFF3F3F3FFF404040FF5858 + 58FFB6B6B6FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF3E3E3EFF2A2A2AFF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0505 + 05FF383838FF000000FF000000FF191919FFE7E7E7FFD5D5D5FF0A0A0AFF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF9090 + 90FFF2F2F2FF2B2B2BFF040404FFC3C3C3FF00000000000000009F9F9FFF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF575757FF0000 + 000000000000DDDDDDFF9A9A9AFF000000000000000000000000000000005F5F + 5FFF000000FF000000FF000000FF000000FF000000FF292929FFF3F3F3FF0000 + 000000000000000000000000000000000000000000000000000000000000F5F5 + F5FF2A2A2AFF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF00000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000000000000000000000000000FF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000000000000000000000000000FF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000000000000000000000000000FF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000FF000000000000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000000000000000000000000000FF000000000000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000000000000000000000000000FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF010101FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000005E5E5EFF868686FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000818181FF636363FF000000000000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7FFF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000007F7F7FFF000000FF0000 + 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000DFDFDFFF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001F1F1FFFDFDFDFFF000000000000 + 00000000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF1F1F1FFFDFDFDFFF0000 + 00000000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF1F1F1FFFDFDF + DFFF000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF1F1F1FFFDFDF + DFFF000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF1F1F1FFFDFDFDFFF0000 + 00000000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000001F1F1FFFDFDFDFFF000000000000 + 00000000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000DFDFDFFF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000CFCFCFFF000000FF000000FFD0D0D0FF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000006F6F6FFF000000FF000000FF707070FF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FAFAFAFF151515FF050505FF050505FF151515FFFAFAFAFF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000AFAFAFFF000000FF505050FF4F4F4FFF000000FFB1B1B1FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004F4F4FFF000000FFB0B0B0FFAEAEAEFF000000FF515151FF000000000000 + 000000000000000000000000000000000000000000000000000000000000EAEA + EAFF050505FF161616FFFBFBFBFFF9F9F9FF131313FF050505FFEBEBEBFF0000 + 0000000000000000000000000000000000000000000000000000000000008F8F + 8FFF000000FF707070FF00000000000000006C6C6CFF000000FF929292FF0000 + 0000000000000000000000000000000000000000000000000000000000002F2F + 2FFF000000FF000000FF000000FF000000FF000000FF000000FF323232FF0000 + 0000000000000000000000000000000000000000000000000000CFCFCFFF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFD2D2 + D2FF0000000000000000000000000000000000000000000000006F6F6FFF0000 + 00FF939393FF000000000000000000000000000000008B8B8BFF000000FF7373 + 73FF0000000000000000000000000000000000000000FAFAFAFF151515FF0606 + 06FFECECECFF00000000000000000000000000000000E7E7E7FF040404FF1818 + 18FFFBFBFBFF00000000000000000000000000000000AFAFAFFF000000FF5050 + 50FF0000000000000000000000000000000000000000000000004B4B4BFF0000 + 00FFB3B3B3FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A4A4A4FFA4A4A4FFA4A4A4FFA4A4 + A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4 + A4FFA4A4A4FFA4A4A4FF00000000000000000000000000000000FEFEFEFF6868 + 68FF969696FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FBFBFBFF5151 + 51FF010101FF959595FF00000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FAFA + FAFF303030FF010101FF959595FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000009191 + 91FF000000FF161616FF000000FF959595FF0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000909090FF0000 + 00FF515151FFF5F5F5FF505050FF000000FF959595FF00000000000000000000 + 000000000000000000000000000000000000000000008F8F8FFF000000FF5151 + 51FFFAFAFAFF00000000FAFAFAFF4F4F4FFF000000FF949494FF000000000000 + 000000000000000000000000000000000000909090FF000000FF515151FFFAFA + FAFF000000000000000000000000FAFAFAFF4E4E4EFF000000FF949494FF0000 + 000000000000000000000000000000000000080808FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF0D0D0DFF0000 + 000000000000000000000000000000000000979797FF010101FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF010101FF989898FF0000 + 0000FBFBFBFF00000000000000000000000000000000969696FF010101FF0000 + 00FF000000FF000000FF000000FF000000FF010101FF969696FF00000000E4E4 + E4FF2A2A2AFFE4E4E4FF00000000000000000000000000000000969696FF0101 + 01FF000000FF000000FF000000FF010101FF969696FF00000000000000005252 + 52FF000000FF545454FF00000000000000000000000000000000000000009696 + 96FF010101FF000000FF010101FF969696FF0000000000000000000000000707 + 07FF000000FF090909FF00000000000000000000000000000000000000000000 + 0000979797FF0D0D0DFF989898FF000000000000000000000000000000007777 + 77FF0C0C0CFF7A7A7AFF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A4A4A4FFA4A4A4FFA4A4A4FFA4A4 + A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4A4FFA4A4 + A4FFA4A4A4FFA4A4A4FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FBFBFBFF848484FFF5F5F5FFFBFB + FBFF545454FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000848484FF000000FF424242FFF5F5 + F5FFFBFBFBFF545454FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000F6F6F6FF424242FF000000FF4242 + 42FFF5F5F5FF0000000000000000575757FF000000FF292929FFFEFEFEFF0000 + 00000000000000000000000000000000000000000000F6F6F6FF424242FF0000 + 00FF424242FFF5F5F5FF00000000585858FF000000FF9D9D9DFF000000000000 + 0000000000000000000000000000000000000000000000000000F6F6F6FF4343 + 43FF000000FF424242FFF5F5F5FFFBFBFBFF6F6F6FFFF9F9F9FF000000000000 + 000000000000000000000000000000000000000000000000000000000000F6F6 + F6FF444444FF000000FF424242FFF5F5F5FF0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000F6F6F6FF323232FF000000FF424242FFF5F5F5FF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000F6F6F6FF151515FF000000FF000000FF424242FFF5F5F5FF000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000979797FF000000FF050505FF3B3B3BFF000000FF424242FFF5F5F5FF0000 + 000000000000000000000000000000000000000000000000000000000000FDFD + FDFF252525FF000000FF5E5E5EFFF5F5F5FF424242FF000000FF424242FFF5F5 + F5FF00000000000000000000000000000000000000000000000000000000AEAE + AEFF000000FF000000FFD2D2D2FF00000000F5F5F5FF424242FF000000FF4242 + 42FFF5F5F5FF0000000000000000000000000000000000000000000000003939 + 39FF000000FF464646FF000000000000000000000000F5F5F5FF424242FF0000 + 00FF4C4C4CFF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000F5F5F5FF4C4C + 4CFFBDBDBDFF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DFDF + DFFF000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7FFF7F7F + 7FFF0000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000007F7F7FFF000000FF7F7F + 7FFF0000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000007F7F7FFF000000FF000000FF7F7F + 7FFF000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007F7F7FFF000000FF000000FF7F7F + 7FFF000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7FFF000000FF7F7F + 7FFF0000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000000000000000000000000000007F7F7FFF7F7F + 7FFF0000000000000000000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000000000000000000000DFDF + DFFF000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF0000000000000000000000FF000000FF000000FF0000 + 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 + 00FF000000FF000000FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000 + } + end + object OpenDialog1: TOpenDialog + left = 128 + top = 88 + end + object SaveDialog1: TSaveDialog + left = 128 + top = 144 + end + object ColorDialog1: TColorDialog + Color = clBlack + CustomColors.Strings = ( + 'ColorA=000000' + 'ColorB=000080' + 'ColorC=008000' + 'ColorD=008080' + 'ColorE=800000' + 'ColorF=800080' + 'ColorG=808000' + 'ColorH=808080' + 'ColorI=C0C0C0' + 'ColorJ=0000FF' + 'ColorK=00FF00' + 'ColorL=00FFFF' + 'ColorM=FF0000' + 'ColorN=FF00FF' + 'ColorO=FFFF00' + 'ColorP=FFFFFF' + 'ColorQ=C0DCC0' + 'ColorR=F0CAA6' + 'ColorS=F0FBFF' + 'ColorT=A4A0A0' + ) + left = 128 + top = 200 + end +end diff --git a/demos/Lazarus/EditorBrowser/uEditorBrowser.pas b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas new file mode 100644 index 00000000..691ab343 --- /dev/null +++ b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas @@ -0,0 +1,508 @@ +// ************************************************************************ +// ***************************** CEF4Delphi ******************************* +// ************************************************************************ +// +// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based +// browser in Delphi applications. +// +// The original license of DCEF3 still applies to CEF4Delphi. +// +// For more information about CEF4Delphi visit : +// https://www.briskbard.com/index.php?lang=en&pageid=cef +// +// Copyright © 2019 Salvador Diaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest <hgourvest@gmail.com> + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + +unit uEditorBrowser; + +{$MODE Delphi} + +{$I cef.inc} + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, + Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ToolWin, ComCtrls, + ImgList, + uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, + uCEFWinControl; + +type + TForm1 = class(TForm) + Timer1: TTimer; + Chromium1: TChromium; + CEFWindowParent1: TCEFWindowParent; + ToolBar1: TToolBar; + SaveBtn: TToolButton; + ImageList1: TImageList; + Separator1: TToolButton; + BoldBtn: TToolButton; + ItalicBtn: TToolButton; + UnderlineBtn: TToolButton; + StrikethroughBtn: TToolButton; + Separator2: TToolButton; + AlignLeftBtn: TToolButton; + AlignCenterBtn: TToolButton; + AlignRightBtn: TToolButton; + OpenBtn: TToolButton; + NewBtn: TToolButton; + OpenDialog1: TOpenDialog; + SaveDialog1: TSaveDialog; + Separator3: TToolButton; + LinkBtn: TToolButton; + ImageBtn: TToolButton; + AlignJustifyBtn: TToolButton; + Separator4: TToolButton; + UnorderedListBtn: TToolButton; + OrderedListBtn: TToolButton; + ColorDialog1: TColorDialog; + Separator5: TToolButton; + IndentBtn: TToolButton; + TextColorBtn: TToolButton; + FillColorBtn: TToolButton; + Separator6: TToolButton; + RemoveFormatBtn: TToolButton; + OutdentBtn: TToolButton; + Separator7: TToolButton; + + procedure Timer1Timer(Sender: TObject); + + procedure FormShow(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + + procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); + procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction : TCefCloseBrowserAction); + procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); + procedure Chromium1TextResultAvailable(Sender: TObject; const aText: ustring); + + procedure BoldBtnClick(Sender: TObject); + procedure ItalicBtnClick(Sender: TObject); + procedure UnderlineBtnClick(Sender: TObject); + procedure StrikethroughBtnClick(Sender: TObject); + procedure AlignLeftBtnClick(Sender: TObject); + procedure AlignCenterBtnClick(Sender: TObject); + procedure AlignRightBtnClick(Sender: TObject); + procedure SaveBtnClick(Sender: TObject); + procedure NewBtnClick(Sender: TObject); + procedure OpenBtnClick(Sender: TObject); + procedure LinkBtnClick(Sender: TObject); + procedure ImageBtnClick(Sender: TObject); + procedure AlignJustifyBtnClick(Sender: TObject); + procedure UnorderedListBtnClick(Sender: TObject); + procedure OrderedListBtnClick(Sender: TObject); + procedure IndentBtnClick(Sender: TObject); + procedure TextColorBtnClick(Sender: TObject); + procedure FillColorBtnClick(Sender: TObject); + procedure RemoveFormatBtnClick(Sender: TObject); + procedure OutdentBtnClick(Sender: TObject); + + protected + // Variables to control when can we destroy the form safely + FCanClose : boolean; // Set to True in TChromium.OnBeforeClose + FClosing : boolean; // Set to True in the CloseQuery event. + + procedure EnableDesignMode; + + // You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. + procedure WMMove(var aMessage : TWMMove); message WM_MOVE; + procedure WMMoving(var aMessage : TMessage); message WM_MOVING; + // You also have to handle these two messages to set GlobalCEFApp.OsmodalLoop + procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; + procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; + + procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; + procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY; + public + { Public declarations } + end; + +var + Form1: TForm1; + +procedure CreateGlobalCEFApp; + +implementation + +{$R *.lfm} + +uses + uCEFApplication, uCEFMiscFunctions; + +// This demo shows how to create a simple editor using a browser. + +// It's possible to add many more editor commands available with the JavaScript function called 'execCommand' +// https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand + +// There are several TODO comments with some missing features that all editors should have + +// This demo includes some icons from "Material Design Icons", made by Google ( https://github.com/google/material-design-icons ) + +// Destruction steps +// ================= +// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. +// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. +// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. + +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.DisableFeatures := 'NetworkService'; +end; + +procedure TForm1.FillColorBtnClick(Sender: TObject); +var + TempCode, TempHexColor : string; +begin + if ColorDialog1.execute then + begin + TempHexColor := '#' + IntToHex(GetRValue(ColorDialog1.Color), 2) + + IntToHex(GetGValue(ColorDialog1.Color), 2) + + IntToHex(GetBValue(ColorDialog1.Color), 2); + + TempCode := 'document.execCommand("backColor", false, "' + TempHexColor + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); + end; +end; + +procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + CanClose := FCanClose; + + if not(FClosing) then + begin + FClosing := True; + Visible := False; + Chromium1.CloseBrowser(True); + end; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + FCanClose := False; + FClosing := False; + + Chromium1.DefaultURL := 'file:///EditorBrowser.html'; +end; + +procedure TForm1.FormShow(Sender: TObject); +begin + // You *MUST* call CreateBrowser to create and initialize the browser. + // This will trigger the AfterCreated event when the browser is fully + // initialized and ready to receive commands. + + // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser + // If it's not initialized yet, we use a simple timer to create the browser later. + if not(Chromium1.CreateBrowser(CEFWindowParent1)) then Timer1.Enabled := True; +end; + +procedure TForm1.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); +begin + // Now the browser is fully initialized we can send a message to the main form to load the initial web page. + PostMessage(Handle, CEF_AFTERCREATED, 0, 0); +end; + +procedure TForm1.Chromium1BeforeClose(Sender: TObject; + const browser: ICefBrowser); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + +procedure TForm1.Chromium1Close(Sender: TObject; + const browser: ICefBrowser; var aAction : TCefCloseBrowserAction); +begin + PostMessage(Handle, CEF_DESTROY, 0, 0); + aAction := cbaDelay; +end; + +procedure TForm1.Chromium1LoadEnd(Sender: TObject; + const browser: ICefBrowser; const frame: ICefFrame; + httpStatusCode: Integer); +begin + if (frame <> nil) and not(frame.isMain) then exit; + + // Enable the "designMode" for all loaded files to edit them + EnableDesignMode; +end; + +procedure TForm1.Chromium1TextResultAvailable(Sender: TObject; const aText: ustring); +var + TempLines : TStringList; +begin + // TODO: This function should notify the user if an existing file is replaced + + TempLines := nil; + SaveDialog1.DefaultExt := '.html'; + SaveDialog1.Filter := 'HTML Files (*.html)|*.HTML'; + + if SaveDialog1.Execute then + try + try + TempLines := TStringList.Create; + TempLines.Text := aText; + TempLines.SaveToFile(SaveDialog1.FileName); + except + on e : exception do + if CustomExceptionHandler('TForm1.Chromium1TextResultAvailable', e) then raise; + end; + finally + if (TempLines <> nil) then FreeAndNil(TempLines); + end; +end; + +procedure TForm1.TextColorBtnClick(Sender: TObject); +var + TempCode, TempHexColor : string; +begin + if ColorDialog1.execute then + begin + TempHexColor := '#' + IntToHex(GetRValue(ColorDialog1.Color), 2) + + IntToHex(GetGValue(ColorDialog1.Color), 2) + + IntToHex(GetBValue(ColorDialog1.Color), 2); + + TempCode := 'document.execCommand("foreColor", false, "' + TempHexColor + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); + end; +end; + +procedure TForm1.EnableDesignMode; +var + TempCode : string; +begin + TempCode := 'document.designMode = "on";'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignCenterBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyCenter", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignJustifyBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyFull", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignLeftBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyLeft", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.AlignRightBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("justifyRight", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.BoldBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("bold", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.ImageBtnClick(Sender: TObject); +var + TempCode, TempURL : string; +begin + // TODO: Replace InputBox + TempURL := inputbox('Type the URL used in the image', 'URL : ', 'https://www.briskbard.com/images/logo5.png'); + TempCode := 'document.execCommand("insertImage", false, "' + TempURL + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.IndentBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("indent", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.ItalicBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("italic", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.LinkBtnClick(Sender: TObject); +var + TempCode, TempURL : string; +begin + // TODO: Replace InputBox + TempURL := inputbox('Type the URL used in the link', 'URL : ', 'https://www.briskbard.com'); + TempCode := 'document.execCommand("createLink", false, "' + TempURL + '");'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.SaveBtnClick(Sender: TObject); +begin + Chromium1.RetrieveHTML; +end; + +procedure TForm1.StrikethroughBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("strikeThrough", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.UnderlineBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("underline", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.UnorderedListBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("insertUnorderedList", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.BrowserCreatedMsg(var aMessage : TMessage); +begin + Caption := 'Editor Browser'; +end; + +procedure TForm1.BrowserDestroyMsg(var aMessage : TMessage); +begin + CEFWindowParent1.Free; +end; + +procedure TForm1.Timer1Timer(Sender: TObject); +begin + Timer1.Enabled := False; + if not(Chromium1.CreateBrowser(CEFWindowParent1)) and not(Chromium1.Initialized) then + Timer1.Enabled := True; +end; + +procedure TForm1.OpenBtnClick(Sender: TObject); +begin + OpenDialog1.Filter := 'HTML Files (*.html)|*.HTML'; + + if OpenDialog1.Execute then + Chromium1.LoadURL('file:///' + OpenDialog1.FileName); // TODO: The URL should be encoded +end; + +procedure TForm1.OrderedListBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("insertOrderedList", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.OutdentBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("outdent", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.RemoveFormatBtnClick(Sender: TObject); +var + TempCode : string; +begin + TempCode := 'document.execCommand("removeFormat", false, null);'; + + Chromium1.ExecuteJavaScript(TempCode, 'about:blank'); +end; + +procedure TForm1.NewBtnClick(Sender: TObject); +begin + // TODO: Before clearing the document we should notify the user if the document has unsaved changes + Chromium1.LoadURL('about:blank'); + EnableDesignMode; +end; + +procedure TForm1.WMMove(var aMessage : TWMMove); +begin + inherited; + + if (Chromium1 <> nil) then Chromium1.NotifyMoveOrResizeStarted; +end; + +procedure TForm1.WMMoving(var aMessage : TMessage); +begin + inherited; + + if (Chromium1 <> nil) then Chromium1.NotifyMoveOrResizeStarted; +end; + +procedure TForm1.WMEnterMenuLoop(var aMessage: TMessage); +begin + inherited; + + if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := True; +end; + +procedure TForm1.WMExitMenuLoop(var aMessage: TMessage); +begin + inherited; + + if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; +end; + +end. diff --git a/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps b/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps index 71314ad0..791110f2 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps +++ b/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps @@ -23,7 +23,7 @@ <IsVisibleTab Value="True"/> <EditorIndex Value="1"/> <TopLine Value="185"/> - <CursorPos X="3" Y="187"/> + <CursorPos Y="199"/> <UsageCount Value="26"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> diff --git a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas index 5625139b..fc682c46 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas +++ b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas @@ -194,8 +194,8 @@ begin GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; GlobalCEFApp.ExternalMessagePump := True; - GlobalCEFApp.MultiThreadedMessageLoop := False; - //GlobalCEFApp.DisableFeatures := 'NetworkService'; + GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; GlobalCEFApp.OnScheduleMessagePumpWork := @GlobalCEFApp_OnScheduleMessagePumpWork; end; diff --git a/demos/Lazarus/PopupBrowser/PopupBrowser.lps b/demos/Lazarus/PopupBrowser/PopupBrowser.lps index f36379d8..246bcc21 100644 --- a/demos/Lazarus/PopupBrowser/PopupBrowser.lps +++ b/demos/Lazarus/PopupBrowser/PopupBrowser.lps @@ -23,7 +23,7 @@ <ResourceBaseClass Value="Form"/> <IsVisibleTab Value="True"/> <TopLine Value="145"/> - <CursorPos X="5" Y="150"/> + <CursorPos Y="151"/> <UsageCount Value="22"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> diff --git a/demos/Lazarus/PopupBrowser/uMainForm.pas b/demos/Lazarus/PopupBrowser/uMainForm.pas index c687c415..836589a3 100644 --- a/demos/Lazarus/PopupBrowser/uMainForm.pas +++ b/demos/Lazarus/PopupBrowser/uMainForm.pas @@ -147,7 +147,7 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - //GlobalCEFApp.DisableFeatures := 'NetworkService'; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); diff --git a/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps b/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps index 72163e9a..be7563b4 100644 --- a/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps +++ b/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps @@ -39,7 +39,7 @@ <ResourceBaseClass Value="Form"/> <IsVisibleTab Value="True"/> <TopLine Value="161"/> - <CursorPos X="29" Y="173"/> + <CursorPos Y="179"/> <UsageCount Value="42"/> <Bookmarks Count="1"> <Item0 X="40" Y="262" ID="4"/> diff --git a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas index 36b925ac..8cb026d1 100644 --- a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas +++ b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas @@ -175,7 +175,7 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - //GlobalCEFApp.DisableFeatures := 'NetworkService'; + GlobalCEFApp.DisableFeatures := 'NetworkService,VizDisplayCompositor'; end; procedure TForm1.GoBtnClick(Sender: TObject); diff --git a/packages/CEF4Delphi_FMX.res b/packages/CEF4Delphi_FMX.res index 934cad8709e937bbd616193ea1577b71e39c0962..391381f9dc4de3bb832da06585491df01ab8693f 100644 GIT binary patch delta 82 zcmZ3&dWCg@0%OQTMR_3M7|pn8;#_6MzKI9jWz87485kKn8S)rP7*ZLEfOH~54uc<% g%w<TOyq8g&odF1dswO{XG-PC$%*uFsvI0{J0DgEBDgXcg delta 46 zcmcb@x`cIt0;9@AMR_3M7|qx;ajr6B+{A<KlPef+FxxTkPj+TBocxE8XL0~j3jk4| B4u}8% diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index db281115..f0541d2a 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,7 +21,7 @@ </CompilerOptions> <Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/> <License Value="MPL 1.1"/> - <Version Major="75" Release="13"/> + <Version Major="75" Minor="1" Release="4"/> <Files Count="143"> <Item1> <Filename Value="..\source\uCEFAccessibilityHandler.pas"/> diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index 632603cb..7f51f4b9 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -61,8 +61,8 @@ uses const CEF_SUPPORTED_VERSION_MAJOR = 75; - CEF_SUPPORTED_VERSION_MINOR = 0; - CEF_SUPPORTED_VERSION_RELEASE = 13; + CEF_SUPPORTED_VERSION_MINOR = 1; + CEF_SUPPORTED_VERSION_RELEASE = 4; CEF_SUPPORTED_VERSION_BUILD = 0; CEF_CHROMEELF_VERSION_MAJOR = 75; diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index cb73a31c..7774b626 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -422,7 +422,7 @@ type function doOnBeforeBrowse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean): Boolean; virtual; function doOnOpenUrlFromTab(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean): Boolean; virtual; procedure doOnGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler; var aUseInternalHandler : boolean); virtual; - function doOnGetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; virtual; + function doOnGetAuthCredentials(const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; virtual; function doOnQuotaRequest(const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback): Boolean; virtual; function doOnCertificateError(const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback): Boolean; virtual; function doOnSelectClientCertificate(const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback): boolean; virtual; @@ -3652,14 +3652,14 @@ begin if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen); end; -function TChromium.doOnGetAuthCredentials(const browser : ICefBrowser; - const frame : ICefFrame; - isProxy : Boolean; - const host : ustring; - port : Integer; - const realm : ustring; - const scheme : ustring; - const callback : ICefAuthCallback): Boolean; +function TChromium.doOnGetAuthCredentials(const browser : ICefBrowser; + const originUrl : ustring; + isProxy : Boolean; + const host : ustring; + port : Integer; + const realm : ustring; + const scheme : ustring; + const callback : ICefAuthCallback): Boolean; begin Result := False; @@ -3672,8 +3672,8 @@ begin end; end else - if (frame <> nil) and frame.IsMain and Assigned(FOnGetAuthCredentials) then - FOnGetAuthCredentials(Self, browser, frame, isProxy, host, port, realm, scheme, callback, Result); + if Assigned(FOnGetAuthCredentials) then + FOnGetAuthCredentials(Self, browser, originUrl, isProxy, host, port, realm, scheme, callback, Result); end; function TChromium.doCanSendCookie(const browser : ICefBrowser; diff --git a/source/uCEFChromiumEvents.pas b/source/uCEFChromiumEvents.pas index 89220a3c..71adf274 100644 --- a/source/uCEFChromiumEvents.pas +++ b/source/uCEFChromiumEvents.pas @@ -111,7 +111,7 @@ type // ICefRequestHandler TOnBeforeBrowse = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean; out Result: Boolean) of object; TOnOpenUrlFromTab = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; out Result: Boolean) of Object; - TOnGetAuthCredentials = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback; out Result: Boolean) of object; + TOnGetAuthCredentials = procedure(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback; out Result: Boolean) of object; TOnQuotaRequest = procedure(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback; out Result: Boolean) of object; TOnCertificateError = procedure(Sender: TObject; const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback; out Result: Boolean) of Object; TOnSelectClientCertificate = procedure(Sender: TObject; const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback; var aResult : boolean) of object; diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index 196d6a41..28f5caea 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -389,7 +389,7 @@ type function doOnBeforeBrowse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean): Boolean; virtual; function doOnOpenUrlFromTab(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean): Boolean; virtual; procedure doOnGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler; var aUseInternalHandler : boolean); virtual; - function doOnGetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; virtual; + function doOnGetAuthCredentials(const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; virtual; function doOnQuotaRequest(const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback): Boolean; virtual; function doOnCertificateError(const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback): Boolean; virtual; function doOnSelectClientCertificate(const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback): boolean; virtual; @@ -518,6 +518,9 @@ type procedure ResolveHost(const aURL : ustring); function IsSameBrowser(const aBrowser : ICefBrowser) : boolean; + procedure ShowDevTools(inspectElementAt: TPoint); + procedure CloseDevTools; + procedure Find(aIdentifier : integer; const aSearchText : ustring; aForward, aMatchCase, aFindNext : Boolean); procedure StopFinding(aClearSelection : Boolean); @@ -2907,6 +2910,47 @@ begin if assigned(FOnPdfPrintFinished) then FOnPdfPrintFinished(self, aResultOK); end; +procedure TFMXChromium.ShowDevTools(inspectElementAt: TPoint); +var + TempPoint : TCefPoint; + TempClient : ICefClient; + TempPPoint : PCefPoint; +begin + try + try + if Initialized then + begin + InitializeSettings(FDevBrowserSettings); + WindowInfoAsPopUp(FDevWindowInfo, WindowHandle, DEVTOOLS_WINDOWNAME); + + TempClient := TCustomClientHandler.Create(Self, True); + + if (inspectElementAt.x <> low(integer)) and + (inspectElementAt.y <> low(integer)) then + begin + TempPoint.x := inspectElementAt.x; + TempPoint.y := inspectElementAt.y; + TempPPoint := @TempPoint; + end + else + TempPPoint := nil; + + FBrowser.Host.ShowDevTools(@FDevWindowInfo, TempClient, @FDevBrowserSettings, TempPPoint); + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.ShowDevTools', e) then raise; + end; + finally + TempClient := nil; + end; +end; + +procedure TFMXChromium.CloseDevTools; +begin + if Initialized then FBrowser.Host.CloseDevTools; +end; + function TFMXChromium.doOnClose(const browser: ICefBrowser): Boolean; var TempAction : TCefCloseBrowserAction; @@ -3218,14 +3262,14 @@ begin if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen); end; -function TFMXChromium.doOnGetAuthCredentials(const browser : ICefBrowser; - const frame : ICefFrame; - isProxy : Boolean; - const host : ustring; - port : Integer; - const realm : ustring; - const scheme : ustring; - const callback : ICefAuthCallback): Boolean; +function TFMXChromium.doOnGetAuthCredentials(const browser : ICefBrowser; + const originUrl : ustring; + isProxy : Boolean; + const host : ustring; + port : Integer; + const realm : ustring; + const scheme : ustring; + const callback : ICefAuthCallback): Boolean; begin Result := False; @@ -3238,8 +3282,8 @@ begin end; end else - if (frame <> nil) and frame.IsMain and Assigned(FOnGetAuthCredentials) then - FOnGetAuthCredentials(Self, browser, frame, isProxy, host, port, realm, scheme, callback, Result); + if Assigned(FOnGetAuthCredentials) then + FOnGetAuthCredentials(Self, browser, originUrl, isProxy, host, port, realm, scheme, callback, Result); end; function TFMXChromium.doCanSendCookie(const browser : ICefBrowser; diff --git a/source/uCEFInterfaces.pas b/source/uCEFInterfaces.pas index 648f1e43..c287f9a4 100644 --- a/source/uCEFInterfaces.pas +++ b/source/uCEFInterfaces.pas @@ -324,7 +324,7 @@ type function doOnBeforeBrowse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean): Boolean; function doOnOpenUrlFromTab(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean): Boolean; procedure doOnGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler; var aUseInternalHandler : boolean); - function doOnGetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; + function doOnGetAuthCredentials(const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; function doOnQuotaRequest(const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback): Boolean; function doOnCertificateError(const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback): Boolean; function doOnSelectClientCertificate(const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback): boolean; @@ -1678,7 +1678,7 @@ type function OnBeforeBrowse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean): Boolean; function OnOpenUrlFromTab(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean): Boolean; procedure GetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); - function GetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; + function GetAuthCredentials(const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; function OnQuotaRequest(const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback): Boolean; function OnCertificateError(const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback): Boolean; function OnSelectClientCertificate(const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback): boolean; @@ -2014,6 +2014,7 @@ type function CanSetPreference(const name: ustring): Boolean; function SetPreference(const name: ustring; const value: ICefValue; out error: ustring): Boolean; procedure ClearCertificateExceptions(const callback: ICefCompletionCallback); + procedure ClearHttpAuthCredentials(const callback: ICefCompletionCallback); procedure CloseAllConnections(const callback: ICefCompletionCallback); procedure ResolveHost(const origin: ustring; const callback: ICefResolveCallback); procedure LoadExtension(const root_directory: ustring; const manifest: ICefDictionaryValue; const handler: ICefExtensionHandler); diff --git a/source/uCEFRequestContext.pas b/source/uCEFRequestContext.pas index 00fb71a5..f4b754de 100644 --- a/source/uCEFRequestContext.pas +++ b/source/uCEFRequestContext.pas @@ -75,6 +75,7 @@ type function CanSetPreference(const name: ustring): Boolean; function SetPreference(const name: ustring; const value: ICefValue; out error: ustring): Boolean; procedure ClearCertificateExceptions(const callback: ICefCompletionCallback); + procedure ClearHttpAuthCredentials(const callback: ICefCompletionCallback); procedure CloseAllConnections(const callback: ICefCompletionCallback); procedure ResolveHost(const origin: ustring; const callback: ICefResolveCallback); procedure LoadExtension(const root_directory: ustring; const manifest: ICefDictionaryValue; const handler: ICefExtensionHandler); @@ -220,6 +221,11 @@ begin PCefRequestContext(FData)^.clear_certificate_exceptions(PCefRequestContext(FData), CefGetData(callback)); end; +procedure TCefRequestContextRef.ClearHttpAuthCredentials(const callback: ICefCompletionCallback); +begin + PCefRequestContext(FData)^.clear_http_auth_credentials(PCefRequestContext(FData), CefGetData(callback)); +end; + procedure TCefRequestContextRef.CloseAllConnections(const callback: ICefCompletionCallback); begin PCefRequestContext(FData)^.close_all_connections(PCefRequestContext(FData), CefGetData(callback)); diff --git a/source/uCEFRequestHandler.pas b/source/uCEFRequestHandler.pas index 86787900..55b24f8c 100644 --- a/source/uCEFRequestHandler.pas +++ b/source/uCEFRequestHandler.pas @@ -57,7 +57,7 @@ type function OnBeforeBrowse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean): Boolean; virtual; function OnOpenUrlFromTab(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean): Boolean; virtual; procedure GetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual; - function GetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; virtual; + function GetAuthCredentials(const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; virtual; function OnQuotaRequest(const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback): Boolean; virtual; function OnCertificateError(const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback): Boolean; virtual; function OnSelectClientCertificate(const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback): boolean; virtual; @@ -79,7 +79,7 @@ type function OnBeforeBrowse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean): Boolean; override; function OnOpenUrlFromTab(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean): Boolean; override; procedure GetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); override; - function GetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; override; + function GetAuthCredentials(const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; override; function OnQuotaRequest(const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback): Boolean; override; function OnCertificateError(const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback): Boolean; override; function OnSelectClientCertificate(const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback): boolean; override; @@ -183,15 +183,15 @@ begin end; end; -function cef_request_handler_get_auth_credentials( self : PCefRequestHandler; - browser : PCefBrowser; - frame : PCefFrame; - isProxy : Integer; - const host : PCefString; - port : Integer; - const realm : PCefString; - const scheme : PCefString; - callback : PCefAuthCallback): Integer; stdcall; +function cef_request_handler_get_auth_credentials( self : PCefRequestHandler; + browser : PCefBrowser; + const origin_url : PCefString; + isProxy : Integer; + const host : PCefString; + port : Integer; + const realm : PCefString; + const scheme : PCefString; + callback : PCefAuthCallback): Integer; stdcall; var TempObject : TObject; begin @@ -200,7 +200,7 @@ begin if (TempObject <> nil) and (TempObject is TCefRequestHandlerOwn) then Result := Ord(TCefRequestHandlerOwn(TempObject).GetAuthCredentials(TCefBrowserRef.UnWrap(browser), - TCefFrameRef.UnWrap(frame), + CefString(origin_url), isProxy <> 0, CefString(host), port, @@ -363,14 +363,14 @@ begin end; end; -function TCefRequestHandlerOwn.GetAuthCredentials(const browser : ICefBrowser; - const frame : ICefFrame; - isProxy : Boolean; - const host : ustring; - port : Integer; - const realm : ustring; - const scheme : ustring; - const callback : ICefAuthCallback): Boolean; +function TCefRequestHandlerOwn.GetAuthCredentials(const browser : ICefBrowser; + const originUrl : ustring; + isProxy : Boolean; + const host : ustring; + port : Integer; + const realm : ustring; + const scheme : ustring; + const callback : ICefAuthCallback): Boolean; begin Result := False; end; @@ -489,19 +489,19 @@ begin FEvents := nil; end; -function TCustomRequestHandler.GetAuthCredentials(const browser : ICefBrowser; - const frame : ICefFrame; - isProxy : Boolean; - const host : ustring; - port : Integer; +function TCustomRequestHandler.GetAuthCredentials(const browser : ICefBrowser; + const originUrl : ustring; + isProxy : Boolean; + const host : ustring; + port : Integer; const realm : ustring; - const scheme : ustring; - const callback : ICefAuthCallback): Boolean; + const scheme : ustring; + const callback : ICefAuthCallback): Boolean; begin if (FEvents <> nil) then - Result := IChromiumEvents(FEvents).doOnGetAuthCredentials(browser, frame, isProxy, host, port, realm, scheme, callback) + Result := IChromiumEvents(FEvents).doOnGetAuthCredentials(browser, originUrl, isProxy, host, port, realm, scheme, callback) else - Result := inherited GetAuthCredentials(browser, frame, isProxy, host, port, realm, scheme, callback); + Result := inherited GetAuthCredentials(browser, originUrl, isProxy, host, port, realm, scheme, callback); end; function TCustomRequestHandler.OnBeforeBrowse(const browser : ICefBrowser; diff --git a/source/uCEFTypes.pas b/source/uCEFTypes.pas index 3bd0e271..946823ea 100644 --- a/source/uCEFTypes.pas +++ b/source/uCEFTypes.pas @@ -1761,7 +1761,7 @@ type on_before_browse : function(self: PCefRequestHandler; browser: PCefBrowser; frame: PCefFrame; request: PCefRequest; user_gesture, isRedirect: Integer): Integer; stdcall; on_open_urlfrom_tab : function(self: PCefRequestHandler; browser:PCefBrowser; frame: PCefFrame; const target_url: PCefString; target_disposition: TCefWindowOpenDisposition; user_gesture: Integer): Integer; stdcall; get_resource_request_handler : function(self: PCefRequestHandler; browser: PCefBrowser; frame: PCefFrame; request: PCefRequest; is_navigation, is_download: Integer; const request_initiator: PCefString; disable_default_handling: PInteger): PCefResourceRequestHandler; stdcall; - get_auth_credentials : function(self: PCefRequestHandler; browser: PCefBrowser; frame: PCefFrame; isProxy: Integer; const host: PCefString; port: Integer; const realm, scheme: PCefString; callback: PCefAuthCallback): Integer; stdcall; + get_auth_credentials : function(self: PCefRequestHandler; browser: PCefBrowser; const origin_url: PCefString; isProxy: Integer; const host: PCefString; port: Integer; const realm, scheme: PCefString; callback: PCefAuthCallback): Integer; stdcall; on_quota_request : function(self: PCefRequestHandler; browser: PCefBrowser; const origin_url: PCefString; new_size: Int64; callback: PCefRequestCallback): Integer; stdcall; on_certificate_error : function(self: PCefRequestHandler; browser: PCefBrowser; cert_error: TCefErrorcode; const request_url: PCefString; ssl_info: PCefSslInfo; callback: PCefRequestCallback): Integer; stdcall; on_select_client_certificate : function(self: PCefRequestHandler; browser: PCefBrowser; isProxy: integer; const host: PCefString; port: integer; certificatesCount: NativeUInt; const certificates: PPCefX509Certificate; callback: PCefSelectClientCertificateCallback): integer; stdcall; @@ -1881,6 +1881,7 @@ type can_set_preference : function(self: PCefRequestContext; const name: PCefString): Integer; stdcall; set_preference : function(self: PCefRequestContext; const name: PCefString; value: PCefValue; error: PCefString): Integer; stdcall; clear_certificate_exceptions : procedure(self: PCefRequestContext; callback: PCefCompletionCallback); stdcall; + clear_http_auth_credentials : procedure(self: PCefRequestContext; callback: PCefCompletionCallback); stdcall; close_all_connections : procedure(self: PCefRequestContext; callback: PCefCompletionCallback); stdcall; resolve_host : procedure(self: PCefRequestContext; const origin: PCefString; callback: PCefResolveCallback); stdcall; load_extension : procedure(self: PCefRequestContext; const root_directory: PCefString; manifest: PCefDictionaryValue; handler: PCefExtensionHandler); stdcall; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index f975c8d8..d2701f15 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,10 +1,10 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : true, - "InternalVersion" : 15, + "ForceNotify" : false, + "InternalVersion" : 16, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "75.0.13.0" + "Version" : "75.1.4.0" } ], "UpdatePackageData" : {