// // langbar.cpp // // Language bar ui code. // #include "globals.h" #include "case.h" #include "resource.h" #define CASE_LANGBARITEMSINK_COOKIE 0x0fab0fab const struct { const WCHAR *pchDesc; void (*pfnHandler)(CCaseTextService *_this); } c_rgMenuItems[] = { { L"Show Snoop Wnd", CCaseTextService::_Menu_ShowSnoopWnd }, // must match MENU_SHOWSNOOP_INDEX { L"Hello World", CCaseTextService::_Menu_HelloWord }, { L"Flip Selection", CCaseTextService::_Menu_FlipSel }, { L"Flip Doc", CCaseTextService::_Menu_FlipDoc }, { L"Flip Keystrokes", CCaseTextService::_Menu_FlipKeys }, // must match MENU_FLIPKEYS_INDEX }; #define MENU_SHOWSNOOP_INDEX 0 #define MENU_FLIPKEYS_INDEX 4 class CLangBarItemButton : public ITfLangBarItemButton, public ITfSource { public: CLangBarItemButton(CCaseTextService *pCase); ~CLangBarItemButton(); // IUnknown STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ITfLangBarItem STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo); STDMETHODIMP GetStatus(DWORD *pdwStatus); STDMETHODIMP Show(BOOL fShow); STDMETHODIMP GetTooltipString(BSTR *pbstrToolTip); // ITfLangBarItemButton STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea); STDMETHODIMP InitMenu(ITfMenu *pMenu); STDMETHODIMP OnMenuSelect(UINT wID); STDMETHODIMP GetIcon(HICON *phIcon); STDMETHODIMP GetText(BSTR *pbstrText); // ITfSource STDMETHODIMP AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie); STDMETHODIMP UnadviseSink(DWORD dwCookie); private: CCaseTextService *_pCase; ITfLangBarItemSink *_pLangBarItemSink; TF_LANGBARITEMINFO _tfLangBarItemInfo; LONG _cRef; }; //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CLangBarItemButton::CLangBarItemButton(CCaseTextService *pCase) { DllAddRef(); _tfLangBarItemInfo.clsidService = c_clsidCaseTextService; _tfLangBarItemInfo.guidItem = c_guidLangBarItemButton; _tfLangBarItemInfo.dwStyle = TF_LBI_STYLE_BTN_MENU; _tfLangBarItemInfo.ulSort = 0; SafeStringCopy(_tfLangBarItemInfo.szDescription, ARRAYSIZE(_tfLangBarItemInfo.szDescription), LANGBAR_ITEM_DESC); _pCase = pCase; _pCase->AddRef(); _pLangBarItemSink = NULL; _cRef = 1; } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CLangBarItemButton::~CLangBarItemButton() { DllRelease(); _pCase->Release(); } //+--------------------------------------------------------------------------- // // QueryInterface // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::QueryInterface(REFIID riid, void **ppvObj) { if (ppvObj == NULL) return E_INVALIDARG; *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfLangBarItem) || IsEqualIID(riid, IID_ITfLangBarItemButton)) { *ppvObj = (ITfLangBarItemButton *)this; } else if (IsEqualIID(riid, IID_ITfSource)) { *ppvObj = (ITfSource *)this; } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } //+--------------------------------------------------------------------------- // // AddRef // //---------------------------------------------------------------------------- STDAPI_(ULONG) CLangBarItemButton::AddRef() { return ++_cRef; } //+--------------------------------------------------------------------------- // // Release // //---------------------------------------------------------------------------- STDAPI_(ULONG) CLangBarItemButton::Release() { LONG cr = --_cRef; assert(_cRef >= 0); if (_cRef == 0) { delete this; } return cr; } //+--------------------------------------------------------------------------- // // GetInfo // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::GetInfo(TF_LANGBARITEMINFO *pInfo) { *pInfo = _tfLangBarItemInfo; return S_OK; } //+--------------------------------------------------------------------------- // // GetStatus // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::GetStatus(DWORD *pdwStatus) { *pdwStatus = 0; return S_OK; } //+--------------------------------------------------------------------------- // // Show // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::Show(BOOL fShow) { return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // GetTooltipString // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::GetTooltipString(BSTR *pbstrToolTip) { *pbstrToolTip = SysAllocString(LANGBAR_ITEM_DESC); return (*pbstrToolTip == NULL) ? E_OUTOFMEMORY : S_OK; } //+--------------------------------------------------------------------------- // // OnClick // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::OnClick(TfLBIClick click, POINT pt, const RECT *prcArea) { return S_OK; } //+--------------------------------------------------------------------------- // // InitMenu // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::InitMenu(ITfMenu *pMenu) { int i; DWORD dwFlags; for (i=0; i_IsSnoopWndVisible() ? TF_LBMENUF_CHECKED : 0; break; case MENU_FLIPKEYS_INDEX: dwFlags = _pCase->_IsKeyFlipping() ? TF_LBMENUF_CHECKED : 0; break; default: // all other items are plain dwFlags = 0; break; } pMenu->AddMenuItem(i, dwFlags, NULL, NULL, c_rgMenuItems[i].pchDesc, wcslen(c_rgMenuItems[i].pchDesc), NULL); } return S_OK; } //+--------------------------------------------------------------------------- // // OnMenuSelect // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::OnMenuSelect(UINT wID) { c_rgMenuItems[wID].pfnHandler(_pCase); return S_OK; } //+--------------------------------------------------------------------------- // // GetIcon // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::GetIcon(HICON *phIcon) { *phIcon = (HICON)LoadImage(g_hInst, TEXT("IDI_CASE"), IMAGE_ICON, 16, 16, 0); return (*phIcon != NULL) ? S_OK : E_FAIL; } //+--------------------------------------------------------------------------- // // GetText // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::GetText(BSTR *pbstrText) { *pbstrText = SysAllocString(LANGBAR_ITEM_DESC); return (*pbstrText == NULL) ? E_OUTOFMEMORY : S_OK; } //+--------------------------------------------------------------------------- // // AdviseSink // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie) { if (!IsEqualIID(IID_ITfLangBarItemSink, riid)) return CONNECT_E_CANNOTCONNECT; if (_pLangBarItemSink != NULL) return CONNECT_E_ADVISELIMIT; if (punk->QueryInterface(IID_ITfLangBarItemSink, (void **)&_pLangBarItemSink) != S_OK) { _pLangBarItemSink = NULL; return E_NOINTERFACE; } *pdwCookie = CASE_LANGBARITEMSINK_COOKIE; return S_OK; } //+--------------------------------------------------------------------------- // // UnadviseSink // //---------------------------------------------------------------------------- STDAPI CLangBarItemButton::UnadviseSink(DWORD dwCookie) { if (dwCookie != CASE_LANGBARITEMSINK_COOKIE) return CONNECT_E_NOCONNECTION; if (_pLangBarItemSink == NULL) return CONNECT_E_NOCONNECTION; _pLangBarItemSink->Release(); _pLangBarItemSink = NULL; return S_OK; } //+--------------------------------------------------------------------------- // // _InitLanguageBar // //---------------------------------------------------------------------------- BOOL CCaseTextService::_InitLanguageBar() { ITfLangBarItemMgr *pLangBarItemMgr; BOOL fRet; if (_pThreadMgr->QueryInterface(IID_ITfLangBarItemMgr, (void **)&pLangBarItemMgr) != S_OK) return FALSE; fRet = FALSE; if ((_pLangBarItem = new CLangBarItemButton(this)) == NULL) goto Exit; if (pLangBarItemMgr->AddItem(_pLangBarItem) != S_OK) { _pLangBarItem->Release(); _pLangBarItem = NULL; goto Exit; } fRet = TRUE; Exit: pLangBarItemMgr->Release(); return fRet; } //+--------------------------------------------------------------------------- // // _UninitLanguageBar // //---------------------------------------------------------------------------- void CCaseTextService::_UninitLanguageBar() { ITfLangBarItemMgr *pLangBarItemMgr; if (_pLangBarItem == NULL) return; if (_pThreadMgr->QueryInterface(IID_ITfLangBarItemMgr, (void **)&pLangBarItemMgr) == S_OK) { pLangBarItemMgr->RemoveItem(_pLangBarItem); pLangBarItemMgr->Release(); } _pLangBarItem->Release(); _pLangBarItem = NULL; }