unit uDLLDispArt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls,
  htmltv, StrUtils, IniFiles, AdvCircularProgress, uCEFApplication,
  uCEFWinControl, uCEFChromiumWindow, uCEFSentinel, HTMListB, VCL.TMSFNCTypes,
  VCL.TMSFNCUtils, VCL.TMSFNCGraphics, VCL.TMSFNCGraphicsTypes,
  VCL.TMSFNCCustomControl, VCL.TMSFNCHTMLText, AdvSplitter, AdvScrollControl,
  AdvRichEditorBase, AdvRichEditor;

type
  TfrmDLLDispArt = class(TForm)
    pnlBrowserContainer: TPanel;
    Timer1: TTimer;
    pnlAddress: TPanel;
    url: TEdit;
    Button1: TButton;
    pnlBrowser: TPanel;
    web: TChromiumWindow;
    CEFSentinel1: TCEFSentinel;
    pnlLeft: TPanel;
    pnlMission: TPanel;
    lblMission: TTMSFNCHTMLText;
    pnlUSNIHarpoon: TPanel;
    txtUSNIHarpoon: TTMSFNCHTMLText;
    pnlLinks: TPanel;
    lbxLinks: THTMListBox;
    TMSFNCHTMLText1: TTMSFNCHTMLText;
    Label1: TLabel;
    AdvSplitter1: TAdvSplitter;
    Button2: TButton;
    tmrBrowserFix: TTimer;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure webAfterCreated(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure webBeforeClose(Sender: TObject);
    procedure webClose(Sender: TObject);
    procedure CEFSentinel1Close(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure tmrBrowserFixTimer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    iniSettings: TIniFile;
  public
    { Public declarations }
  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 CreateParams(var Params: TCreateParams) ; override;
  end;

var
  frmDLLDispArt: TfrmDLLDispArt;

implementation

{$R *.dfm}

uses uUSNIGlobals;


procedure TfrmDLLDispArt.CreateParams(var Params: TCreateParams) ;
begin
  inherited;
  // ALE 20191230 attempting to show form on Taskbar
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  //Params.WndParent := 0;
end;

procedure TfrmDLLDispArt.Button1Click(Sender: TObject);
begin
  web.LoadURL(url.Text + '?' + gPromoSrc);
  //frmUSNI.web2.LoadURL('https://www.google.com');
end;

procedure TfrmDLLDispArt.Button2Click(Sender: TObject);
begin
  tmrBrowserFix.Enabled := True;
  // ALE 20191230 ineffective for triggering redraw web.ScrollBy(0, 0);
  //web.NotifyMoveOrResizeStarted;
end;

procedure TfrmDLLDispArt.CEFSentinel1Close(Sender: TObject);
begin
  FCanClose := True;
  PostMessage(Handle, WM_CLOSE, 0, 0);
end;

procedure TfrmDLLDispArt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caMinimize;
end;

procedure TfrmDLLDispArt.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := FCanClose;

  if not(FClosing) then
    begin
      FClosing := True;
      Visible  := False;
      web.CloseBrowser(True);
    end;
end;

procedure TfrmDLLDispArt.FormCreate(Sender: TObject);
var
  intLeft, intRight, intTop, intBottom: Integer;
begin
  FCanClose := False;
  FClosing  := False;

  iniSettings := TIniFile.Create(ExtractFilePath(Application.ExeName)
   + 'ExportDLLs\USNI.ini');
  intLeft := iniSettings.ReadInteger('MAIN', 'WindowPosLeft', 0);
  intTop := iniSettings.ReadInteger('MAIN', 'WindowPosTop', 0);
  intBottom := iniSettings.ReadInteger('MAIN', 'WindowPosBottom', 560);
  intRight := iniSettings.ReadInteger('MAIN', 'WindowPosRight', 800);
  if ((Screen.DesktopWidth >= intRight) AND (Screen.DesktopHeight >= intBottom))  then
  begin
    Self.Left := intLeft;
    Self.Top := intTop;
    Self.Height := intBottom - Self.Top;
    Self.Width := intRight - Self.Left;
  end
  else
  begin
    // upper-left corner
    frmDLLDispArt.Left := 0;
    frmDLLDispArt.Width := 800;
    frmDLLDispArt.Top := 0;
    frmDLLDispArt.Height := 560;
  end;
end;

procedure TfrmDLLDispArt.FormDestroy(Sender: TObject);
begin
  iniSettings.WriteInteger('MAIN', 'WindowPosLeft', Self.Left);
  iniSettings.WriteInteger('MAIN', 'WindowPosTop', Self.Top);
  iniSettings.WriteInteger('MAIN', 'WindowPosBottom', Self.Top + Self.Height);
  iniSettings.WriteInteger('MAIN', 'WindowPosRight', Self.Left + Self.Width);

  iniSettings.UpdateFile;
  iniSettings.Free;
end;

procedure TfrmDLLDispArt.FormResize(Sender: TObject);
begin
  tmrBrowserFix.Enabled := True;
end;

procedure TfrmDLLDispArt.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.
  Label1.Caption := 'FormShow';
  if not(web.CreateBrowser) then
    Timer1.Enabled := True
end;

procedure TfrmDLLDispArt.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  if (frmDLLDispArt <> nil) AND (frmDLLDispArt.Showing) then
  begin
    Label1.Caption := 'Timer ' + FormatDateTime('hh:nn:ss', Now);
    if not(web.CreateBrowser) and not(web.Initialized) then
      Timer1.Enabled := True;
    tmrBrowserFix.Enabled := True; // ALE 20191230 trigger browser rerender
  end;
end;

procedure TfrmDLLDispArt.tmrBrowserFixTimer(Sender: TObject);
begin
  tmrBrowserFix.Enabled := False;
  web.ScrollBy(1, 1);
  web.ScrollBy(-1, -1);
end;

procedure TfrmDLLDispArt.webAfterCreated(Sender: TObject);
begin
  Label1.Caption := 'Browser Ready';
  Button1.Click;
end;

procedure TfrmDLLDispArt.webBeforeClose(Sender: TObject);
begin
  //FCanClose := True;
  //PostMessage(Handle, WM_CLOSE, 0, 0);
  CEFSentinel1.Start;
end;

procedure TfrmDLLDispArt.webClose(Sender: TObject);
begin
  // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order.
  if not(web.DestroyChildWindow) then CEFSentinel1.Start;
  {
  if not(web.DestroyChildWindow) then
    begin
      FCanClose := True;
      Close;
    end;
  }
end;

end.
