/**********************************************************************/
/**                       Microsoft Windows/NT                       **/
/**                Copyright(c) Microsoft Corp., 1991                **/
/**********************************************************************/

/*
    bltmsgp.hxx
    BLT Message popup header file

    Note: where the default button is named as "0", it means to use
    the same default that Windows uses.

    FILE HISTORY:
        rustanl      5-Dec-1990 Created
        Johnl       15-Feb-1991 Added meat
        RustanL      4-Mar-1991 Replaced QueryHwnd with QueryRobustHwnd
        beng        14-May-1991 Hack for separate compilation
        beng        20-Aug-1991 Const owner-window parameter
        chuckc      23-Sep-1991 Added DisplayGenericError
        beng        30-Sep-1991 Changed an amazing number of SHORTs to INTs;
                                added MSGID business
        beng        17-Jun-1992 Restructuring
        Yi-HsinS    10-Aug-1991 Added MPSEV_QUESTION
        JonN        25-Aug-1992 Merged in PERFORMER::DisplayError()
*/

#ifndef _BLT_HXX_
#error "Don't include this file directly; instead, include it through blt.hxx"
#endif  // _BLT_HXX_

#ifndef _BLTMSGP_HXX_
#define _BLTMSGP_HXX_

// this allows the apps that assume STRLIST as
// a result of including this file to build. CODEWORK - cleanup!
#include "strlst.hxx"

//  MsgPopup Buttons, and the shorthands of their common combinations

#define MP_UNKNOWN  (0x0000)
#define MP_OK       (0x0001)
#define MP_CANCEL   (0x0002)
#define MP_YES      (0x0004)
#define MP_NO       (0x0008)

#define MP_OKCANCEL     ( MP_OK | MP_CANCEL )
#define MP_YESNO        ( MP_YES | MP_NO )
#define MP_YESNOCANCEL  ( MP_YES | MP_NO | MP_CANCEL )


// Help context options.

//   HC_NO_HELP means don't display a help button even if there is a help
//              topic for this message
//   HC_DEFAULT_HELP means display a help button if there is an associated
//              help context for this message number

#define HC_NO_HELP          (~0L)
#define HC_DEFAULT_HELP     (0L)


//  MsgPopup severity

enum MSG_SEVERITY
{
    MPSEV_ERROR,
    MPSEV_WARNING,
    MPSEV_INFO,
    MPSEV_QUESTION
};

// Message Map table for use by applications
typedef struct _MSGMAPENTRY
{
    MSGID msgidIn;
    MSGID msgidOut;
} MSGMAPENTRY ;



/*************************************************************************

    NAME:       POPUP

    SYNOPSIS:   Encapsulates messageboxes

    INTERFACE:  POPUP()     - ctor
                ~POPUP()    - dtor
                Show()      - displays the popup

                Init()      - initialize module
                Term()      - clean up before shutdown

                SetCaption()   - Set the caption of MsgPopup
                ResetCaption() - Reset the caption of MsgPopup back to
                                 Windows NT

                SetHelpContextBase() - Set the help context base for
                                       help contexts automatically searched
                                       in the msg2help.tbl.

    PARENT:     BASE

    USES:       NLS_STR

    CAVEATS:
        Uses BASE only as a Boolean fError indicator.

    NOTES:
        Clients should access this class through MsgPopup() only.

    HISTORY:
        beng        17-Jun-1992 Created in restructuring
        beng        29-Jun-1992 Outlined Set and ResetCaption
        Yi-HsinS    09-Oct-1992 Added _ulHelpContextBase, SetHelpContextBase()

**************************************************************************/

DLL_CLASS POPUP: public BASE
{
private:
    HWND         _hwndParent;
    MSGID        _msgid;
    MSG_SEVERITY _msgsev;
    ULONG        _ulHelpContext;
    UINT         _nButtons;
    UINT         _nDefButton;
    NLS_STR *    _pnlsText;

    static BOOL  _fInit;

    static NLS_STR * _vpnlsEmergencyText;
    static NLS_STR * _vpnlsEmergencyCapt;

    static MSGMAPENTRY * _vpmmeTable;

    static MSGID _vmsgidCaption;
    static ULONG _ulHelpContextBase;

    NLS_STR * LoadMessage( MSGID msgid, BOOL fTrySystem = FALSE );
    INT       Emergency() const;

    static INT CalcDefButton( UINT nButtons, UINT nDefButton );
    static INT MapButton( UINT nButton );

public:
    POPUP( HWND hwndOwner, MSGID msgid, MSG_SEVERITY msgsev,
           UINT nButtons, UINT nDefButton, BOOL fTrySystem = FALSE );

    POPUP( HWND hwndOwner, MSGID msgid, MSG_SEVERITY msgsev,
           ULONG ulHelpTopic, UINT nButtons,
           const NLS_STR ** apnlsInsert, UINT nDefButton );

#if 0 // elide unused form
    POPUP( HWND hwndOwner, MSGID msgid, MSG_SEVERITY msgsev,
           ULONG ulHelpTopic, UINT nButtons,
           STRLIST & strlstInsert, UINT nDefButton );
#endif

    ~POPUP();

    INT Show();

    static APIERR Init();
    static VOID   Term();

    static VOID SetCaption( MSGID msgid );
    static VOID ResetCaption();

    static VOID SetMsgMapTable( MSGMAPENTRY * pmmeTable );
    static MSGID MapMessage( MSGID msgidIn );

    static ULONG SetHelpContextBase( ULONG ulHelpContextBase = 0 );
};


/*************************************************************************

    NAME:       OWNINGWND

    SYNOPSIS:   Hack to convert a pwnd to a robust hwnd for MsgPopup.

    HISTORY:
        beng        02-Jun-1992 Created (from PWND2HWND of bltdlg)

**************************************************************************/

DLL_CLASS OWNINGWND
{
private:
    HWND _hwnd;

public:
    OWNINGWND( HWND hwnd ) : _hwnd(hwnd) { }
    OWNINGWND( const OWNER_WINDOW * pwnd )
        : _hwnd(pwnd->QueryRobustHwnd()) { }

    HWND QueryHwnd() const
        { return _hwnd; }
};


/*
 * Call this function during application initialization to properly
 * initialize the message popup stuff (only affects msgpopup during
 * low memory/resource failure situations).
 *
 * These are called automatically when BLTRegister is called (an app.
 * shouldn't call these directly).
 *
 * UnInitMsgPopup should be called during application shutdown.  It frees
 * resources allocated by InitMsgPopup.
 */

inline APIERR InitMsgPopup()
{
    return POPUP::Init();
}

inline VOID   UnInitMsgPopup()
{
    POPUP::Term();
}


//
//  The MsgPopup function declarations
//

//  The following form takes the help context from the resource
//  file, and uses an OK button.

extern DLL_BASED
INT MsgPopup( const OWNINGWND & wnd,
              MSGID        msgid,
              MSG_SEVERITY msgsev = MPSEV_ERROR );


//  The following form allows the client to specify a set of buttons,
//  as well as an optional default button.  The help context is taken from
//  the resource file.

extern DLL_BASED
INT MsgPopup( const OWNINGWND & wnd,
              MSGID        msgid,
              MSG_SEVERITY msgsev,
              UINT         nButtons,
              UINT         nDefButton = MP_UNKNOWN );


//  The following form allows the client to specify insert strings, as
//  well as a choice of buttons.  Help context is taken from the resource
//  file.  The insert strings come in three flavors, a single parameter,
//  two parameters and > two parameters.  This is for ease of use since
//  95% of the message strings take one or two parameters.


extern DLL_BASED
INT MsgPopup( const OWNINGWND & wnd,
              MSGID         msgid,
              MSG_SEVERITY  msgsev,
              UINT          nButtons,
              const TCHAR * pszIns,
              UINT          nDefButton = MP_UNKNOWN );

extern DLL_BASED
INT MsgPopup( const OWNINGWND & wnd,
              MSGID         msgid,
              MSG_SEVERITY  msgsev,
              UINT          nButtons,
              const TCHAR * pszIns1,
              const TCHAR * pszIns2,
              UINT          nDefButton = MP_UNKNOWN );

/*
    One further refinement:  This form allows the user to
    specify both a MSGID and an APIERR.  The string for this
    APIERR will be inserted into the MSGID string as %1,
    while the apnlsInserted strings will be shifted to %2
    and higher.  If the APIERR string cannot be found,
    a string containing the error number and class will be
    inserted instead.
*/
extern DLL_BASED
INT MsgPopup( const OWNINGWND & wnd,
              MSGID msgid,
              APIERR       errAPI,
              MSG_SEVERITY msgsev,
              ULONG     ulHelpTopic,
              UINT      nButtons,
              NLS_STR * apnlsParams[],
              UINT      nDefButton = MP_UNKNOWN );

#if 0 // strlist form never used
INT MsgPopup( const OWNINGWND & wnd,
              MSGID        msgid,
              MSG_SEVERITY msgsev,
              UINT         nButtons,
              STRLIST &    strlst,
              UINT         nDefButton = MP_UNKNOWN );
#endif


//  Finally, these forms allow the client to have it all.  They take
//  as parameters insert strings (note, that an insert string object may
//  contain 0 insert strings, if desired), a help topic, and a choice of
//  buttons.

#if 0 // strlist form never used
INT MsgPopup( const OWNINGWND & wnd,
              MSGID        msgid,
              MSG_SEVERITY msgsev,
              ULONG        ulHelpTopic,
              UINT         nButtons,
              STRLIST &    strlst,
              UINT         nDefButton = MP_UNKNOWN );
#endif

extern DLL_BASED
INT MsgPopup( const OWNINGWND & wnd,
              MSGID        msgid,
              MSG_SEVERITY msgsev,
              ULONG        ulHelpTopic,
              UINT         nButtons,
              NLS_STR *    apnlsInserted[],
              UINT         nDefButton = MP_UNKNOWN );


/*
   This function is used to display a generic error message of form:

       Some error on object %objectname%.
       Error %apierr% occurred: %text_for_api_err%

   idMessage should refer to a resource string of the form above, eg:

       The world collapsed while stopping server %1.
       Error %2 occurred: %3%.

   pszObjectName will be substituted in %1, errAPI in %2, and the
   corresponding API text in %3. If we cannot find the text for the
   API err, we just leave the text out. errAPI is expected to be in
   the SYS/NET range.
*/

extern DLL_BASED
UINT DisplayGenericError( const OWNINGWND &    wnd,
                          MSGID                msgid,
                          APIERR               errAPI,
                          const TCHAR *        pszObject1,
                          const TCHAR *        pszObject2,
                          MSG_SEVERITY         msgsev = MPSEV_ERROR );

extern DLL_BASED
UINT DisplayGenericError( const OWNINGWND &    wnd,
                          MSGID                msgid,
                          APIERR               errAPI,
                          const TCHAR *        pszObjectName,
                          MSG_SEVERITY         msgsev = MPSEV_ERROR );


#endif // _BLTMSGP_HXX_ - end of file