/**************************************************************************\ * Module Name: softkbdimx.cpp * * Copyright (c) 1985 - 2000, Microsoft Corporation * * Declaration of Soft Keyboard Input TIP class. * * History: * 28-March-2000 weibz Created \**************************************************************************/ #ifndef SOFTKBDIMX_H #define SOFTKBDIMX_H #include "private.h" #include "globals.h" #include "dap.h" #include "computil.h" #include "resource.h" #include "softkbd.h" #include "nui.h" #include "immxutil.h" class CCommandEventSink; class CEditSession; class CThreadMgrEventSink; class CSoftKeyboardEventSink; class CSoftKbdWindowEventSink; class CFunctionProvider; class CActiveLanguageProfileNotifySink; class CLanguageProfileNotifySink; #define ESCB_KEYLABEL 10 #define NON_LAYOUT 0 #define KBDTYPE_NONE 0 #define KBDTYPE_STANDARD 1 #define KBDTYPE_SYMBOL 2 typedef struct tagSoftLayout { DWORD dwSoftKbdLayout; BOOL fStandard; DWORD dwNumLabels; // Number of Label status. DWORD dwCurLabel; CSoftKeyboardEventSink *pskbdes; DWORD dwSkbdESCookie; } SOFTLAYOUT; class CSoftkbdIMX : public CComObjectRoot_CreateInstance, public ITfTextInputProcessor, public ITfThreadFocusSink, public CDisplayAttributeProvider { public: CSoftkbdIMX(); ~CSoftkbdIMX(); BEGIN_COM_MAP_IMMX(CSoftkbdIMX) COM_INTERFACE_ENTRY(ITfTextInputProcessor) COM_INTERFACE_ENTRY(ITfThreadFocusSink) COM_INTERFACE_ENTRY(ITfDisplayAttributeProvider) END_COM_MAP_IMMX() public: // ITfX methods STDMETHODIMP Activate(ITfThreadMgr *ptim, TfClientId tid); STDMETHODIMP Deactivate(); // ITfThreadFocusSink STDMETHODIMP OnSetThreadFocus(); STDMETHODIMP OnKillThreadFocus(); static LRESULT CALLBACK _OwnerWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hWnd, uMsg, wParam, lParam); } void _OnOffToggle( ); ITfContext *GetIC(); HWND GetOwnerWnd() {return _hOwnerWnd;} HRESULT Initialize( ); BOOL _fOnOffSave; BOOL GetSoftKBDOnOff( ) { DWORD dw; if ( _tim == NULL ) return FALSE; GetCompartmentDWORD(_tim, GUID_COMPARTMENT_HANDWRITING_OPENCLOSE , &dw, FALSE); return dw ? TRUE : FALSE; } void SetSoftKBDOnOff( BOOL fOn ) { // check to see if the _SoftKbd and soft keyboard related members are initialized. if ( _fInitialized == FALSE ) { Initialize( ); } if ( (_SoftKbd == NULL) || ( _tim == NULL) ) return; if ( fOn == GetSoftKBDOnOff( ) ) return; SetCompartmentDWORD(_tid, _tim, GUID_COMPARTMENT_HANDWRITING_OPENCLOSE ,fOn ? 0x01 : 0x00 , FALSE); } DWORD GetSoftKBDLayout( ) { DWORD dw; if ( (_SoftKbd == NULL) || ( _tim == NULL) ) return NON_LAYOUT; GetCompartmentDWORD(_tim, GUID_COMPARTMENT_SOFTKBD_KBDLAYOUT, &dw, FALSE); return dw; } void SetSoftKBDLayout(DWORD dwKbdLayout) { // check to see if the _SoftKbd and soft keyboard related members are initialized. if ( _fInitialized == FALSE ) { Initialize( ); } if ( (_SoftKbd == NULL) || ( _tim == NULL) ) return; SetCompartmentDWORD(_tid, _tim, GUID_COMPARTMENT_SOFTKBD_KBDLAYOUT, dwKbdLayout , FALSE); } HRESULT GetSoftKBDPosition(int *xWnd, int *yWnd) { DWORD dwPos; HRESULT hr = S_OK; if ( (_SoftKbd == NULL) || ( _tim == NULL) ) return E_FAIL; if ( !xWnd || !yWnd ) return E_FAIL; hr = GetCompartmentDWORD(_tim, GUID_COMPARTMENT_SOFTKBD_WNDPOSITION, &dwPos, TRUE); if ( hr == S_OK ) { *xWnd = dwPos & 0x0000ffff; *yWnd = (dwPos >> 16) & 0x0000ffff; hr = S_OK; } else { *xWnd = 0; *yWnd = 0; hr = E_FAIL; } return hr; } void SetSoftKBDPosition(int xWnd, int yWnd ) { DWORD dwPos; DWORD left, top; if ( (_SoftKbd == NULL) || ( _tim == NULL) ) return; if ( xWnd < 0 ) left = 0; else left = (WORD)xWnd; if ( yWnd < 0 ) top = 0; else top = (WORD)yWnd; dwPos = ((DWORD)top << 16) + left; SetCompartmentDWORD(_tid, _tim, GUID_COMPARTMENT_SOFTKBD_WNDPOSITION, dwPos, TRUE); } static HRESULT _EditSessionCallback(TfEditCookie ec, CEditSession *pes); ITfThreadMgr *_tim; TfClientId _GetId() { return _tid; } LANGID _GetLangId( ) { return _langid; } ISoftKbd *_SoftKbd; SOFTLAYOUT _KbdStandard; SOFTLAYOUT _KbdSymbol; DWORD _CurLayout; DWORD _CurKbdType; TfClientId _tid; ITfDocumentMgr *_dim; LANGID _langid; ITfInputProcessorProfiles *_pProfile; void _InitLangID() { ITfInputProcessorProfiles *pProfile; _langid = 0x409; if ( _pProfile == NULL ) { CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, (void **) &_pProfile); } if ( _pProfile != NULL ) { GUID guid; pProfile = _pProfile; pProfile->AddRef( ); pProfile->GetActiveLanguageProfile(CLSID_SoftkbdIMX, &_langid, &guid); pProfile->Release( ); } } private: HRESULT _InputKeyLabel(TfEditCookie ec, ITfContext *pic, WCHAR *lpszLabel, UINT nLabLen); void _UpdateUI(); HRESULT _MySetSelectionSimple(TfEditCookie ec, ITfContext *pic, ITfRange *range); HRESULT _ShowSoftKBDWindow( BOOL fShow ); HWND _hOwnerWnd; CFunctionProvider *_pFuncPrv; static HRESULT _CompEventSinkCallback(void *pv, REFGUID rguid); // compartment (storage) event sink CCompartmentEventSink *_pCes; UINT_PTR _uCurrentEditCookie; DWORD _dwThreadFocusCookie; static HRESULT _AlsCallback(REFCLSID clsid, REFGUID guidProfile, BOOL fActivated, void *pv); static HRESULT _LsCallback(BOOL fChanged, LANGID langid, BOOL *pfAccept, void *pv); CActiveLanguageProfileNotifySink *_timActiveLangSink; CLanguageProfileNotifySink *_timLangSink; CSoftKbdWindowEventSink *_psftkbdwndes; DWORD _dwsftkbdwndesCookie; CLBarItem *_plbi; BOOL _fInitialized; LIBTHREAD _libTLS; // tls for the helper library. Since this object is apt threaded, // all members are accessed in a single thread // also, cicero will only create a single instance of this obj per thread }; inline void SetThis(HWND hWnd, LPARAM lParam) { SetWindowLongPtr(hWnd, GWLP_USERDATA, (UINT_PTR)((CREATESTRUCT *)lParam)->lpCreateParams); } inline CSoftkbdIMX *GetThis(HWND hWnd) { CSoftkbdIMX *pIMX = (CSoftkbdIMX *)GetWindowLongPtr(hWnd, GWLP_USERDATA); Assert(pIMX != NULL); return pIMX; } class CSoftkbdRegistry : public CComObjectRoot_CreateInstance, public ITfSoftKbdRegistry { public: CSoftkbdRegistry(); ~CSoftkbdRegistry(); BEGIN_COM_MAP_IMMX(CSoftkbdRegistry) COM_INTERFACE_ENTRY(ITfSoftKbdRegistry) END_COM_MAP_IMMX() public: // ITfSoftKbdRegistry STDMETHODIMP EnableSoftkbd(LANGID langid ); STDMETHODIMP DisableSoftkbd(LANGID langid ); private: HRESULT _SetSoftkbdTIP(LANGID langid, BOOL fEnable ); HRESULT _GenerateCurrentLangProfileList( ); BOOL m_fInitialized; CComPtr m_cpInputProcessorProfiles; CStructArray m_rgLang; WCHAR m_pwszStandard[128]; WCHAR m_pwszSymbol[128]; WCHAR m_pwszIconFile[MAX_PATH]; }; #endif // SOFTKBDIMX_H