Leaked source code of windows server 2003
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

//
// 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_