/* * _DXFROBJ.H * * Purpose: * Class declaration for an OLE data transfer object (for use in * drag drop and clipboard operations) * * Author: * alexgo (4/25/95) * * Copyright (c) 1995-2000, Microsoft Corporation. All rights reserved. */ #ifndef __DXFEROBJ_H__ #define __DXFEROBJ_H__ class CTxtRange; EXTERN_C const IID IID_IRichEditDO; /* * CDataTransferObj * * Purpose: * holds a "snapshot" of some rich-text data that can be used * for drag drop or clipboard operations * * Notes: * FUTURE (alexgo): add in support for TOM<-->TOM optimized data * transfers */ class CDataTransferObj : public IDataObject, public ITxNotify { public: // IUnknown methods STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObj); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); // IDataObject methods STDMETHOD(DAdvise)( FORMATETC * pFormatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection); STDMETHOD(DUnadvise)( DWORD dwConnection); STDMETHOD(EnumDAdvise)( IEnumSTATDATA ** ppenumAdvise); STDMETHOD(EnumFormatEtc)( DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc); STDMETHOD(GetCanonicalFormatEtc)( FORMATETC *pformatetc, FORMATETC *pformatetcOut); STDMETHOD(GetData)( FORMATETC *pformatetcIn, STGMEDIUM *pmedium ); STDMETHOD(GetDataHere)( FORMATETC *pformatetc, STGMEDIUM *pmedium); STDMETHOD(QueryGetData)( FORMATETC *pformatetc ); STDMETHOD(SetData)( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease); // ITxNotify methods virtual void OnPreReplaceRange( LONG cp, LONG cchDel, LONG cchNew, LONG cpFormatMin, LONG cpFormatMax, NOTIFY_DATA *pNotifyData ); virtual void OnPostReplaceRange( LONG cp, LONG cchDel, LONG cchNew, LONG cpFormatMin, LONG cpFormatMax, NOTIFY_DATA *pNotifyData ); virtual void Zombie(); static CDataTransferObj * Create(CTxtEdit *ped, CTxtRange *prg, LONG lStreamFormat); private: // NOTE: private cons/destructor, may not be allocated on the stack as // this would break OLE's current object liveness rules CDataTransferObj(CTxtEdit *ped); ~CDataTransferObj(); BOOL IsZombie() {return !_ped;} ULONG _crefs; ULONG _cTotal; // total number of formats supported FORMATETC * _prgFormats; // the array of supported formats LONG _lStreamFormat; // Stream format to use in Rtf conversion // for 1.0 compatability DWORD _dwFlags; DWORD _dwUser; DWORD _dvaspect; enum TEXTKIND { tPlain, tRtf, tRtfUtf8, tRtfNCRforNonASCII }; HGLOBAL TextToHglobal( HGLOBAL &hText, TEXTKIND tKind ); LPSTORAGE GetDataForEmbeddedObject( LPOLEOBJECT pOleObj, LPSTORAGE lpstgdest ); HGLOBAL GetDataForObjectDescriptor( LPOLEOBJECT pOleObj, DWORD dwAspect, SIZEUV* psize ); public: CTxtEdit * _ped; HGLOBAL _hPlainText; // handle to the plain UNICODE text HGLOBAL _hRtfText; // handle to the RTF UNICODE text HGLOBAL _hRtfUtf8; // Handle to UTF8 encoding of RTF HGLOBAL _hRtfNCRforNonASCII; // Handle to NCRforNonASCII encoding of RTF IOleObject * _pOleObj; // Embedded Object LPSTORAGE _pObjStg; // Embedded object data HGLOBAL _hObjDesc; // Embedded object descriptor HMETAFILE _hMFPict; // Embedded object metafile LONG _cch; // number of "characters" in the this // dxfer object LONG _cpMin; // Starting cp for this dxfer object LONG _cObjs; // number of objects in this dxfer object. }; /* * class CEnumFormatEtc * * Purpose: * implements a generic format enumerator for IDataObject */ class CEnumFormatEtc : public IEnumFORMATETC { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObj); STDMETHOD_(ULONG,AddRef)(void); STDMETHOD_(ULONG,Release)(void); STDMETHOD(Next) (ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched); STDMETHOD(Skip) (ULONG celt); STDMETHOD(Reset) (void); STDMETHOD(Clone) (IEnumFORMATETC **ppenum); static HRESULT Create(FORMATETC *prgFormats, DWORD cFormats, IEnumFORMATETC **ppenum); private: CEnumFormatEtc(); ~CEnumFormatEtc(); ULONG _crefs; ULONG _iCurrent; // current clipboard format ULONG _cTotal; // total number of formats FORMATETC * _prgFormats; // array of available formats }; // // Some globally useful FORMATETCs extern FORMATETC g_rgFETC[]; extern const DWORD g_rgDOI[]; #define CFETC 17 // Dimension of g_rgFETC[] enum FETCINDEX // Keep in sync with g_rgFETC[] { iRtfUtf8, // RTF in UTF8 encoding iRtfFETC, // RTF iRtfNCRforNonASCII, // RTF with NCR for nonASCII iEmbObj, // Embedded Object iEmbSrc, // Embed Source iObtDesc, // Object Descriptor iLnkSrc, // Link Source iMfPict, // Metafile iDIB, // DIB iBitmap, // Bitmap iRtfNoObjs, // RTF with no objects iUnicodeFETC, // Unicode plain text iAnsiFETC, // ANSI plain text iFilename, // Filename iRtfAsTextFETC, // Pastes RTF as text iTxtObj, // Richedit Text iRichEdit // RichEdit Text w/formatting }; #define cf_RICHEDIT g_rgFETC[iRichEdit].cfFormat #define cf_EMBEDDEDOBJECT g_rgFETC[iEmbObj].cfFormat #define cf_EMBEDSOURCE g_rgFETC[iEmbSrc].cfFormat #define cf_OBJECTDESCRIPTOR g_rgFETC[iObtDesc].cfFormat #define cf_LINKSOURCE g_rgFETC[iLnkSrc].cfFormat #define cf_RTF g_rgFETC[iRtfFETC].cfFormat #define cf_RTFUTF8 g_rgFETC[iRtfUtf8].cfFormat #define cf_RTFNCRFORNONASCII g_rgFETC[iRtfNCRforNonASCII].cfFormat #define cf_RTFNOOBJS g_rgFETC[iRtfNoObjs].cfFormat #define cf_TEXTOBJECT g_rgFETC[iTxtObj].cfFormat #define cf_RTFASTEXT g_rgFETC[iRtfAsTextFETC].cfFormat #define cf_FILENAME g_rgFETC[iFilename].cfFormat #endif // !__DXFROBJ_H__