|
|
//
// 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<ARRAYSIZE(c_rgMenuItems); i++) { switch (i) { case MENU_SHOWSNOOP_INDEX: dwFlags = _pCase->_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; }
|