// // acp2anch.h // #ifndef ACP2ANCH_H #define ACP2ANCH_H #include "private.h" #include "strary.h" #include "ptrary.h" class CInputContext; class CAnchorRef; class CAnchor; class CACPWrap; extern const IID IID_PRIV_ACPWRAP; // PSEUDO_ESCB_SERIALIZE_ACP params typedef struct _SERIALIZE_ACP_PARAMS { CACPWrap *pWrap; ITfProperty *pProp; ITfRange *pRange; TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr; IStream *pStream; } SERIALIZE_ACP_PARAMS; // PSEUDO_ESCB_UNSERIALIZE_ACP params typedef struct _UNSERIALIZE_ACP_PARAMS { CACPWrap *pWrap; ITfProperty *pProp; const TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr; IStream *pStream; ITfPersistentPropertyLoaderACP *pLoaderACP; } UNSERIALIZE_ACP_PARAMS; ////////////////////////////////////////////////////////////////////////////// // // CLoaderACPWrap // ////////////////////////////////////////////////////////////////////////////// class CLoaderACPWrap : public ITfPersistentPropertyLoaderAnchor, public CComObjectRootImmx { public: CLoaderACPWrap(ITfPersistentPropertyLoaderACP *loader); ~CLoaderACPWrap(); BEGIN_COM_MAP_IMMX(CLoaderACPWrap) COM_INTERFACE_ENTRY(ITfPersistentPropertyLoaderAnchor) END_COM_MAP_IMMX() IMMX_OBJECT_IUNKNOWN_FOR_ATL() // ITfPersistentPropertyLoaderACP STDMETHODIMP LoadProperty(const TF_PERSISTENT_PROPERTY_HEADER_ANCHOR *pHdr, IStream **ppStream); private: ITfPersistentPropertyLoaderACP *_loader; DBG_ID_DECLARE; }; ////////////////////////////////////////////////////////////////////////////// // // CACPWrap // ////////////////////////////////////////////////////////////////////////////// class CACPWrap : public ITextStoreAnchor, public ITextStoreACPSink, public ITextStoreACPServices, public ITfMouseTrackerACP, public IServiceProvider { public: CACPWrap(ITextStoreACP *ptsi); ~CACPWrap(); // // IUnknown methods // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ITextStoreACPSink STDMETHODIMP OnTextChange(DWORD dwFlags, const TS_TEXTCHANGE *pChange); STDMETHODIMP OnSelectionChange(); STDMETHODIMP OnLayoutChange(TsLayoutCode lcode, TsViewCookie vcView); STDMETHODIMP OnStatusChange(DWORD dwFlags); STDMETHODIMP OnAttrsChange(LONG acpStart, LONG acpEnd, ULONG cAttrs, const TS_ATTRID *paAttrs); STDMETHODIMP OnLockGranted(DWORD dwLockFlags); STDMETHODIMP OnStartEditTransaction(); STDMETHODIMP OnEndEditTransaction(); // ITextStoreACPServices STDMETHODIMP Serialize(ITfProperty *pProp, ITfRange *pRange, TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr, IStream *pStream); STDMETHODIMP ForceLoadProperty(ITfProperty *pProp); STDMETHODIMP Unserialize(ITfProperty *pProp, const TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr, IStream *pStream, ITfPersistentPropertyLoaderACP *pLoader); STDMETHODIMP CreateRange(LONG acpStart, LONG acpEnd, ITfRangeACP **ppRange); // ITextStoreAnchor 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(IAnchor *paTestStart, IAnchor *paTestEnd, ULONG cch, IAnchor **ppaResultStart, IAnchor **ppaResultEnd); STDMETHODIMP GetSelection(ULONG ulIndex, ULONG ulCount, TS_SELECTION_ANCHOR *pSelection, ULONG *pcFetched); STDMETHODIMP SetSelection(ULONG ulCount, const TS_SELECTION_ANCHOR *pSelection); STDMETHODIMP GetText(DWORD dwFlags, IAnchor *paStart, IAnchor *paEnd, WCHAR *pchText, ULONG cchReq, ULONG *pcch, BOOL fUpdateAnchor); STDMETHODIMP SetText(DWORD dwFlags, IAnchor *paStart, IAnchor *paEnd, const WCHAR *pchText, ULONG cch); STDMETHODIMP GetFormattedText(IAnchor *paStart, IAnchor *paEnd, IDataObject **ppDataObject); STDMETHODIMP GetEmbedded(DWORD dwFlags, IAnchor *paPos, REFGUID rguidService, REFIID riid, IUnknown **ppunk); STDMETHODIMP QueryInsertEmbedded(const GUID *pguidService, const FORMATETC *pFormatEtc, BOOL *pfInsertable); STDMETHODIMP InsertEmbedded(DWORD dwFlags, IAnchor *paStart, IAnchor *paEnd, IDataObject *pDataObject); STDMETHODIMP RequestSupportedAttrs (DWORD dwFlags, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs); STDMETHODIMP RequestAttrsAtPosition(IAnchor *paPos, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, DWORD dwFlags); STDMETHODIMP RequestAttrsTransitioningAtPosition(IAnchor *paPos, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, DWORD dwFlags); STDMETHODIMP FindNextAttrTransition(IAnchor *paStart, IAnchor *paHalt, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, DWORD dwFlags, BOOL *pfFound, LONG *plFoundOffset); STDMETHODIMP RetrieveRequestedAttrs(ULONG ulCount, TS_ATTRVAL *paAttrVals, ULONG *pcFetched); STDMETHODIMP GetStart(IAnchor **ppaStart); STDMETHODIMP GetEnd(IAnchor **ppaEnd); STDMETHODIMP GetActiveView(TsViewCookie *pvcView); STDMETHODIMP GetAnchorFromPoint(TsViewCookie vcView, const POINT *pt, DWORD dwFlags, IAnchor **ppaSite); STDMETHODIMP GetTextExt(TsViewCookie vcView, IAnchor *paStart, IAnchor *paEnd, RECT *prc, BOOL *pfClipped); STDMETHODIMP GetScreenExt(TsViewCookie vcView, RECT *prc); STDMETHODIMP GetWnd(TsViewCookie vcView, HWND *phwnd); STDMETHODIMP InsertTextAtSelection(DWORD dwFlags, const WCHAR *pchText, ULONG cch, IAnchor **ppaStart, IAnchor **ppaEnd); STDMETHODIMP InsertEmbeddedAtSelection(DWORD dwFlags, IDataObject *pDataObject, IAnchor **ppaStart, IAnchor **ppaEnd); // ITfMouseTrackerACP STDMETHODIMP AdviseMouseSink(ITfRangeACP *range, ITfMouseSink *pSink, DWORD *pdwCookie); STDMETHODIMP UnadviseMouseSink(DWORD dwCookie); // IServiceProvider STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv); HRESULT _Serialize(ITfProperty *pProp, ITfRange *pRange, TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr, IStream *pStream); HRESULT _Unserialize(ITfProperty *pProp, const TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr, IStream *pStream, ITfPersistentPropertyLoaderACP *pLoader); void _OnLockReleased(); CAnchorRef *_CreateAnchorACP(LONG acp, TsGravity gravity); CAnchorRef *_CreateAnchorAnchor(CAnchor *pa, TsGravity gravity); ITextStoreACP *_GetTSI() { return _ptsi; } void _Dbg_AssertNoAppLock() { #ifdef DEBUG Assert(!_Dbg_fAppHasLock); // if we get here, it means the app has called OnTextChange // and someone (prob. the app) is trying to use a range object before calling // OnLockGranted (cicero will have asked for a lock inside OnTextChange). #endif } HRESULT _ACPHdrToAnchor(const TF_PERSISTENT_PROPERTY_HEADER_ACP *pHdr, TF_PERSISTENT_PROPERTY_HEADER_ANCHOR *phanch); void _OnAnchorRelease() { if (_cRef == 0 && _GetAnchorRef() == 0) { delete this; } } BOOL _IsDisconnected() { return (_ptsi == NULL); } CInputContext *_GetContext() { return _pic; } void _NormalizeAnchor(CAnchor *pa); BOOL _InOnTextChange() { return _fInOnTextChange; } private: friend CLoaderACPWrap; friend CAnchor; friend CAnchorRef; void _PostInsertUpdate(LONG acpStart, LONG acpEnd, ULONG cch, const TS_TEXTCHANGE *ptsTextChange); static BOOL _AnchorHdrToACP(const TF_PERSISTENT_PROPERTY_HEADER_ANCHOR *phanch, TF_PERSISTENT_PROPERTY_HEADER_ACP *phacp); LONG _GetAnchorRef() { return _GetCount(); } CAnchor *_FindWithinPendingRange(LONG acp) { int iIndex; Assert(_lPendingDelta != 0); Assert(_lPendingDeltaIndex < _rgAnchors.Count()); return _FindInnerLoop(acp, _lPendingDeltaIndex+1, _rgAnchors.Count(), &iIndex); } HRESULT _Insert(CAnchorRef *par, LONG ich); HRESULT _Insert(CAnchorRef *par, CAnchor *pa); void _Remove(CAnchorRef *par); void _Update(const TS_TEXTCHANGE *pdctc); void _Renormalize(int ichStart, int ichEnd); LONG _GetCount() { return _rgAnchors.Count(); } void _DragAnchors(LONG acpFrom, LONG acpTo); LONG _GetPendingDelta() { return _lPendingDelta; } LONG _GetPendingDeltaIndex() { return _lPendingDeltaIndex; } CAnchor *_GetPendingDeltaAnchor() { return _rgAnchors.Get(_lPendingDeltaIndex); } BOOL _IsPendingDelta() { return _lPendingDelta != 0 && _lPendingDeltaIndex < _rgAnchors.Count(); } CAnchor *_Find(int ich, int *piOut = NULL); CAnchor *_FindInnerLoop(LONG acp, int iMin, int iMax, int *piIndex); int _Update(CAnchor *pa, int ichNew, int iOrg, CAnchor *paInto, int iInto); void _Merge(CAnchor *paInto, CAnchor *paFrom); void _Delete(CAnchor *pa); void _AdjustIchs(int iFirst, int dSize); void _TrackDelHistory(int iEndOrg, BOOL fExactEndOrgMatch, int iEndNew, BOOL fExactEndNewMatch); #ifdef DEBUG void _Dbg_AssertAnchors(); #else void _Dbg_AssertAnchors() {} #endif BOOL _fInOnTextChange : 1; // TRUE if we're inside OnTextChange CPtrArray _rgAnchors; LONG _lPendingDeltaIndex; LONG _lPendingDelta; ITextStoreACP *_ptsi; ITextStoreAnchorSink *_ptss; CInputContext *_pic; LONG _cRef; #ifdef DEBUG BOOL _Dbg_fAppHasLock; #endif DBG_ID_DECLARE; }; #endif // ACP2ANCH_H