/*
 * Copyright (C) 2002 Andriy Palamarchuk
 * Copyright (C) 2004 Mike McCormack
 *
 * 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
 */

cpp_quote("#if 0")  /* not included on Windows */
import "oleidl.idl";
cpp_quote("#endif")

/* REOBJECT structure flags */
cpp_quote("#define REO_GETOBJ_NO_INTERFACES        0x00000000")
cpp_quote("#define REO_GETOBJ_POLEOBJ              0x00000001")
cpp_quote("#define REO_GETOBJ_PSTG                 0x00000002")
cpp_quote("#define REO_GETOBJ_POLESITE             0x00000004")
cpp_quote("#define REO_GETOBJ_ALL_INTERFACES       0x00000007")
cpp_quote("#define REO_CP_SELECTION                0xFFFFFFFF")
cpp_quote("#define REO_IOB_SELECTION               0xFFFFFFFF")
cpp_quote("#define REO_IOB_USE_CP                  0xFFFFFFFE")
cpp_quote("#define REO_NULL                        0x00000000")
cpp_quote("#define REO_READWRITEMASK               0x0000003F")
cpp_quote("#define REO_DONTNEEDPALETTE             0x00000020")
cpp_quote("#define REO_BLANK                       0x00000010")
cpp_quote("#define REO_DYNAMICSIZE                 0x00000008")
cpp_quote("#define REO_INVERTEDSELECT              0x00000004")
cpp_quote("#define REO_BELOWBASELINE               0x00000002")
cpp_quote("#define REO_RESIZABLE                   0x00000001")
cpp_quote("#define REO_LINK                        0x80000000")
cpp_quote("#define REO_STATIC                      0x40000000")
cpp_quote("#define REO_SELECTED                    0x08000000")
cpp_quote("#define REO_OPEN                        0x04000000")
cpp_quote("#define REO_INPLACEACTIVE               0x02000000")
cpp_quote("#define REO_HILITED                     0x01000000")
cpp_quote("#define REO_LINKAVAILABLE               0x00800000")
cpp_quote("#define REO_GETMETAFILE                 0x00400000")

/* clipboard operation flags */
cpp_quote("#define RECO_PASTE            0x00000000")
cpp_quote("#define RECO_DROP             0x00000001")
cpp_quote("#define RECO_COPY             0x00000002")
cpp_quote("#define RECO_CUT              0x00000003")
cpp_quote("#define RECO_DRAG             0x00000004")

typedef struct _reobject {
    DWORD cbStruct;
    LONG cp;
    CLSID clsid;
    LPOLEOBJECT poleobj;
    LPSTORAGE pstg;
    LPOLECLIENTSITE polesite;
    SIZEL sizel;
    DWORD dvaspect;
    DWORD dwFlags;
    DWORD dwUser;
} REOBJECT;

cpp_quote("#ifndef __RICHEDIT_CHARRANGE_DEFINED")
cpp_quote("#define __RICHEDIT_CHARRANGE_DEFINED")

typedef struct _charrange
{
    LONG cpMin;
    LONG cpMax;
} CHARRANGE;

cpp_quote("#endif /* __RICHEDIT_CHARRANGE_DEFINED */")

/*****************************************************************************
 * IRichEditOle
 */
[
  object,
  uuid(00020d00-0000-0000-c000-000000000046),
  pointer_default(unique)
]
interface IRichEditOle : IUnknown
{
    typedef [unique] IRichEditOle *LPRICHEDITOLE;

    HRESULT GetClientSite(LPOLECLIENTSITE *lplpolesite);
    HRESULT GetObjectCount();
    HRESULT GetLinkCount();
    HRESULT GetObject(LONG iob, REOBJECT *lpreobject, DWORD dwFlags);
    HRESULT InsertObject(REOBJECT *lpreobject);
    HRESULT ConvertObject(LONG iob, REFCLSID rclsidNew, LPCSTR lpstrUserTypeNew);
    HRESULT ActivateAs(REFCLSID rclsid, REFCLSID rclsidAs);
    HRESULT SetHostNames(LPCSTR lpstrContainerApp, LPCSTR lpstrContainerObj);
    HRESULT SetLinkAvailable(LONG iob, BOOL fAvailable);
    HRESULT SetDvaspect(LONG iob, DWORD dvaspect);
    HRESULT HandsOffStorage(LONG iob);
    HRESULT SaveCompleted(LONG iob, LPSTORAGE lpstg);
    HRESULT InPlaceDeactivate();
    HRESULT ContextSensitiveHelp(BOOL fEnterMode);
    HRESULT GetClipboardData(CHARRANGE* lpchrg, DWORD reco, LPDATAOBJECT *lplpdataobj);
    HRESULT ImportDataObject(LPDATAOBJECT lpdataobj, CLIPFORMAT cf, HGLOBAL hMetaPict);
}

/*****************************************************************************
 * IRichEditOleCallback
 */
[
  object,
  uuid(00020d03-0000-0000-c000-000000000046),
  pointer_default(unique)
]
interface IRichEditOleCallback : IUnknown
{
    typedef [unique] IRichEditOleCallback *LPRICHEDITOLECALLBACK;

    HRESULT GetNewStorage(LPSTORAGE *lplpstg);
    HRESULT GetInPlaceContext(LPOLEINPLACEFRAME *lplpFrame, LPOLEINPLACEUIWINDOW *lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
    HRESULT ShowContainerUI(BOOL fShow);
    HRESULT QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
    HRESULT DeleteObject(LPOLEOBJECT lpoleobj);
    HRESULT QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT *lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
    HRESULT ContextSensitiveHelp(BOOL fEnterMode);
    HRESULT GetClipboardData(CHARRANGE *lpchrg, DWORD reco, LPDATAOBJECT *lplpdataobj);
    HRESULT GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect);
    HRESULT GetContextMenu(WORD seltype, LPOLEOBJECT lpoleobj, CHARRANGE *lpchrg, HMENU *lphmenu);
}
