/**************************************************************************
 *  File name  :  draghelp.c
 *
 *  Description:  This file contains all the routines for interfacing
 *                with the IPF help manager.
 *
 *                This source file contains the following functions:
 *
 *                InitHelp(hab, hwnd)
 *                HelpUsingHelp(hwnd)
 *                HelpGeneral(hwnd)
 *                HelpIndex(hwnd)
 *                HelpProductInfo(hwnd)
 *                DestroyHelpInstance(hwnd)
 *                ProductInfoDlgProc(hwnd, msg, mp1, mp2)
 *                SetSysMenu(hwnd)
 *
 *  Concepts   :  IPF Help Manager
 *
 *  API's      :  WinLoadString
 *                WinCreateHelpInstance
 *                WinAssociateHelpInstance
 *                WinSendMsg
 *                WinDlgBox
 *                WinDestroyHelpInstance
 *                WinDefDlgProc
 *                WinWindowFromID
 *
 *  Required
 *    Files    :  OS2.H, STRING.H, STDIO.H, DRAGDROP.H, DRAGHELP.H
 *
 *  Copyright (C) 1991 IBM Corporation
 *
 *      DISCLAIMER OF WARRANTIES.  The following [enclosed] code is
 *      sample code created by IBM Corporation. This sample code is not
 *      part of any standard or IBM product and is provided to you solely
 *      for  the purpose of assisting you in the development of your
 *      applications.  The code is provided "AS IS", without
 *      warranty of any kind.  IBM shall not be liable for any damages
 *      arising out of your use of the sample code, even if they have been
 *      advised of the possibility of such damages.                                                    *
 *************************************************************************/
/*
 *  Include files, macros, defined constants, and externs
 */

#define  INCL_WINHELP
#define  INCL_WINSTDDRAG
#define  INCL_WINMENUS
#define  INCL_WINFRAMEMGR

#include <os2.h>
#include <string.h>
#include <stdio.h>
#include "dragdrop.h"
#include "draghelp.h"

#define HELPLIBRARYNAMELEN  20

/*
 *  Global variables
 */
static HWND hwndHelpInstance;
static CHAR szLibName[HELPLIBRARYNAMELEN];
static CHAR szWindowTitle[HELPLIBRARYNAMELEN];
static BOOL fHelpEnabled;

/*
 *  Entry point declarations
 */
MRESULT EXPENTRY ProductInfoDlgProc(HWND hwnd,
                                    USHORT msg,
                                    MPARAM mp1,
                                    MPARAM mp2);

/**************************************************************************
 *
 *  Name       :  InitHelp(hab, hwnd)
 *
 *  Description: Initializes the IPF help facility
 *               Called once during initialization of the program
 *
 *  Concepts   : Initializes the HELPINIT structure and creates the
 *               help instance.  If successful, the help instance
 *               is associated with the main window queue
 *
 *  API's      :   WinLoadString
 *                 WinCreateHelpInstance
 *                 WinAssociateHelpInstance
 *
 *  Parameters :  hab      = anchor block handle
 *                hwndMain = main window handle
 *
 *  Return     :  [none]
 *
 *************************************************************************/
VOID InitHelp(HAB hab, HWND hwndMain)
{
   HELPINIT hini;

   /* If we return because of an error, Help will be disabled. */
   fHelpEnabled = FALSE;

   /* initialize help init structure */
   hini.cb = sizeof(HELPINIT);
   hini.ulReturnCode = 0L;
   hini.pszTutorialName = (PSZ)NULL;
   hini.phtHelpTable = (PHELPTABLE)MAKELONG(DRAGDROP_HELP_TABLE, 0xFFFF);
   hini.hmodHelpTableModule = 0;
   hini.hmodAccelActionBarModule = 0;
   hini.idAccelTable = 0;
   hini.idActionBar = 0;

   if(!WinLoadString(hab,
                     0,
                     IDS_CLIENTCLASS,
                     HELPLIBRARYNAMELEN,
                     (PSZ)szWindowTitle))
   {
       MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
       return;
   }

   hini.pszHelpWindowTitle = (PSZ)szWindowTitle;
   hini.fShowPanelId = CMIC_HIDE_PANEL_ID;

   if(!WinLoadString(hab,
                     0,
                     IDS_HELPLIBRARYNAME,
                     HELPLIBRARYNAMELEN,
                     (PSZ)szLibName))
   {
       MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
       return;
   }

   hini.pszHelpLibraryName = (PSZ)szLibName;

                   /* creating help instance */
   hwndHelpInstance = WinCreateHelpInstance(hab, &hini);

   if(!hwndHelpInstance)
   {
       MessageBox(hwndMain, IDMSG_HELPNOTAVAILABLE, MB_OK | MB_ERROR, TRUE);
       return;
   }

   if(hini.ulReturnCode)
   {
       MessageBox(hwndMain, IDMSG_HELPCREATEERROR, MB_OK | MB_ERROR, TRUE);
       return;
   }

                /* associate help instance with main frame */
   if(!WinAssociateHelpInstance(hwndHelpInstance, hwndMain))
   {
       MessageBox(hwndMain, IDMSG_HELPASSOCIATEERROR, MB_OK | MB_ERROR, TRUE);
       return;
   }

   /* help manager is successfully initialized so set flag to TRUE */
   fHelpEnabled = TRUE;
}   /*  End of InitHelp  */

/**************************************************************************
 *
 *  Name       :  HelpUsingHelp(hwnd)
 *
 *  Description: Processes the Using help choice from the Help pulldown
 *
 *  Concepts   : Processes the WM_COMMAND message posted by the
 *               Using Help item of the Help menu
 *               Called from MainCommand when the Using Help
 *               menu item is selected
 *               Sends an HM_DISPLAY_HELP message to the help
 *               instance so that the default Using Help is
 *               displayed.
 *
 *  API's      :   WinSendMsg
 *
 *  Parameters :  hwndMain = main window handle
 *
 *  Return     :  [none]
 *
 *************************************************************************/
VOID  HelpUsingHelp(HWND hwndMain)
{
    /* this just displays the system using help panel */
    if(fHelpEnabled)
       if (NULL != WinSendMsg(hwndHelpInstance, HM_DISPLAY_HELP,
                          (MPARAM)NULL, (MPARAM)NULL))
        {
            MessageBox(hwndMain, IDMSG_HELPDISPLAYERROR, MB_OK | MB_ERROR,
                       FALSE);
        }
}   /* End of HelpUsingHelp   */


/**************************************************************************
 *
 *  Name       :  HelpGeneral(hwnd)
 *
 *  Description: Processes the General help choice from the Help pulldown
 *
 *  Concepts   : Processes the WM_COMMAND message posted by the
 *               General Help item of the Help menu
 *               Called from MainCommand when the General Help
 *               menu item is selected
 *               Sends an HM_EXT_HELP message to the help
 *               instance so that the default Extended Help is
 *               displayed.
 *
 *  API's      :   WinSendMsg
 *
 *  Parameters :  hwndMain = main window handle
 *
 *  Return     :  [none]
 *
 *************************************************************************/
VOID  HelpGeneral(HWND hwndMain)
{
    /* this just displays the system general help panel */
    if(fHelpEnabled)
        if(NULL != WinSendMsg(hwndHelpInstance, HM_EXT_HELP,
                      (MPARAM)NULL, (MPARAM)NULL))
            MessageBox(hwndMain,
                       IDMSG_HELPDISPLAYERROR,
                       MB_OK | MB_ERROR,
                       FALSE);
}   /* End of HelpGeneral   */


/**************************************************************************
 *
 *  Name       :  HelpIndex(hwnd)
 *
 *  Description: Processes the Help index choice from the Help pulldown
 *
 *  Concepts   : Processes the WM_COMMAND message posted by the
 *               Help index item of the Help menu
 *               Called from MainCommand when the Help index
 *               menu item is selected
 *               Sends an HM_INDEX_HELP message to the help
 *               instance so that the Help index is displayed.
 *
 *  API's      :  WinSendMsg
 *
 *  Parameters :  hwndMain = main window handle
 *
 *  Return     :  [none]
 *
 *************************************************************************/
VOID  HelpIndex(HWND hwndMain)
{
    /* this just displays the system help index panel */
    if(fHelpEnabled)
        if(NULL != WinSendMsg(hwndHelpInstance, HM_HELP_INDEX,
                      (MPARAM)NULL, (MPARAM)NULL))
            MessageBox(hwndMain,
                       IDMSG_HELPDISPLAYERROR,
                       MB_OK | MB_ERROR,
                       FALSE);
}   /* End of HelpIndex   */


/**************************************************************************
 *
 *  Name       :  HelpProductInfo(hwndMain)
 *
 *  Description: Processes the Product information choice from the Help
 *               pulldown
 *
 *  Concepts   : Processes the WM_COMMAND message posted by the
 *               Product information item of the Help menu
 *               Called from MainCommand when the Product information
 *               menu item is selected
 *               Calls WinDlgBox to display the Product information
 *               dialog.
 *
 *  API's      :  WinSendMsg
 *
 *  Parameters :  hwndMain = main window handle
 *
 *  Return     :  [none]
 *
 *************************************************************************/
VOID  HelpProductInfo(HWND hwndMain)
{
    /* display the Product Information dialog. */
    if(DID_ERROR == WinDlgBox(HWND_DESKTOP,
                              hwndMain,
                              (PFNWP)ProductInfoDlgProc,
                              0,
                              IDD_PRODUCTINFO,
                              (PVOID)NULL))

        MessageBox(HWND_DESKTOP,
                   IDMSG_CANTSTARTDIALOG ,
                   MB_OK | MB_ERROR,
                   TRUE);
}   /*  End of HelpProductInfo   */

/**************************************************************************
 *
 *  Name       :  DestroyHelpInstance()
 *
 *  Description:  Deletes the application's help instance
 *
 *  Concepts   : Calls WinDestroyHelp Instance to delete the instance
 *
 *  API's      :  WinDestroyHelpInstance
 *
 *  Parameters :  [none]
 *
 *  Return     :  [none]
 *
 *************************************************************************/
VOID DestroyHelpInstance(VOID)
{
    if(hwndHelpInstance != 0L)
    {
        WinDestroyHelpInstance(hwndHelpInstance);
    }
}   /* End of DestroyHelpInstance    */


/**************************************************************************
 *
 *  Name       :  ProductInfoDlgProc(hwnd, msg, mp1, mp2)
 *
 *  Description:  Processes all messages sent to the Product
 *                information dialog
 *
 *  Concepts   :  Called for each message sent to the Product information
 *                dialog box.
 *
 *                the Product information dialog has only a button control, so this
 *                routine processes only WM_COMMAND messages.  Any
 *                WM_COMMAND posted must have come from the OK
 *                button, so we dismiss the dialog upon receiving it.
 *
 *  API's      :  WinDefDlgProc
 *
 *  Parameters :  [none]
 *
 *  Return     :  dependent on message sent
 *
 *************************************************************************/
MRESULT EXPENTRY ProductInfoDlgProc(HWND hwnd,
                                    USHORT msg,
                                    MPARAM mp1,
                                    MPARAM mp2)
{
    switch (msg)
    {
    case WM_INITDLG:
       SetSysMenu(hwnd);       /* system menu for this dialog  */
          return (MRESULT)NULL;

    default:
       return WinDefDlgProc(hwnd, msg, mp1, mp2);
    }
    return (MRESULT)NULL;
}   /*  End of ProductInfoDlgProc  */

/**************************************************************************
 *
 *  Name       :  SetSysMenu(hDlg)
 *
 *  Description:  Enables only the Move and Close items in the
 *                system menu pulldown for any dialog
 *
 *  Concepts   :
 *
 *  API's      :  WinWindowFromID
 *                WinSendMsg
 *
 *  Parameters :  hDlg = dialog handle
 *
 *  Return     :  [none]
 *
 *************************************************************************/
VOID SetSysMenu( HWND hDlg )
{
    HWND     hSysMenu;
    MENUITEM Mi;
    SHORT    Pos;
    ULONG    Id;
    SHORT    cItems;

    /*
     *  We only want Move and Close in the system menu.
     */
    hSysMenu = WinWindowFromID(hDlg, FID_SYSMENU);
    WinSendMsg( hSysMenu, MM_QUERYITEM
              , MPFROM2SHORT(SC_SYSMENU, FALSE), MPFROMP((PCH) & Mi));
    Pos = 0;
    cItems = (SHORT)WinSendMsg( Mi.hwndSubMenu, MM_QUERYITEMCOUNT,
                                (MPARAM)NULL, (MPARAM)NULL);
    while (cItems--)
    {
        Id = (ULONG) WinSendMsg( Mi.hwndSubMenu, MM_ITEMIDFROMPOSITION
                          , MPFROM2SHORT(Pos, TRUE), (MPARAM)NULL);
        switch (SHORT1FROMMP(Id))
        {
        case SC_MOVE:
        case SC_CLOSE:
            Pos++;  /* Don't delete that one. */
            break;
        default:
            WinSendMsg( Mi.hwndSubMenu, MM_DELETEITEM
                      , MPFROM2SHORT(Id, TRUE), (MPARAM)NULL);
        }
    }
} /*  End of SetSysMenu  */
/***************************  End of draghelp.c  *************************/
