/*++ Copyright (c) 2001, Microsoft Corporation Module Name: context.h Abstract: This file defines the CicInputContext Interface Class. Author: Revision History: Notes: --*/ #ifndef _CONTEXT_H_ #define _CONTEXT_H_ #include "tls.h" #include "template.h" #include "boolean.h" #include "imc.h" #include "ctxtcomp.h" #include "globals.h" #include "modebias.h" #define ArrayZeroInit(x) memset(&(x), 0, sizeof(x)); class CicInputContext; class CInputContextOwnerCallBack; class CTextEventSinkCallBack; class CThreadMgrEventSink_ICCallBack; class CKbdOpenCloseEventSink; class CCandidateWndOpenCloseEventSink; class CStartReconversionNotifySink; class CModeBias; typedef struct tagCTFIMECONTEXT { CicInputContext* m_pCicContext; BOOL m_fInDestroy : 1; } CTFIMECONTEXT, *PCTFIMECONTEXT; class CicInputContext : public ITfCleanupContextSink, public ITfContextOwnerCompositionSink, public ITfCompositionSink { public: CicInputContext(TfClientId tid, LIBTHREAD* pLibTLS, HIMC hIMC) : m_tid(tid), m_pLibTLS(pLibTLS), m_hIMC(hIMC) { m_ref = 1; m_fQueryPos = IME_QUERY_POS_UNKNOWN; } virtual ~CicInputContext() { } // // IUnknown methods // public: STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // // ITfCleanupContextSink methods // STDMETHODIMP OnCleanupContext(TfEditCookie ecWrite, ITfContext *pic); // // ITfContextOwnerCompositionSink // STDMETHODIMP OnStartComposition(ITfCompositionView *pComposition, BOOL *pfOk); STDMETHODIMP OnUpdateComposition(ITfCompositionView *pComposition, ITfRange *pRangeNew); STDMETHODIMP OnEndComposition(ITfCompositionView *pComposition); // // ITfCompositionSink // STDMETHODIMP OnCompositionTerminated(TfEditCookie ecWrite, ITfComposition* pComposition); public: HRESULT CreateInputContext(ITfThreadMgr_P* ptim_P, IMCLock& imc); HRESULT DestroyInputContext(); void GenerateMessage(IMCLock& imc); BOOL SetCompositionString(IMCLock& imc, ITfThreadMgr_P* ptim_P, DWORD dwIndex, void* pComp, DWORD dwCompLen, void* pRead, DWORD dwReadLen, UINT cp); // // Cicero's context // public: ITfContext* GetInputContext() { return m_pic; } ITfDocumentMgr* GetDocumentManager() { return m_pdim; } ITfContextOwnerServices* GetInputContextOwnerSink() { return m_piccb; } // // ref count. // private: long m_ref; // // hIMC // private: HIMC m_hIMC; // // Cicero's context // private: ITfDocumentMgr *m_pdim; // Document Manager ITfContext *m_pic; // Input Context ITfContextOwnerServices *m_piccb; // Context owner service from m_pic // // Cicero's event sink callback // private: CInputContextOwnerCallBack *m_pICOwnerSink; // IC owner call back CTextEventSinkCallBack *m_pTextEventSink; // Text event sink callback CKbdOpenCloseEventSink *m_pKbdOpenCloseEventSink; // Kbd TIP Open/Close Compartment event sink callback CCandidateWndOpenCloseEventSink *m_pCandidateWndOpenCloseEventSink; // Candidate UI Window Open/Close Compartment event sink callback CStartReconversionNotifySink *m_pStartReconvSink; // // Reconvert // public: HRESULT SetupReconvertString(IMCLock& imc, ITfThreadMgr_P* ptim_P, UINT cp, UINT uPrivMsg, BOOL fUndoComposition); HRESULT EndReconvertString(IMCLock& imc); HRESULT DelayedReconvertFuncCall(IMCLock &imc); private: HRESULT _ReconvertStringNegotiation(IMCLock& imc, ITfThreadMgr_P* ptim_P, UINT cp, UINT uPrivMsg, BOOL fUndoComposition); HRESULT _ReconvertStringTextStore(IMCLock& imc, ITfThreadMgr_P* ptim_P, UINT uPrivMsg); HRESULT MakeReconversionFuncCall( IMCLock& imc, ITfThreadMgr_P* ptim_P, CWReconvertString &wReconvStr, BOOL fCallFunc); CWCompString m_PrevResultStr; public: void UpdatePrevResultStr(IMCLock& imc) { IMCCLock pCompStr((HIMCC)imc->hCompStr); m_PrevResultStr.RemoveAll(); m_PrevResultStr.AddCompData( (WCHAR *)pCompStr.GetOffsetPointer(pCompStr->dwResultStrOffset), pCompStr->dwResultStrLen); } private: static HRESULT Internal_QueryReconvertString_ICOwnerSink(UINT uCode, ICOARGS *pargs, VOID *pv); HRESULT Internal_QueryReconvertString(IMCLock& imc, ITfThreadMgr_P* ptim_P, RECONVERTSTRING* pReconv, UINT cp, BOOL fNeedAW); HRESULT Internal_ReconvertString(IMCLock& imc, ITfThreadMgr_P* ptim_P, CWReconvertString& wReconvStr, CWReconvertString& wReconvReadStr); HRESULT Internal_SetCompositionString(IMCLock& imc, CWCompString& wCompStr, CWCompString& wCompReadStr); // // Document Feeding // public: HRESULT SetupDocFeedString(IMCLock& imc, UINT cp); HRESULT ClearDocFeedBuffer(IMCLock& imc, BOOL fSync = TRUE) { return EscbClearDocFeedBuffer(imc, fSync); } // // Undo composition string // public: HRESULT SetupUndoCompositionString(IMCLock& imc, ITfThreadMgr_P* ptim_P, UINT cp) { return SetupReconvertString(imc, ptim_P, cp, 0, TRUE); /* 0 == Don't need ITfFnReconvert */ } HRESULT EndUndoCompositionString(IMCLock& imc) { return EndReconvertString(imc); } // // QueryCharPos // public: typedef enum { IME_QUERY_POS_UNKNOWN = 0, IME_QUERY_POS_NO = 1, IME_QUERY_POS_YES = 2 } IME_QUERY_POS; HRESULT InquireIMECharPosition(LANGID langid, IMCLock& imc, IME_QUERY_POS* pfQueryPos); HRESULT RetrieveIMECharPosition(IMCLock& imc, IMECHARPOSITION* ip); HRESULT ResetIMECharPosition() { m_fQueryPos = IME_QUERY_POS_UNKNOWN; return S_OK; } private: BOOL QueryCharPos(IMCLock& imc, IMECHARPOSITION* position); // // Apps support QueryCharPos(). // IME_QUERY_POS m_fQueryPos; // // Generate message // public: UINT TranslateImeMessage(IMCLock& imc, LPTRANSMSGLIST lpTransMsgList = NULL); CFirstInFirstOut *m_pMessageBuffer; // // Mouse sink // LRESULT MsImeMouseHandler(ULONG uEdge, ULONG uQuadrant, ULONG dwBtnStatus, IMCLock& imc); // // Mode bias // public: CModeBias m_ModeBias; // // Flags // public: CBoolean m_fStartComposition; // TRUE: already sent WM_IME_STARTCOMPOSITION. CBoolean m_fOpenCandidateWindow; // TRUE: opening candidate list window. CBoolean m_fInReconvertEditSession; // TRUE: In reconvert edit session. CBoolean m_fInClearDocFeedEditSession; // TRUE: In ClearDocFeed edit session. CBoolean m_fInCompComplete; // TRUE: In CompComplete running. CBoolean m_fInUpdateComposition; // TRUE: In UpdateComposition running. CBoolean m_fHanjaReConversion; #if 0 CBoolean m_fHanjaRequested; #endif #ifdef UNSELECTCHECK CBoolean m_fSelected; // TRUE: if this context is selected. #endif UNSELECTCHECK CBoolean m_fOpenStatusChanging; CBoolean m_fKorImxModeChanging; CBoolean m_fGeneratedEndComposition; CBoolean m_fInProcessKey; CBoolean m_fInToAsciiEx; CBoolean m_fSelectingInSelectEx; CBoolean m_fInDocFeedReconvert; // TRUE: In CFnDocFeed::StartReconvert function. // // ITfContextOwnerCompositionSink // public: CBoolean m_fModifyingDoc; int m_cCompositions; public: CBoolean m_fConversionSentenceModeChanged; CBoolean m_fOnceModeChanged; UINT m_nInConversionModeChangingRef; UINT m_nInConversionModeResetRef; // // IME share. // public: HRESULT GetGuidAtom(IMCLock& imc, BYTE bAttr, TfGuidAtom* atom); HRESULT MapAttributes(IMCLock& imc); VOID ClearGuidMap() { usGuidMapSize = 0; memset(&aGuidMap, 0, sizeof aGuidMap); } // // Default Key Handling // public: BOOL WantThisKey(UINT uVirtKey); private: BOOL IsTopNow() { BOOL bRet = FALSE; ITfContext *pic; if (SUCCEEDED(m_pdim->GetTop(&pic))) { bRet = (pic == m_pic) ? TRUE : FALSE; pic->Release(); } return bRet; } private: USHORT usGuidMapSize; TfGuidAtom aGuidMap[256]; // GUIDATOM map to IME Attribute static const USHORT ATTR_LAYER_GUID_START = ATTR_FIXEDCONVERTED + 1; // // previous candidate position // private: HWND m_hwndPrevCandidatePos; RECT m_rcPrevAppPosForCandidatePos; CANDIDATEFORM m_cfPrevCandidatePos; RECT m_rcPrevAppCandidatePos; public: HRESULT OnSetCandidatePos(TLS* ptls, IMCLock& imc); void ClearPrevCandidatePos() { m_hwndPrevCandidatePos = NULL; ArrayZeroInit(m_rcPrevAppPosForCandidatePos); ArrayZeroInit(m_cfPrevCandidatePos); ArrayZeroInit(m_rcPrevAppCandidatePos); ResetIMECharPosition(); } // // Edit session helper // public: HRESULT EscbHandleThisKey(IMCLock& imc, UINT uVirtKey) { return ::EscbHandleThisKey(imc, m_tid, m_pic, m_pLibTLS, uVirtKey); } HRESULT EscbCompComplete(IMCLock& imc) { return ::EscbCompComplete(imc, m_tid, m_pic, m_pLibTLS, TRUE); } HRESULT EscbCompCancel(IMCLock& imc) { return ::EscbCompCancel(imc, m_tid, m_pic, m_pLibTLS); } HRESULT EscbGetSelection(IMCLock& imc, Interface* selection) { return ::EscbGetSelection(imc, m_tid, m_pic, m_pLibTLS, selection); } HRESULT EscbReadOnlyPropMargin(IMCLock& imc, Interface* range_acp, LONG* pcch) { return ::EscbReadOnlyPropMargin(imc, m_tid, m_pic, m_pLibTLS, range_acp, pcch); } protected: HRESULT EscbUpdateCompositionString(IMCLock& imc) { return ::EscbUpdateCompositionString(imc, m_tid, m_pic, m_pLibTLS, 0, 0); } HRESULT EscbReplaceWholeText(IMCLock& imc, CWCompString* wCompString) { return ::EscbReplaceWholeText(imc, m_tid, m_pic, m_pLibTLS, wCompString); } HRESULT EscbClearDocFeedBuffer(IMCLock& imc, BOOL fSync = TRUE) { return ::EscbClearDocFeedBuffer(imc, *this, m_tid, m_pic, m_pLibTLS, fSync); } HRESULT EscbQueryReconvertString(IMCLock& imc, Interface_Attach local_pic, CWReconvertString* wReconvertString, Interface* selection) { return ::EscbQueryReconvertString(imc, m_tid, local_pic, m_pLibTLS, wReconvertString, selection); } HRESULT EscbReconvertString(IMCLock& imc, CWReconvertString* wReconvertString, Interface* selection, BOOL fDocFeedOnly) { return ::EscbReconvertString(imc, m_tid, m_pic, m_pLibTLS, wReconvertString, selection, fDocFeedOnly); } HRESULT EscbCalcRangePos(IMCLock& imc, Interface_Attach local_pic, CWReconvertString* wReconvertString, Interface* range) { return ::EscbCalcRangePos(imc, m_tid, local_pic, m_pLibTLS, wReconvertString, range); } // // Edit session friend // private: friend HRESULT EscbHandleThisKey(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, UINT uVirtKey); friend HRESULT EscbCompComplete(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, BOOL fSync); friend HRESULT EscbCompCancel(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS); friend HRESULT EscbUpdateCompositionString(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, DWORD dwDeltaStart, DWORD dwFlags); friend HRESULT EscbReplaceWholeText(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, CWCompString* wCompString); friend HRESULT EscbReconvertString(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, CWReconvertString* wReconvertString, Interface* selection, BOOL fDocFeedOnly); friend HRESULT EscbClearDocFeedBuffer(IMCLock& imc, CicInputContext& CicContext, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, BOOL fSync); friend HRESULT EscbGetSelection(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, Interface* selection); friend HRESULT EscbQueryReconvertString(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, CWReconvertString* wReconvertString, Interface* selection); friend HRESULT EscbCalcRangePos(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, CWReconvertString* wReconvertString, Interface* range); friend HRESULT EscbReadOnlyPropMargin(IMCLock& imc, TfClientId tid, Interface_Attach pic, LIBTHREAD* pLibTLS, Interface* range_acp, LONG* pcch); private: TfClientId m_tid; LIBTHREAD* m_pLibTLS; }; #endif // _CONTEXT_H_