/*
 * Copyright 2005 Jacek Caban
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "ocidl.idl";
import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "docobj.idl";

cpp_quote("#define CONTEXT_MENU_DEFAULT     0")
cpp_quote("#define CONTEXT_MENU_IMAGE       1")
cpp_quote("#define CONTEXT_MENU_CONTROL     2")
cpp_quote("#define CONTEXT_MENU_TABLE       3")
cpp_quote("#define CONTEXT_MENU_TEXTSELECT  4")
cpp_quote("#define CONTEXT_MENU_ANCHOR      5")
cpp_quote("#define CONTEXT_MENU_UNKNOWN     6")
cpp_quote("#define CONTEXT_MENU_IMGDYNSRC   7")
cpp_quote("#define CONTEXT_MENU_IMGART      8")
cpp_quote("#define CONTEXT_MENU_DEBUG       9")
cpp_quote("#define CONTEXT_MENU_VSCROLL    10")
cpp_quote("#define CONTEXT_MENU_HSCROLL    11")

cpp_quote("#define MENUEXT_SHOWDIALOG 1")

cpp_quote("#define DOCHOSTUIFLAG_BROWSER (DOCHOSTUIFLAG_DISABLE_HELP_MENU|DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE)")

cpp_quote("#define HTMLDLG_NOUI            0x0010")
cpp_quote("#define HTMLDLG_MODAL           0x0020")
cpp_quote("#define HTMLDLG_MODELESS        0x0040")
cpp_quote("#define HTMLDLG_PRINT_TEMPLATE  0x0080")
cpp_quote("#define HTMLDLG_VERIFY          0x0100")

cpp_quote("#define PRINT_DONTBOTHERUSER     0x0001")
cpp_quote("#define PRINT_WAITFORCOMPLETION  0x0002")

cpp_quote("DEFINE_GUID(CGID_MSHTML, 0xde4ba900,0x59ca,0x11cf,0x95,0x92,0x44,0x45,0x53,0x54,0x00,0x00);")
cpp_quote("#define CMDSETID_Forms3 CGID_MSHTML")

cpp_quote("#if defined(__GNUC__)")
cpp_quote("#define SZ_HTML_CLIENTSITE_OBJECTPARAM (const WCHAR[]) {'{','d','4','d','b','6','8','5','0','-','5','3','8','5','-','1','1','d','0','-','8','9','e','9','-','0','0','a','0','c','9','0','a','9','0','a','c','}',0}")
cpp_quote("#elif defined(_MSC_VER)")
cpp_quote("#define SZ_HTML_CLIENTSITE_OBJECTPARAM L\"{d4db6850-5385-11d0-89e9-00a0c90a90ac}\"")
cpp_quote("#else")
cpp_quote("static const WCHAR SZ_HTML_CLIENTSITE_OBJECTPARAM[] = {'{','d','4','d','b','6','8','5','0','-','5','3','8','5','-','1','1','d','0','-','8','9','e','9','-','0','0','a','0','c','9','0','a','9','0','a','c','}',0};")
cpp_quote("#endif")

cpp_quote("#ifndef __IHTMLWindow2_FWD_DEFINED__")
cpp_quote("#define __IHTMLWindow2_FWD_DEFINED__")
cpp_quote("typedef interface IHTMLWindow2 IHTMLWindow2;")
cpp_quote("#endif")

/*****************************************************************************
 *    IHostDialogHelper interface
 */
[
    object,
    uuid(53DEC138-A51E-11d2-861E-00C04FA35C89),
    pointer_default(unique),
    local
]
interface IHostDialogHelper : IUnknown
{
    HRESULT ShowHTMLDialog(
        HWND hwndParent,
        IMoniker *pMk,
        VARIANT *pvarArgIn,
        WCHAR *pchOptions,
        VARIANT *pvarArgOut,
        IUnknown *punkHost);
}

/*****************************************************************************
 *    HostDialogHelper coclass
 */
[
    uuid(429AF92C-A51F-11d2-861E-00C04FA35C89)
]
coclass HostDialogHelper
{
    [default] interface IHostDialogHelper;
}

/*****************************************************************************
 *    IDocHostUIHandler interface
 */

typedef enum tagDOCHOSTUITYPE {
    DOCHOSTUITYPE_BROWSE = 0,
    DOCHOSTUITYPE_AUTHOR = 1
} DOCHOSTUITYPE;

typedef enum tagDOCHOSTUIDBLCLK
{
    DOCHOSTUIDBLCLK_DEFAULT         = 0,
    DOCHOSTUIDBLCLK_SHOWPROPERTIES  = 1,
    DOCHOSTUIDBLCLK_SHOWCODE        = 2
} DOCHOSTUIDBLCLK;

typedef enum tagDOCHOSTUIFLAG
{
    DOCHOSTUIFLAG_DIALOG                         = 0x00000001,
    DOCHOSTUIFLAG_DISABLE_HELP_MENU              = 0x00000002,
    DOCHOSTUIFLAG_NO3DBORDER                     = 0x00000004,
    DOCHOSTUIFLAG_SCROLL_NO                      = 0x00000008,
    DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE        = 0x00000010,
    DOCHOSTUIFLAG_OPENNEWWIN                     = 0x00000020,
    DOCHOSTUIFLAG_DISABLE_OFFSCREEN              = 0x00000040,
    DOCHOSTUIFLAG_FLAT_SCROLLBAR                 = 0x00000080,
    DOCHOSTUIFLAG_DIV_BLOCKDEFAULT               = 0x00000100,
    DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY        = 0x00000200,
    DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY        = 0x00000400,
    DOCHOSTUIFLAG_CODEPAGELINKEDFONTS            = 0x00000800,
    DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8      = 0x00001000,
    DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8       = 0x00002000,
    DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE      = 0x00004000,
    DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION      = 0x00010000,
    DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION        = 0x00020000,
    DOCHOSTUIFLAG_THEME                          = 0x00040000,
    DOCHOSTUIFLAG_NOTHEME                        = 0x00080000,
    DOCHOSTUIFLAG_NOPICS                         = 0x00100000,
    DOCHOSTUIFLAG_NO3DOUTERBORDER                = 0x00200000,
    DOCHOSTUIFLAG_DISABLE_EDIT_NS_FIXUP          = 0x00400000,
    DOCHOSTUIFLAG_LOCAL_MACHINE_ACCESS_CHECK     = 0x00800000,
    DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL      = 0x01000000,
    DOCHOSTUIFLAG_HOST_NAVIGATES                 = 0x02000000,
    DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION   = 0x04000000,
    DOCHOSTUIFLAG_USE_WINDOWLESS_SELECTCONTROL   = 0x08000000,
    DOCHOSTUIFLAG_USE_WINDOWED_SELECTCONTROL     = 0x10000000,
    DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE = 0x20000000,
    DOCHOSTUIFLAG_DPI_AWARE                      = 0x40000000
} DOCHOSTUIFLAG;

[
    object,
    uuid(BD3F23C0-D43E-11CF-893B-00AA00BDCE1A),
    pointer_default(unique),
    local
]
interface IDocHostUIHandler : IUnknown
{
    typedef struct _DOCHOSTUIINFO
    {
        ULONG cbSize;
        DWORD dwFlags;
        DWORD dwDoubleClick;
        OLECHAR *pchHostCss;
        OLECHAR *pchHostNS;
    } DOCHOSTUIINFO;

    HRESULT ShowContextMenu(
        [in] DWORD dwID, 
        [in] POINT *ppt, 
        [in] IUnknown *pcmdtReserved,  
        [in] IDispatch *pdispReserved);

    HRESULT GetHostInfo([in, out] DOCHOSTUIINFO *pInfo);

    HRESULT ShowUI(
        [in] DWORD dwID,
        [in] IOleInPlaceActiveObject *pActiveObject,
        [in] IOleCommandTarget *pCommandTarget,
        [in] IOleInPlaceFrame *pFrame,
        [in] IOleInPlaceUIWindow *pDoc);

    HRESULT HideUI();

    HRESULT UpdateUI();

    HRESULT EnableModeless([in] BOOL fEnable);

    HRESULT OnDocWindowActivate([in] BOOL fActivate);

    HRESULT OnFrameWindowActivate([in] BOOL fActivate);

    HRESULT ResizeBorder(
        [in] LPCRECT prcBorder,
        [in] IOleInPlaceUIWindow *pUIWindow,
        [in] BOOL fRameWindow);

    HRESULT TranslateAccelerator(
        [in] LPMSG lpMsg,
        [in] const GUID *pguidCmdGroup, 
        [in] DWORD nCmdID);

    HRESULT GetOptionKeyPath(
        [out] LPOLESTR *pchKey,
        [in] DWORD dw);

    HRESULT GetDropTarget(
        [in] IDropTarget *pDropTarget, 
        [out] IDropTarget **ppDropTarget);

    HRESULT GetExternal([out] IDispatch **ppDispatch);

    HRESULT TranslateUrl(
        [in] DWORD dwTranslate,
        [in] OLECHAR *pchURLIn,
        [out] OLECHAR **ppchURLOut);

    HRESULT FilterDataObject(
        [in] IDataObject *pDO,
        [out] IDataObject **ppDORet);
}

cpp_quote("DEFINE_GUID(CGID_DocHostCommandHandler,0xf38bc242,0xb950,0x11d1,0x89,0x18,0x00,0xc0,0x4f,0xc2,0xc8,0x36);")

[
    object,
    uuid(3050F6D0-98b5-11CF-BB82-00AA00BDCE0B),
    pointer_default(unique),
    local
]
interface IDocHostUIHandler2 : IDocHostUIHandler
{
    HRESULT GetOverrideKeyPath(
        [out] LPOLESTR *pchKey,
        [in] DWORD dw);
}

/*****************************************************************************
 *    ICustomDoc interface
 */
[
    object,
    uuid(3050f3f0-98b5-11cf-bb82-00aa00bdce0b),
    pointer_default(unique),
    local
]
interface ICustomDoc : IUnknown
{
    HRESULT SetUIHandler([in] IDocHostUIHandler *pUIHandler);
}

/*****************************************************************************
 *    IDocHostShowUI interface
 */
[
    object,
    uuid(c4d244b0-d43e-11cf-893b-00aa00bdce1a),
    pointer_default(unique),
    local
]
interface IDocHostShowUI : IUnknown
{
    HRESULT ShowMessage(
        [in] HWND hwnd,
        [in] LPOLESTR lpstrText,
        [in] LPOLESTR lpstrCaption,
        [in] DWORD dwType,
        [in] LPOLESTR lpstrHelpFile,
        [in] DWORD dwHelpContext,
        [out] LRESULT *plResult);

    HRESULT ShowHelp(
        [in] HWND hwnd,
        [in] LPOLESTR pszHelpFile,
        [in] UINT uCommand,
        [in] DWORD dwData,
        [in] POINT ptMouse,
        [out] IDispatch *pDispatchObjectHit);
}

/*****************************************************************************
 *    IClassFactoryEx interface
 */

cpp_quote("#define IClassFactory3 IClassFactoryEx")
cpp_quote("#define IID_IClassFactory3 IID_IClassFactoryEx")

[
    object,
    uuid(342D1EA0-AE25-11D1-89C5-006008C3FBFC),
    pointer_default(unique),
    local
]
interface IClassFactoryEx : IClassFactory
{
    HRESULT CreateInstanceWithContext(
        IUnknown *punkContext,
        IUnknown *punkOuter,
        REFIID riid,
        [out] void **ppv);
}

cpp_quote("typedef HRESULT WINAPI SHOWHTMLDIALOGFN(HWND,IMoniker*,VARIANT*,WCHAR*,VARIANT*);")
cpp_quote("typedef HRESULT WINAPI SHOWHTMLDIALOGEXFN(HWND,IMoniker*,DWORD,VARIANT*,WCHAR*,VARIANT*);")
cpp_quote("typedef HRESULT WINAPI SHOWMODELESSHTMLDIALOGFN(HWND,IMoniker*,VARIANT*,VARIANT*,IHTMLWindow2**);")

cpp_quote("EXTERN_C HRESULT WINAPI ShowHTMLDialog(HWND,IMoniker*,VARIANT*,WCHAR*,VARIANT*);")
cpp_quote("EXTERN_C HRESULT WINAPI ShowHTMLDialogEx(HWND,IMoniker*,DWORD,VARIANT*,WCHAR*,VARIANT*);")
cpp_quote("EXTERN_C HRESULT WINAPI ShowModelessHTMLDialog(HWND,IMoniker*,VARIANT*,VARIANT*,IHTMLWindow2**);")
cpp_quote("EXTERN_C HRESULT WINAPI RunHTMLApplication(HINSTANCE,HINSTANCE,LPSTR,int);")
cpp_quote("EXTERN_C HRESULT WINAPI CreateHTMLPropertyPage(IMoniker*,IPropertyPage**);")
