/*
 * Copyright (C) 1999 Paul Quinn
 * Copyright (C) 2003 Alexandre Julliard
 *
 * 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 "servprov.idl";


interface IOleDocumentView;
interface IEnumOleDocumentViews;


/*****************************************************************************
 * IOleDocument interface
 */
[
    object,
    uuid(b722bcc5-4e68-101b-a2bc-00aa00404770),
    pointer_default(unique)
]
interface IOleDocument : IUnknown
{
    typedef [unique] IOleDocument *LPOLEDOCUMENT;

    typedef enum
    {
        DOCMISC_CANCREATEMULTIPLEVIEWS = 1,
        DOCMISC_SUPPORTCOMPLEXRECTANGLES = 2,
        DOCMISC_CANTOPENEDIT = 4,
        DOCMISC_NOFILESUPPORT = 8
    } DOCMISC;

    HRESULT CreateView(
        [in, unique] IOleInPlaceSite *pIPSite,
        [in, unique] IStream *pstm,
        [in] DWORD dwReserved,
        [out] IOleDocumentView **ppView);

    HRESULT GetDocMiscStatus(
        [out] DWORD *pdwStatus);

    HRESULT EnumViews(
        [out] IEnumOleDocumentViews **ppEnum,
        [out] IOleDocumentView **ppView);
}


/*****************************************************************************
 * IOleDocumentSite interface
 */
[
    object,
    uuid(b722bcc7-4e68-101b-a2bc-00aa00404770),
    pointer_default(unique)
]
interface IOleDocumentSite : IUnknown
{
    typedef [unique] IOleDocumentSite *LPOLEDOCUMENTSITE;

    HRESULT ActivateMe( [in] IOleDocumentView *pViewToActivate );
}


/*****************************************************************************
 * IOleDocumentView interface
 */
[
    object,
    uuid(b722bcc6-4e68-101b-a2bc-00aa00404770),
    pointer_default(unique)
]
interface IOleDocumentView : IUnknown
{
    typedef [unique] IOleDocumentView *LPOLEDOCUMENTVIEW;

    HRESULT SetInPlaceSite( [in, unique] IOleInPlaceSite *pIPSite );

    HRESULT GetInPlaceSite( [out] IOleInPlaceSite **ppIPSite );

    HRESULT GetDocument( [out] IUnknown **ppunk );

    HRESULT SetRect( [in] LPRECT prcView );

    HRESULT GetRect( [out] LPRECT prcView );

    HRESULT SetRectComplex(
        [in, unique] LPRECT prcView,
        [in, unique] LPRECT prcHScroll,
        [in, unique] LPRECT prcVScroll,
        [in, unique] LPRECT prcSizeBox);

    HRESULT Show( [in] BOOL fShow );

    HRESULT UIActivate( [in] BOOL fUIActivate );

    HRESULT Open();

    HRESULT CloseView( [in] DWORD dwReserved );

    HRESULT SaveViewState( [in] LPSTREAM pstm );

    HRESULT ApplyViewState( [in] LPSTREAM pstm );

    HRESULT Clone(
        [in] IOleInPlaceSite *pIPSiteNew,
        [out] IOleDocumentView **ppViewNew);
}


/*****************************************************************************
 * IEnumOleDocumentViews interface
 */
[
    object,
    uuid(b722bcc8-4e68-101b-a2bc-00aa00404770),
    pointer_default(unique)
]
interface IEnumOleDocumentViews : IUnknown
{
    typedef [unique] IEnumOleDocumentViews *LPENUMOLEDOCUMENTVIEWS;

    [local]
    HRESULT Next(
        [in] ULONG cViews,
        [out] IOleDocumentView **rgpView,
        [out] ULONG *pcFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cViews,
        [out, size_is(cViews), length_is(*pcFetched)] IOleDocumentView **rgpView,
        [out] ULONG *pcFetched);

    HRESULT Skip( [in] ULONG cViews );

    HRESULT Reset();

    HRESULT Clone( [out] IEnumOleDocumentViews **ppEnum );
}


/*****************************************************************************
 * IOleCommandTarget interface
 */
[
    object,
    uuid(b722bccb-4e68-101b-a2bc-00aa00404770),
    pointer_default(unique)
]
interface IOleCommandTarget : IUnknown
{
    typedef [unique] IOleCommandTarget *LPOLECOMMANDTARGET;

    typedef enum OLECMDF
    {
        OLECMDF_SUPPORTED = 0x1,
        OLECMDF_ENABLED = 0x2,
        OLECMDF_LATCHED = 0x4,
        OLECMDF_NINCHED = 0x8,
        OLECMDF_INVISIBLE = 0x10,
        OLECMDF_DEFHIDEONCTXTMENU = 0x20
    } OLECMDF;

    typedef struct _tagOLECMD
    {
        ULONG cmdID;
        DWORD cmdf;
    } OLECMD;

    typedef struct _tagOLECMDTEXT
    {
        DWORD cmdtextf;
        ULONG cwActual;
        ULONG cwBuf;
        [size_is(cwBuf)] WCHAR rgwz[];
    } OLECMDTEXT;

    typedef enum OLECMDTEXTF
    {
        OLECMDTEXTF_NONE = 0,
        OLECMDTEXTF_NAME = 1,
        OLECMDTEXTF_STATUS = 2
    } OLECMDTEXTF;

    typedef enum OLECMDEXECOPT
    {
        OLECMDEXECOPT_DODEFAULT = 0,
        OLECMDEXECOPT_PROMPTUSER = 1,
        OLECMDEXECOPT_DONTPROMPTUSER = 2,
        OLECMDEXECOPT_SHOWHELP = 3
    } OLECMDEXECOPT;

    typedef enum OLECMDID
    {
        OLECMDID_OPEN = 1,
        OLECMDID_NEW = 2,
        OLECMDID_SAVE = 3,
        OLECMDID_SAVEAS = 4,
        OLECMDID_SAVECOPYAS = 5,
        OLECMDID_PRINT = 6,
        OLECMDID_PRINTPREVIEW = 7,
        OLECMDID_PAGESETUP = 8,
        OLECMDID_SPELL = 9,
        OLECMDID_PROPERTIES = 10,
        OLECMDID_CUT = 11,
        OLECMDID_COPY = 12,
        OLECMDID_PASTE = 13,
        OLECMDID_PASTESPECIAL = 14,
        OLECMDID_UNDO = 15,
        OLECMDID_REDO = 16,
        OLECMDID_SELECTALL = 17,
        OLECMDID_CLEARSELECTION = 18,
        OLECMDID_ZOOM = 19,
        OLECMDID_GETZOOMRANGE = 20,
        OLECMDID_UPDATECOMMANDS = 21,
        OLECMDID_REFRESH = 22,
        OLECMDID_STOP = 23,
        OLECMDID_HIDETOOLBARS = 24,
        OLECMDID_SETPROGRESSMAX = 25,
        OLECMDID_SETPROGRESSPOS = 26,
        OLECMDID_SETPROGRESSTEXT = 27,
        OLECMDID_SETTITLE = 28,
        OLECMDID_SETDOWNLOADSTATE = 29,
        OLECMDID_STOPDOWNLOAD = 30,
        OLECMDID_ONTOOLBARACTIVATED = 31,
        OLECMDID_FIND = 32,
        OLECMDID_DELETE = 33,
        OLECMDID_HTTPEQUIV = 34,
        OLECMDID_HTTPEQUIV_DONE = 35,
        OLECMDID_ENABLE_INTERACTION = 36,
        OLECMDID_ONUNLOAD = 37,
        OLECMDID_PROPERTYBAG2 = 38,
        OLECMDID_PREREFRESH = 39,
        /* iexplorer uses ... 44 */
        OLECMDID_SHOWSCRIPTERROR = 40,
        OLECMDID_SHOWMESSAGE = 41,
        OLECMDID_SHOWFIND = 42,
        OLECMDID_SHOWPAGESETUP = 43,
        OLECMDID_SHOWPRINT = 44,
        OLECMDID_CLOSE = 45,
        OLECMDID_ALLOWUILESSSAVEAS = 46,
        OLECMDID_DONTDOWNLOADCSS = 47,
        OLECMDID_UPDATEPAGESTATUS = 48,
        OLECMDID_PRINT2 = 49,
        OLECMDID_PRINTPREVIEW2 = 50,
        OLECMDID_SETPRINTTEMPLATE = 51,
        OLECMDID_GETPRINTTEMPLATE = 52,
        OLECMDID_PAGEACTIONBLOCKED = 55,
        OLECMDID_PAGEACTIONUIQUERY = 56,
        OLECMDID_FOCUSVIEWCONTROLS = 57,
        OLECMDID_FOCUSVIEWCONTROLSQUERY = 58,
        OLECMDID_SHOWPAGEACTIONMENU = 59,
        OLECMDID_ADDTRAVELENTRY = 60,
        OLECMDID_UPDATETRAVELENTRY = 61,
        OLECMDID_UPDATEBACKFORWARDSTATE = 62,
        OLECMDID_OPTICAL_ZOOM = 63,
        OLECMDID_OPTICAL_GETZOOMRANGE = 64,
        OLECMDID_WINDOWSTATECHANGED = 65,
        OLECMDID_ACTIVEXINSTALLSCOPE = 66,
        OLECMDID_UPDATETRAVELENTRY_DATARECOVERY = 67
    } OLECMDID;

    HRESULT QueryStatus(
        [in, unique] const GUID *pguidCmdGroup,
        [in] ULONG cCmds,
        [in, out, size_is(cCmds)] OLECMD prgCmds[],
        [in, out, unique] OLECMDTEXT *pCmdText);

    HRESULT Exec(
        [in, unique] const GUID *pguidCmdGroup,
        [in] DWORD nCmdID,
        [in] DWORD nCmdexecopt,
        [in, unique] VARIANT *pvaIn,
        [in, out, unique] VARIANT *pvaOut);
}


/*****************************************************************************
 * IContinueCallback interface
 */
[
   object,
   uuid(b722bcca-4e68-101b-a2bc-00aa00404770),
   pointer_default(unique)
]
interface IContinueCallback : IUnknown
{
    typedef [unique] IContinueCallback *LPCONTINUECALLBACK;

    HRESULT FContinue();

    HRESULT FContinuePrinting(
        [in] LONG nCntPrinted,
        [in] LONG nCurPage,
        [in, unique] WCHAR *pwszPrintStatus);
}


/*****************************************************************************
 * IPrint interface
 */
[
   object,
   uuid(b722bcc9-4e68-101b-a2bc-00aa00404770),
   pointer_default(unique)
]
interface IPrint : IUnknown
{
    typedef [unique] IPrint *LPPRINT;

    typedef enum
    {
        PRINTFLAG_MAYBOTHERUSER = 1,
        PRINTFLAG_PROMPTUSER  = 2,
        PRINTFLAG_USERMAYCHANGEPRINTER  = 4,
        PRINTFLAG_RECOMPOSETODEVICE = 8,
        PRINTFLAG_DONTACTUALLYPRINT = 16,
        PRINTFLAG_FORCEPROPERTIES = 32,
        PRINTFLAG_PRINTTOFILE = 64
    } PRINTFLAG;

    typedef struct tagPAGERANGE
    {
        LONG nFromPage;
        LONG nToPage;
    } PAGERANGE;

    typedef struct tagPAGESET
    {
        ULONG cbStruct;
        BOOL fOddPages;
        BOOL fEvenPages;
        ULONG cPageRange;
        [size_is(cPageRange)] PAGERANGE rgPages[];
    } PAGESET;

    HRESULT SetInitialPageNum(
        [in] LONG nFirstPage);

    HRESULT GetPageInfo(
        [out] LONG *pnFirstPage,
        [out] LONG *pcPages);

    [local]
    HRESULT Print(
        [in] DWORD grfFlags,
        [in, out] DVTARGETDEVICE **pptd,
        [in, out] PAGESET **ppPageSet,
        [in, out, unique] STGMEDIUM *pstgmOptions,
        [in] IContinueCallback *pcallback,
        [in]  LONG nFirstPage,
        [out] LONG *pcPagesPrinted,
        [out] LONG *pnLastPage);

    [call_as(Print)]
    HRESULT RemotePrint(
        [in] DWORD grfFlags,
        [in, out] DVTARGETDEVICE **pptd,
        [in, out] PAGESET **pppageset,
        [in, out, unique] RemSTGMEDIUM *pstgmOptions,
        [in] IContinueCallback *pcallback,
        [in]  LONG nFirstPage,
        [out] LONG *pcPagesPrinted,
        [out] LONG *pnLastPage);
}


cpp_quote("#define OLECMDERR_E_FIRST            (OLE_E_LAST+1)")
cpp_quote("#define OLECMDERR_E_NOTSUPPORTED     (OLECMDERR_E_FIRST)")
cpp_quote("#define OLECMDERR_E_DISABLED         (OLECMDERR_E_FIRST+1)")
cpp_quote("#define OLECMDERR_E_NOHELP           (OLECMDERR_E_FIRST+2)")
cpp_quote("#define OLECMDERR_E_CANCELED         (OLECMDERR_E_FIRST+3)")
cpp_quote("#define OLECMDERR_E_UNKNOWNGROUP     (OLECMDERR_E_FIRST+4)")

cpp_quote("#define MSOCMDERR_E_FIRST OLECMDERR_E_FIRST")
cpp_quote("#define MSOCMDERR_E_NOTSUPPORTED OLECMDERR_E_NOTSUPPORTED")
cpp_quote("#define MSOCMDERR_E_DISABLED OLECMDERR_E_DISABLED")
cpp_quote("#define MSOCMDERR_E_NOHELP OLECMDERR_E_NOHELP")
cpp_quote("#define MSOCMDERR_E_CANCELED OLECMDERR_E_CANCELED")
cpp_quote("#define MSOCMDERR_E_UNKNOWNGROUP OLECMDERR_E_UNKNOWNGROUP")

cpp_quote("#define LPMSODOCUMENT                  LPOLEDOCUMENT")
cpp_quote("#define LPMSODOCUMENTSITE              LPOLEDOCUMENTSITE")
cpp_quote("#define LPMSOVIEW                      LPOLEDOCUMENTVIEW")
cpp_quote("#define LPENUMMSOVIEW                  LPENUMOLEDOCUMENTVIEWS")
cpp_quote("#define LPMSOCOMMANDTARGET             LPOLECOMMANDTARGET")
cpp_quote("#define IID_IMsoDocument               IID_IOleDocument")
cpp_quote("#define IID_IMsoDocumentSite           IID_IOleDocumentSite")
cpp_quote("#define IID_IMsoView                   IID_IOleDocumentView")
cpp_quote("#define IID_IEnumMsoView               IID_IEnumOleDocumentViews")
cpp_quote("#define IID_IMsoCommandTarget          IID_IOleCommandTarget")

cpp_quote("EXTERN_C const GUID SID_SContainerDispatch;")