// // fnrecon.h // #ifndef FNRECON_H #define FNRECON_H #include "private.h" #include "ctffunc.h" #include "sapilayr.h" #include "candlist.h" #include "mscandui.h" #include "ptrary.h" #include "lmobj.h" #include "propstor.h" #include "strary.h" #include "TabletTip.h" #define OPTION_REPLAY 0 #define OPTION_DELETE 1 #define OPTION_REDO 2 class CSapiIMX; class CCandUIFilterEventSink; class CCandUIExtButtonEventSink; class CSapiAlternativeList ; ////////////////////////////////////////////////////////////////////////////// // // CFunction // ////////////////////////////////////////////////////////////////////////////// class CFunction { public: CFunction(CSapiIMX *pImx); ~CFunction(); protected: BOOL GetFocusedTarget(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, BOOL bAdjust, ITfRange **ppRangeTmp); HRESULT _GetLangIdFromRange(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, LANGID *plangid); friend CSapiIMX; CSapiIMX *m_pImx; long m_cRef; }; // // The member functions in this class are extracted from CFnReconversion, // We create this new class for a separate functionality that computes best prop range // for the given selected range. // This Class could be inherited by CFnReconversion and CSapiPlayBack. // class __declspec(novtable) CBestPropRange { public: CBestPropRange( ) { m_MaxCandChars = 0; } ~CBestPropRange( ) { } HRESULT _ComputeBestFitPropRange(TfEditCookie ec, ITfProperty *pProp, ITfRange *pRange, ITfRange **ppBestPropRange, ULONG *pulStart, ULONG *pulcElem); ULONG _GetMaxCandidateChars( ); private: ULONG m_MaxCandChars; }; class CFnReconversion : public ITfFnReconversion, public CFunction, public CMasterLMWrap, public CBestPropRange { public: CFnReconversion(CSapiIMX *psi); ~CFnReconversion(); // // IUnknown methods // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // // ITfFunction // STDMETHODIMP GetDisplayName(BSTR *pbstrCand); // // ITfFnReconversion // STDMETHODIMP QueryRange(ITfRange *pRange, ITfRange **ppNewRange, BOOL *pfConvertable); STDMETHODIMP GetReconversion(ITfRange *pRange, ITfCandidateList **ppCandList); STDMETHODIMP Reconvert(ITfRange *pRange); static HRESULT SetResult(ITfContext *pic, ITfRange *pRange, CCandidateString *pCand, TfCandidateResult imcr); static HRESULT SetOption(ITfContext *pic, ITfRange *pRange, CCandidateString *pCand, TfCandidateResult imcr); HRESULT _Reconvert(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, BOOL *pfCallLMReconvert); HRESULT _GetReconversion(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, ITfCandidateList **ppCandList, BOOL fDisableEngine = FALSE); HRESULT _QueryReconversion(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, ITfRange **ppNewRange); void _SetCurrentLangID(LANGID langid) { m_langid = langid;} HRESULT GetCandidateForRange(CSapiAlternativeList *psal, ITfContext *pic, ITfRange *pRange, ITfCandidateList **ppCandList) ; void _Commit(CCandidateString *pcand); CSapiAlternativeList *GetCSapiAlternativeList( ) { return m_psal; } HRESULT CFnReconversion::_GetSapilayrEngineInstance(ISpRecognizer **ppRecoEngine); friend CCandUIFilterEventSink; friend CCandUIExtButtonEventSink; // TABLET PC HRESULT GetTabletTip(void); CComPtr m_cpTabletTip; private: HRESULT ShowCandidateList(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, ITfCandidateList *pCandList); LANGID m_langid; CSapiAlternativeList *m_psal; CComPtr m_cpRecoResult; }; class CCandUIFilterEventSink : public ITfCandUIAutoFilterEventSink { public: CCandUIFilterEventSink(CFnReconversion *pfnReconv, ITfContext *pic, ITfCandidateUI *pCandUI) { m_pic = pic; m_pic->AddRef(); m_pfnReconv = pfnReconv; m_pfnReconv->AddRef(); m_pCandUI = pCandUI; m_cRef = 1; } ~CCandUIFilterEventSink() { SafeRelease(m_pic); SafeRelease(m_pfnReconv); } // // IUnknown methods // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // // ITfCandUIAutoFilterEventSink // STDMETHODIMP OnFilterEvent(CANDUIFILTEREVENT ev); // STDMETHODIMP OnAddCharToFilterStringEvent(CANDUIFILTEREVENT ev, WCHAR wch, int nItemVisible, BOOL *bEten); ITfContext *m_pic; private: CFnReconversion *m_pfnReconv; ITfCandidateUI *m_pCandUI; long m_cRef; }; class CSapiAlternativeList { public: CSapiAlternativeList(LANGID langid, ITfRange *pRange, ULONG ulMaxCandChars); ~CSapiAlternativeList(); int GetNumItem(); HRESULT SetPhraseAlt(CRecoResultWrap *pResWrap, ISpPhraseAlt **ppAlt, ULONG cAlt, ULONG ulStart, ULONG ulcElem, WCHAR *pwszParent); HRESULT GetCachedAltInfo(ULONG nId, ULONG *pulParentStart, ULONG *pulcParentElements, ULONG *pulcElements, WCHAR **ppwszText, ULONG *pulLeadSpaceRemoved=NULL); HRESULT GetAlternativeText(ISpPhraseAlt *pAlt, SPPHRASE *pPhrases, BOOL fFirstAlt, ULONG ulStartElem, ULONG ulNumElems, WCHAR *pwszAlt, int cchAlt, ULONG *pulLeadSpaceRemoved); HRESULT GetProbability(int nId, int * nProb); HRESULT AddLMAlternates(CLMAlternates *pLMAlt); BOOL IsSameRange(ITfRange *pRange, TfEditCookie ec) { Assert(m_cpRange); BOOL fEq = FALSE; HRESULT hr = pRange->IsEqualStart(ec, m_cpRange, TF_ANCHOR_START, &fEq); if (S_OK == hr ) { if (fEq) { hr = pRange->IsEqualEnd(ec, m_cpRange, TF_ANCHOR_END, &fEq); } } return S_OK == hr && fEq; } void _Commit(ULONG nIdx, ISpRecoResult *pRecoResult); // Keep the current selection index // void _SaveCurrentSelectionIndex(ULONG ulIndexSelect) { m_ulIndexSelect = ulIndexSelect; } void _Speak(void) { if( m_cpwrp ) { ULONG ulParentStart=0, ulParentNumElems=0; if ( S_OK == GetCachedAltInfo(m_ulIndexSelect, &ulParentStart, &ulParentNumElems, NULL, NULL) ) { m_cpwrp->_SpeakAudio(ulParentStart, ulParentNumElems); } } } HRESULT _ProcessTrailingSpaces(SPPHRASE *pPhrases, ULONG ulNextElem, WCHAR *pwszAlt); CRecoResultWrap *GetResultWrap() { return m_cpwrp; } BOOL _GetUIFont(BOOL fVerticalWriting, LOGFONTW * plf); BOOL _IsFirstAltInCandidate( ) { return m_fFirstAltInCandidate; } BOOL _IsNoAlternate( ) { return m_fNoAlternate; } int _GetFakeAltIndex( ) { return m_iFakeAlternate; } private: int m_nItem; ULONG m_ulStart; ULONG m_ulcElem; ISpPhraseAlt **m_ppAlt; ULONG m_cAlt; CComPtr m_cpRange; CPtrArray *m_prgLMAlternates; typedef struct { ULONG ulParentStart; ULONG ulcParentElements; ULONG ulcElements; ULONG ulLeadSpaceRemoved; // the number of leading space to remove. WCHAR *pwszAltText; } SPELEMENTUSED; CStructArray m_rgElemUsed; LANGID m_langid; CComPtr m_cpwrp; BOOL m_fFirstAltInCandidate; BOOL m_fNoAlternate; int m_iFakeAlternate; ULONG m_MaxCandChars; ULONG m_ulIndexSelect; // keep the index of the current selection in the candidate Window. }; #define NO_FAKEALT -1 #endif // FNRECON_H