// // nuibase.cpp // #include "private.h" #include "nuibase.h" #include "helpers.h" #define NUIBASE_ITEMSINK_COOKIE 0x80000001 ////////////////////////////////////////////////////////////////////////////// // // CLBarItemBase // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CLBarItemBase::CLBarItemBase() { _dwStatus = 0; _szToolTip[0] = L'\0'; _cRef = 1; } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CLBarItemBase::~CLBarItemBase() { SafeRelease(_plbiSink); } //+--------------------------------------------------------------------------- // // InitNuiInfo // //---------------------------------------------------------------------------- void CLBarItemBase::InitNuiInfo(REFCLSID rclsid, REFGUID rguid, DWORD dwStyle, ULONG ulSort, WCHAR *pszDesc) { // init nuiInfo. _lbiInfo.clsidService = rclsid; _lbiInfo.guidItem = rguid; _lbiInfo.dwStyle = dwStyle; _lbiInfo.ulSort = ulSort; wcsncpy(_lbiInfo.szDescription, pszDesc, ARRAYSIZE(_lbiInfo.szDescription)); } //+--------------------------------------------------------------------------- // // GetType // //---------------------------------------------------------------------------- STDAPI CLBarItemBase::GetInfo(TF_LANGBARITEMINFO *pInfo) { *pInfo = _lbiInfo; return S_OK; } //+--------------------------------------------------------------------------- // // GetStatus // //---------------------------------------------------------------------------- STDAPI CLBarItemBase::GetStatus(DWORD *pdw) { *pdw = _dwStatus; return S_OK; } //+--------------------------------------------------------------------------- // // Show // //---------------------------------------------------------------------------- STDAPI CLBarItemBase::Show(BOOL fShow) { return ShowInternal(fShow, TRUE); } //+--------------------------------------------------------------------------- // // GetTooltipString // //---------------------------------------------------------------------------- STDAPI CLBarItemBase::GetTooltipString(BSTR *pbstrToolTip) { if (!pbstrToolTip) return E_INVALIDARG; *pbstrToolTip = SysAllocString(_szToolTip); if (*pbstrToolTip) return S_OK; else return E_OUTOFMEMORY; } //+--------------------------------------------------------------------------- // // AdviseSink // //---------------------------------------------------------------------------- HRESULT CLBarItemBase::AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie) { HRESULT hr; if (IsEqualIID(IID_ITfLangBarItemSink, riid)) { if (_plbiSink) hr = CONNECT_E_CANNOTCONNECT; else { hr = punk->QueryInterface(IID_ITfLangBarItemSink, (void **)&_plbiSink); if (SUCCEEDED(hr)) { *pdwCookie = NUIBASE_ITEMSINK_COOKIE; } } } else { hr = CONNECT_E_CANNOTCONNECT; } return hr; } //+--------------------------------------------------------------------------- // // UnadviseSink // //---------------------------------------------------------------------------- HRESULT CLBarItemBase::UnadviseSink(DWORD dwCookie) { if (NUIBASE_ITEMSINK_COOKIE != dwCookie) return E_FAIL; if (!_plbiSink) return E_UNEXPECTED; _plbiSink->Release(); _plbiSink = NULL; return S_OK; } //+--------------------------------------------------------------------------- // // Show // //---------------------------------------------------------------------------- HRESULT CLBarItemBase::ShowInternal(BOOL fShow, BOOL fNotify) { DWORD dwOldStatus = _dwStatus; if (fShow) _dwStatus &= ~TF_LBI_STATUS_HIDDEN; else _dwStatus |= TF_LBI_STATUS_HIDDEN; if (fNotify && (dwOldStatus != _dwStatus) && _plbiSink) _plbiSink->OnUpdate(TF_LBI_STATUS); return S_OK; } //+--------------------------------------------------------------------------- // // OnLButtonUp // //---------------------------------------------------------------------------- HRESULT CLBarItemBase::OnLButtonUp(const POINT pt, const RECT *prcArea) { return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // OnRButtonUp // //---------------------------------------------------------------------------- HRESULT CLBarItemBase::OnRButtonUp(const POINT pt, const RECT *prcArea) { return E_NOTIMPL; } ////////////////////////////////////////////////////////////////////////////// // // CLBarItemButtonBase // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // IUnknown // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfLangBarItem)) { *ppvObj = SAFECAST(this, ITfLangBarItem *); } else if (IsEqualIID(riid, IID_ITfLangBarItemButton)) { *ppvObj = SAFECAST(this, ITfLangBarItemButton *); } else if (IsEqualIID(riid, IID_ITfSource)) { *ppvObj = SAFECAST(this, ITfSource *); } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } STDAPI_(ULONG) CLBarItemButtonBase::AddRef() { return ++_cRef; } STDAPI_(ULONG) CLBarItemButtonBase::Release() { long cr; cr = --_cRef; Assert(cr >= 0); if (cr == 0) { delete this; } return cr; } //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CLBarItemButtonBase::CLBarItemButtonBase() { } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CLBarItemButtonBase::~CLBarItemButtonBase() { if (_hIcon) { DestroyIcon(_hIcon); _hIcon = NULL; } } //+--------------------------------------------------------------------------- // // AdviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie) { return CLBarItemBase::AdviseSink(riid, punk, pdwCookie); } //+--------------------------------------------------------------------------- // // UnadviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::UnadviseSink(DWORD dwCookie) { return CLBarItemBase::UnadviseSink(dwCookie); } //+--------------------------------------------------------------------------- // // GetInfo // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::GetInfo(TF_LANGBARITEMINFO *pInfo) { return CLBarItemBase::GetInfo(pInfo); } //+--------------------------------------------------------------------------- // // GetStatus // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::GetStatus(DWORD *pdw) { return CLBarItemBase::GetStatus(pdw); } //+--------------------------------------------------------------------------- // // Show // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::Show(BOOL fShow) { return CLBarItemBase::Show(fShow); } //+--------------------------------------------------------------------------- // // GetTooltipString // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::GetTooltipString(BSTR *pbstrToolTip) { return CLBarItemBase::GetTooltipString(pbstrToolTip); } //+--------------------------------------------------------------------------- // // OnClick // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::OnClick(TfLBIClick click, POINT pt, const RECT *prcArea) { switch (click) { case TF_LBI_CLK_RIGHT: return OnRButtonUp(pt, prcArea); case TF_LBI_CLK_LEFT: return OnLButtonUp(pt, prcArea); } return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // InitMenu // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::InitMenu(ITfMenu *pMenu) { return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // OnMenuSelect // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::OnMenuSelect(UINT uID) { return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // GetIcon // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::GetIcon(HICON *phIcon) { if (_hIcon) *phIcon = CopyIcon(_hIcon); else *phIcon = NULL; return S_OK; } //+--------------------------------------------------------------------------- // // GetText // //---------------------------------------------------------------------------- STDAPI CLBarItemButtonBase::GetText(BSTR *pbstrText) { if (!pbstrText) return E_INVALIDARG; *pbstrText = SysAllocString(_szText); if (*pbstrText) return S_OK; else return E_OUTOFMEMORY; } ////////////////////////////////////////////////////////////////////////////// // // CLBarItemBitmapButtonBase // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // IUnknown // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfLangBarItem)) { *ppvObj = SAFECAST(this, ITfLangBarItem *); } else if (IsEqualIID(riid, IID_ITfLangBarItemBitmapButton)) { *ppvObj = SAFECAST(this, ITfLangBarItemBitmapButton *); } else if (IsEqualIID(riid, IID_ITfSource)) { *ppvObj = SAFECAST(this, ITfSource *); } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } STDAPI_(ULONG) CLBarItemBitmapButtonBase::AddRef() { return ++_cRef; } STDAPI_(ULONG) CLBarItemBitmapButtonBase::Release() { long cr; cr = --_cRef; Assert(cr >= 0); if (cr == 0) { delete this; } return cr; } //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CLBarItemBitmapButtonBase::CLBarItemBitmapButtonBase() { } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CLBarItemBitmapButtonBase::~CLBarItemBitmapButtonBase() { } //+--------------------------------------------------------------------------- // // AdviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie) { return CLBarItemBase::AdviseSink(riid, punk, pdwCookie); } //+--------------------------------------------------------------------------- // // UnadviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::UnadviseSink(DWORD dwCookie) { return CLBarItemBase::UnadviseSink(dwCookie); } //+--------------------------------------------------------------------------- // // GetInfo // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::GetInfo(TF_LANGBARITEMINFO *pInfo) { return CLBarItemBase::GetInfo(pInfo); } //+--------------------------------------------------------------------------- // // GetStatus // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::GetStatus(DWORD *pdw) { return CLBarItemBase::GetStatus(pdw); } //+--------------------------------------------------------------------------- // // Show // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::Show(BOOL fShow) { return CLBarItemBase::Show(fShow); } //+--------------------------------------------------------------------------- // // GetTooltipString // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::GetTooltipString(BSTR *pbstrToolTip) { return CLBarItemBase::GetTooltipString(pbstrToolTip); } //+--------------------------------------------------------------------------- // // OnClick // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::OnClick(TfLBIClick click, POINT pt, const RECT *prcArea) { switch (click) { case TF_LBI_CLK_RIGHT: return OnRButtonUp(pt, prcArea); case TF_LBI_CLK_LEFT: return OnLButtonUp(pt, prcArea); } return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // InitMenu // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::InitMenu(ITfMenu *pMenu) { return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // OnMenuSelect // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::OnMenuSelect(UINT uID) { return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // GetPreferredSize // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::GetPreferredSize(const SIZE *pszDefault, SIZE *psize) { *psize = _sizePrefered; return S_OK; } //+--------------------------------------------------------------------------- // // GetText // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapButtonBase::GetText(BSTR *pbstrText) { if (!pbstrText) return E_INVALIDARG; *pbstrText = SysAllocString(_szText); if (*pbstrText) return S_OK; else return E_OUTOFMEMORY; } ////////////////////////////////////////////////////////////////////////////// // // CLBarItemBitmapBase // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // IUnknown // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfLangBarItem)) { *ppvObj = SAFECAST(this, ITfLangBarItem *); } else if (IsEqualIID(riid, IID_ITfLangBarItemBitmap)) { *ppvObj = SAFECAST(this, ITfLangBarItemBitmap *); } else if (IsEqualIID(riid, IID_ITfSource)) { *ppvObj = SAFECAST(this, ITfSource *); } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } STDAPI_(ULONG) CLBarItemBitmapBase::AddRef() { return ++_cRef; } STDAPI_(ULONG) CLBarItemBitmapBase::Release() { long cr; cr = --_cRef; Assert(cr >= 0); if (cr == 0) { delete this; } return cr; } //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CLBarItemBitmapBase::CLBarItemBitmapBase() { } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CLBarItemBitmapBase::~CLBarItemBitmapBase() { } //+--------------------------------------------------------------------------- // // AdviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie) { return CLBarItemBase::AdviseSink(riid, punk, pdwCookie); } //+--------------------------------------------------------------------------- // // UnadviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::UnadviseSink(DWORD dwCookie) { return CLBarItemBase::UnadviseSink(dwCookie); } //+--------------------------------------------------------------------------- // // GetInfo // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::GetInfo(TF_LANGBARITEMINFO *pInfo) { return CLBarItemBase::GetInfo(pInfo); } //+--------------------------------------------------------------------------- // // GetStatus // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::GetStatus(DWORD *pdw) { return CLBarItemBase::GetStatus(pdw); } //+--------------------------------------------------------------------------- // // Show // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::Show(BOOL fShow) { return CLBarItemBase::Show(fShow); } //+--------------------------------------------------------------------------- // // GetTooltipString // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::GetTooltipString(BSTR *pbstrToolTip) { return CLBarItemBase::GetTooltipString(pbstrToolTip); } //+--------------------------------------------------------------------------- // // OnClick // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::OnClick(TfLBIClick click, POINT pt, const RECT *prcArea) { switch (click) { case TF_LBI_CLK_RIGHT: return OnRButtonUp(pt, prcArea); case TF_LBI_CLK_LEFT: return OnLButtonUp(pt, prcArea); } return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // GetPreferredSize // //---------------------------------------------------------------------------- STDAPI CLBarItemBitmapBase::GetPreferredSize(const SIZE *pszDefault, SIZE *psize) { *psize = _sizePrefered; return S_OK; } ////////////////////////////////////////////////////////////////////////////// // // CLBarItemBalloonBase // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // IUnknown // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfLangBarItem)) { *ppvObj = SAFECAST(this, ITfLangBarItem *); } else if (IsEqualIID(riid, IID_ITfLangBarItemBalloon)) { *ppvObj = SAFECAST(this, ITfLangBarItemBalloon *); } else if (IsEqualIID(riid, IID_ITfSource)) { *ppvObj = SAFECAST(this, ITfSource *); } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } STDAPI_(ULONG) CLBarItemBalloonBase::AddRef() { return ++_cRef; } STDAPI_(ULONG) CLBarItemBalloonBase::Release() { long cr; cr = --_cRef; Assert(cr >= 0); if (cr == 0) { delete this; } return cr; } //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CLBarItemBalloonBase::CLBarItemBalloonBase() { } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CLBarItemBalloonBase::~CLBarItemBalloonBase() { } //+--------------------------------------------------------------------------- // // AdviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie) { return CLBarItemBase::AdviseSink(riid, punk, pdwCookie); } //+--------------------------------------------------------------------------- // // UnadviseSink // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::UnadviseSink(DWORD dwCookie) { return CLBarItemBase::UnadviseSink(dwCookie); } //+--------------------------------------------------------------------------- // // GetInfo // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::GetInfo(TF_LANGBARITEMINFO *pInfo) { return CLBarItemBase::GetInfo(pInfo); } //+--------------------------------------------------------------------------- // // GetStatus // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::GetStatus(DWORD *pdw) { return CLBarItemBase::GetStatus(pdw); } //+--------------------------------------------------------------------------- // // Show // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::Show(BOOL fShow) { return CLBarItemBase::Show(fShow); } //+--------------------------------------------------------------------------- // // GetTooltipString // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::GetTooltipString(BSTR *pbstrToolTip) { return CLBarItemBase::GetTooltipString(pbstrToolTip); } //+--------------------------------------------------------------------------- // // OnClick // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::OnClick(TfLBIClick click, POINT pt, const RECT *prcArea) { switch (click) { case TF_LBI_CLK_RIGHT: return OnRButtonUp(pt, prcArea); case TF_LBI_CLK_LEFT: return OnLButtonUp(pt, prcArea); } return E_NOTIMPL; } //+--------------------------------------------------------------------------- // // GetPreferredSize // //---------------------------------------------------------------------------- STDAPI CLBarItemBalloonBase::GetPreferredSize(const SIZE *pszDefault, SIZE *psize) { *psize = _sizePrefered; return S_OK; }