windows-nt/Source/XPSP1/NT/windows/richedit/re30/_ldte.h
2020-09-26 16:20:57 +08:00

181 lines
4.8 KiB
C++

/*
* @doc INTERNAL
*
* @module _LDTE.H - Lighweight Data Transfer Engine |
*
* Declaration for CLightDTEngine class
*
* Author:
* alexgo 3/25/95
*
* Copyright (c) 1995-1997, Microsoft Corporation. All rights reserved.
*/
#ifndef __LDTE_H__
#define __LDTE_H__
#include "_m_undo.h"
#include "_dragdrp.h"
class CTxtRange;
class CTxtEdit;
/*
* DataObjectInfo
*
* Purpose:
* enumeration of bit flags used to indicate what operations
* are possible from a given data object.
*/
typedef enum tagDataObjectInfo
{
DOI_NONE = 0,
DOI_CANUSETOM = 1, // TOM<-->TOM optimized data transfers
DOI_CANPASTEPLAIN = 2, // plain text pasting available
DOI_CANPASTERICH = 4, // rich text pasting available
DOI_CANPASTEOLE = 8, // object may be pasted as an OLE embedding
// (note that this flag may be combined with
// others).
} DataObjectInfo;
class CLightDTEngine;
typedef struct _READHGLOBAL
{ // Used by RtfHGlobalToRange()
LPSTR ptext; // ANSI string remaining to be read
LONG cbLeft; // Bytes remaining (might exceed string len)
} READHGLOBAL;
typedef struct _WRITEHGLOBAL
{ // Used by RtfHGlobalToRange()
HGLOBAL hglobal;
LONG cch; // Count of ASCII chars written (a cb)
LONG cb; // Count of bytes in hglobal
} WRITEHGLOBAL;
// the following macro (should be an in-line function...) defines
// the formula by which in-memory buffers will grow. It is exponential
// (sort of "if we needed this much memory, chances are we'll need at
// least as much more) but the actual growth factor should be played with
// to achieve better performance across most common scenarios
#define GROW_BUFFER(cbCurrentSize, cbRequestedGrowth) (ULONG)max(2*(cbCurrentSize), (cbCurrentSize) + 2*(cbRequestedGrowth))
//DWORD packed flags for PasteDataObjectToRange. Make sure new values
//are assigned such that flags can be or'd together.
#define PDOR_NONE 0x00000000 //No flags
#define PDOR_NOQUERY 0x00000001 //Do not call QueryAcceptData
#define PDOR_DROP 0x00000002 //This is a drop operation
class CLightDTEngine
{
public:
CLightDTEngine();
~CLightDTEngine();
void Init(CTxtEdit * ped);
void ReleaseDropTarget();
void Destroy();
// clipboard
HRESULT CopyRangeToClipboard( CTxtRange *prg );
HRESULT CutRangeToClipboard( CTxtRange *prg,
IUndoBuilder *publdr );
DWORD CanPaste( IDataObject *pdo, CLIPFORMAT cf, DWORD flags );
void FlushClipboard(void);
// data object
HRESULT RangeToDataObject( CTxtRange *prg, LONG lStreamFormat,
IDataObject **ppdo );
HRESULT PasteDataObjectToRange( IDataObject *pdo, CTxtRange *prg,
CLIPFORMAT cf, REPASTESPECIAL *rps,
IUndoBuilder *publdr, DWORD dwFlags );
HRESULT CreateOleObjFromDataObj( IDataObject *pdo, CTxtRange *prg,
REPASTESPECIAL *rps, INT iFormatEtc,
IUndoBuilder *publdr );
// drag drop
HRESULT GetDropTarget( IDropTarget **ppDropTarget );
HRESULT StartDrag( CTxtSelection *psel, IUndoBuilder *publdr );
BOOL fInDrag();
// file I/O
LONG LoadFromEs( CTxtRange *prg, LONG lStreamFormat, EDITSTREAM *pes,
BOOL fTestLimit, IUndoBuilder *publdr);
LONG SaveToEs( CTxtRange *prg, LONG lStreamFormat,
EDITSTREAM *pes );
// conversion routines
HGLOBAL AnsiPlainTextFromRange( CTxtRange *prg );
HGLOBAL UnicodePlainTextFromRange( CTxtRange *prg );
HGLOBAL RtfFromRange( CTxtRange *prg, LONG lStreamFormat );
// direct clipboard support
HRESULT RenderClipboardFormat(WPARAM wFmt);
HRESULT RenderAllClipboardFormats();
HRESULT DestroyClipboard();
LONG ReadPlainText( CTxtRange *prg, EDITSTREAM *pes, BOOL fTestLimit,
IUndoBuilder *publdr, LONG lStreamFormat);
protected:
LONG WritePlainText( CTxtRange *prg, EDITSTREAM *pes, LONG lStreamFormat);
HRESULT HGlobalToRange(DWORD dwFormatIndex, HGLOBAL hGlobal, LPTSTR ptext,
CTxtRange *prg, IUndoBuilder * publdr);
HRESULT DIBToRange(HGLOBAL hGlobal, CTxtRange *prg, IUndoBuilder * publdr);
LONG GetStreamCodePage(LONG lStreamFormat);
CTxtEdit * _ped;
CDropTarget * _pdt; // the current drop target
IDataObject * _pdo; // data object that may be on the clipboard.
BYTE _fUseLimit; // Whether to use limit text in calculation
// Note: if we need more flags do the bit
// field thing.
BYTE _fOleless; // Ole clipboard support?
};
/*
* CLightDTEngine::Init (ped)
*
* @mfunc
* initializes the object
*/
inline void CLightDTEngine::Init(
CTxtEdit *ped) // @parm text
{
_ped = ped;
}
/*
* CLightDTEngine::ReleaseDropTarget (ped)
*
* @mfunc
* Releases the drop target if there is one.
*/
inline void CLightDTEngine::ReleaseDropTarget()
{
if (_pdt)
{
_pdt->Release();
_pdt = NULL;
}
}
/*
* CLightDTEngine::fInDrag ()
*
* @mfunc
* Tells whether a drag operation is occuring
*/
inline BOOL CLightDTEngine::fInDrag()
{
return (_pdt != NULL) ? _pdt->fInDrag() : FALSE;
}
#endif // !__LDTE_H__