/*
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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 );
}
