//+---------------------------------------------------------------------------
//
//  Microsoft Windows NT Security
//  Copyright (C) Microsoft Corporation, 1992 - 1999
//
//  File:       acuictl.h
//
//  Contents:   UI Control class definitions
//
//  History:    12-May-97    kirtd    Created
//
//----------------------------------------------------------------------------
#if !defined(__ACUICTL_H__)
#define __ACUICTL_H__

//
// Forward class declaration
//

class CInvokeInfoHelper;

//
// Link subclass definitions
//

typedef struct _TUI_LINK_SUBCLASS_DATA {

    HWND    hwndParent;
    WNDPROC wpPrev;
    DWORD_PTR uToolTipText;
    DWORD   uId;
    HWND    hwndTip;
    LPVOID  pvData;
    BOOL    fMouseCaptured;

} TUI_LINK_SUBCLASS_DATA, *PTUI_LINK_SUBCLASS_DATA;

//
// IACUIControl abstract base class interface.  This is used by the
// invoke UI entry point to put up the appropriate UI.  There are different
// implementations of this interface based on the invoke reason code
//

class IACUIControl
{
public:

    //
    // Constructor
    //

    IACUIControl (CInvokeInfoHelper& riih);

    //
    // Virtual destructor
    //

    virtual ~IACUIControl ();

    //
    // UI Message processing
    //

    virtual BOOL OnUIMessage (
                     HWND   hwnd,
                     UINT   uMsg,
                     WPARAM wParam,
                     LPARAM lParam
                     );

    void LoadActionText(WCHAR **ppszRet, WCHAR *pwszIn, DWORD dwDefId);
    void SetupButtons(HWND hwnd);

    //
    // Pure virtual methods
    //

    virtual HRESULT InvokeUI (HWND hDisplay) = 0;

    virtual BOOL OnInitDialog (HWND hwnd, WPARAM wParam, LPARAM lParam) = 0;

    virtual BOOL OnYes (HWND hwnd) = 0;

    virtual BOOL OnNo (HWND hwnd) = 0;

    virtual BOOL OnMore (HWND hwnd) = 0;

protected:

    //
    // Invoke Info Helper reference
    //

    CInvokeInfoHelper& m_riih;

    //
    // Invoke result
    //

    HRESULT            m_hrInvokeResult;

    WCHAR               *m_pszCopyActionText;
    WCHAR               *m_pszCopyActionTextNoTS;
    WCHAR               *m_pszCopyActionTextNotSigned;
};

//
// CVerifiedTrustUI class is used to invoke authenticode UI where the
// trust hierarchy for the signer has been successfully verified and the
// user has to make an override decision
//

class CVerifiedTrustUI : public IACUIControl
{
public:

    //
    // Initialization
    //

    CVerifiedTrustUI (CInvokeInfoHelper& riih, HRESULT& rhr);

    ~CVerifiedTrustUI ();

    //
    // IACUIControl methods
    //

    virtual HRESULT InvokeUI (HWND hDisplay);

    virtual BOOL OnInitDialog (HWND hwnd, WPARAM wParam, LPARAM lParam);

    virtual BOOL OnYes (HWND hwnd);

    virtual BOOL OnNo (HWND hwnd);

    virtual BOOL OnMore (HWND hwnd);

private:

    //
    // Formatted strings for display
    //

    LPWSTR             m_pszInstallAndRun;
    LPWSTR             m_pszAuthenticity;
    LPWSTR             m_pszCaution;
    LPWSTR             m_pszPersonalTrust;

    //
    // links
    //

    TUI_LINK_SUBCLASS_DATA m_lsdPublisher;
    TUI_LINK_SUBCLASS_DATA m_lsdOpusInfo;
    TUI_LINK_SUBCLASS_DATA m_lsdCA;
    TUI_LINK_SUBCLASS_DATA m_lsdAdvanced;
};

//
// CUnverifiedTrustUI class is used to invoke authenticode UI where the
// trust hierarchy for the signer has been NOT been successfully verified and
// the user has to make an override decision
//

class CUnverifiedTrustUI : public IACUIControl
{
public:

    //
    // Initialization
    //

    CUnverifiedTrustUI (CInvokeInfoHelper& riih, HRESULT& rhr);

    ~CUnverifiedTrustUI ();

    //
    // IACUIControl methods
    //

    virtual HRESULT InvokeUI (HWND hDisplay);

    virtual BOOL OnInitDialog (HWND hwnd, WPARAM wParam, LPARAM lParam);

    virtual BOOL OnYes (HWND hwnd);

    virtual BOOL OnNo (HWND hwnd);

    virtual BOOL OnMore (HWND hwnd);

private:

    //
    // Formatted strings for display
    //

    LPWSTR              m_pszNoAuthenticity;
    LPWSTR              m_pszProblemsBelow;
    LPWSTR              m_pszInstallAndRun3;

    //
    // links
    //

    TUI_LINK_SUBCLASS_DATA m_lsdPublisher;
    TUI_LINK_SUBCLASS_DATA m_lsdOpusInfo;
    TUI_LINK_SUBCLASS_DATA m_lsdCA;
    TUI_LINK_SUBCLASS_DATA m_lsdAdvanced;
};

//
// CNoSignatureUI class is used to invoke authenticode UI where the
// there is no signature for the subject and the user has to make an
// override decision
//

class CNoSignatureUI : public IACUIControl
{
public:

    //
    // Initialization
    //

    CNoSignatureUI (CInvokeInfoHelper& riih, HRESULT& rhr);

    ~CNoSignatureUI ();

    //
    // IACUIControl methods
    //

    virtual HRESULT InvokeUI (HWND hDisplay);

    virtual BOOL OnInitDialog (HWND hwnd, WPARAM wParam, LPARAM lParam);

    virtual BOOL OnYes (HWND hwnd);

    virtual BOOL OnNo (HWND hwnd);

    virtual BOOL OnMore (HWND hwnd);

private:

    //
    // Formatted strings for display
    //

    LPWSTR m_pszInstallAndRun2;
    LPWSTR m_pszNoPublisherFound;
};

//
// ACUIMessageProc, this dialog message procedure is used to dispatch
// dialog messages to the control
//

INT_PTR CALLBACK ACUIMessageProc (
                  HWND   hwnd,
                  UINT   uMsg,
                  WPARAM wParam,
                  LPARAM lParam
                  );

//
// Subclassing helper routines and definitions
//

VOID SubclassEditControlForArrowCursor (HWND hwndEdit);

LRESULT CALLBACK ACUISetArrowCursorSubclass (
                  HWND   hwnd,
                  UINT   uMsg,
                  WPARAM wParam,
                  LPARAM lParam
                  );

VOID SubclassEditControlForLink (
                 HWND                       hwndDlg,
                 HWND                       hwndEdit,
                 WNDPROC                    wndproc,
                 PTUI_LINK_SUBCLASS_DATA    plsd
                 );

LRESULT CALLBACK ACUILinkSubclass (
                  HWND   hwnd,
                  UINT   uMsg,
                  WPARAM wParam,
                  LPARAM lParam
                  );

//
// UI control resizing helper functions
//

VOID RebaseControlVertical (
                  HWND  hwndDlg,
                  HWND  hwnd,
                  HWND  hwndNext,
                  BOOL  fResizeForText,
                  int   deltavpos,
                  int   oline,
                  int   minsep,
                  int*  pdeltaheight
                  );

int CalculateControlVerticalDistanceFromDlgBottom (HWND hwnd, UINT Control);

int CalculateControlVerticalDistance (HWND hwnd, UINT Control1, UINT Control2);

VOID ACUICenterWindow (HWND hWndToCenter);

int GetEditControlMaxLineWidth (HWND hwndEdit, HDC hdc, int cline);

void DrawFocusRectangle (HWND hwnd, HDC hdc);

void AdjustEditControlWidthToLineCount(HWND hwnd, int cline, TEXTMETRIC* ptm);

//
// Miscellaneous definitions
//

#define MAX_LOADSTRING_BUFFER 1024

//
// Resource string formatting helper
//

HRESULT FormatACUIResourceString (
                  UINT   StringResourceId,
                  DWORD_PTR* aMessageArgument,
                  LPWSTR* ppszFormatted
                  );

//
// Rendering helper
//

int RenderACUIStringToEditControl (
                  HWND                      hwndDlg,
                  UINT                      ControlId,
                  UINT                      NextControlId,
                  LPCWSTR                   psz,
                  int                       deltavpos,
                  BOOL                      fLink,
                  WNDPROC                   wndproc,
                  PTUI_LINK_SUBCLASS_DATA   plsd,
                  int                       minsep,
                  LPCWSTR                   pszThisTextOnlyInLink
                  );

//
// HTML help viewing helper
//

VOID ACUIViewHTMLHelpTopic (HWND hwnd, LPSTR pszTopic);

//
// Hotkey helpers
//

int GetHotKeyCharPositionFromString (LPWSTR pwszText);

int GetHotKeyCharPosition (HWND hwnd);

VOID FormatHotKeyOnEditControl (HWND hwnd, int hkcharpos);

#endif
