/*
 * Copyright (C) 1999 Paul Quinn
 * Copyright (C) 1999 Francis Beaudet
 * 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 "oleidl.idl";
import "oaidl.idl";
import "servprov.idl";
import "urlmon.idl";


/*****************************************************************************
 * IOleControlTypes interface
 */
[
    pointer_default(unique)
]
interface IOleControlTypes
{
    typedef [v1_enum] enum tagUASFLAGS
    {
        UAS_NORMAL       = 0x0,
        UAS_BLOCKED      = 0x1,
        UAS_NOPARENTABLE = 0x2,
        UAS_MASK         = 0x3
    } UASFLAGS;

    typedef enum tagREADYSTATE
    {
        READYSTATE_UNINITIALIZED  = 0,
        READYSTATE_LOADING  = 1,
        READYSTATE_LOADED = 2,
        READYSTATE_INTERACTIVE  = 3,
        READYSTATE_COMPLETE = 4
    } READYSTATE;

    typedef struct tagVARIANT_BLOB
    {
        DWORD clSize;
        DWORD rpcReserved;
        [size_is(clSize-1)] ULONGLONG ahData[];
    } wireVARIANT_BLOB;

    typedef struct tagUserVARIANT
    {
      wireVARIANT_BLOB pVarBlob;
    } UserVARIANT;
}


/*****************************************************************************
 * IFont interface
 */
[
    object,
    uuid(bef6e002-a874-101a-8bba-00aa00300cab),
    pointer_default(unique)
]
interface IFont : IUnknown
{
    typedef IFont *LPFONT;
    typedef TEXTMETRICW TEXTMETRICOLE, *LPTEXTMETRICOLE;

    [propget] HRESULT Name( [out] BSTR *pname);
    [propput] HRESULT Name( [in] BSTR name );
    [propget] HRESULT Size( [out] CY *psize );
    [propput] HRESULT Size( [in] CY size );
    [propget] HRESULT Bold( [out] BOOL *pbold );
    [propput] HRESULT Bold( [in] BOOL bold );
    [propget] HRESULT Italic( [out] BOOL *pitalic );
    [propput] HRESULT Italic( [in] BOOL italic );
    [propget] HRESULT Underline( [out] BOOL *punderline );
    [propput] HRESULT Underline( [in] BOOL underline );
    [propget] HRESULT Strikethrough( [out] BOOL *pstrikethrough );
    [propput] HRESULT Strikethrough( [in] BOOL strikethrough );
    [propget] HRESULT Weight( [out] SHORT *pweight );
    [propput] HRESULT Weight( [in] SHORT weight );
    [propget] HRESULT Charset( [out] SHORT *pcharset );
    [propput] HRESULT Charset( [in] SHORT charset );
    [propget] HRESULT hFont( [out] HFONT *phfont );
    HRESULT Clone( [out] IFont **ppfont );
    HRESULT IsEqual( [in] IFont *pFontOther );
    HRESULT SetRatio( [in] LONG cyLogical, [in] LONG cyHimetric );
    HRESULT QueryTextMetrics( [out] TEXTMETRICOLE * ptm );
    HRESULT AddRefHfont( [in] HFONT hfont );
    HRESULT ReleaseHfont( [in] HFONT hfont );
    HRESULT SetHdc( [in] HDC hdc );
}


/*****************************************************************************
 * IFontDisp interface
 */
[
    object,
    uuid(bef6e003-a874-101a-8bba-00aa00300cab),
    pointer_default(unique)
]
interface IFontDisp : IDispatch
{
    typedef IFontDisp *LPFONTDISP;
}


/*****************************************************************************
 * IFontEventsDisp interface
 */
[
    object,
    uuid(4ef6100a-af88-11d0-9846-00c04fc29993),
    pointer_default(unique)
]
interface IFontEventsDisp : IDispatch
{
    typedef IFontEventsDisp *LPFONTEVENTS;
}


/*****************************************************************************
 * IPicture interface
 */
[
    object,
    uuid(7bf80980-bf32-101a-8bbb-00aa00300cab),
    pointer_default(unique)
]
interface IPicture : IUnknown
{
    typedef IPicture *LPPICTURE;

    typedef enum tagPicture
    {
        PICTURE_SCALABLE = 0x1,
        PICTURE_TRANSPARENT = 0x2
    } PICTUREATTRIBUTES;

    typedef UINT OLE_HANDLE;
    typedef LONG OLE_XPOS_HIMETRIC;
    typedef LONG OLE_YPOS_HIMETRIC;
    typedef LONG OLE_XSIZE_HIMETRIC;
    typedef LONG OLE_YSIZE_HIMETRIC;

    [propget] HRESULT Handle( [out] OLE_HANDLE *pHandle );
    [propget] HRESULT hPal( [out] OLE_HANDLE *phPal );
    [propget] HRESULT Type( [out] SHORT *pType );
    [propget] HRESULT Width( [out] OLE_XSIZE_HIMETRIC *pWidth );
    [propget] HRESULT Height( [out] OLE_YSIZE_HIMETRIC *pHeight );

    HRESULT Render(
        [in] HDC hdc,
        [in] LONG x,
        [in] LONG y,
        [in] LONG cx,
        [in] LONG cy,
        [in] OLE_XPOS_HIMETRIC xSrc,
        [in] OLE_YPOS_HIMETRIC ySrc,
        [in] OLE_XSIZE_HIMETRIC cxSrc,
        [in] OLE_YSIZE_HIMETRIC cySrc,
        [in] LPCRECT pRcWBounds);

    HRESULT set_hPal( [in] OLE_HANDLE hPal );

    [propget] HRESULT CurDC( [out] HDC *phDC );

    HRESULT SelectPicture(
        [in] HDC hDCIn,
        [out] HDC * phDCOut,
        [out] OLE_HANDLE * phBmpOut);

    [propget] HRESULT KeepOriginalFormat( [out] BOOL *pKeep );

    [propput] HRESULT KeepOriginalFormat( [in] BOOL keep );

    HRESULT PictureChanged();

    HRESULT SaveAsFile(
        [in] LPSTREAM pStream,
        [in] BOOL fSaveMemCopy,
        [out] LONG *pCbSize);

    [propget] HRESULT Attributes( [out] DWORD *pDwAttr );
}


/*****************************************************************************
 * IPictureDisp interface
 */
[
    object,
    uuid(7bf80981-bf32-101a-8bbb-00aa00300cab),
    pointer_default(unique)
]
interface IPictureDisp : IDispatch
{
    typedef IPictureDisp *LPPICTUREDISP;
}


/*****************************************************************************
 * IOleControl interface
 */
[
    object,
    uuid(b196b288-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]

interface IOleControl : IUnknown
{
    typedef IOleControl *LPOLECONTROL;

    typedef struct tagCONTROLINFO
    {
        ULONG cb;
        HACCEL hAccel;
        USHORT cAccel;
        DWORD dwFlags;
    } CONTROLINFO, *LPCONTROLINFO;

    typedef enum tagCTRLINFO
    {
        CTRLINFO_EATS_RETURN = 1,
        CTRLINFO_EATS_ESCAPE = 2
    } CTRLINFO;

    HRESULT GetControlInfo( [out] CONTROLINFO *pCI );
    HRESULT OnMnemonic( [in] MSG *pMsg );
    HRESULT OnAmbientPropertyChange( [in] DISPID dispID );
    HRESULT FreezeEvents( [in] BOOL bFreeze );
}


/*****************************************************************************
 * IOleControlSite interface
 */
[
    object,
    uuid(b196b289-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IOleControlSite : IUnknown
{
    typedef IOleControlSite *LPOLECONTROLSITE;

    typedef struct tagPOINTF
    {
        FLOAT x;
        FLOAT y;
    } POINTF, *LPPOINTF;

    typedef enum tagXFORMCOORDS
    {
	XFORMCOORDS_POSITION = 0x1,
	XFORMCOORDS_SIZE = 0x2,
	XFORMCOORDS_HIMETRICTOCONTAINER = 0x4,
	XFORMCOORDS_CONTAINERTOHIMETRIC = 0x8,
        XFORMCOORDS_EVENTCOMPAT = 0x10
    } XFORMCOORDS;

    HRESULT OnControlInfoChanged();

    HRESULT LockInPlaceActive( [in] BOOL fLock );

    HRESULT GetExtendedControl( [out] IDispatch ** ppDisp );

    HRESULT TransformCoords(
        [in, out] POINTL *pPtlHimetric,
        [in, out] POINTF *pPtfContainer,
        [in] DWORD dwFlags);

    HRESULT TranslateAccelerator( [in] MSG *pMsg, [in] DWORD grfModifiers );

    HRESULT OnFocus( [in] BOOL fGotFocus );

    HRESULT ShowPropertyFrame();
}


/*****************************************************************************
 * IOleInPlaceSiteEx interface
 */
[
    object,
    uuid(9c2cad80-3424-11cf-b670-00aa004cd6d8),
    pointer_default(unique)
]
interface IOleInPlaceSiteEx : IOleInPlaceSite
{
    typedef IOleInPlaceSiteEx *LPOLEINPLACESITEEX;

    typedef enum tagACTIVATEFLAGS
    {
        ACTIVATE_WINDOWLESS = 1
    } ACTIVATE_FLAGS;

    HRESULT OnInPlaceActivateEx( [out] BOOL * pfNoRedraw, [in] DWORD dwFlags );
    HRESULT OnInPlaceDeactivateEx( [in] BOOL fNoRedraw );
    HRESULT RequestUIActivate();
}


/*****************************************************************************
 * IOleInPlaceSiteWindowless interface
 */
[
    local,
    object,
    uuid(922eada0-3424-11cf-b670-00aa004cd6d8),
    pointer_default(unique)
]
interface IOleInPlaceSiteWindowless : IOleInPlaceSiteEx
{
    typedef IOleInPlaceSiteWindowless *LPOLEINPLACESITEWINDOWLESS;

    typedef enum tagOLEDCFLAGS
    {
        OLEDC_NODRAW = 0x1,
        OLEDC_PAINTBKGND = 0x2,
        OLEDC_OFFSCREEN = 0x4
    } OLEDCFLAGS;

    HRESULT CanWindowlessActivate();

    HRESULT GetCapture();

    HRESULT SetCapture( [in] BOOL fCapture );

    HRESULT GetFocus();

    HRESULT SetFocus( [in] BOOL fFocus );

    HRESULT GetDC(
        [in] LPCRECT pRect,
        [in] DWORD grfFlags,
        [out] HDC *phDC);

    HRESULT ReleaseDC( [in] HDC hDC );

    HRESULT InvalidateRect(
        [in] LPCRECT pRect,
        [in] BOOL fErase);

    HRESULT InvalidateRgn(
        [in] HRGN hRGN,
        [in] BOOL fErase);

    HRESULT ScrollRect(
        [in] INT dx,
        [in] INT dy,
        [in] LPCRECT pRectScroll,
        [in] LPCRECT pRectClip);

    HRESULT AdjustRect( [in, out] LPRECT prc );

    HRESULT OnDefWindowMessage(
        [in] UINT msg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] LRESULT *plResult);
}


/*****************************************************************************
 * IOleInPlaceObjectWindowless interface
 */
[
    local,
    object,
    uuid(1c2056cc-5ef4-101b-8bc8-00aa003e3b29),
    pointer_default(unique)
]
interface IOleInPlaceObjectWindowless : IOleInPlaceObject
{
    typedef IOleInPlaceObjectWindowless *LPOLEINPLACEOBJECTWINDOWLESS;

    HRESULT OnWindowMessage(
        [in] UINT msg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] LRESULT *plResult);

    HRESULT GetDropTarget( [out] IDropTarget **ppDropTarget );
}


/*****************************************************************************
 * IClassFactory2 interface
 */
[
    object,
    uuid(b196b28f-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IClassFactory2 : IClassFactory
{
    typedef IClassFactory2 *LPCLASSFACTORY2;

    typedef struct tagLICINFO
    {
        LONG cbLicInfo;
        BOOL fRuntimeKeyAvail;
        BOOL fLicVerified;
    } LICINFO, *LPLICINFO;

    HRESULT GetLicInfo( [out] LICINFO *pLicInfo );

    HRESULT RequestLicKey(
        [in] DWORD dwReserved,
        [out] BSTR *pBstrKey);

    [local]
    HRESULT CreateInstanceLic(
        [in] IUnknown *pUnkOuter,
        [in] IUnknown *pUnkReserved,
        [in] REFIID riid,
        [in] BSTR bstrKey,
        [out, iid_is(riid)] PVOID *ppvObj);

    [call_as(CreateInstanceLic)]
    HRESULT RemoteCreateInstanceLic(
        [in] REFIID riid,
        [in] BSTR bstrKey,
        [out, iid_is(riid)] IUnknown **ppvObj);
}


/*****************************************************************************
 * IViewObject interface
 */
[
    local,
    object,
    uuid(3af24292-0c96-11ce-a0cf-00aa00600ab8),
    pointer_default(unique)
]
interface IViewObjectEx : IViewObject2
{
    typedef IViewObjectEx *LPVIEWOBJECTEX;

    typedef enum tagVIEWSTATUS
    {
        VIEWSTATUS_OPAQUE = 1,
        VIEWSTATUS_SOLIDBKGND = 2,
        VIEWSTATUS_DVASPECTOPAQUE = 4,
        VIEWSTATUS_DVASPECTTRANSPARENT = 8,
        VIEWSTATUS_SURFACE = 16,
        VIEWSTATUS_3DSURFACE = 32
    } VIEWSTATUS;

    typedef enum tagHITRESULT
    {
        HITRESULT_OUTSIDE = 0,
        HITRESULT_TRANSPARENT = 1,
        HITRESULT_CLOSE = 2,
        HITRESULT_HIT = 3
    } HITRESULT;

    typedef enum tagDVASPECT2
    {
        DVASPECT_OPAQUE = 16,
        DVASPECT_TRANSPARENT = 32
    } DVASPECT2;

    typedef struct tagExtentInfo
    {
        ULONG cb;
        DWORD dwExtentMode;
        SIZEL sizelProposed;
    } DVEXTENTINFO;

    typedef enum tagAspectInfoFlag
    {
        DVASPECTINFOFLAG_CANOPTIMIZE = 1
    } DVASPECTINFOFLAG;

    typedef struct tagAspectInfo
    {
        ULONG cb;
        DWORD dwFlags;
    } DVASPECTINFO;

    HRESULT GetRect(
        [in] DWORD dwAspect,
        [out] LPRECTL pRect);

    HRESULT GetViewStatus( [out] DWORD *pdwStatus );

    HRESULT QueryHitPoint(
        [in] DWORD dwAspect,
        [in] LPCRECT pRectBounds,
        [in] POINT ptlLoc,
        [in] LONG lCloseHint,
        [out] DWORD *pHitResult);

    HRESULT QueryHitRect(
        [in] DWORD dwAspect,
        [in] LPCRECT pRectBounds,
        [in] LPCRECT pRectLoc,
        [in] LONG lCloseHint,
        [out] DWORD *pHitResult);

    HRESULT GetNaturalExtent (
        [in] DWORD dwAspect,
        [in] LONG lindex,
        [in] DVTARGETDEVICE *ptd,
        [in] HDC hicTargetDev,
        [in] DVEXTENTINFO *pExtentInfo,
        [out] LPSIZEL pSizel);
}


/*****************************************************************************
 * IProvideClassInfo interface
 */
[
    object,
    uuid(b196b283-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IProvideClassInfo : IUnknown
{
    typedef IProvideClassInfo *LPPROVIDECLASSINFO;

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef GetClassInfo")
cpp_quote("#endif")

    HRESULT GetClassInfo( [out] ITypeInfo ** ppTI );
}


/*****************************************************************************
 * IProvideClassInfo2 interface
 */
[
    object,
    uuid(a6bc3ac0-dbaa-11ce-9de3-00aa004bb851),
    pointer_default(unique)
]
interface IProvideClassInfo2 : IProvideClassInfo
{
    typedef IProvideClassInfo2 *LPPROVIDECLASSINFO2;

    typedef enum tagGUIDKIND
    {
        GUIDKIND_DEFAULT_SOURCE_DISP_IID = 1
    } GUIDKIND;

    HRESULT GetGUID(
        [in]  DWORD dwGuidKind,
        [out] GUID *pGUID );
}


[
    object,
    uuid(a7aba9c1-8983-11cf-8f20-00805f2cd064),
    pointer_default(unique)
]
interface IProvideMultipleClassInfo : IProvideClassInfo2
{
    cpp_quote("#define MULTICLASSINFO_GETTYPEINFO           0x00000001")
    cpp_quote("#define MULTICLASSINFO_GETNUMRESERVEDDISPIDS 0x00000002")
    cpp_quote("#define MULTICLASSINFO_GETIIDPRIMARY         0x00000004")
    cpp_quote("#define MULTICLASSINFO_GETIIDSOURCE          0x00000008")

    cpp_quote("#define TIFLAGS_EXTENDDISPATCHONLY           0x00000001")

    typedef IProvideMultipleClassInfo *LPPROVIDEMULTIPLECLASSINFO;

    HRESULT GetMultiTypeInfoCount( 
        [out] ULONG *pcti);

    HRESULT GetInfoOfIndex( 
        [in] ULONG iti,
        [in] DWORD dwFlags,
        [out] ITypeInfo **pptiCoClass,
        [out] DWORD *pdwTIFlags,
        [out] ULONG *pcdispidReserved,
        [out] IID *piidPrimary,
        [out] IID *piidSource);
}


/*****************************************************************************
 * IConnectionPoint interface
 */
interface IConnectionPointContainer; /* forward declarations */
interface IEnumConnections;

[
    object,
    uuid(b196b286-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IConnectionPoint : IUnknown
{
    typedef IConnectionPoint *PCONNECTIONPOINT, *LPCONNECTIONPOINT;

    HRESULT GetConnectionInterface( [out] IID *pIID );
    HRESULT GetConnectionPointContainer( [out] IConnectionPointContainer **ppCPC );
    HRESULT Advise( [in] IUnknown *pUnkSink, [out] DWORD *pdwCookie );
    HRESULT Unadvise( [in] DWORD dwCookie );
    HRESULT EnumConnections( [out] IEnumConnections **ppEnum );
}


/*****************************************************************************
 * IConnectionPointContainer interface
 */
interface IEnumConnectionPoints; /* forward declaration */
[
    object,
    uuid(b196b284-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IConnectionPointContainer : IUnknown
{
    typedef IConnectionPointContainer *PCONNECTIONPOINTCONTAINER, *LPCONNECTIONPOINTCONTAINER;

    HRESULT EnumConnectionPoints( [out] IEnumConnectionPoints **ppEnum );
    HRESULT FindConnectionPoint( [in] REFIID riid, [out] IConnectionPoint **ppCP );
}


/*****************************************************************************
 * IEnumConnections interface
 */
[
    object,
    uuid(b196b287-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IEnumConnections : IUnknown
{
    typedef IEnumConnections *PENUMCONNECTIONS, *LPENUMCONNECTIONS;

    typedef struct tagCONNECTDATA
    {
        IUnknown *pUnk;
        DWORD dwCookie;
    } CONNECTDATA, *PCONNECTDATA, *LPCONNECTDATA;

    [local]
    HRESULT Next(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTDATA rgcd,
        [out] ULONG *pcFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTDATA rgcd,
        [out] ULONG *pcFetched);

    HRESULT Skip( [in] ULONG cConnections );

    HRESULT Reset();

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


/*****************************************************************************
 * IEnumConnectionPoints interface
 */
[
    object,
    uuid(b196b285-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IEnumConnectionPoints : IUnknown
{
    typedef IEnumConnectionPoints *PENUMCONNECTIONPOINTS, *LPENUMCONNECTIONPOINTS;

    [local]
    HRESULT Next(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTIONPOINT *ppCP,
        [out] ULONG *pcFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTIONPOINT *ppCP,
        [out] ULONG *pcFetched);

    HRESULT Skip( [in] ULONG cConnections );

    HRESULT Reset();

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


/*****************************************************************************
 * IPropertyPage interface
 */
interface IPropertyPageSite;  /* forward declaration */
[
    object,
    uuid(b196b28d-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IPropertyPage : IUnknown
{
    typedef IPropertyPage *LPPROPERTYPAGE;

    typedef struct tagPROPPAGEINFO
    {
        ULONG cb;
        LPOLESTR pszTitle;
        SIZE size;
        LPOLESTR pszDocString;
        LPOLESTR pszHelpFile;
        DWORD dwHelpContext;
    } PROPPAGEINFO, *LPPROPPAGEINFO;

    HRESULT SetPageSite( [in] IPropertyPageSite *pPageSite );

    HRESULT Activate(
        [in] HWND hWndParent,
        [in] LPCRECT pRect,
        [in] BOOL bModal);

    HRESULT Deactivate();

    HRESULT GetPageInfo( [out] PROPPAGEINFO *pPageInfo );

    HRESULT SetObjects(
        [in] ULONG cObjects,
        [in, size_is(cObjects)] IUnknown **ppUnk);

    HRESULT Show( [in] UINT nCmdShow );

    HRESULT Move( [in] LPCRECT pRect );

    HRESULT IsPageDirty();

    HRESULT Apply();

    HRESULT Help( [in] LPCOLESTR pszHelpDir );

    HRESULT TranslateAccelerator( [in] MSG *pMsg );
}


/*****************************************************************************
 * IPropertyPage2 interface
 */
[
    object,
    uuid(01e44665-24ac-101b-84ed-08002b2ec713),
    pointer_default(unique)
]
interface IPropertyPage2 : IPropertyPage
{
    typedef IPropertyPage2 *LPPROPERTYPAGE2;

    HRESULT EditProperty( [in] DISPID dispID );
}


/*****************************************************************************
 * IPropertyPageSite interface
 */
[
    object,
    uuid(b196b28c-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IPropertyPageSite : IUnknown
{
    typedef IPropertyPageSite *LPPROPERTYPAGESITE;

    typedef enum tagPROPPAGESTATUS
    {
        PROPPAGESTATUS_DIRTY = 0x1,
        PROPPAGESTATUS_VALIDATE = 0x2,
        PROPPAGESTATUS_CLEAN = 0x4
    } PROPPAGESTATUS;

    HRESULT OnStatusChange( [in] DWORD dwFlags );
    HRESULT GetLocaleID( [out] LCID *pLocaleID );
    HRESULT GetPageContainer( [out] IUnknown **ppUnk );
    HRESULT TranslateAccelerator( [in] MSG *pMsg );
}


/*****************************************************************************
 * IPropertyNotifySink interface
 */
[
    object,
    uuid(9bfbbc02-eff1-101a-84ed-00aa00341d07),
    pointer_default(unique)
]
interface IPropertyNotifySink : IUnknown
{
    typedef IPropertyNotifySink *LPPROPERTYNOTIFYSINK;

    HRESULT OnChanged( [in] DISPID dispID );
    HRESULT OnRequestEdit( [in] DISPID dispID );
}


/*****************************************************************************
 * ISimpleFrameSite interface
 */
[
    object,
    uuid(742b0e01-14e6-101b-914e-00aa00300cab),
    pointer_default(unique)
]
interface ISimpleFrameSite : IUnknown
{
    typedef ISimpleFrameSite *LPSIMPLEFRAMESITE;

    HRESULT PreMessageFilter(
        [in] HWND hWnd,
        [in] UINT msg,
        [in] WPARAM wp,
        [in] LPARAM lp,
        [out] LRESULT *plResult,
        [out] DWORD *pdwCookie);

    HRESULT PostMessageFilter(
        [in] HWND hWnd,
        [in] UINT msg,
        [in] WPARAM wp,
        [in] LPARAM lp,
        [out] LRESULT *plResult,
        [in] DWORD dwCookie);
}


/*****************************************************************************
 * IPersistStreamInit interface
 */
[
    object,
    uuid(7fd52380-4e07-101b-ae2d-08002b2ec713),
    pointer_default(unique)
]
interface IPersistStreamInit : IPersist
{
    typedef IPersistStreamInit *LPPERSISTSTREAMINIT;

    HRESULT IsDirty();
    HRESULT Load( [in] LPSTREAM pStm );
    HRESULT Save( [in] LPSTREAM pStm, [in] BOOL fClearDirty );
    HRESULT GetSizeMax( [out] ULARGE_INTEGER *pcbSize );
    HRESULT InitNew();
}


/*****************************************************************************
 * IPersistMemory interface
 */
[
    object,
    uuid(bd1ae5e0-a6ae-11ce-bd37-504200c10000),
    pointer_default(unique)
]
interface IPersistMemory : IPersist
{
    typedef IPersistMemory *LPPERSISTMEMORY;

    HRESULT IsDirty();

    [local]
    HRESULT Load(
        [in, size_is(cbSize)] LPVOID pMem,
        [in] ULONG cbSize);

    [call_as(Load)]
    HRESULT RemoteLoad(
        [in, size_is(cbSize)] BYTE *pMem,
        [in] ULONG cbSize);

    [local]
    HRESULT Save(
        [out, size_is(cbSize)] LPVOID pMem,
        [in] BOOL fClearDirty,
        [in] ULONG cbSize);

    [call_as(Save)]
    HRESULT RemoteSave(
        [out, size_is(cbSize)] BYTE *pMem,
        [in] BOOL fClearDirty,
        [in] ULONG cbSize);

    HRESULT GetSizeMax( [out] ULONG *pCbSize );
    HRESULT InitNew();
}


/*****************************************************************************
 * IPersistPropertyBag interface
 */
[
    object,
    uuid(37d84f60-42cb-11ce-8135-00aa004bb851),
    pointer_default(unique)
]
interface IPersistPropertyBag : IPersist
{
    typedef IPersistPropertyBag *LPPERSISTPROPERTYBAG;

    HRESULT InitNew();

    HRESULT Load(
        [in] IPropertyBag *pPropBag,
        [in] IErrorLog *pErrorLog);

    HRESULT Save(
        [in] IPropertyBag *pPropBag,
        [in] BOOL fClearDirty,
        [in] BOOL fSaveAllProperties);
}


/*****************************************************************************
 * IPropertyBag2 interface
 */
[
    object,
    uuid(22f55882-280b-11d0-a8a9-00a0c90c2004),
    pointer_default(unique)
]
interface IPropertyBag2 : IUnknown
{
    typedef IPropertyBag2 *LPPROPERTYBAG2;

    typedef enum tagPROPBAG2_TYPE
    {
        PROPBAG2_TYPE_UNDEFINED = 0,
        PROPBAG2_TYPE_DATA = 1,
        PROPBAG2_TYPE_URL = 2,
        PROPBAG2_TYPE_OBJECT = 3,
        PROPBAG2_TYPE_STREAM = 4,
        PROPBAG2_TYPE_STORAGE = 5,
        PROPBAG2_TYPE_MONIKER = 6
    } PROPBAG2_TYPE;

    typedef struct tagPROPBAG2
    {
        DWORD dwType;
        VARTYPE vt;
        CLIPFORMAT cfType;
        DWORD dwHint;
        LPOLESTR pstrName;
        CLSID clsid;
    } PROPBAG2;

    HRESULT Read(
        [in] ULONG cProperties,
        [in] PROPBAG2 *pPropBag,
        [in] IErrorLog *pErrLog,
        [out] VARIANT *pvarValue,
        [out] HRESULT *phrError);

    HRESULT Write(
        [in] ULONG cProperties,
        [in] PROPBAG2 *pPropBag,
        [in] VARIANT *pvarValue);

    HRESULT CountProperties(
        [out] ULONG *pcProperties );

    HRESULT GetPropertyInfo(
        [in] ULONG iProperty,
        [in] ULONG cProperties,
        [out] PROPBAG2 *pPropBag,
        [out] ULONG *pcProperties);

    HRESULT LoadObject(
        [in] LPCOLESTR pstrName,
        [in] DWORD dwHint,
        [in] IUnknown *pUnkObject,
        [in] IErrorLog *pErrLog);
}


/*****************************************************************************
 * IPersistPropertyBag2 interface
 */
[
    object,
    uuid(22f55881-280b-11d0-a8a9-00a0c90c2004),
    pointer_default(unique)
]
interface IPersistPropertyBag2 : IPersist
{
    typedef IPersistPropertyBag2 *LPPERSISTPROPERTYBAG2;

    HRESULT InitNew();

    HRESULT Load(
        [in] IPropertyBag2 *pPropBag,
        [in] IErrorLog *pErrorLog);

    HRESULT Save(
        [in] IPropertyBag2 *pPropBag,
        [in] BOOL fClearDirty,
        [in] BOOL fSaveAllProperties);

    HRESULT IsDirty();
}


/*****************************************************************************
 * ISpecifyPropertyPages interface
 */
[
    object,
    uuid(b196b28b-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface ISpecifyPropertyPages : IUnknown
{
    typedef ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;

    typedef struct tagCAUUID
    {
	ULONG cElems;
        [size_is(cElems)] GUID *pElems;
    } CAUUID, *LPCAUUID;

    HRESULT GetPages( [out] CAUUID *pPages );
}


/*****************************************************************************
 * IPerPropertyBrowsing interface
 */
[
    object,
    uuid(376bd3aa-3845-101b-84ed-08002b2ec713),
    pointer_default(unique)
]
interface IPerPropertyBrowsing : IUnknown
{
    typedef IPerPropertyBrowsing *LPPERPROPERTYBROWSING;

    typedef struct tagCALPOLESTR
    {
        ULONG cElems;
        [size_is(cElems)] LPOLESTR *pElems;
    } CALPOLESTR, *LPCALPOLESTR;

    typedef struct tagCADWORD
    {
        ULONG cElems;
        [size_is(cElems)] DWORD *pElems;
    } CADWORD, *LPCADWORD;

    HRESULT GetDisplayString(
        [in] DISPID dispID,
        [out] BSTR *pBstr);

    HRESULT MapPropertyToPage(
        [in] DISPID dispID,
        [out] CLSID *pClsid);

    HRESULT GetPredefinedStrings(
        [in] DISPID dispID,
        [out] CALPOLESTR *pCaStringsOut,
        [out] CADWORD *pCaCookiesOut);

    HRESULT GetPredefinedValue(
        [in] DISPID dispID,
        [in] DWORD dwCookie,
        [out] VARIANT *pVarOut);
}


/*****************************************************************************
 * IAdviseSinkEx interface
 */
[
    object,
    uuid(3af24290-0c96-11ce-a0cf-00aa00600ab8),
    pointer_default(unique)
]
interface IAdviseSinkEx : IAdviseSink
{
    typedef IAdviseSinkEx *LPADVISESINKEX;

    [local]
    void OnViewStatusChange( [in] DWORD dwViewStatus );

    [call_as(OnViewStatusChange)]
    HRESULT RemoteOnViewStatusChange( [in] DWORD dwViewStatus );
}


/*****************************************************************************
 * IPointerInactive interface
 */
[
    object,
    uuid(55980ba0-35aa-11cf-b671-00aa004cd6d8),
    pointer_default(unique)
]
interface IPointerInactive : IUnknown
{
    typedef IPointerInactive *LPPOINTERINACTIVE;

    HRESULT GetActivationPolicy(
        [out] DWORD *pdwPolicy);

    HRESULT OnInactiveMouseMove(
        [in] LPCRECT pRectBounds,
        [in] LONG x,
        [in] LONG y,
        [in] DWORD grfKeyState);

    HRESULT OnInactiveSetCursor(
        [in] LPCRECT pRectBounds,
        [in] LONG x,
        [in] LONG y,
        [in] DWORD dwMouseMsg,
        [in] BOOL fSetAlways);
}


/*****************************************************************************
 * IObjectWithSite interface
 */
[
    object,
    uuid(fc4801a3-2ba9-11cf-a229-00aa003d7352),
    pointer_default(unique)
]
interface IObjectWithSite : IUnknown
{
    typedef IObjectWithSite *LPOBJECTWITHSITE;

    HRESULT SetSite(
        [in] IUnknown * pUnkSite);

    HRESULT GetSite(
        [in] REFIID riid, 
        [out, iid_is(riid)] PVOID *ppvSite);
}


/*****************************************************************************
 * IOleUndoUnit interface
 */
interface IOleUndoManager;  /* forward declaration */
[
    object,
    uuid(894ad3b0-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IOleUndoUnit : IUnknown
{
    typedef IOleUndoUnit *LPOLEUNDOUNIT;

    HRESULT Do( [in] IOleUndoManager *pUndoManager );
    HRESULT GetDescription( [out] BSTR *pBstr );
    HRESULT GetUnitType( [out] CLSID *pClsid, [out] LONG *plID );
    HRESULT OnNextAdd();
}


/*****************************************************************************
 * IOleParentUndoUnit interface
 */
[
    object,
    uuid(a1faf330-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IOleParentUndoUnit : IOleUndoUnit
{
    typedef IOleParentUndoUnit *LPOLEPARENTUNDOUNIT;

    HRESULT Open( [in] IOleParentUndoUnit *pPUU );
    HRESULT Close( [in] IOleParentUndoUnit *pPUU, [in] BOOL fCommit );
    HRESULT Add( [in] IOleUndoUnit *pUU );
    HRESULT FindUnit( [in] IOleUndoUnit *pUU );
    HRESULT GetParentState( [out] DWORD *pdwState );
}


/*****************************************************************************
 * IEnumOleUndoUnits interface
 */
[
    object,
    uuid(b3e7c340-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IEnumOleUndoUnits : IUnknown
{
    typedef IEnumOleUndoUnits *LPENUMOLEUNDOUNITS;

    [local]
    HRESULT Next(
        [in] ULONG cElt,
        [out, size_is(cElt), length_is(*pcEltFetched)] IOleUndoUnit **rgElt,
        [out] ULONG *pcEltFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cElt,
        [out, size_is(cElt), length_is(*pcEltFetched)] IOleUndoUnit **rgElt,
        [out] ULONG *pcEltFetched);

    HRESULT Skip( [in] ULONG cElt );

    HRESULT Reset();

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


/*****************************************************************************
 * IOleUndoManager interface
 */
[
    object,
    uuid(d001f200-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IOleUndoManager : IUnknown
{
    typedef IOleUndoManager *LPOLEUNDOMANAGER;

    HRESULT Open( [in] IOleParentUndoUnit *pPUU );
    HRESULT Close( [in] IOleParentUndoUnit *pPUU, [in] BOOL fCommit );
    HRESULT Add( [in] IOleUndoUnit *pUU );
    HRESULT GetOpenParentState( [out] DWORD *pdwState );
    HRESULT DiscardFrom( [in] IOleUndoUnit *pUU );
    HRESULT UndoTo( [in] IOleUndoUnit *pUU );
    HRESULT RedoTo( [in] IOleUndoUnit *pUU );
    HRESULT EnumUndoable( [out] IEnumOleUndoUnits **ppEnum );
    HRESULT EnumRedoable( [out] IEnumOleUndoUnits **ppEnum );
    HRESULT GetLastUndoDescription( [out] BSTR *pBstr );
    HRESULT GetLastRedoDescription( [out] BSTR *pBstr );
    HRESULT Enable( [in] BOOL fEnable );
}


/*****************************************************************************
 * IQuickActivate interface
 */
[
    object,
    uuid(cf51ed10-62fe-11cf-bf86-00a0c9034836),
    pointer_default(unique)
]
interface IQuickActivate : IUnknown
{
    typedef IQuickActivate *LPQUICKACTIVATE;

    typedef enum tagQACONTAINERFLAGS
    {
        QACONTAINER_SHOWHATCHING = 0x1,
        QACONTAINER_SHOWGRABHANDLES = 0x2,
        QACONTAINER_USERMODE = 0x4,
        QACONTAINER_DISPLAYASDEFAULT = 0x8,
        QACONTAINER_UIDEAD = 0x10,
        QACONTAINER_AUTOCLIP = 0x20,
        QACONTAINER_MESSAGEREFLECT = 0x40,
        QACONTAINER_SUPPORTSMNEMONICS = 0x80
    } QACONTAINERFLAGS;

    typedef DWORD OLE_COLOR;
    
    typedef struct tagQACONTAINER
    {
        ULONG cbSize;
        IOleClientSite *pClientSite;
        IAdviseSinkEx *pAdviseSink;
        IPropertyNotifySink *pPropertyNotifySink;
        IUnknown *pUnkEventSink;
        DWORD dwAmbientFlags;
        OLE_COLOR colorFore;
        OLE_COLOR colorBack;
        IFont *pFont;
        IOleUndoManager *pUndoMgr;
        DWORD dwAppearance;
        LONG lcid;
        HPALETTE hpal;
        IBindHost *pBindHost;
        IOleControlSite *pOleControlSite;
        IServiceProvider *pServiceProvider;
    } QACONTAINER;

    typedef struct tagQACONTROL
    {
        ULONG cbSize;
        DWORD dwMiscStatus;
        DWORD dwViewStatus;
        DWORD dwEventCookie;
        DWORD dwPropNotifyCookie;
        DWORD dwPointerActivationPolicy;
    } QACONTROL;

    [local]
    HRESULT QuickActivate(
        [in] QACONTAINER *pQaContainer,
        [in,out] QACONTROL *pQaControl);

    [call_as(QuickActivate)]
    HRESULT RemoteQuickActivate(
        [in] QACONTAINER *pQaContainer,
        [out] QACONTROL *pQaControl);

    HRESULT SetContentExtent( [in] LPSIZEL pSizel );

    HRESULT GetContentExtent( [out] LPSIZEL pSizel );
}
