From b35ff384285f8584e726bf3e83f53ca9c56145f3 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Thu, 27 Feb 2014 11:56:28 +0000 Subject: [PATCH] [RSHELL] * Improve hot-tracking behaviour. CORE-7881 svn path=/branches/shell-experiments/; revision=62347 --- base/shell/rshell/CMenuBand.cpp | 16 ++++------ base/shell/rshell/CMenuBand.h | 3 +- base/shell/rshell/CMenuToolbars.cpp | 46 ++++++++++++++++++++--------- base/shell/rshell/CMenuToolbars.h | 27 ++++++++++------- 4 files changed, 55 insertions(+), 37 deletions(-) diff --git a/base/shell/rshell/CMenuBand.cpp b/base/shell/rshell/CMenuBand.cpp index 6c3dcdd35d0..09afc7f432f 100644 --- a/base/shell/rshell/CMenuBand.cpp +++ b/base/shell/rshell/CMenuBand.cpp @@ -54,8 +54,7 @@ CMenuBand::CMenuBand() : m_subMenuChild(NULL), m_useBigIcons(FALSE), m_hotBar(NULL), - m_hotItem(-1), - m_popupItem(-1) + m_hotItem(-1) { m_focusManager = CMenuFocusManager::AcquireManager(); } @@ -625,12 +624,10 @@ HRESULT CMenuBand::_GetTopLevelWindow(HWND*topLevel) HRESULT CMenuBand::_OnHotItemChanged(CMenuToolbarBase * tb, INT id) { - if (m_hotBar && m_hotBar != tb) - m_hotBar->ChangeHotItem(-1); m_hotBar = tb; m_hotItem = id; - if (m_staticToolbar) m_staticToolbar->InvalidateDraw(); - if (m_SFToolbar) m_SFToolbar->InvalidateDraw(); + if (m_staticToolbar) m_staticToolbar->OnHotItemChanged(tb, id); + if (m_SFToolbar) m_SFToolbar->OnHotItemChanged(tb, id); return S_OK; } @@ -717,7 +714,7 @@ HRESULT CMenuBand::_MenuItemHotTrack(DWORD changeType) return S_OK; } -HRESULT CMenuBand::_OnPopupSubMenu(INT popupItem, IMenuPopup * popup, POINTL * pAt, RECTL * pExclude) +HRESULT CMenuBand::_OnPopupSubMenu(IMenuPopup * popup, POINTL * pAt, RECTL * pExclude, CMenuToolbarBase * toolbar, INT item) { if (m_subMenuChild) { @@ -725,7 +722,8 @@ HRESULT CMenuBand::_OnPopupSubMenu(INT popupItem, IMenuPopup * popup, POINTL * p if (FAILED(hr)) return hr; } - m_popupItem = popupItem; + if (m_staticToolbar) m_staticToolbar->OnPopupItemChanged(toolbar, item); + if (m_SFToolbar) m_SFToolbar->OnPopupItemChanged(toolbar, item); m_subMenuChild = popup; if (popup) { @@ -733,8 +731,6 @@ HRESULT CMenuBand::_OnPopupSubMenu(INT popupItem, IMenuPopup * popup, POINTL * p popup->Popup(pAt, pExclude, MPPF_RIGHT); } - if (m_staticToolbar) m_staticToolbar->InvalidateDraw(); - if (m_SFToolbar) m_SFToolbar->InvalidateDraw(); return S_OK; } diff --git a/base/shell/rshell/CMenuBand.h b/base/shell/rshell/CMenuBand.h index adea4b72dff..1e6fec1beeb 100644 --- a/base/shell/rshell/CMenuBand.h +++ b/base/shell/rshell/CMenuBand.h @@ -60,7 +60,6 @@ private: CMenuToolbarBase * m_hotBar; INT m_hotItem; - INT m_popupItem; public: CMenuBand(); @@ -176,7 +175,7 @@ public: HRESULT _GetTopLevelWindow(HWND*topLevel); HRESULT _OnHotItemChanged(CMenuToolbarBase * tb, INT id); HRESULT _MenuItemHotTrack(DWORD changeType); - HRESULT _OnPopupSubMenu(INT popupItem, IMenuPopup * popup, POINTL * pAt, RECTL * pExclude); + HRESULT _OnPopupSubMenu(IMenuPopup * popup, POINTL * pAt, RECTL * pExclude, CMenuToolbarBase * toolbar, INT item); BOOL UseBigIcons() { diff --git a/base/shell/rshell/CMenuToolbars.cpp b/base/shell/rshell/CMenuToolbars.cpp index 7e9cf7c42d7..ee4e23b7b01 100644 --- a/base/shell/rshell/CMenuToolbars.cpp +++ b/base/shell/rshell/CMenuToolbars.cpp @@ -55,6 +55,7 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM COLORREF clrText; COLORREF clrTextHighlight; SIZE tbs; + bool isHot, isPopup; *theResult = 0; switch (uMsg) @@ -112,8 +113,10 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM rc = cdraw->nmcd.rc; hdc = cdraw->nmcd.hdc; - if (((INT) cdraw->nmcd.dwItemSpec == m_hotItem || - (m_hotItem < 0 && (INT) cdraw->nmcd.dwItemSpec == m_popupItem))) + isHot = m_hotBar == this && m_hotItem == (INT) cdraw->nmcd.dwItemSpec; + isPopup = m_popupBar == this && m_popupItem == (INT) cdraw->nmcd.dwItemSpec; + + if (isHot || (m_hotItem < 0 && isPopup)) { cdraw->nmcd.uItemState = CDIS_HOT; } @@ -168,11 +171,11 @@ CMenuToolbarBase::CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager) : m_menuBand(menuBand), m_hwndToolbar(NULL), m_dwMenuFlags(0), - m_hotItem(-1), - m_popupItem(-1), m_SubclassOld(NULL), m_hasIdealSize(FALSE), - m_usePager(usePager) + m_usePager(usePager), + m_hotItem(-1), + m_popupItem(-1) { m_marlett = CreateFont( 0, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, @@ -370,7 +373,7 @@ LRESULT CMenuToolbarBase::SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR { KillTimer(hWnd, TIMERID_HOTTRACK); - m_menuBand->_OnPopupSubMenu(-1, NULL, NULL, NULL); + m_menuBand->_OnPopupSubMenu(NULL, NULL, NULL, NULL, -1); if (HasSubMenu(m_hotItem) == S_OK) { @@ -404,7 +407,23 @@ HRESULT CMenuToolbarBase::OnHotItemChange(const NMTBHOTITEM * hot) return S_OK; } -HRESULT CMenuToolbarBase::PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu) +HRESULT CMenuToolbarBase::OnHotItemChanged(CMenuToolbarBase * toolbar, INT item) +{ + m_hotBar = toolbar; + m_hotItem = item; + InvalidateDraw(); + return S_OK; +} + +HRESULT CMenuToolbarBase::OnPopupItemChanged(CMenuToolbarBase * toolbar, INT item) +{ + m_popupBar = toolbar; + m_popupItem = item; + InvalidateDraw(); + return S_OK; +} + +HRESULT CMenuToolbarBase::PopupSubMenu(UINT uItem, UINT index, IShellMenu* childShellMenu) { IBandSite* pBandSite; IDeskBar* pDeskBar; @@ -469,8 +488,7 @@ HRESULT CMenuToolbarBase::PopupSubMenu(UINT itemId, UINT index, IShellMenu* chil if (FAILED(hr)) return hr; - m_popupItem = itemId; - m_menuBand->_OnPopupSubMenu(itemId, popup, &pt, &rcl); + m_menuBand->_OnPopupSubMenu(popup, &pt, &rcl, this, m_popupItem); return S_OK; } @@ -746,7 +764,7 @@ HRESULT CMenuStaticToolbar::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *the return m_menuBand->_CallCBWithItemId(wParam, SMC_EXEC, 0, 0); } -HRESULT CMenuStaticToolbar::PopupItem(UINT uItem) +HRESULT CMenuStaticToolbar::PopupItem(INT uItem) { TBBUTTONINFO info = { 0 }; info.cbSize = sizeof(TBBUTTONINFO); @@ -777,7 +795,7 @@ HRESULT CMenuStaticToolbar::PopupItem(UINT uItem) } } -HRESULT CMenuStaticToolbar::HasSubMenu(UINT uItem) +HRESULT CMenuStaticToolbar::HasSubMenu(INT uItem) { TBBUTTONINFO info = { 0 }; info.cbSize = sizeof(TBBUTTONINFO); @@ -909,7 +927,7 @@ HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REF return hr; } -LPITEMIDLIST CMenuSFToolbar::GetPidlFromId(UINT uItem, INT* pIndex) +LPITEMIDLIST CMenuSFToolbar::GetPidlFromId(INT uItem, INT* pIndex) { TBBUTTONINFO info = { 0 }; info.cbSize = sizeof(TBBUTTONINFO); @@ -955,7 +973,7 @@ HRESULT CMenuSFToolbar::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResu return m_menuBand->_CallCBWithItemPidl(GetPidlFromId(wParam), SMC_SFEXEC, 0, 0); } -HRESULT CMenuSFToolbar::PopupItem(UINT uItem) +HRESULT CMenuSFToolbar::PopupItem(INT uItem) { HRESULT hr; UINT uId; @@ -1005,7 +1023,7 @@ HRESULT CMenuSFToolbar::PopupItem(UINT uItem) return PopupSubMenu(uItem, index, shellMenu); } -HRESULT CMenuSFToolbar::HasSubMenu(UINT uItem) +HRESULT CMenuSFToolbar::HasSubMenu(INT uItem) { HRESULT hr; LPCITEMIDLIST pidl = GetPidlFromId(uItem); diff --git a/base/shell/rshell/CMenuToolbars.h b/base/shell/rshell/CMenuToolbars.h index 9f73a769a61..11850fe49d5 100644 --- a/base/shell/rshell/CMenuToolbars.h +++ b/base/shell/rshell/CMenuToolbars.h @@ -33,12 +33,14 @@ protected: CMenuBand * m_menuBand; HWND m_hwndToolbar; DWORD m_dwMenuFlags; - INT m_hotItem; - INT m_popupItem; WNDPROC m_SubclassOld; BOOL m_hasIdealSize; SIZE m_idealSize; BOOL m_usePager; + CMenuToolbarBase * m_hotBar; + INT m_hotItem; + CMenuToolbarBase * m_popupBar; + INT m_popupItem; private: static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -55,10 +57,8 @@ public: HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); - virtual HRESULT FillToolbar() = 0; - virtual HRESULT PopupItem(UINT uItem) = 0; - virtual HRESULT HasSubMenu(UINT uItem) = 0; - virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0; + HRESULT OnHotItemChanged(CMenuToolbarBase * toolbar, INT item); + HRESULT OnPopupItemChanged(CMenuToolbarBase * toolbar, INT item); HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu); HRESULT PopupSubMenu(UINT index, HMENU menu); @@ -72,6 +72,11 @@ public: void InvalidateDraw(); + virtual HRESULT FillToolbar() = 0; + virtual HRESULT PopupItem(INT uItem) = 0; + virtual HRESULT HasSubMenu(INT uItem) = 0; + virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0; + protected: virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); @@ -94,8 +99,8 @@ public: HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags); virtual HRESULT FillToolbar(); - virtual HRESULT PopupItem(UINT uItem); - virtual HRESULT HasSubMenu(UINT uItem); + virtual HRESULT PopupItem(INT uItem); + virtual HRESULT HasSubMenu(INT uItem); virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); virtual HRESULT OnContextMenu(NMMOUSE * rclick); @@ -117,11 +122,11 @@ public: HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv); virtual HRESULT FillToolbar(); - virtual HRESULT PopupItem(UINT uItem); - virtual HRESULT HasSubMenu(UINT uItem); + virtual HRESULT PopupItem(INT uItem); + virtual HRESULT HasSubMenu(INT uItem); virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); virtual HRESULT OnContextMenu(NMMOUSE * rclick); private: - LPITEMIDLIST GetPidlFromId(UINT uItem, INT* pIndex = NULL); + LPITEMIDLIST GetPidlFromId(INT uItem, INT* pIndex = NULL); };