unit HTTPContentProvider;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, BaseContentProvider, LNetHTTPDataProvider, IpHtml, ComCtrls,
  Menus, Controls, lhelpstrconsts;
  
type

  { THTTPContentProvider }

  THTTPContentProvider = class(TBaseContentProvider)
  private
    fHomeUrl: String;
    fPopup: TPopupMenu;
    fStatusBar: TStatusBar;
    fHtml: TIpHtmlPanel;
    fHttpDataProvider: TIpHTTPDataProvider;
    procedure IpHtmlPanelHotChange(Sender: TObject);
    procedure PopupCopyClick(Sender: TObject);
    procedure SetTitle(ATitle: String);
  public
    function CanGoBack: Boolean; override;
    function CanGoForward: Boolean; override;
    function GetHistory: TStrings; override;
    function LoadURL(const AURL: String; const AContext: THelpContext=-1): Boolean; override;
    procedure GoHome; override;
    procedure GoBack; override;
    procedure GoForward; override;
    class function GetProperContentProvider(const AURL: String): TBaseContentProviderClass; override;
    constructor Create(AParent: TWinControl; AImageList: TImageList); override;
  end;

implementation

{ THTTPContentProvider }

procedure THTTPContentProvider.IpHtmlPanelHotChange(Sender: TObject);
begin
  fStatusBar.SimpleText := fHtml.HotURL;
end;

procedure THTTPContentProvider.PopupCopyClick(Sender: TObject);
begin
  fHtml.CopyToClipboard;
end;

procedure THTTPContentProvider.SetTitle(ATitle: String);
begin
  if Parent = nil then exit;
  TTabSheet(Parent).Caption := ATitle;
end;

function THTTPContentProvider.CanGoBack: Boolean;
begin
  //Result:=inherited CanGoBack;
  fHtml.canGoBack;
end;

function THTTPContentProvider.CanGoForward: Boolean;
begin
  //Result:=inherited CanGoForward;
  fHtml.canGoForward;
end;

function THTTPContentProvider.GetHistory: TStrings;
begin
  //Result:=inherited GetHistory;
end;

function THTTPContentProvider.LoadURL(const AURL: String;
  const AContext: THelpContext): Boolean;
begin
  Result:=True;
  SetTitle(Format(slhelp_Loading, [AURL]) );
  //WriteLn('Loading URL:', AURL);
  fHtml.OpenURL(AURL);
  SetTitle(AURL);
  if fHomeURL = '' then fHomeURL := AURL;
  
end;

procedure THTTPContentProvider.GoHome;
begin
  LoadURL(fHomeURL);
end;

procedure THTTPContentProvider.GoBack;
begin
  fHtml.GoBack;
end;

procedure THTTPContentProvider.GoForward;
begin
  fHtml.GoForward;
end;

class function THTTPContentProvider.GetProperContentProvider(const AURL: String
  ): TBaseContentProviderClass;
begin
  Result := THTTPContentProvider;
end;

constructor THTTPContentProvider.Create(AParent: TWinControl; AImageList: TImageList);
begin
  inherited Create(AParent, AImageList);
  fPopUp := TPopupMenu.Create(fHtml);
  fPopUp.Items.Add(TMenuItem.Create(fPopup));
  with fPopUp.Items.Items[0] do begin
    Caption := slhelp_Copy;
    OnClick := @PopupCopyClick;
  end;

  fHttpDataProvider := TIpHTTPDataProvider.Create(AParent);
  fHtml := TIpHtmlPanel.Create(Parent);
  with fHtml do begin
    DataProvider := fHttpDataProvider;
    //OnDocumentOpen := @IpHtmlPanelDocumentOpen;
    OnHotChange := @IpHtmlPanelHotChange;
    PopupMenu := fPopUp;
    Parent := AParent;
    Align := alClient;
    Visible := True;
  end;
  
  fStatusBar := TStatusBar.Create(AParent);
  with fStatusBar do begin
    Parent := AParent;
    Align := alBottom;
    SimplePanel := True;
  end;
end;

initialization
  RegisterContentProvider('http://', THTTPContentProvider);
end.

