/*
 * 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
 */

#ifndef DO_NO_IMPORTS
import "oleidl.idl";
import "oaidl.idl";
import "servprov.idl";
import "urlmon.idl";
#endif

/*****************************************************************************
 * 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
{
cpp_quote("#define SID_SOleUndoManager IID_IOleUndoManager")
    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 );
}
