windows-nt/Source/XPSP1/NT/windows/richedit/re41/_cuim.h

268 lines
9.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
*
* @doc INTERNAL
*
* @module _CUIM.H CUIM declaration
*
* Purpose:
*
* Author: <nl>
* 11/16/99 honwch
*
* Copyright (c) 1995-2001, Microsoft Corporation. All rights reserved.
*/
#ifndef _CUIM_H
#define _CUIM_H
#include "_notmgr.h"
class CUlColorArray : public CArray<COLORREF>
{
public:
CUlColorArray() {};
~CUlColorArray() {};
};
class CITfEnumRange : public CArray<IEnumTfRanges *>
{
public:
CITfEnumRange() {};
~CITfEnumRange() {};
};
typedef struct tagCTFMOUSETRAP
{
LONG cpMouseStart;
LONG cchMosueComp;
WPARAM wParamBefore;
DWORD dwCookie;
ITfMouseSink *pMouseSink;
tagCTFMOUSETRAP *pNext;
} CTFMOUSETRAP;
typedef struct _EMBEDOBJECT
{
LONG cpOffset;
IDataObject *pIDataObj;
} EMBEDOBJECT;
// Forward declarations
class CTextMsgFilter;
typedef HRESULT (*PTESCALLBACK)(ITfEditRecord *pEditRecord, void *pv);
class CTextEditSink : public ITfTextEditSink
{
public:
CTextEditSink(PTESCALLBACK pfnCallback, void *pv);
//
// IUnknown methods
//
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//
// ITfTextEditSink
//
STDMETHODIMP OnEndEdit(ITfContext *pic, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord);
HRESULT _Advise(ITfContext *pic);
HRESULT _Unadvise();
private:
long _cRef;
ITfContext *_pic;
DWORD _dwCookie;
PTESCALLBACK _pfnCallback;
void *_pv;
};
class CUIM : public ITextStoreACP, public ITfContextOwnerCompositionSink,
public ITfMouseTrackerACP, public ITxNotify,
public ITfEnableService, public IServiceProvider
{
public :
CUIM(CTextMsgFilter *pTextMsgFilter);
~CUIM();
//
// IUnknown
//
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
STDMETHODIMP_(ULONG) STDMETHODCALLTYPE AddRef(void);
STDMETHODIMP_(ULONG) STDMETHODCALLTYPE Release(void);
//
// ITextStoreACP
//
STDMETHODIMP AdviseSink(REFIID riid, IUnknown *punk, DWORD dwMask);
STDMETHODIMP UnadviseSink(IUnknown *punk);
STDMETHODIMP RequestLock(DWORD dwLockFlags, HRESULT *phrSession);
STDMETHODIMP GetStatus(TS_STATUS *pdcs);
STDMETHODIMP QueryInsert(LONG acpInsertStart, LONG acpInsertEnd, ULONG cch, LONG *pacpResultStart, LONG *pacpResultEnd);
STDMETHODIMP GetSelection(ULONG ulIndex, ULONG ulCount, TS_SELECTION_ACP *pSelection, ULONG *pcFetched);
STDMETHODIMP SetSelection(ULONG ulCount, const TS_SELECTION_ACP *pSelection);
STDMETHODIMP GetText(LONG acpStart, LONG acpEnd, WCHAR *pchPlain, ULONG cchPlainReq, ULONG *pcchPlainOut, TS_RUNINFO *prgRunInfo,
ULONG ulRunInfoReq, ULONG *pulRunInfoOut, LONG *pacpNext);
STDMETHODIMP SetText(DWORD dwFlags, LONG acpStart, LONG acpEnd, const WCHAR *pchText, ULONG cch, TS_TEXTCHANGE *pChange);
STDMETHODIMP GetFormattedText(LONG acpStart, LONG acpEnd, IDataObject **ppDataObject);
STDMETHODIMP GetEmbedded(LONG acpPos, REFGUID rguidService, REFIID riid, IUnknown **ppunk);
STDMETHODIMP InsertEmbedded(DWORD dwFlags, LONG acpStart, LONG acpEnd, IDataObject *pDataObject, TS_TEXTCHANGE *pChange);
STDMETHODIMP RequestSupportedAttrs(DWORD dwFlags, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs);
STDMETHODIMP RequestAttrsAtPosition(LONG acpPos, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, DWORD dwFlags);
STDMETHODIMP RequestAttrsTransitioningAtPosition(LONG acpPos, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, DWORD dwFlags);
STDMETHODIMP FindNextAttrTransition(LONG acpStart, LONG acpHalt, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs,
DWORD dwFlags, LONG *pacpNext, BOOL *pfFound, LONG *plFoundOffset);
STDMETHODIMP RetrieveRequestedAttrs(ULONG ulCount, TS_ATTRVAL *paAttrVals, ULONG *pcFetched);
STDMETHODIMP GetEndACP(LONG *pacp);
STDMETHODIMP GetActiveView(TsViewCookie *pvcView);
STDMETHODIMP GetACPFromPoint(TsViewCookie vcView, const POINT *pt, DWORD dwFlags, LONG *pacp);
STDMETHODIMP GetTextExt(TsViewCookie vcView, LONG acpStart, LONG acpEnd, RECT *prc, BOOL *pfClipped);
STDMETHODIMP GetScreenExt(TsViewCookie vcView, RECT *prc);
STDMETHODIMP GetWnd(TsViewCookie vcView, HWND *phwnd);
STDMETHODIMP QueryInsertEmbedded(const GUID *pguidService, const FORMATETC *pFormatEtc, BOOL *pfInsertable);
STDMETHODIMP InsertTextAtSelection(DWORD dwFlags, const WCHAR *pchText, ULONG cch, LONG *pacpStart,
LONG *pacpEnd, TS_TEXTCHANGE *pChange);
STDMETHODIMP InsertEmbeddedAtSelection(DWORD dwFlags, IDataObject *pDataObject, LONG *pacpStart,
LONG *pacpEnd, TS_TEXTCHANGE *pChange);
//
// ITxNotify
//
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();
//
// ITfContextOwnerCompositionSink
//
STDMETHODIMP OnStartComposition(ITfCompositionView *pComposition, BOOL *pfOk);
STDMETHODIMP OnUpdateComposition(ITfCompositionView *pComposition, ITfRange *pRangeNew);
STDMETHODIMP OnEndComposition(ITfCompositionView *pComposition);
//
// ITfMouseTrackerACP
//
STDMETHODIMP AdviseMouseSink(ITfRangeACP *pRangeACP, ITfMouseSink *pSink, DWORD *pdwCookie);
STDMETHODIMP UnadviseMouseSink(DWORD dwCookie);
//
// ITfEnableService
//
STDMETHODIMP IsEnabled(REFGUID rguidServiceCategory, CLSID clsidService, IUnknown *punkService, BOOL *pfOkToRun);
STDMETHODIMP GetId(GUID *pguidId);
//
// IServiceProvider
//
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv);
// Public
STDMETHODIMP Init();
void Uninit();
HRESULT GetAltDispAttrib(long lValue, ALTDISPLAYATTRIBUTE *pAltDispAttribute);
void OnSetFocus(BOOL fEnable = TRUE);
void CompleteUIMText();
BOOL IsUIMTyping() { return _fUIMTyping; };
STDMETHODIMP GetStoryLength(LONG *pacp);
int Reconverse();
HRESULT MouseCheck(UINT *pmsg, WPARAM *pwparam, LPARAM *plparam, LRESULT *plres);
ITfContext *GetITfContext() { return _pic; };
WORD _fUIMTyping : 1;
WORD _fReadLockOn : 1;
WORD _fWriteLockOn : 1;
WORD _fReadLockPending : 1;
WORD _fWriteLockPending : 1;
WORD _fAllowUIMLock : 1;
WORD _fAnyWriteOperation : 1;
WORD _fSelChangeEventPending : 1;
WORD _fLayoutEventPending : 1;
WORD _fModeBiasPending : 1;
WORD _fHoldCTFSelChangeNotify: 1;
WORD _fEndTyping : 1;
WORD _fInterimChar : 1;
WORD _fInsertTextAtSel : 1;
WORD _fShutDown : 1;
WORD _fMosueSink : 1;
short _cCallMgrLevels;
short _ase;
LONG _acpInterimStart;
LONG _acpInterimEnd;
LONG _cchComposition;
BSTR _bstrComposition;
LONG _acpBstrStart;
long _cObjects;
EMBEDOBJECT *_pObjects;
LONG _acpFocusRange;
LONG _cchFocusRange;
LONG _acpPreFocusRangeLast;
LONG _cchFocusRangeLast;
LONG _cpEnd;
ITextStoreACPSink *_ptss;
BOOL CTFOpenStatus(BOOL fGetStatus, BOOL fOpen);
CTFMOUSETRAP *_pSinkList; // Support for mouse trap operation
void NotifyService(); // Notify Cicero about services changes
private:
ULONG _crefs;
CTextMsgFilter *_pTextMsgFilter;
ITfDocumentMgr *_pdim;
ITfContext *_pic;
ITextFont *_pTextFont;
long _cpMin;
TfEditCookie _editCookie;
ITfDisplayAttributeMgr *_pDAM;
ITfCategoryMgr *_pCategoryMgr;
CTextEditSink *_pTextEditSink;
CUlColorArray *_pacrUl;
CITfEnumRange *_parITfEnumRange;
ITfContextRenderingMarkup *_pContextRenderingMarkup;
USHORT _uAttrsValCurrent;
USHORT _uAttrsValTotal;
TS_ATTRVAL *_parAttrsVal;
void InitAttrVarArray(BOOL fAllocData = TRUE);
BOOL GetExtentAcpPrange(ITfRange *ITfRangeIn, long &cpFirst, long &cpLim);
static HRESULT EndEditCallback(ITfEditRecord *pEditRecord, void *pv);
long GetUIMUnderline(TF_DISPLAYATTRIBUTE &da, long &idx, COLORREF &cr);
BOOL GetUIMAttributeColor(TF_DA_COLOR *pdac, COLORREF *pcr);
HRESULT HandlePropAttrib(IEnumTfRanges *pEnumRanges);
HRESULT HandleFocusRange(IEnumTfRanges *pEnumRanges);
HRESULT HandleLangID(IEnumTfRanges *pEnumRanges);
void OnUIMTypingDone();
BOOL GetGUIDATOMFromGUID(REFGUID rguid, TfGuidAtom *pguidatom);
int FindGUID(REFGUID guid);
BOOL PackAttrData(LONG idx, ITextFont *pITextFont, ITextPara *pITextPara, TS_ATTRVAL *pTSAttrVal);
HRESULT GetAttrs(LONG acpPos, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, BOOL fGetDefault);
void BuildHiddenTxtBlks(long &cpMin, long &cpMax, long **ppHiddenTxtBlk, long &cHiddenTxtBlk);
HRESULT FindHiddenText(long cp, long cpEnd, long &cpRange);
HRESULT FindUnhiddenText(long cp, long cpEnd, long &cpRange);
void HandleFinalString(ITfRange *pPropRange, long cp=0, long cch=0, BOOL fEndComposition = FALSE);
void HandleDispAttr(ITfRange *pITfRangeProp, VARIANT &var, long cp=0, long cch=0);
int BuildObject(ITextRange *pTextRange, BSTR bstr, EMBEDOBJECT **ppEmbeddObjects, int cSize);
void InsertTextandObject(ITextRange *pTextRange, BSTR bstr, EMBEDOBJECT *pEmbeddObjects, long cEmbeddedObjects);
void CleanUpObjects(long cObjects, EMBEDOBJECT *pObjects);
void HandleTempDispAttr(ITfEditRecord *pEditRecord);
void CleanUpComposition();
STDMETHODIMP InsertData(DWORD dwFlags, LONG acpStart, LONG acpEnd, const WCHAR *pchText, ULONG cch,
IDataObject *pDataObject, TS_TEXTCHANGE *pChange);
};
BOOL CreateUIM(CTextMsgFilter *pTextMsgFilter);
#endif // _CUIM_H