(*******************************************************************************
* This file is part of otanmi.dpk package.                                     *
* For complete information refer to otanmi.dpk file.                           *
*******************************************************************************)
{
  Adapted demonstrate calling HTML Help
  from Delphi IDE, shortcut F2. Tested with Delphi 7.

  Miika Nurminen / 2004-09-25

  Original Open Tools Menu example by: Miha Remec
  http://www.miharemec.com/doc/ota-nmi.html 
}
unit otanmi_main;

interface

uses
  Windows, Forms, Menus, ExtCtrls, SysUtils, ToolsAPI;

type
  TotanmiNewMenuItem = class
  private
    FTimer: TTimer;
    FInitialized: Boolean;
    FMainMenu: TMainMenu;
    FFileMenu: TMenuItem;
    FNewMenuItem: TMenuItem;
    procedure OnMenuItemClick(Sender: TObject);
  public
    procedure StartTimer;
    procedure AddMenuItem(Sender: TObject);
    procedure RemoveMenuItem;
  end;

(*
 A most simple html help interface. Much more detailed API conversion & examples
 can be found from ftp://delphi-jedi.org/api/HtmlHlp.zip  
*)
const
  HH_DISPLAY_TOPIC        = $0000;
  HH_DISPLAY_TOC          = $0001;
  HH_CLOSE_ALL            = $0012;

function HtmlHelp(hwndCaller: HWND;
  pszFile: PChar; uCommand: UINT;
  dwData: DWORD): HWND; stdcall;
  external 'HHCTRL.OCX' name 'HtmlHelpA';



var
  OTAnmiItem: TotanmiNewMenuItem;

procedure Register;

implementation

{ TotanmiNewMenuItem }

procedure TotanmiNewMenuItem.StartTimer;
begin
  FTimer := TTimer.Create(nil);
  FTimer.Interval := 1000;
  FTimer.OnTimer := AddMenuItem;
  FTimer.Enabled := True;
  FInitialized := False;
end;

procedure TotanmiNewMenuItem.AddMenuItem;
var
  i: Integer;
begin
  FreeAndNil(FTimer);

  // find Delphi's main menu
  FMainMenu := (BorlandIDEServices as INTAServices).MainMenu;
  // find File
  for i := 0 to FMainMenu.Items.Count - 1 do begin
    if AnsiSameCaption(FMainMenu.Items[i].Caption, 'Help') then begin
      FFileMenu := FMainMenu.Items[i];
      Break;
    end;
  end;

  FNewMenuItem := TMenuItem.Create(FFileMenu);
  FNewMenuItem.Caption := 'HtmlHelp';
  FNewMenuItem.OnClick := OnMenuItemClick;
  FNewMenuItem.ShortCut := TextToShortCut('F2');

  // find first separator
  for i := 0 to FFileMenu.Count - 1 do begin
    if FFileMenu.Items[i].IsLine then begin
      FFileMenu.Insert(i, FNewMenuItem);
      Break;
    end;
  end;

  FInitialized := True;
end;

procedure TotanmiNewMenuItem.RemoveMenuItem;
var
  i: Integer;
begin
  if Assigned(FTimer) then
    FreeAndNil(FTimer);
  if not FInitialized then
    Exit;

  i := 0;
  while i < FFileMenu.Count do begin
    if AnsiSameCaption(FFileMenu.Items[i].Caption, 'mrExperts') then
      FFileMenu.Remove(FFileMenu.Items[i])
    else
      Inc(i);
  end;
  FNewMenuItem.Free;
end;

procedure TotanmiNewMenuItem.OnMenuItemClick(Sender: TObject);
begin
  // Action here...
  HtmlHelp(Application.Handle,PChar('myhelp.chm'),HH_DISPLAY_TOC, 0);
end;

procedure Register;
begin
  OTAnmiItem.StartTimer;
end;

initialization
  OTAnmiItem := TotanmiNewMenuItem.Create;

finalization
  OTAnmiItem.RemoveMenuItem;
  OTAnmiItem.Free;

end.
