[RSHELL]
authorDavid Quintana <gigaherz@gmail.com>
Thu, 27 Feb 2014 11:56:28 +0000 (11:56 +0000)
committerDavid Quintana <gigaherz@gmail.com>
Thu, 27 Feb 2014 11:56:28 +0000 (11:56 +0000)
* Improve hot-tracking behaviour.
CORE-7881

svn path=/branches/shell-experiments/; revision=62347

base/shell/rshell/CMenuBand.cpp
base/shell/rshell/CMenuBand.h
base/shell/rshell/CMenuToolbars.cpp
base/shell/rshell/CMenuToolbars.h

index 6c3dcdd..09afc7f 100644 (file)
@@ -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;
 }
 
index adea4b7..1e6fec1 100644 (file)
@@ -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()
     {
index 7e9cf7c..ee4e23b 100644 (file)
@@ -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);
index 9f73a76..11850fe 100644 (file)
@@ -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);
 };