// // nuihkl.h // #ifndef NUIHKL_H #define NUIHKL_H #include "private.h" #include "strary.h" #include "commctrl.h" #include "internat.h" #include "nuibase.h" #include "sink.h" #include "assembly.h" #include "lbmenu.h" #include "systhrd.h" ULONG GetIconIndexFromhKL(HKL hKL); ULONG GetIconIndex(LANGID langid, ASSEMBLYITEM *pItem); HRESULT AsyncReconversion(); extern const TCHAR c_szNuiWin32IMEWndClass[]; class CCompartmentEventSink; typedef struct tag_TIPMENUITEMMAP { ITfSystemLangBarItemSink *plbSink; UINT nOrgID; UINT nTmpID; } TIPMENUITEMMAP; typedef struct tag_GUIDATOMHKL { TfGuidAtom guidatom; HKL hkl; ULONG uIconIndex; ASSEMBLYITEM *pItem; } GUIDATOMHKL; ////////////////////////////////////////////////////////////////////////////// // // CLBarItemWin32IME // ////////////////////////////////////////////////////////////////////////////// class CLBarItemWin32IME : public CLBarItemButtonBase { public: CLBarItemWin32IME(); ~CLBarItemWin32IME() {} STDMETHODIMP GetIcon(HICON *phIcon); HRESULT OnLButtonUp(const POINT pt, const RECT *prcArea); HRESULT OnRButtonUp(const POINT pt, const RECT *prcArea); void UpdateIMEIcon(); private: void ShowIMELeftMenu(HWND hWnd, LONG xPos, LONG yPos); void ShowIMERightMenu(HWND hWnd, LONG xPos, LONG yPos); static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND CreateMyWnd() { return CreateWindow(c_szNuiWin32IMEWndClass, "", WS_POPUP | WS_DISABLED, 0,0,0,0, NULL, 0, g_hInst, this); } static void SetThis(HWND hWnd, LPARAM lParam) { SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)((CREATESTRUCT *)lParam)->lpCreateParams); } static CLBarItemWin32IME *GetThis(HWND hWnd) { CLBarItemWin32IME *p = (CLBarItemWin32IME *)GetWindowLongPtr(hWnd, GWLP_USERDATA); Assert(p != NULL); return p; } int _nIconId; DBG_ID_DECLARE; }; ////////////////////////////////////////////////////////////////////////////// // // CLBarItemReconv // ////////////////////////////////////////////////////////////////////////////// class CLBarItemReconv : public CLBarItemButtonBase, public CSysThreadRef { public: CLBarItemReconv(SYSTHREAD *psfn); STDMETHODIMP GetIcon(HICON *phIcon); void ShowOrHide(BOOL fNotify); private: HRESULT OnLButtonUp(const POINT pt, const RECT *prcArea); BOOL _fAddedBefore; DBG_ID_DECLARE; }; ////////////////////////////////////////////////////////////////////////////// // // CLBarItemDeviceType // ////////////////////////////////////////////////////////////////////////////// class __declspec(novtable) CLBarItemSystemButtonBase : public CLBarItemButtonBase, public ITfSystemLangBarItem, public ITfSystemDeviceTypeLangBarItem, public CSysThreadRef { public: CLBarItemSystemButtonBase(SYSTHREAD *psfn); ~CLBarItemSystemButtonBase(); // // IUnknown methods // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // // ITfSource // STDMETHODIMP AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie); STDMETHODIMP UnadviseSink(DWORD dwCookie); // // ITfLangBarItem // STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo); STDMETHODIMP Show(BOOL fShow); // // ITfSystemLangBarItem // STDMETHODIMP SetIcon(HICON hIcon); STDMETHODIMP SetTooltipString(WCHAR *pchToolTip, ULONG cch); // // ITfSystemDeviceTypeLangBarItem, // STDMETHODIMP SetIconMode(DWORD dwFlags); STDMETHODIMP GetIconMode(DWORD *pdwFlags); protected: BOOL _InsertCustomMenus(ITfMenu *pMenu, UINT *pnTipCurMenuID); UINT _MergeMenu(ITfMenu *pMenu, CCicLibMenu *pMenuTip, ITfSystemLangBarItemSink *plbSink, CStructArray *pMenuMap, UINT &nCurID); CStructArray *_pMenuMap; void ClearMenuMap() { if (_pMenuMap) _pMenuMap->Clear(); } virtual void SetBrandingIcon(HKL hKL, BOOL fNotify) {return;} virtual void SetDefaultIcon(BOOL fNotify) {return;} CStructArray _rgEventSinks; // ITfSystemLangBarItemSink DWORD _dwIconMode; }; ////////////////////////////////////////////////////////////////////////////// // // CLBarItemDeviceType // ////////////////////////////////////////////////////////////////////////////// #define ID_TYPE_KEYBOARD 0 #define ID_TYPE_HANDWRITING 1 #define ID_TYPE_SPEECH 2 class CLBarItemDeviceType : public CLBarItemSystemButtonBase { public: CLBarItemDeviceType(SYSTHREAD *psfn, REFGUID rguid); ~CLBarItemDeviceType(); // // IUnknown methods // // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); // STDMETHODIMP_(ULONG) AddRef(void); // STDMETHODIMP_(ULONG) Release(void); // // ITfSource // // STDMETHODIMP AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie); // STDMETHODIMP UnadviseSink(DWORD dwCookie); // // ITfLangBarItem // // STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo); STDMETHODIMP Show(BOOL fShow); STDMETHODIMP GetIcon(HICON *phIcon); // // ITfSystemLangBarItem // STDMETHODIMP SetIcon(HICON hIcon); STDMETHODIMP SetTooltipString(WCHAR *pchToolTip, ULONG cch); void Init(); void Uninit(); void ShowOrHide(BOOL fNotify); void InitTipArray(BOOL fInitIconIndex); BOOL IsKeyboardType() {return (_nType == ID_TYPE_KEYBOARD) ? TRUE : FALSE;} HICON GetIcon() { return CLBarItemSystemButtonBase::GetIcon(); } void SetBrandingIcon(HKL hKL, BOOL fNotify); void SetDefaultIcon(BOOL fNotify); GUID *GetDeviceTypeGUID() {return &_guid;} private: BOOL _StringFromMenuId(int nMenuId, BSTR *pbstr); STDMETHODIMP InitMenu(ITfMenu *pMenu); STDMETHODIMP OnMenuSelect(UINT wID); GUID _guid; int _nType; CStructArray _rgGuidatomHkl; CCompartmentEventSink *_pces; static HRESULT CompEventSinkCallback(void *pv, REFGUID rguid); HRESULT SetSpeechButtonState(CThreadInputMgr *ptim); typedef struct tag_ICONFILE { int uIconIndex; WCHAR szFile[MAX_PATH]; } ICONFILE; ICONFILE *_pif; // // When someone else calls Show(FALSE), we hide the button forcefully. // If this is TRUE, we never clear TF_LBI_STATUS_HIDDEN flag. // BOOL _fHideOrder; DBG_ID_DECLARE; }; #endif // NUIHKL_H