// // candui.h // #ifndef CANDUI_H #define CANDUI_H #include "private.h" #include "mscandui.h" #include "globals.h" #include "ico.h" #include "tes.h" #include "editcb.h" #include "cuilib.h" #include "candmgr.h" #include "candprop.h" #include "candext.h" #include "candkey.h" #include "candobj.h" #include "candfunc.h" #include "wcand.h" #include "sptask.h" #include "candcomp.h" // // // #define ESCB_RESETTARGETPOS 0 #define ESCB_COMPARERANGEANDCLOSECANDIDATE 1 #define ESCB_TEXTEVENT 2 class CSpTask; // // CCandidateUI // class CCandidateUI : public ITfCandidateUI, public ITfContextOwner, public ITfContextKeyEventSink, public ITfTextEditSink, public ITfTextLayoutSink, public ITfEditTransactionSink, public CComObjectRoot_CreateInstance, public CCandListMgr, public CCandUIObjectMgr, public CCandUIPropertyMgr, public CCandUICompartmentMgr, public CCandUIFunctionMgr, public CCandUIExtensionMgr { public: CCandidateUI( void ); virtual ~CCandidateUI( void ); BEGIN_COM_MAP_IMMX( CCandidateUI ) COM_INTERFACE_ENTRY( ITfCandidateUI ) COM_INTERFACE_ENTRY( ITfContextOwner ) COM_INTERFACE_ENTRY( ITfContextKeyEventSink ) COM_INTERFACE_ENTRY( ITfTextEditSink ) COM_INTERFACE_ENTRY( ITfTextLayoutSink ) COM_INTERFACE_ENTRY( ITfEditTransactionSink ) END_COM_MAP_IMMX() ITfThreadMgr *_ptim; // // ITfCandidateUIEx methods // STDMETHODIMP SetClientId( TfClientId tid ); STDMETHODIMP OpenCandidateUI( HWND hWnd, ITfDocumentMgr *pdim, TfEditCookie ec, ITfRange *pRange ); STDMETHODIMP CloseCandidateUI( void ); STDMETHODIMP SetCandidateList( ITfCandidateList *pCandList ); STDMETHODIMP SetSelection( ULONG nIndex ); STDMETHODIMP GetSelection( ULONG *pnIndex ); STDMETHODIMP SetTargetRange( ITfRange *pRange ); STDMETHODIMP GetTargetRange( ITfRange **ppRange ); STDMETHODIMP GetUIObject( REFIID riid, IUnknown **ppunk ); STDMETHODIMP GetFunction( REFIID riid, IUnknown **ppunk ); STDMETHODIMP ProcessCommand( CANDUICOMMAND cmd, INT iParam ); // key config function methods HRESULT SetKeyTable( ITfContext *pic, ITfCandUIKeyTable *pCandUIKeyTable ); HRESULT GetKeyTable( ITfContext *pic, ITfCandUIKeyTable **ppCandUIKeyTable ); HRESULT ResetKeyTable( ITfContext *pic ); // UI config function methods HRESULT SetUIStyle( ITfContext *pic, CANDUISTYLE style ); HRESULT GetUIStyle( ITfContext *pic, CANDUISTYLE *pstyle ); HRESULT SetUIOption( ITfContext *pic, DWORD dwOption ); HRESULT GetUIOption( ITfContext *pic, DWORD *pdwOption ); // // input context eventsink // HRESULT InitContextEventSinks( ITfContext *pic ); HRESULT DoneContextEventSinks( ITfContext *pic ); STDMETHODIMP GetACPFromPoint( const POINT *pt, DWORD dwFlags, LONG *pacp ); STDMETHODIMP GetScreenExt( RECT *prc ); STDMETHODIMP GetTextExt( LONG acpStart, LONG acpEnd, RECT *prc, BOOL *pfClipped ); STDMETHODIMP GetStatus( TF_STATUS *pdcs ); STDMETHODIMP GetWnd( HWND *phwnd ); STDMETHODIMP GetAttribute( REFGUID rguidAttribute, VARIANT *pvarValue ); STDMETHODIMP OnKeyDown( WPARAM wParam, LPARAM lParam, BOOL *pfEaten ); STDMETHODIMP OnKeyUp( WPARAM wParam, LPARAM lParam, BOOL *pfEaten ); STDMETHODIMP OnTestKeyDown( WPARAM wParam, LPARAM lParam, BOOL *pfEaten ); STDMETHODIMP OnTestKeyUp( WPARAM wParam, LPARAM lParam, BOOL *pfEaten ); static HRESULT TextEventCallback( UINT uCode, VOID *pv, VOID *pvData ); // // text eventsink // HRESULT InitTextEventSinks( ITfContext *pic ); HRESULT DoneTextEventSinks( ITfContext *pic ); STDMETHODIMP OnEndEdit( ITfContext *pic, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord ); STDMETHODIMP OnLayoutChange( ITfContext *pic, TfLayoutCode lcode, ITfContextView *pView ); STDMETHODIMP OnStartEditTransaction( ITfContext *pic ); STDMETHODIMP OnEndEditTransaction( ITfContext *pic ); // // edit session callback // static HRESULT EditSessionCallback( TfEditCookie ec, CEditSession *pes ); void ClearWndCand( void ) { if (m_pCandWnd) { m_pCandWnd->Release(); m_pCandWnd = NULL; } } // accessed from CCandWnd HRESULT NotifyCancelCand( void ); HRESULT NotifySelectCand( int iCandItem ); HRESULT NotifyCompleteOption( int iCandItem ); HRESULT NotifyCompleteCand( int iCandItem ); HRESULT NotifyExtensionEvent( int iExtension, DWORD dwCommand, LPARAM lParam ); HRESULT NotifyFilteringEvent( CANDUIFILTEREVENT ev ); HRESULT NotifySortEvent( CANDUISORTEVENT sort ); HRESULT NotifyCompleteRawData( void ); HRESULT NotifyCompleteExtraCand( void ); void EndCandidateList(); HRESULT NotifySpeechCmd(SPPHRASE *pPhrase, const WCHAR *pszRuleName, ULONG ulRuleId); HRESULT FHandleSpellingChar( WCHAR ch ); void EnsureSpeech(void); HRESULT CreateCandWindowObject( ITfContext *pic, CCandWindowBase** ppCandWnd ); HRESULT InitCandWindow( void ); __inline CCandListMgr *GetCandListMgr( void ) { return this; } __inline CCandUIObjectMgr *GetUIObjectMgr( void ) { return this; } __inline CCandUIPropertyMgr *GetPropertyMgr( void ) { return this; } __inline CCandUICompartmentMgr *GetCompartmentMgr( void ) { return this; } __inline CCandUIFunctionMgr *GetFunctionMgr( void ) { return this; } __inline CCandUIExtensionMgr *GetExtensionMgr( void ) { return this; } void PostCommand( CANDUICOMMAND cmd, INT iParam ); __inline CCandWindowBase *GetCandWindow( void ) { return m_pCandWnd; } protected: // internal use HRESULT CloseCandidateUIProc( void ); HRESULT CallSetOptionResult( int nIndex, TfCandidateResult imcr ); HRESULT CallSetResult( int nIndex, TfCandidateResult imcr ); HRESULT OnKeyEvent( UINT uCode, WPARAM wParam, LPARAM lParam, BOOL *pfEaten ); BOOL FHandleKeyEvent( UINT uCode, UINT uVKey, BYTE *pbKeyState, BOOL *pfEatKey ); BOOL HandleTextDeltas( TfEditCookie ec, ITfContext *pic, IEnumTfRanges *pEnumText ); // void SetSelectionCur( ITfRange *pRange ); void ClearSelectionCur( void ); ITfRange *GetSelectionCur( void ); // transaction functions void SetSelectionStart( ITfRange *pRange ); void ClearSelectionStart( void ); ITfRange *GetSelectionStart( void ); void EnterEditTransaction( ITfRange *pSelection ); void LeaveEditTransaction( void ); __inline BOOL IsInEditTransaction( void ) { return m_fInTransaction; } // filtering functions BOOL FHandleFilteringKey( UINT uCode, UINT uVKey, BYTE *pbKeyState, BOOL *pfEatKey ); HRESULT AddFilteringChar( WCHAR wch, BOOL *pfUpdateList ); HRESULT DelFilteringChar( BOOL *pfUpdateList ); HRESULT FilterCandidateList( void ); // WCHAR CharFromKey( UINT uVKey, BYTE *pbKeyState ); CCandUIKeyTable *GetKeyTableProc( ITfContext *pic ); void CommandFromKey( UINT uVkey, BYTE *pbKeyState, CANDUICOMMAND *pcmd, UINT *pParam ); void CommandFromRule( LPCWSTR szRule, CANDUICOMMAND *pcmd, UINT *pParam ); // members CCandUIKeyTable *m_pCandUIKeyTable; TfClientId m_tidClient; ITfContext *m_pic; ITfDocumentMgr *m_pdim; HWND m_hWndParent; CCandWindowBase *m_pCandWnd; ITfContext *m_picParent; ITfRange *m_pTargetRange; UINT m_codepage; // BOOL m_fContextEventSinkAdvised; DWORD m_dwCookieContextOwnerSink; DWORD m_dwCookieContextKeySink; // BOOL m_fTextEventSinkAdvised; DWORD m_dwCookieTextEditSink; DWORD m_dwCookieTextLayoutSink; DWORD m_dwCookieTransactionSink; // CTextEventSink *m_pTextEventSink; // ITfRange *m_pSelectionCur; // BOOL m_fInTransaction; ITfRange *m_pSelectionStart; // BOOL m_fInCallback; CSpTask *m_pSpTask; }; #endif // CANDUI_H