You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
416 lines
12 KiB
416 lines
12 KiB
//
|
|
// nuibase.h
|
|
//
|
|
// Generic ITfTextEventSink object
|
|
//
|
|
|
|
#ifndef NUIBASE_H
|
|
#define NUIBASE_H
|
|
|
|
#include "ctfutb.h"
|
|
#include "iconlib.h"
|
|
inline HRESULT LangBarInsertMenu(ITfMenu *pMenu, UINT uId, WCHAR *psz, BOOL bChecked = FALSE, BOOL bRadioChecked = FALSE)
|
|
{
|
|
DWORD dwFlags = 0;
|
|
|
|
if (bChecked)
|
|
dwFlags |= TF_LBMENUF_CHECKED;
|
|
if (bRadioChecked)
|
|
dwFlags |= TF_LBMENUF_RADIOCHECKED;
|
|
|
|
return pMenu->AddMenuItem(uId,
|
|
dwFlags,
|
|
NULL,
|
|
NULL,
|
|
psz,
|
|
wcslen(psz),
|
|
NULL);
|
|
}
|
|
|
|
inline HRESULT LangBarInsertGrayedMenu(ITfMenu *pMenu, WCHAR *psz)
|
|
{
|
|
return pMenu->AddMenuItem((UINT)-1,
|
|
TF_LBMENUF_GRAYED,
|
|
NULL,
|
|
NULL,
|
|
psz,
|
|
wcslen(psz),
|
|
NULL);
|
|
}
|
|
|
|
inline HRESULT LangBarInsertMenu(ITfMenu *pMenu, UINT uId, WCHAR *psz, HBITMAP hbmp, HBITMAP hbmpMask)
|
|
{
|
|
return pMenu->AddMenuItem(uId,
|
|
0,
|
|
hbmp,
|
|
hbmpMask,
|
|
psz,
|
|
wcslen(psz),
|
|
NULL);
|
|
}
|
|
|
|
inline HRESULT LangBarInsertMenu(ITfMenu *pMenu, UINT uId, WCHAR *psz, BOOL bChecked, HICON hIcon)
|
|
{
|
|
HBITMAP hbmp = NULL;
|
|
HBITMAP hbmpMask = NULL;
|
|
if (hIcon)
|
|
{
|
|
HICON hSmIcon = (HICON)CopyImage(hIcon,
|
|
IMAGE_ICON,
|
|
16,
|
|
16,
|
|
LR_COPYFROMRESOURCE);
|
|
SIZE size = {16, 16};
|
|
|
|
if (!GetIconBitmaps(hSmIcon ? hSmIcon : hIcon, &hbmp, &hbmpMask, &size))
|
|
return E_FAIL;
|
|
|
|
if (hSmIcon)
|
|
DestroyIcon(hSmIcon);
|
|
|
|
if (hIcon)
|
|
DestroyIcon(hIcon);
|
|
}
|
|
|
|
return pMenu->AddMenuItem(uId,
|
|
bChecked ? TF_LBMENUF_CHECKED : 0,
|
|
hbmp,
|
|
hbmpMask,
|
|
psz,
|
|
wcslen(psz),
|
|
NULL);
|
|
}
|
|
|
|
inline HRESULT LangBarInsertGrayedMenu(ITfMenu *pMenu, WCHAR *psz, HICON hIcon)
|
|
{
|
|
HBITMAP hbmp = NULL;
|
|
HBITMAP hbmpMask = NULL;
|
|
if (hIcon)
|
|
{
|
|
HICON hSmIcon = (HICON)CopyImage(hIcon,
|
|
IMAGE_ICON,
|
|
16,
|
|
16,
|
|
LR_COPYFROMRESOURCE);
|
|
SIZE size = {16, 16};
|
|
|
|
if (!GetIconBitmaps(hSmIcon ? hSmIcon : hIcon, &hbmp, &hbmpMask, &size))
|
|
return E_FAIL;
|
|
|
|
if (hSmIcon)
|
|
DestroyIcon(hSmIcon);
|
|
|
|
if (hIcon)
|
|
DestroyIcon(hIcon);
|
|
}
|
|
|
|
return pMenu->AddMenuItem((UINT)-1,
|
|
TF_LBMENUF_GRAYED,
|
|
hbmp,
|
|
hbmpMask,
|
|
psz,
|
|
wcslen(psz),
|
|
NULL);
|
|
}
|
|
|
|
inline HRESULT LangBarInsertSubMenu(ITfMenu *pMenu, WCHAR *psz, ITfMenu **ppSubMenu)
|
|
{
|
|
return pMenu->AddMenuItem(UINT(-1),
|
|
TF_LBMENUF_SUBMENU,
|
|
NULL,
|
|
NULL,
|
|
psz,
|
|
wcslen(psz),
|
|
ppSubMenu);
|
|
}
|
|
|
|
inline HRESULT LangBarInsertSeparator(ITfMenu *pMenu)
|
|
{
|
|
return pMenu->AddMenuItem((UINT)(-1),
|
|
TF_LBMENUF_SEPARATOR,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
NULL);
|
|
}
|
|
|
|
#define NUIBASE_TOOLTIP_MAX 256
|
|
#define NUIBASE_TEXT_MAX 256
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemBase
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class __declspec(novtable) CLBarItemBase
|
|
{
|
|
public:
|
|
CLBarItemBase();
|
|
virtual ~CLBarItemBase();
|
|
|
|
void InitNuiInfo(REFCLSID clsid, REFGUID rguid, DWORD dwStyle, ULONG ulSort, WCHAR *pszDesc);
|
|
virtual STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo);
|
|
virtual STDMETHODIMP GetStatus(DWORD *pdwStatus);
|
|
virtual STDMETHODIMP Show(BOOL fShow);
|
|
virtual STDMETHODIMP GetTooltipString(BSTR *pbstrToolTip);
|
|
|
|
virtual STDMETHODIMP AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie);
|
|
virtual STDMETHODIMP UnadviseSink(DWORD dwCookie);
|
|
|
|
DWORD GetStyle() {return _lbiInfo.dwStyle;}
|
|
void SetStyle(DWORD dwStyle) {_lbiInfo.dwStyle = dwStyle;}
|
|
|
|
GUID* GetGuidItem() {return &_lbiInfo.guidItem;}
|
|
|
|
DWORD GetStatusInternal() {return _dwStatus;}
|
|
void SetStatusInternal(DWORD dw) {_dwStatus = dw;}
|
|
HRESULT ShowInternal(BOOL fShow, BOOL fNotify);
|
|
|
|
void SetOrClearStatus(DWORD dw, BOOL fSet)
|
|
{
|
|
if (fSet)
|
|
_dwStatus |= dw;
|
|
else
|
|
_dwStatus &= ~dw;
|
|
}
|
|
|
|
void SetToolTip(WCHAR *psz, UINT cch = (UINT)(-1))
|
|
{
|
|
if (cch == (UINT)(-1))
|
|
StringCchCopyW(_szToolTip, ARRAYSIZE(_szToolTip), psz);
|
|
else
|
|
{
|
|
UINT cchTemp = (UINT)min(ARRAYSIZE(_szToolTip) - 1, cch);
|
|
memcpy(_szToolTip, psz, cchTemp * sizeof(WCHAR));
|
|
_szToolTip[cchTemp] = L'\0';
|
|
}
|
|
}
|
|
|
|
virtual HRESULT OnLButtonUp(const POINT pt, const RECT *prcArea);
|
|
virtual HRESULT OnRButtonUp(const POINT pt, const RECT *prcArea);
|
|
|
|
ITfLangBarItemSink *GetSink() {return _plbiSink;}
|
|
|
|
protected:
|
|
DWORD _dwStatus;
|
|
TF_LANGBARITEMINFO _lbiInfo;
|
|
WCHAR _szToolTip[NUIBASE_TOOLTIP_MAX];
|
|
long _cRef;
|
|
ITfLangBarItemSink *_plbiSink;
|
|
|
|
private:
|
|
DWORD _dwCookie;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemButtonBase
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class __declspec(novtable) CLBarItemButtonBase : public CLBarItemBase,
|
|
public ITfSource,
|
|
public ITfLangBarItemButton
|
|
{
|
|
public:
|
|
CLBarItemButtonBase();
|
|
virtual ~CLBarItemButtonBase();
|
|
|
|
//
|
|
// 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 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);
|
|
|
|
void SetIcon(HICON hIcon) {_hIcon = hIcon;}
|
|
HICON GetIcon() {return _hIcon;}
|
|
void SetText(WCHAR *psz)
|
|
{
|
|
StringCchCopyW(_szText, ARRAYSIZE(_szText), psz);
|
|
}
|
|
|
|
private:
|
|
HICON _hIcon;
|
|
WCHAR _szText[NUIBASE_TEXT_MAX];
|
|
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemBitmapButtonBase
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class __declspec(novtable) CLBarItemBitmapButtonBase : public CLBarItemBase,
|
|
public ITfSource,
|
|
public ITfLangBarItemBitmapButton
|
|
{
|
|
public:
|
|
CLBarItemBitmapButtonBase();
|
|
virtual ~CLBarItemBitmapButtonBase();
|
|
|
|
//
|
|
// 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 GetStatus(DWORD *pdwStatus);
|
|
STDMETHODIMP Show(BOOL fShow);
|
|
STDMETHODIMP GetTooltipString(BSTR *pbstrToolTip);
|
|
|
|
//
|
|
// ITfLangBarItemBitmapButton
|
|
//
|
|
STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea);
|
|
STDMETHODIMP InitMenu(ITfMenu *pMenu);
|
|
STDMETHODIMP OnMenuSelect(UINT wID);
|
|
STDMETHODIMP GetPreferredSize(const SIZE *pszDefault, SIZE *psize);
|
|
STDMETHODIMP DrawBitmap(LONG x, LONG y, DWORD dwFlags, HBITMAP *phbmp, HBITMAP *phbmpMask) = 0;
|
|
STDMETHODIMP GetText(BSTR *pbstrText);
|
|
|
|
|
|
void SetText(WCHAR *psz)
|
|
{
|
|
StringCchCopyW(_szText, ARRAYSIZE(_szText), psz);
|
|
}
|
|
|
|
void SetPreferedSize(SIZE *psize) {_sizePrefered = *psize;}
|
|
private:
|
|
SIZE _sizePrefered;
|
|
WCHAR _szText[NUIBASE_TEXT_MAX];
|
|
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemBitmapBase
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class __declspec(novtable) CLBarItemBitmapBase : public CLBarItemBase,
|
|
public ITfSource,
|
|
public ITfLangBarItemBitmap
|
|
{
|
|
public:
|
|
CLBarItemBitmapBase();
|
|
virtual ~CLBarItemBitmapBase();
|
|
|
|
//
|
|
// 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 GetStatus(DWORD *pdwStatus);
|
|
STDMETHODIMP Show(BOOL fShow);
|
|
STDMETHODIMP GetTooltipString(BSTR *pbstrToolTip);
|
|
|
|
//
|
|
// ITfLangBarItemBitmap
|
|
//
|
|
STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea);
|
|
STDMETHODIMP GetPreferredSize(const SIZE *pszDefault, SIZE *psize);
|
|
STDMETHODIMP DrawBitmap(LONG x, LONG y, DWORD dwFlags, HBITMAP *phbmp, HBITMAP *phbmpMask) = 0;
|
|
|
|
void SetPreferedSize(SIZE *psize) {_sizePrefered = *psize;}
|
|
private:
|
|
SIZE _sizePrefered;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemBalloonBase
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class __declspec(novtable) CLBarItemBalloonBase : public CLBarItemBase,
|
|
public ITfSource,
|
|
public ITfLangBarItemBalloon
|
|
{
|
|
public:
|
|
CLBarItemBalloonBase();
|
|
virtual ~CLBarItemBalloonBase();
|
|
|
|
//
|
|
// 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 GetStatus(DWORD *pdwStatus);
|
|
STDMETHODIMP Show(BOOL fShow);
|
|
STDMETHODIMP GetTooltipString(BSTR *pbstrToolTip);
|
|
|
|
//
|
|
// ITfLangBarItemBalloon
|
|
//
|
|
STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea);
|
|
STDMETHODIMP GetPreferredSize(const SIZE *pszDefault, SIZE *psize);
|
|
STDMETHODIMP GetBalloonInfo(TF_LBBALLOONINFO *pInfo) = 0;
|
|
|
|
void SetPreferedSize(SIZE *psize) {_sizePrefered = *psize;}
|
|
private:
|
|
SIZE _sizePrefered;
|
|
};
|
|
|
|
#endif // NUIBASE_H
|