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