181 lines
4.9 KiB
C
181 lines
4.9 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, LONG lStreamFormat);
|
||
|
HRESULT CutRangeToClipboard (CTxtRange *prg, LONG lStreamFormat,
|
||
|
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__
|
||
|
|