/*
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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_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_NONE = 0,
        OLECMDTEXTF_NAME = 1,
        OLECMDTEXTF_STATUS = 2
    } OLECMDTEXTF;

    typedef enum
    {
        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;

    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")
