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.
1533 lines
39 KiB
1533 lines
39 KiB
//
|
|
// tipbar.h
|
|
//
|
|
|
|
#ifndef _TIPBAR_H_
|
|
#define _TIPBAR_H_
|
|
|
|
#include "private.h"
|
|
#include "cuitb.h"
|
|
#include "cuiwnd.h"
|
|
#include "ptrary.h"
|
|
#include "utbmenu.h"
|
|
#include "slbarid.h"
|
|
#include "itemlist.h"
|
|
#include "maskbmp.h"
|
|
#include "tlapi.h"
|
|
#include "cuibln.h"
|
|
#include "msutbapi.h"
|
|
#include "utbacc.h"
|
|
#include "resource.h"
|
|
#include "shellwnd.h"
|
|
|
|
//
|
|
// from uim\nuictrl.cpp
|
|
//
|
|
HRESULT WINAPI TF_RunInputCPL();
|
|
|
|
|
|
#define STATUSWND_WIDTH 100
|
|
#define STATUSWND_HEIGHT 24
|
|
#define STATUSWND_DEF_X 50
|
|
#define STATUSWND_DEF_Y 580
|
|
|
|
#define CX_ITEMMARGIN 6
|
|
#define CY_ITEMMARGIN 6
|
|
#define CX_ITEMMARGIN_THEME 4
|
|
#define CY_ITEMMARGIN_THEME 2
|
|
#define ITEMDISTANCE 6
|
|
#define ITEMDISTANCE_THEME 2
|
|
|
|
#define CTRLITEMHEIGHTMARGIN 0
|
|
#define CTRLITEMHEIGHTMARGIN_THEME 1
|
|
|
|
#define KANACAPSBMP_WIDTH 21
|
|
#define KANACAPSBMP_HEIGHT 7
|
|
|
|
class CTipbarThread;
|
|
class CTipbarButtonItem;
|
|
class CTipbarItem;
|
|
class CTipbarWnd;
|
|
class CTipbarCtrlButton;
|
|
class CEnumCatCache;
|
|
class CGuidDwordCache;
|
|
class CTipbarCtrlButtonHolder;
|
|
class CDeskBand;
|
|
|
|
extern const IID IID_PRIV_BUTTONITEM;
|
|
extern const IID IID_PRIV_BITMAPBUTTONITEM;
|
|
extern const IID IID_PRIV_BITMAPITEM;
|
|
extern const IID IID_PRIV_BALLOONITEM;
|
|
|
|
extern DWORD g_dwWndStyle;
|
|
extern DWORD g_dwMenuStyle;
|
|
extern const TCHAR c_szUTBKey[];
|
|
extern const TCHAR c_szShowDeskBand[];
|
|
extern const TCHAR c_szDontShowCloseLangBarDlg[];
|
|
extern const TCHAR c_szDontShowMinimizeLangBarDlg[];
|
|
extern const TCHAR c_szShowMinimizedBalloon[];
|
|
extern BOOL g_bShowCloseMenu;
|
|
extern BOOL g_bShowMinimizedBalloon;
|
|
extern BOOL g_bWinLogon;
|
|
extern BOOL g_bShowDeskBand;
|
|
|
|
extern BOOL g_fTaskbarTheme;
|
|
|
|
extern BOOL g_bIntelliSense;
|
|
|
|
//
|
|
// IDs for Timer
|
|
//
|
|
#define TIPWND_TIMER_STUBSTART 1
|
|
#define TIPWND_TIMER_STUBEND 2
|
|
#define TIPWND_TIMER_BACKTOALPHA 3
|
|
#define TIPWND_TIMER_ONTHREADITEMCHANGE 4
|
|
#define TIPWND_TIMER_SETWINDOWPOS 5
|
|
#define TIPWND_TIMER_ONUPDATECALLED 6
|
|
#define TIPWND_TIMER_SYSCOLORCHANGED 7
|
|
#define TIPWND_TIMER_UPDATEUI 8
|
|
#define TIPWND_TIMER_SHOWWINDOW 9
|
|
#define TIPWND_TIMER_MOVETOTRAY 10
|
|
#define TIPWND_TIMER_DOACCDEFAULTACTION 11
|
|
#define TIPWND_TIMER_DISPLAYCHANGE 12
|
|
#define TIPWND_TIMER_ENSUREFOCUS 13
|
|
#define TIPWND_TIMER_SHOWDESKBAND 14
|
|
|
|
extern UINT g_uTimerElapseTRAYWNDONDELAYMSG;
|
|
extern UINT g_uTimerElapseDOACCDEFAULTACTION;
|
|
|
|
#define TRAYICONWND_TIMER_ONDELAYMSG 100
|
|
|
|
#define TIPWND_TIMER_DEMOTEITEMFIRST 10000
|
|
#define TIPWND_TIMER_DEMOTEITEMLAST 10050
|
|
|
|
BOOL GetTipbarInternal(HWND hwndParent, DWORD dwFlags, CDeskBand *pDeskBand);
|
|
BOOL IsDeskBandFromReg();
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// predefined control buttons
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
struct CTRLBTNMAP {
|
|
DWORD dwId;
|
|
DWORD dwStyle;
|
|
int nColumn;
|
|
int nRow;
|
|
DWORD dwFlags;
|
|
WCHAR wsz[2];
|
|
};
|
|
|
|
#define CY_CTRLBTN 9
|
|
#define CX_COLUMN0 24
|
|
#define CX_COLUMN1 16
|
|
|
|
#define CTRL_USEMARLETT 0x0001
|
|
#define CTRL_ICONFROMRES 0x0002
|
|
#define CTRL_TOGGLEBUTTON 0x0004
|
|
#define CTRL_DISABLEONWINLOGON 0x0008
|
|
|
|
#define ID_CBTN_MINIMIZE 100
|
|
#define ID_CBTN_EXTMENU 101
|
|
#define ID_CBTN_KANAKEY 102
|
|
#define ID_CBTN_CAPSKEY 103
|
|
#define ID_CBTN_RESTORE 104
|
|
#define NUM_CTRLBUTTONS 4
|
|
|
|
// #define CX_CTRLBTNAREA (12 + 24)
|
|
|
|
//
|
|
// dwFlags for CTipbarCtrlButtonHolder::Locate()
|
|
//
|
|
#define TCBH_NOCOLUMN0 0x0001
|
|
#define TCBH_NOCOLUMN 0x0002
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// misc func
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL InitFromReg();
|
|
|
|
HRESULT SetGlobalCompartmentDWORD(REFGUID rguidComp, DWORD dw);
|
|
HRESULT GetGlobalCompartmentDWORD(REFGUID rguidComp, DWORD *pdw);
|
|
void TurnOffSpeechIfItsOn();
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CItemSortScore
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CItemSortScore
|
|
{
|
|
public:
|
|
CItemSortScore(DWORD dwCat = 0, DWORD dwItem = 0, DWORD dwSub = 0)
|
|
{
|
|
_dwCat = dwCat;
|
|
_dwItem = dwItem;
|
|
_dwSub = dwSub;
|
|
}
|
|
|
|
void Set(DWORD dwCat, DWORD dwItem, DWORD dwSub)
|
|
{
|
|
_dwCat = dwCat;
|
|
_dwItem = dwItem;
|
|
_dwSub = dwSub;
|
|
}
|
|
|
|
friend int operator >(CItemSortScore &s1, CItemSortScore &s2)
|
|
{
|
|
if (s1._dwCat > s2._dwCat)
|
|
return 1;
|
|
else if (s1._dwCat < s2._dwCat)
|
|
return 0;
|
|
|
|
if (s1._dwItem > s2._dwItem)
|
|
return 1;
|
|
else if (s1._dwItem < s2._dwItem)
|
|
return 0;
|
|
|
|
if (s1._dwSub > s2._dwSub)
|
|
return 1;
|
|
else if (s1._dwSub < s2._dwSub)
|
|
return 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
CItemSortScore& operator =(const CItemSortScore& iss)
|
|
{
|
|
_dwCat = iss._dwCat;
|
|
_dwItem = iss._dwItem;
|
|
_dwSub = iss._dwSub;
|
|
return *this;
|
|
}
|
|
|
|
DWORD GetCat() {return _dwCat;}
|
|
|
|
private:
|
|
DWORD _dwCat;
|
|
DWORD _dwItem;
|
|
DWORD _dwSub;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarGripper
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarGripper: public CUIFGripper
|
|
{
|
|
public:
|
|
CTipbarGripper(CTipbarWnd *pTipbarWnd, RECT *prc, DWORD dwStyle);
|
|
|
|
BOOL OnSetCursor(UINT uMsg, POINT pt);
|
|
void OnRButtonUp(POINT pt);
|
|
void OnLButtonUp(POINT pt);
|
|
|
|
CTipbarWnd *_pTipbarWnd;
|
|
BOOL _fInMenu;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarCtrlButtonHolder
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarCtrlButtonHolder
|
|
{
|
|
public:
|
|
CTipbarCtrlButtonHolder();
|
|
|
|
void Init(CTipbarWnd *ptw);
|
|
void EnableBtns();
|
|
void UpdateBitmap(CTipbarWnd *ptw);
|
|
void Locate(CTipbarWnd *ptw, int x, int y, int nHeight, DWORD dwFlags, BOOL fVertical);
|
|
int GetWidth(DWORD dwFlags);
|
|
void UpdateCapsKanaState(LPARAM lParam);
|
|
|
|
CTipbarCtrlButton *GetCtrlBtn(DWORD dwId);
|
|
private:
|
|
CTRLBTNMAP *_pcbCtrlBtn;
|
|
CTipbarCtrlButton *_rgpCtrlBtn[NUM_CTRLBUTTONS];
|
|
CMaskBitmap _maskbmpCap;
|
|
CMaskBitmap _maskbmpKana;
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarWnd
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// for Get/SetNotifyStatus()
|
|
//
|
|
#define TW_NS_ONSETFOCUS 0x0001
|
|
#define TW_NS_ONTHREADITEMCHANGE 0x0002
|
|
|
|
class CTipbarWnd: public ITfLangBarEventSink,
|
|
public ITfLangBarEventSink_P,
|
|
public CTipbarAccItem,
|
|
public CTipbarCoInitialize,
|
|
public CUIFWindow
|
|
{
|
|
public:
|
|
CTipbarWnd(DWORD dwStyle);
|
|
~CTipbarWnd();
|
|
|
|
//
|
|
// IUnknown methods
|
|
//
|
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
//
|
|
// ITfLangBarEventSink
|
|
//
|
|
STDMETHODIMP OnSetFocus(DWORD dwThreadId);
|
|
STDMETHODIMP OnThreadTerminate(DWORD dwThreadId);
|
|
STDMETHODIMP OnThreadItemChange(DWORD dwThreadId);
|
|
STDMETHODIMP OnModalInput(DWORD dwThreadId, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
STDMETHODIMP ShowFloating(DWORD dwFlags);
|
|
STDMETHODIMP GetItemFloatingRect(DWORD dwThreadId, REFGUID rguid, RECT *prc);
|
|
|
|
//
|
|
// ITfLangBarEventSink_P
|
|
//
|
|
STDMETHODIMP OnLangBarUpdate(UINT uUpdate, LPARAM lParam);
|
|
|
|
// void UpdateUI() {InvalidateRect(GetWnd(), NULL, FALSE);}
|
|
|
|
BOOL IsFullScreenWindow(HWND hwnd);
|
|
HRESULT SetFocusThread(CTipbarThread *pThread);
|
|
HRESULT AttachFocusThread();
|
|
HRESULT OnThreadItemChangeInternal(DWORD dwThreadId);
|
|
HRESULT OnThreadTerminateInternal(DWORD dwThreadId);
|
|
void CleanUpThreadPointer(CTipbarThread *pThread, BOOL fCheckThreadArray);
|
|
void EnsureFocusThread();
|
|
|
|
void Init(BOOL fInDeskband, CDeskBand *pDeskBand);
|
|
void UnInit();
|
|
void SetVertical(BOOL fVertical);
|
|
void UpdateVerticalFont();
|
|
HFONT CreateVerticalFont();
|
|
BOOL SetLangBand(BOOL fLangBand, BOOL fNotify = TRUE);
|
|
void SetMoveRect( int x, int y, int nWidth, int nHeight);
|
|
virtual void Move( int x, int y, int nWidth, int nHeight);
|
|
void LocateCtrlButtons();
|
|
void SetAlpha(BYTE bAlpha, BOOL fTemp);
|
|
|
|
DWORD _dwlbimCookie;
|
|
|
|
BOOL IsInDeskBand() {return _fInDeskBand;}
|
|
|
|
void DestroyWnd()
|
|
{
|
|
if (IsWindow(GetWnd()))
|
|
DestroyWindow(GetWnd());
|
|
}
|
|
|
|
int GetTipbarHeight()
|
|
{
|
|
int nRet;
|
|
SIZE sizeWndFrame;
|
|
|
|
// window frame
|
|
|
|
sizeWndFrame.cx = 0;
|
|
sizeWndFrame.cy = 0;
|
|
if (_pWndFrame != NULL) {
|
|
_pWndFrame->GetFrameSize( &sizeWndFrame );
|
|
}
|
|
nRet = _cySmIcon;
|
|
|
|
nRet += max(CY_ITEMMARGIN,
|
|
CY_ITEMMARGIN_THEME + _marginsItem.cyTopHeight + _marginsItem.cyBottomHeight);
|
|
nRet += (sizeWndFrame.cy * 2);
|
|
return nRet;
|
|
}
|
|
|
|
DWORD GetWndStyle( void )
|
|
{
|
|
return CUIFWindow::GetWndStyle() & ~WS_BORDER;
|
|
}
|
|
|
|
BOOL CheckExcludeCaptionButtonMode(RECT *prcWnd, RECT *prcWork)
|
|
{
|
|
//
|
|
// if the window is not top, we don't move to exclude caption mode.
|
|
//
|
|
if (prcWnd->top >= prcWork->top + 5)
|
|
return FALSE;
|
|
|
|
//
|
|
// if the window is near right-top corner, we move to exclude caption
|
|
// mode.
|
|
//
|
|
if (prcWnd->right + (_cxCapBtn * 5) >= prcWork->right)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL IsShowText() {return _fShowText;}
|
|
BOOL IsShowTrayIcon() {return _fShowTrayIcon;}
|
|
|
|
void SetShowText(BOOL fShowText);
|
|
void SetShowTrayIcon(BOOL fShowTrayIcon);
|
|
void MoveToStub(BOOL fHide);
|
|
void RestoreFromStub();
|
|
|
|
CTipbarThread *GetFocusThread() {return _pFocusThread;}
|
|
CTipbarThread *GetThread(DWORD dwThread);
|
|
void RestoreLastFocus(DWORD *pdwThreadId, BOOL fPrev);
|
|
|
|
CModalMenu *_pModalMenu;
|
|
void CancelMenu();
|
|
CTipbarThread *_pttModal;
|
|
|
|
void SetWaitNotifyThread(DWORD dwThread) { _dwThreadIdWaitNotify = dwThread;}
|
|
ITfLangBarMgr_P *GetLangBarMgr() {return _putb;}
|
|
|
|
BOOL IsSFShowNormal() { return (_dwSFTFlags & TF_SFT_SHOWNORMAL) ? TRUE : FALSE; }
|
|
BOOL IsSFDocked() { return (_dwSFTFlags & TF_SFT_DOCK) ? TRUE : FALSE; }
|
|
BOOL IsSFMinmized() { return (_dwSFTFlags & TF_SFT_MINIMIZED) ? TRUE : FALSE; }
|
|
BOOL IsSFHidden() { return (_dwSFTFlags & TF_SFT_HIDDEN) ? TRUE : FALSE; }
|
|
BOOL IsSFDeskband() { return (_dwSFTFlags & TF_SFT_DESKBAND) ? TRUE : FALSE; }
|
|
BOOL IsSFNoExtraIcon() { return !_fAddExtraIcon; }
|
|
|
|
CLangBarItemList _itemList;
|
|
HFONT GetMarlett() {return _hfontMarlett;}
|
|
HFONT GetVerticalFont() {return _hfontVert;}
|
|
|
|
int GetCtrlButtonWidth()
|
|
{
|
|
DWORD dwFlags = 0;
|
|
|
|
if (IsSFDeskband() && IsSFNoExtraIcon())
|
|
dwFlags |= TCBH_NOCOLUMN;
|
|
|
|
if (!IsCapKanaShown())
|
|
dwFlags |= TCBH_NOCOLUMN0;
|
|
|
|
return _ctrlbtnHolder.GetWidth(dwFlags);
|
|
}
|
|
|
|
void InitHighContrast()
|
|
{
|
|
HIGHCONTRAST hc;
|
|
_fHighContrastOn = FALSE;
|
|
hc.cbSize = sizeof(HIGHCONTRAST);
|
|
if (SystemParametersInfo(SPI_GETHIGHCONTRAST,
|
|
sizeof(HIGHCONTRAST),
|
|
&hc,
|
|
FALSE))
|
|
{
|
|
if (hc.dwFlags & HCF_HIGHCONTRASTON)
|
|
_fHighContrastOn = TRUE;
|
|
}
|
|
}
|
|
|
|
BOOL IsHighContrastOn() {return _fHighContrastOn ? TRUE : FALSE;}
|
|
|
|
void InitMetrics()
|
|
{
|
|
_cxSmIcon = GetSystemMetrics( SM_CXSMICON );
|
|
_cySmIcon = GetSystemMetrics( SM_CYSMICON );
|
|
LONG_PTR dwStyle = GetWindowLongPtr(GetWnd(), GWL_STYLE);
|
|
if (dwStyle & WS_DLGFRAME)
|
|
{
|
|
_cxDlgFrame = GetSystemMetrics(SM_CXDLGFRAME) * 2;
|
|
_cyDlgFrame = GetSystemMetrics(SM_CYDLGFRAME) * 2;
|
|
}
|
|
else if (dwStyle & WS_BORDER)
|
|
{
|
|
_cxDlgFrame = GetSystemMetrics(SM_CXBORDER) * 2;
|
|
_cyDlgFrame = GetSystemMetrics(SM_CYBORDER) * 2;
|
|
}
|
|
else
|
|
{
|
|
_cxDlgFrame = 0;
|
|
_cyDlgFrame = 0;
|
|
}
|
|
}
|
|
|
|
int GetSmIconWidth() {return _cxSmIcon;}
|
|
int GetSmIconHeight() {return _cySmIcon;}
|
|
int GetCxDlgFrame() {return _cxDlgFrame;}
|
|
int GetCyDlgFrame() {return _cyDlgFrame;}
|
|
|
|
int GetGripperWidth();
|
|
|
|
void StartModalInput(ITfLangBarEventSink *pSink, DWORD dwThreadId);
|
|
void StopModalInput(DWORD dwThreadId);
|
|
|
|
CUIFWndFrame *GetWndFrame() {return _pWndFrame;}
|
|
|
|
void MoveToTray();
|
|
|
|
void ClearLBItemList();
|
|
|
|
void MyClientToScreen(POINT *ppt, RECT *prc)
|
|
{
|
|
if (ppt)
|
|
ClientToScreen(GetWnd(), ppt);
|
|
if (prc)
|
|
{
|
|
ClientToScreen(GetWnd(), (POINT *)&prc->left);
|
|
ClientToScreen(GetWnd(), (POINT *)&prc->right);
|
|
}
|
|
}
|
|
void ShowOverScreenSizeBalloon();
|
|
void DestroyOverScreenSizeBalloon();
|
|
|
|
void SetExcludeCaptionButtonMode(BOOL bSet) {_bInExcludeCaptionButtonMode = bSet;}
|
|
BOOL IsInExcludeCaptionButtonMode() {return _bInExcludeCaptionButtonMode;}
|
|
void ShowContextMenu(POINT pt, RECT *prc, BOOL fExtendMenuItems);
|
|
|
|
|
|
BOOL IsCapKanaShown()
|
|
{
|
|
HKL hkl = GetFocusKeyboardLayout();
|
|
return (LOWORD(hkl) == 0x411) ? TRUE : FALSE;
|
|
}
|
|
|
|
CTipbarCtrlButtonHolder *GetCtrlButtonHolder() {return &_ctrlbtnHolder;}
|
|
|
|
BOOL IsInFullScreen() {return _fInFullScreen;}
|
|
|
|
BOOL _fIsItemShownInFloatingToolbar;
|
|
|
|
void StartPendingUpdateUI()
|
|
{
|
|
_dwPendingUpdateUI++;
|
|
}
|
|
|
|
void EndPendingUpdateUI()
|
|
{
|
|
Assert(_dwPendingUpdateUI > 0);
|
|
_dwPendingUpdateUI--;
|
|
}
|
|
|
|
BOOL IsInItemChangeOrDirty(CTipbarThread *pThread);
|
|
|
|
BSTR GetAccName( void )
|
|
{
|
|
return SysAllocString(CRStr(IDS_LANGBAR));
|
|
}
|
|
|
|
void GetAccLocation( RECT *prc )
|
|
{
|
|
GetRect(prc);
|
|
}
|
|
|
|
BOOL StartDoAccDefaultActionTimer(CTipbarItem *pItem);
|
|
CTipbarAccessible *GetAccessible() {return _pTipbarAcc;}
|
|
|
|
BOOL IsVertical() {return _fVertical;}
|
|
|
|
void UpdatePosFlags();
|
|
|
|
BOOL AutoAdjustDeskBandSize();
|
|
BOOL AdjustDeskBandSize(BOOL fFit);
|
|
void ClearDeskbandSizeAdjusted()
|
|
{
|
|
_fDeskbandSizeAdjusted = FALSE;
|
|
}
|
|
|
|
void SetDeskbandSizeAdjusted()
|
|
{
|
|
_fDeskbandSizeAdjusted = TRUE;
|
|
}
|
|
|
|
void SetAdjustDeskbandIfNoRoom()
|
|
{
|
|
_fAdjustDeskbandIfNoRoom = TRUE;
|
|
}
|
|
|
|
BOOL IsSingleKeyboardLayout()
|
|
{
|
|
if (::GetKeyboardLayoutList(0, NULL) == 1)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
HKL GetFocusKeyboardLayout() ;
|
|
|
|
UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT uElapse)
|
|
{
|
|
if (!IsWindow(GetWnd()))
|
|
return 0;
|
|
|
|
return ::SetTimer(GetWnd(), nIDEvent, uElapse, NULL);
|
|
}
|
|
|
|
UINT_PTR KillTimer(UINT_PTR nIDEvent)
|
|
{
|
|
if (!IsWindow(GetWnd()))
|
|
return 0;
|
|
|
|
return ::KillTimer(GetWnd(), nIDEvent);
|
|
}
|
|
|
|
private:
|
|
CTipbarThread *_FindThread(DWORD dwThread);
|
|
CTipbarThread *_CreateThread(DWORD dwThread);
|
|
void OnCreate(HWND hWnd);
|
|
void OnDestroy(HWND hWnd);
|
|
void OnEndSession(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
|
void SavePosition();
|
|
void HandleMouseMsg( UINT uMsg, POINT pt );
|
|
void OnMouseOutFromWindow( POINT pt );
|
|
void OnTimer(UINT uId);
|
|
void OnSysColorChange();
|
|
void OnUser(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
LRESULT OnShowWindow( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
|
LRESULT OnSettingChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
LRESULT OnDisplayChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
LRESULT OnWindowPosChanged(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
LRESULT OnWindowPosChanging(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
LRESULT OnEraseBkGnd( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
|
LRESULT OnGetObject( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
|
void OnThemeChanged(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
|
void PaintObject( HDC hDC, const RECT *prcUpdate );
|
|
void UpdateUI(const RECT *prcUpdate );
|
|
|
|
void AdjustPosOnDisplayChange();
|
|
|
|
void KillOnTheadItemChangeTimer();
|
|
|
|
void OnTerminateToolbar();
|
|
void TerminateAllThreads(BOOL fTerminatFocusThread);
|
|
|
|
static void SetThis(HWND hWnd, LPARAM lParam)
|
|
{
|
|
SetWindowLongPtr(hWnd, GWLP_USERDATA,
|
|
(LONG_PTR)((CREATESTRUCT *)lParam)->lpCreateParams);
|
|
}
|
|
|
|
static CTipbarWnd *GetThis(HWND hWnd)
|
|
{
|
|
CTipbarWnd *p = (CTipbarWnd *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
|
Assert(p != NULL);
|
|
return p;
|
|
}
|
|
|
|
|
|
#ifdef USE_OFC10LOOKONWINXP
|
|
void CheckO10Flag();
|
|
#endif
|
|
|
|
void StartBackToAlphaTimer()
|
|
{
|
|
//
|
|
// doubld-click-time * 3 is ok?
|
|
//
|
|
::SetTimer(GetWnd(),
|
|
TIPWND_TIMER_BACKTOALPHA,
|
|
GetDoubleClickTime() * 3,
|
|
NULL);
|
|
}
|
|
|
|
CUIFWndFrame *_pWndFrame;
|
|
CTipbarGripper *_pGripper;
|
|
CTipbarThread *_pFocusThread;
|
|
CPtrArray<CTipbarThread> _rgThread;
|
|
BYTE _bAlpha;
|
|
BOOL _fFocusAttached : 1;
|
|
BOOL _fInDeskBand : 1;
|
|
BOOL _fVertical : 1;
|
|
BOOL _bCurAlpha : 1;
|
|
|
|
BOOL _fShowText : 1;
|
|
BOOL _fShowTrayIcon : 1;
|
|
BOOL _fInStub : 1;
|
|
BOOL _fInStubShow : 1;
|
|
BOOL _fHighContrastOn : 1;
|
|
BOOL _fInFullScreen : 1;
|
|
|
|
BOOL _fNeedMoveWindow : 1;
|
|
BOOL _fInHandleMouseMsg : 1;
|
|
BOOL _bInExcludeCaptionButtonMode : 1;
|
|
BOOL _fInEnsureFocusThread : 1;
|
|
BOOL _fDeskbandSizeAdjusted : 1;
|
|
BOOL _fAdjustDeskbandIfNoRoom : 1;
|
|
|
|
BOOL _fTerminating : 1;
|
|
|
|
BOOL _fAddExtraIcon : 1;
|
|
|
|
BOOL _fPosTop : 1;
|
|
BOOL _fPosBottom : 1;
|
|
BOOL _fPosRight : 1;
|
|
BOOL _fPosLeft : 1;
|
|
|
|
int _cxCapBtn;
|
|
DWORD _dwSFTFlags;
|
|
DWORD _dwPrevTBStatus;
|
|
|
|
int _cxSmIcon;
|
|
int _cySmIcon;
|
|
int _cxDlgFrame;
|
|
int _cyDlgFrame;
|
|
|
|
HFONT _hfontMarlett;
|
|
HFONT _hfontVert;
|
|
ITfLangBarMgr_P *_putb;
|
|
|
|
DWORD _dwThreadIdWaitNotify;
|
|
CTipbarCtrlButtonHolder _ctrlbtnHolder;
|
|
|
|
CUIFBalloonWindow *_pblnOverScreenSize;
|
|
|
|
DWORD _dwThreadItemChangedForTimer;
|
|
|
|
DWORD _dwPendingUpdateUI;
|
|
RECT _rcNew;
|
|
|
|
//
|
|
// MSAA support
|
|
//
|
|
CTipbarAccessible *_pTipbarAcc;
|
|
int _nDoAccDefaultActionItemId;
|
|
|
|
MARGINS _marginsItem;
|
|
int _cxItemMargin;
|
|
int _nItemDistance;
|
|
int _nCtrlItemHeightMargin;
|
|
|
|
public:
|
|
MARGINS *GetThemeMargins() {return &_marginsItem;}
|
|
int GetItemMargin()
|
|
{
|
|
return _cxItemMargin;
|
|
}
|
|
|
|
int GetItemDistance()
|
|
{
|
|
return _nItemDistance;
|
|
}
|
|
|
|
int GetCtrlItemHeightMargin()
|
|
{
|
|
return _nCtrlItemHeightMargin;
|
|
}
|
|
|
|
int GetCaptionButtonWidth()
|
|
{
|
|
return _cxCapBtn;
|
|
}
|
|
|
|
void InitThemeMargins();
|
|
|
|
BOOL _fShowWindowAtTimer : 1;
|
|
BOOL _fShowOverItemBalloonAtTimer : 1;
|
|
CTipbarThread *_pThreadShowWindowAtTimer;
|
|
|
|
BOOL IsHKLToSkipRedrawOnNoItem();
|
|
|
|
void ClearDeskBandPointer()
|
|
{
|
|
_pDeskBand = NULL;
|
|
}
|
|
|
|
private:
|
|
|
|
CDeskBand *_pDeskBand;
|
|
|
|
CShellWndThread shellwnd;
|
|
int _cRef;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarThread
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarThread
|
|
{
|
|
public:
|
|
CTipbarThread(CTipbarWnd *ptw);
|
|
~CTipbarThread();
|
|
|
|
ULONG _AddRef( );
|
|
ULONG _Release( );
|
|
|
|
HRESULT Init(DWORD dwThreadId);
|
|
HRESULT InitItemList();
|
|
void GetTextSize(BSTR bstr, SIZE *psize);
|
|
BOOL InsertItem(ITfLangBarItem *plbi, CEnumCatCache *penumcache, CGuidDwordCache *pgdcache, RECT *prc, MARGINS *pmargins, TF_LANGBARITEMINFO *plbiInfo, DWORD *pdwStatus);
|
|
HRESULT _UninitItemList(BOOL fUnAdvise);
|
|
void _AdviseItemsSink();
|
|
HRESULT _UnadviseItemsSink();
|
|
BOOL UpdateItems();
|
|
void AddUIObjs();
|
|
void RemoveUIObjs();
|
|
void AddAllSeparators();
|
|
void RemoveAllSeparators();
|
|
void LocateItems();
|
|
void GetSortScore(CItemSortScore *pscore, TF_LANGBARITEMINFO *plbiInfo, CEnumCatCache *penumcache, CGuidDwordCache *pgdcache);
|
|
void MyMoveWnd(int dxOffset, int dyOffset);
|
|
|
|
BOOL SetFocus(BOOL fFocus);
|
|
|
|
BOOL IsFocusThread()
|
|
{
|
|
if (!_ptw)
|
|
return FALSE;
|
|
|
|
return (this == _ptw->GetFocusThread()) ? TRUE : FALSE;
|
|
}
|
|
|
|
void Disconnect()
|
|
{
|
|
_ptw = NULL;
|
|
}
|
|
|
|
DWORD IsDirtyItem();
|
|
BOOL CallOnUpdateHandler();
|
|
|
|
CTipbarWnd *_ptw;
|
|
ITfLangBarItemMgr *_plbim;
|
|
CPtrArray<CTipbarItem> _rgItem;
|
|
CPtrArray<CUIFSeparator> _rgSep;
|
|
int _nNumItem;
|
|
CTipbarItem *GetItem(REFGUID guid);
|
|
|
|
BOOL IsConsole() {return (_dwThreadFlags & TLF_NTCONSOLE) ? TRUE : FALSE;}
|
|
BOOL IsTIMActive() {return (_dwThreadFlags & TLF_TIMACTIVE) ? TRUE : FALSE;}
|
|
BOOL Is16bitTask() {return (_dwThreadFlags & TLF_16BITTASK) ? TRUE : FALSE;}
|
|
BOOL IsCtfmonProcess() {return (_dwThreadFlags & TLF_CTFMONPROCESS) ? TRUE : FALSE;}
|
|
|
|
DWORD _dwThreadId;
|
|
DWORD _dwThreadFlags;
|
|
DWORD _dwProcessId;
|
|
SIZE _sizeWnd;
|
|
DWORD _dwTickTime;
|
|
BOOL _fItemChanged : 1;
|
|
BOOL _fSkipRedrawOnNoItem : 1;
|
|
|
|
BOOL IsVertical()
|
|
{
|
|
if (!_ptw)
|
|
return FALSE;
|
|
|
|
return _ptw->IsVertical();
|
|
}
|
|
|
|
|
|
#ifdef DEBUG
|
|
BOOL _fInCallOnUpdateHandler;
|
|
BOOL _fIsInatItem;
|
|
#endif
|
|
|
|
private:
|
|
ULONG _ref;
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarItem
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarItem : public CTipbarAccItem
|
|
{
|
|
public:
|
|
CTipbarItem(CTipbarThread *ptt, ITfLangBarItem *plbi, TF_LANGBARITEMINFO *plbiInfo, DWORD dwStatus);
|
|
virtual ~CTipbarItem();
|
|
|
|
virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) = 0;
|
|
virtual STDMETHODIMP_(ULONG) AddRef(void) = 0;
|
|
virtual STDMETHODIMP_(ULONG) Release(void) = 0;
|
|
|
|
virtual STDMETHODIMP OnUpdate(DWORD dwFlags);
|
|
|
|
virtual BOOL OnSetCursor(UINT uMsg, POINT pt);
|
|
virtual void OnPosChanged() { return;}
|
|
void SetWidth(DWORD dw) {_dwWidth = dw;}
|
|
DWORD GetWidth() {return _dwWidth;}
|
|
CItemSortScore *GetItemSortScore() {return &_score;}
|
|
DWORD GetCatScore() {return _score.GetCat();}
|
|
|
|
virtual HRESULT OnUpdateHandler(DWORD dwFlags, DWORD dwStatus);
|
|
virtual void SetRect( const RECT *prc ) = 0;
|
|
virtual void AddMeToUI(CUIFObject *pobj) = 0;
|
|
virtual void RemoveMeToUI(CUIFObject *pobj) = 0;
|
|
|
|
void _AddedToUI();
|
|
void _RemovedToUI();
|
|
|
|
virtual void OnLeftClick() = 0;
|
|
|
|
virtual BOOL Init() = 0;
|
|
virtual void DetachWnd() = 0;
|
|
virtual void ClearWnd() = 0;
|
|
virtual void Enable(BOOL fEnable) = 0;
|
|
virtual void SetToolTip(LPCWSTR pwszToolTip) = 0;
|
|
virtual LPCWSTR GetToolTipFromUIOBJ() = 0;
|
|
virtual LPCWSTR GetToolTip();
|
|
virtual HICON GetIconFromUIObj() {return NULL;}
|
|
virtual void GetScreenRect(RECT *prc) = 0;
|
|
virtual void MoveToTray() {};
|
|
virtual void UninitUIResource() {}
|
|
virtual void SetFont(HFONT hfont) {}
|
|
virtual void SetText( WCHAR *psz) {}
|
|
|
|
DWORD _dwlbiSinkCookie;
|
|
|
|
|
|
DWORD GetStatus() {return _dwStatus;}
|
|
BOOL IsHiddenStatusControl() {return (_lbiInfo.dwStyle & TF_LBI_STYLE_HIDDENSTATUSCONTROL) ? TRUE : FALSE;}
|
|
BOOL IsShownInTray() {return (_lbiInfo.dwStyle & TF_LBI_STYLE_SHOWNINTRAY) ? TRUE : FALSE;}
|
|
BOOL IsShownInTrayOnly() {return (_lbiInfo.dwStyle & TF_LBI_STYLE_SHOWNINTRAYONLY) ? TRUE : FALSE;}
|
|
BOOL IsHideOnNoOtherItems() {return (_lbiInfo.dwStyle & TF_LBI_STYLE_HIDEONNOOTHERITEMS) ? TRUE : FALSE;}
|
|
BOOL IsHiddenByDefault() {return (_lbiInfo.dwStyle & TF_LBI_STYLE_HIDDENBYDEFAULT) ? TRUE : FALSE;}
|
|
BOOL IsToggled() {return (_dwStatus & TF_LBI_STATUS_BTN_TOGGLED) ? TRUE : FALSE;}
|
|
BOOL IsMenuBtn() {return (_lbiInfo.dwStyle & TF_LBI_STYLE_BTN_MENU) ? TRUE : FALSE;}
|
|
BOOL IsInHiddenStatus() {return (_dwStatus & TF_LBI_STATUS_HIDDEN) ? TRUE : FALSE;}
|
|
BOOL IsDisabled() {return (_dwStatus & TF_LBI_STATUS_DISABLED) ? TRUE : FALSE;}
|
|
BOOL IsTextColorIcon() {return (_lbiInfo.dwStyle & TF_LBI_STYLE_TEXTCOLORICON) ? TRUE : FALSE;}
|
|
WCHAR *GetDescriptionRef() {return _lbiInfo.szDescription;}
|
|
GUID *GetGUID() {return &_lbiInfo.guidItem;}
|
|
ITfLangBarItem *GetNotifyUI() {return _plbi;}
|
|
|
|
BOOL IsSystemItem()
|
|
{
|
|
return (IsEqualGUID(CLSID_SYSTEMLANGBARITEM, _lbiInfo.clsidService)) ? TRUE : FALSE;
|
|
}
|
|
|
|
DWORD GetDirtyUpdateFlags() {return _dwDirtyUpdateFlags;}
|
|
void ClearDirtyUpdateFlags() {_dwDirtyUpdateFlags = 0;}
|
|
void AddRemoveMeToUI(BOOL fAdd);
|
|
BOOL IsVisibleInToolbar() {return _fVisibleInToolbar;}
|
|
void VisibleInToolbar(BOOL fVisible) {_fVisibleInToolbar = fVisible;}
|
|
|
|
void ClearOnUpdateRequest() {_fNewOnUpdateRequest = FALSE;}
|
|
BOOL IsNewOnUpdateRequest() {return _fNewOnUpdateRequest;}
|
|
|
|
void ClearConnections()
|
|
{
|
|
_ptt = NULL;
|
|
SafeReleaseClear(_plbi);
|
|
}
|
|
|
|
void Disconnect()
|
|
{
|
|
_fDisconnected = TRUE;
|
|
}
|
|
|
|
BOOL IsConnected()
|
|
{
|
|
if (_fDisconnected)
|
|
return FALSE;
|
|
|
|
if (!_ptt)
|
|
return FALSE;
|
|
|
|
if (!_ptt->_ptw)
|
|
return FALSE;
|
|
|
|
if (!_plbi)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BSTR GetAccName( void )
|
|
{
|
|
return SysAllocString(_lbiInfo.szDescription);
|
|
}
|
|
|
|
void GetAccLocation( RECT *prc )
|
|
{
|
|
GetScreenRect(prc);
|
|
}
|
|
|
|
BOOL DoAccDefaultAction()
|
|
{
|
|
if (!_ptt || !_ptt->_ptw)
|
|
return FALSE;
|
|
|
|
_ptt->_ptw->StartDoAccDefaultActionTimer(this);
|
|
return TRUE;
|
|
}
|
|
|
|
virtual void SetActiveTheme(LPCWSTR pszClassList, int iPartID = 0, int iStateID = 0) = 0;
|
|
|
|
void SetTextSize(SIZE *psize)
|
|
{
|
|
_sizeText = *psize;
|
|
}
|
|
|
|
protected:
|
|
void MyClientToScreen(RECT *prc)
|
|
{
|
|
if (!_ptt || !_ptt->_ptw)
|
|
return;
|
|
|
|
_ptt->_ptw->MyClientToScreen(NULL, prc);
|
|
}
|
|
void MyClientToScreen(POINT *ppt, RECT *prc)
|
|
{
|
|
if (!_ptt || !_ptt->_ptw)
|
|
return;
|
|
|
|
_ptt->_ptw->MyClientToScreen(ppt, prc);
|
|
}
|
|
|
|
void StartDemotingTimer(BOOL fIntentionally)
|
|
{
|
|
if (!g_bIntelliSense)
|
|
return;
|
|
|
|
if (!_ptt || !_ptt->_ptw)
|
|
return;
|
|
|
|
if (!fIntentionally)
|
|
fIntentionally = _ptt->_ptw->_itemList.IsStartedIntentionally(*GetGUID());
|
|
_ptt->_ptw->_itemList.StartDemotingTimer(*GetGUID(), fIntentionally);
|
|
}
|
|
|
|
TF_LANGBARITEMINFO _lbiInfo;
|
|
DWORD _dwStatus;
|
|
|
|
DWORD _dwWidth;
|
|
CTipbarThread *_ptt;
|
|
ITfLangBarItem *_plbi;
|
|
|
|
SIZE _sizeText;
|
|
|
|
BOOL _fToolTipInit : 1;
|
|
BOOL _fAddedToUI : 1;
|
|
BOOL _fAddedToIconTray : 1;
|
|
BOOL _fVisibleInToolbar : 1;
|
|
BOOL _fDisconnected : 1;
|
|
BOOL _fNewOnUpdateRequest : 1;
|
|
DWORD _dwDirtyUpdateFlags;
|
|
|
|
int _cRef;
|
|
|
|
private:
|
|
CItemSortScore _score;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarItemGuidArray
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarItemGuidArray
|
|
{
|
|
public:
|
|
CTipbarItemGuidArray() {_pguid = NULL;}
|
|
~CTipbarItemGuidArray()
|
|
{
|
|
if (_pguid)
|
|
delete _pguid;
|
|
}
|
|
|
|
BOOL Init(CPtrArray<CTipbarItem> *prgItem)
|
|
{
|
|
int i;
|
|
_pguid = new GUID[prgItem->Count()];
|
|
if (!_pguid)
|
|
return FALSE;
|
|
|
|
for (i = 0; i < prgItem->Count(); i++)
|
|
{
|
|
CTipbarItem *ptbItem = prgItem->Get(i);
|
|
Assert(ptbItem);
|
|
_pguid[i] = *ptbItem->GetGUID();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
GUID *GetPtr() {return _pguid;}
|
|
|
|
private:
|
|
GUID *_pguid;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarButtonItem
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarButtonItem: public CTipbarItem,
|
|
public CUIFToolbarButton,
|
|
public ITfLangBarItemSink
|
|
{
|
|
public:
|
|
CTipbarButtonItem(CTipbarThread *ptt,
|
|
ITfLangBarItem *plbi,
|
|
ITfLangBarItemButton *plbiButton,
|
|
DWORD dwId,
|
|
RECT *prc,
|
|
DWORD dwStyle,
|
|
DWORD dwSBtnStyle,
|
|
DWORD dwSBtnShowType,
|
|
TF_LANGBARITEMINFO *plbiInfo,
|
|
DWORD dwStatus);
|
|
~CTipbarButtonItem();
|
|
|
|
//
|
|
// IUnknown methods
|
|
//
|
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
//
|
|
// ITfLangbarItemSink methods
|
|
//
|
|
STDMETHODIMP OnUpdate(DWORD dwFlags)
|
|
{
|
|
return CTipbarItem::OnUpdate(dwFlags);
|
|
}
|
|
|
|
BOOL Init()
|
|
{
|
|
CUIFToolbarButton::Initialize();
|
|
return CUIFToolbarButton::Init();
|
|
}
|
|
|
|
virtual void UninitUIResource()
|
|
{
|
|
HICON hIconOld = GetIconFromUIObj();
|
|
if (hIconOld)
|
|
DestroyIcon(hIconOld);
|
|
SetIcon((HICON)NULL);
|
|
}
|
|
|
|
void DetachWnd() {DetachWndObj();}
|
|
void ClearWnd() {ClearWndObj();}
|
|
void Enable(BOOL fEnable)
|
|
{
|
|
CUIFToolbarButton::Enable(fEnable);
|
|
}
|
|
|
|
void SetToolTip(LPCWSTR pwszToolTip)
|
|
{
|
|
CUIFToolbarButton::SetToolTip(pwszToolTip);
|
|
}
|
|
|
|
LPCWSTR GetToolTipFromUIOBJ()
|
|
{
|
|
return CUIFToolbarButton::GetToolTip();
|
|
}
|
|
|
|
LPCWSTR GetToolTip()
|
|
{
|
|
return CTipbarItem::GetToolTip();
|
|
}
|
|
|
|
HICON GetIconFromUIObj()
|
|
{
|
|
return CUIFToolbarButton::GetIcon();
|
|
}
|
|
|
|
HICON GetIcon()
|
|
{
|
|
HICON hIcon;
|
|
if (_plbiButton->GetIcon(&hIcon) == S_OK)
|
|
return hIcon;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void GetScreenRect(RECT *prc)
|
|
{
|
|
GetRect(prc);
|
|
MyClientToScreen(prc);
|
|
}
|
|
|
|
void SetFont(HFONT hfont)
|
|
{
|
|
CUIFToolbarButton::SetFont(hfont);
|
|
}
|
|
|
|
void SetText(WCHAR *psz)
|
|
{
|
|
CUIFToolbarButton::SetText(psz);
|
|
}
|
|
|
|
|
|
BOOL OnSetCursor(UINT uMsg, POINT pt) {return CTipbarItem::OnSetCursor(uMsg, pt);}
|
|
void OnRightClick();
|
|
void OnLeftClick();
|
|
void OnShowMenu();
|
|
void DoModalMenu(POINT *ppt, RECT *prc);
|
|
HRESULT OnUpdateHandler(DWORD dwFlags, DWORD dwStatus);
|
|
|
|
void SetRect( const RECT *prc ) {CUIFToolbarButton::SetRect(prc);}
|
|
void AddMeToUI(CUIFObject *pobj)
|
|
{
|
|
if (!pobj)
|
|
return;
|
|
|
|
pobj->AddUIObj(this);
|
|
_AddedToUI();
|
|
}
|
|
void RemoveMeToUI(CUIFObject *pobj)
|
|
{
|
|
if (!pobj)
|
|
return;
|
|
|
|
pobj->RemoveUIObj(this);
|
|
_RemovedToUI();
|
|
}
|
|
|
|
void MoveToTray();
|
|
|
|
|
|
ITfLangBarItemButton *GetNotifyUIButton() {return _plbiButton;}
|
|
ITfLangBarItemButton *GetLangBarItem() {return _plbiButton;}
|
|
|
|
virtual void SetActiveTheme(LPCWSTR pszClassList, int iPartID, int iStateID )
|
|
{
|
|
CUIFToolbarButton::SetActiveTheme(pszClassList, iPartID, iStateID);
|
|
}
|
|
|
|
//
|
|
// MSAA Support
|
|
//
|
|
BSTR GetAccDefaultAction()
|
|
{
|
|
return SysAllocString(CRStr(IDS_LEFTCLICK));
|
|
}
|
|
|
|
|
|
BOOL DoAccDefaultActionReal()
|
|
{
|
|
if (IsMenuOnly())
|
|
OnShowMenu();
|
|
else
|
|
OnLeftClick();
|
|
return TRUE;
|
|
}
|
|
private:
|
|
ITfLangBarItemButton *_plbiButton;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarBitmapButtonItem
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarBitmapButtonItem: public CTipbarItem,
|
|
public CUIFToolbarButton,
|
|
public ITfLangBarItemSink
|
|
{
|
|
public:
|
|
CTipbarBitmapButtonItem(CTipbarThread *ptt,
|
|
ITfLangBarItem *plbi,
|
|
ITfLangBarItemBitmapButton *plbiBitmapButton,
|
|
DWORD dwId,
|
|
RECT *prc,
|
|
DWORD dwStyle,
|
|
DWORD dwSBtnStyle,
|
|
DWORD dwSBtnShowType,
|
|
TF_LANGBARITEMINFO *plbiInfo,
|
|
DWORD dwStatus);
|
|
~CTipbarBitmapButtonItem();
|
|
|
|
//
|
|
// IUnknown methods
|
|
//
|
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
//
|
|
// ITfLangbarItemSink methods
|
|
//
|
|
STDMETHODIMP OnUpdate(DWORD dwFlags)
|
|
{
|
|
return CTipbarItem::OnUpdate(dwFlags);
|
|
}
|
|
|
|
BOOL Init()
|
|
{
|
|
CUIFToolbarButton::Initialize();
|
|
return CUIFToolbarButton::Init();
|
|
}
|
|
void DetachWnd() {DetachWndObj();}
|
|
void ClearWnd() {ClearWndObj();}
|
|
void Enable(BOOL fEnable)
|
|
{
|
|
CUIFToolbarButton::Enable(fEnable);
|
|
}
|
|
|
|
void SetToolTip(LPCWSTR pwszToolTip)
|
|
{
|
|
CUIFToolbarButton::SetToolTip(pwszToolTip);
|
|
}
|
|
|
|
LPCWSTR GetToolTipFromUIOBJ()
|
|
{
|
|
return CUIFToolbarButton::GetToolTip();
|
|
}
|
|
|
|
LPCWSTR GetToolTip()
|
|
{
|
|
return CTipbarItem::GetToolTip();
|
|
}
|
|
|
|
void GetScreenRect(RECT *prc)
|
|
{
|
|
GetRect(prc);
|
|
MyClientToScreen(prc);
|
|
}
|
|
|
|
void SetFont(HFONT hfont)
|
|
{
|
|
CUIFToolbarButton::SetFont(hfont);
|
|
}
|
|
|
|
void SetText(WCHAR *psz)
|
|
{
|
|
CUIFToolbarButton::SetText(psz);
|
|
}
|
|
|
|
BOOL OnSetCursor(UINT uMsg, POINT pt) {return CTipbarItem::OnSetCursor(uMsg, pt);}
|
|
void OnRightClick();
|
|
void OnLeftClick();
|
|
void OnShowMenu();
|
|
HRESULT OnUpdateHandler(DWORD dwFlags, DWORD dwStatus);
|
|
|
|
void SetRect( const RECT *prc ) {CUIFToolbarButton::SetRect(prc);}
|
|
void AddMeToUI(CUIFObject *pobj)
|
|
{
|
|
if (!pobj)
|
|
return;
|
|
|
|
pobj->AddUIObj(this);
|
|
_AddedToUI();
|
|
}
|
|
void RemoveMeToUI(CUIFObject *pobj)
|
|
{
|
|
if (!pobj)
|
|
return;
|
|
|
|
pobj->RemoveUIObj(this);
|
|
_RemovedToUI();
|
|
}
|
|
|
|
ITfLangBarItemBitmapButton *GetLangBarItem() {return _plbiBitmapButton;}
|
|
|
|
virtual void SetActiveTheme(LPCWSTR pszClassList, int iPartID, int iStateID )
|
|
{
|
|
CUIFToolbarButton::SetActiveTheme(pszClassList, iPartID, iStateID);
|
|
}
|
|
|
|
//
|
|
// MSAA Support
|
|
//
|
|
BSTR GetAccDefaultAction()
|
|
{
|
|
return SysAllocString(CRStr(IDS_LEFTCLICK));
|
|
}
|
|
|
|
BOOL DoAccDefaultActionReal()
|
|
{
|
|
if (IsMenuOnly())
|
|
OnShowMenu();
|
|
else
|
|
OnLeftClick();
|
|
return TRUE;
|
|
}
|
|
|
|
private:
|
|
BOOL _GetBitmapFromNUI();
|
|
|
|
ITfLangBarItemBitmapButton *_plbiBitmapButton;
|
|
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarBitmapItem
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarBitmapItem: public CTipbarItem,
|
|
public CUIFObject,
|
|
public ITfLangBarItemSink
|
|
{
|
|
public:
|
|
CTipbarBitmapItem(CTipbarThread *ptt,
|
|
ITfLangBarItem *plbi,
|
|
ITfLangBarItemBitmap *plbiButton,
|
|
DWORD dwId,
|
|
RECT *prc,
|
|
DWORD dwStyle,
|
|
TF_LANGBARITEMINFO *plbiInfo,
|
|
DWORD dwStatus);
|
|
|
|
~CTipbarBitmapItem();
|
|
|
|
//
|
|
// IUnknown methods
|
|
//
|
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
//
|
|
// ITfLangbarItemSink methods
|
|
//
|
|
STDMETHODIMP OnUpdate(DWORD dwFlags)
|
|
{
|
|
return CTipbarItem::OnUpdate(dwFlags);
|
|
}
|
|
|
|
BOOL Init()
|
|
{
|
|
CUIFObject::Initialize();
|
|
|
|
return TRUE;
|
|
}
|
|
void DetachWnd() {DetachWndObj();}
|
|
void ClearWnd() {ClearWndObj();}
|
|
|
|
void Enable(BOOL fEnable)
|
|
{
|
|
CUIFObject::Enable(fEnable);
|
|
}
|
|
|
|
void SetToolTip(LPCWSTR pwszToolTip)
|
|
{
|
|
CUIFObject::SetToolTip(pwszToolTip);
|
|
}
|
|
|
|
LPCWSTR GetToolTipFromUIOBJ()
|
|
{
|
|
return CUIFObject::GetToolTip();
|
|
}
|
|
|
|
LPCWSTR GetToolTip()
|
|
{
|
|
return CTipbarItem::GetToolTip();
|
|
}
|
|
|
|
void GetScreenRect(RECT *prc)
|
|
{
|
|
GetRect(prc);
|
|
MyClientToScreen(prc);
|
|
}
|
|
|
|
BOOL OnSetCursor(UINT uMsg, POINT pt) {return CTipbarItem::OnSetCursor(uMsg, pt);}
|
|
void OnPaint( HDC hdc );
|
|
void OnRightClick();
|
|
void OnLeftClick();
|
|
HRESULT OnUpdateHandler(DWORD dwFlags, DWORD dwStatus);
|
|
|
|
void SetRect( const RECT *prc );
|
|
void AddMeToUI(CUIFObject *pobj)
|
|
{
|
|
if (!pobj)
|
|
return;
|
|
|
|
pobj->AddUIObj(this);
|
|
_AddedToUI();
|
|
}
|
|
void RemoveMeToUI(CUIFObject *pobj)
|
|
{
|
|
if (!pobj)
|
|
return;
|
|
|
|
pobj->RemoveUIObj(this);
|
|
_RemovedToUI();
|
|
}
|
|
|
|
BOOL _GetBitmapFromNUI();
|
|
|
|
HBITMAP GetBitmap( void ) { return _hbmp; }
|
|
|
|
ITfLangBarItemBitmap *GetLangBarItem() {return _plbiBitmap;}
|
|
|
|
virtual void SetActiveTheme(LPCWSTR pszClassList, int iPartID, int iStateID )
|
|
{
|
|
CUIFObject::SetActiveTheme(pszClassList, iPartID, iStateID);
|
|
}
|
|
|
|
//
|
|
// MSAA Support
|
|
//
|
|
BSTR GetAccDefaultAction()
|
|
{
|
|
return SysAllocString(CRStr(IDS_LEFTCLICK));
|
|
}
|
|
|
|
BOOL DoAccDefaultActionReal()
|
|
{
|
|
OnLeftClick();
|
|
return TRUE;
|
|
}
|
|
private:
|
|
ITfLangBarItemBitmap *_plbiBitmap;
|
|
HBITMAP _hbmp;
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTipbarCtrlButton
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CTipbarCtrlButton: public CUIFButton2
|
|
{
|
|
public:
|
|
CTipbarCtrlButton(CTipbarWnd *ptw, DWORD dwId, const RECT *prc, DWORD dwStyle);
|
|
~CTipbarCtrlButton() {};
|
|
|
|
CTipbarWnd *_ptw;
|
|
|
|
void OnLButtonUp(POINT pt);
|
|
|
|
void SetVKey(UINT uVKey)
|
|
{
|
|
_uVKey = uVKey;
|
|
}
|
|
|
|
UINT GetVKey() {return _uVKey;}
|
|
|
|
|
|
void SetToggleStateByVKey()
|
|
{
|
|
Assert(_uVKey);
|
|
SHORT sKeyState;
|
|
sKeyState = GetKeyState(_uVKey);
|
|
CUIFButton2::SetToggleState((sKeyState & 0x01) ? TRUE : FALSE);
|
|
}
|
|
|
|
void ShowExtendMenu(POINT pt);
|
|
private:
|
|
BOOL _fInMenu;
|
|
|
|
void MyClientToScreen(POINT *ppt, RECT *prc)
|
|
{
|
|
_ptw->MyClientToScreen(ppt, prc);
|
|
}
|
|
|
|
UINT _uVKey;
|
|
};
|
|
|
|
#endif // _TIPBAR_H_
|