mirror of
https://github.com/reactos/reactos.git
synced 2025-06-25 12:59:43 +00:00
[RSHELL]
* Improve hot-tracking behaviour. CORE-7881 svn path=/branches/shell-experiments/; revision=62347
This commit is contained in:
parent
107ae8ee41
commit
b35ff38428
4 changed files with 55 additions and 37 deletions
|
@ -54,8 +54,7 @@ CMenuBand::CMenuBand() :
|
||||||
m_subMenuChild(NULL),
|
m_subMenuChild(NULL),
|
||||||
m_useBigIcons(FALSE),
|
m_useBigIcons(FALSE),
|
||||||
m_hotBar(NULL),
|
m_hotBar(NULL),
|
||||||
m_hotItem(-1),
|
m_hotItem(-1)
|
||||||
m_popupItem(-1)
|
|
||||||
{
|
{
|
||||||
m_focusManager = CMenuFocusManager::AcquireManager();
|
m_focusManager = CMenuFocusManager::AcquireManager();
|
||||||
}
|
}
|
||||||
|
@ -625,12 +624,10 @@ HRESULT CMenuBand::_GetTopLevelWindow(HWND*topLevel)
|
||||||
|
|
||||||
HRESULT CMenuBand::_OnHotItemChanged(CMenuToolbarBase * tb, INT id)
|
HRESULT CMenuBand::_OnHotItemChanged(CMenuToolbarBase * tb, INT id)
|
||||||
{
|
{
|
||||||
if (m_hotBar && m_hotBar != tb)
|
|
||||||
m_hotBar->ChangeHotItem(-1);
|
|
||||||
m_hotBar = tb;
|
m_hotBar = tb;
|
||||||
m_hotItem = id;
|
m_hotItem = id;
|
||||||
if (m_staticToolbar) m_staticToolbar->InvalidateDraw();
|
if (m_staticToolbar) m_staticToolbar->OnHotItemChanged(tb, id);
|
||||||
if (m_SFToolbar) m_SFToolbar->InvalidateDraw();
|
if (m_SFToolbar) m_SFToolbar->OnHotItemChanged(tb, id);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -717,7 +714,7 @@ HRESULT CMenuBand::_MenuItemHotTrack(DWORD changeType)
|
||||||
return S_OK;
|
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)
|
if (m_subMenuChild)
|
||||||
{
|
{
|
||||||
|
@ -725,7 +722,8 @@ HRESULT CMenuBand::_OnPopupSubMenu(INT popupItem, IMenuPopup * popup, POINTL * p
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return 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;
|
m_subMenuChild = popup;
|
||||||
if (popup)
|
if (popup)
|
||||||
{
|
{
|
||||||
|
@ -733,8 +731,6 @@ HRESULT CMenuBand::_OnPopupSubMenu(INT popupItem, IMenuPopup * popup, POINTL * p
|
||||||
|
|
||||||
popup->Popup(pAt, pExclude, MPPF_RIGHT);
|
popup->Popup(pAt, pExclude, MPPF_RIGHT);
|
||||||
}
|
}
|
||||||
if (m_staticToolbar) m_staticToolbar->InvalidateDraw();
|
|
||||||
if (m_SFToolbar) m_SFToolbar->InvalidateDraw();
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,6 @@ private:
|
||||||
|
|
||||||
CMenuToolbarBase * m_hotBar;
|
CMenuToolbarBase * m_hotBar;
|
||||||
INT m_hotItem;
|
INT m_hotItem;
|
||||||
INT m_popupItem;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CMenuBand();
|
CMenuBand();
|
||||||
|
@ -176,7 +175,7 @@ public:
|
||||||
HRESULT _GetTopLevelWindow(HWND*topLevel);
|
HRESULT _GetTopLevelWindow(HWND*topLevel);
|
||||||
HRESULT _OnHotItemChanged(CMenuToolbarBase * tb, INT id);
|
HRESULT _OnHotItemChanged(CMenuToolbarBase * tb, INT id);
|
||||||
HRESULT _MenuItemHotTrack(DWORD changeType);
|
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()
|
BOOL UseBigIcons()
|
||||||
{
|
{
|
||||||
|
|
|
@ -55,6 +55,7 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
|
||||||
COLORREF clrText;
|
COLORREF clrText;
|
||||||
COLORREF clrTextHighlight;
|
COLORREF clrTextHighlight;
|
||||||
SIZE tbs;
|
SIZE tbs;
|
||||||
|
bool isHot, isPopup;
|
||||||
|
|
||||||
*theResult = 0;
|
*theResult = 0;
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
|
@ -112,8 +113,10 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
|
||||||
rc = cdraw->nmcd.rc;
|
rc = cdraw->nmcd.rc;
|
||||||
hdc = cdraw->nmcd.hdc;
|
hdc = cdraw->nmcd.hdc;
|
||||||
|
|
||||||
if (((INT) cdraw->nmcd.dwItemSpec == m_hotItem ||
|
isHot = m_hotBar == this && m_hotItem == (INT) cdraw->nmcd.dwItemSpec;
|
||||||
(m_hotItem < 0 && (INT) cdraw->nmcd.dwItemSpec == m_popupItem)))
|
isPopup = m_popupBar == this && m_popupItem == (INT) cdraw->nmcd.dwItemSpec;
|
||||||
|
|
||||||
|
if (isHot || (m_hotItem < 0 && isPopup))
|
||||||
{
|
{
|
||||||
cdraw->nmcd.uItemState = CDIS_HOT;
|
cdraw->nmcd.uItemState = CDIS_HOT;
|
||||||
}
|
}
|
||||||
|
@ -168,11 +171,11 @@ CMenuToolbarBase::CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager) :
|
||||||
m_menuBand(menuBand),
|
m_menuBand(menuBand),
|
||||||
m_hwndToolbar(NULL),
|
m_hwndToolbar(NULL),
|
||||||
m_dwMenuFlags(0),
|
m_dwMenuFlags(0),
|
||||||
m_hotItem(-1),
|
|
||||||
m_popupItem(-1),
|
|
||||||
m_SubclassOld(NULL),
|
m_SubclassOld(NULL),
|
||||||
m_hasIdealSize(FALSE),
|
m_hasIdealSize(FALSE),
|
||||||
m_usePager(usePager)
|
m_usePager(usePager),
|
||||||
|
m_hotItem(-1),
|
||||||
|
m_popupItem(-1)
|
||||||
{
|
{
|
||||||
m_marlett = CreateFont(
|
m_marlett = CreateFont(
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET,
|
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);
|
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)
|
if (HasSubMenu(m_hotItem) == S_OK)
|
||||||
{
|
{
|
||||||
|
@ -404,7 +407,23 @@ HRESULT CMenuToolbarBase::OnHotItemChange(const NMTBHOTITEM * hot)
|
||||||
return S_OK;
|
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;
|
IBandSite* pBandSite;
|
||||||
IDeskBar* pDeskBar;
|
IDeskBar* pDeskBar;
|
||||||
|
@ -469,8 +488,7 @@ HRESULT CMenuToolbarBase::PopupSubMenu(UINT itemId, UINT index, IShellMenu* chil
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
m_popupItem = itemId;
|
m_menuBand->_OnPopupSubMenu(popup, &pt, &rcl, this, m_popupItem);
|
||||||
m_menuBand->_OnPopupSubMenu(itemId, popup, &pt, &rcl);
|
|
||||||
|
|
||||||
return S_OK;
|
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);
|
return m_menuBand->_CallCBWithItemId(wParam, SMC_EXEC, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuStaticToolbar::PopupItem(UINT uItem)
|
HRESULT CMenuStaticToolbar::PopupItem(INT uItem)
|
||||||
{
|
{
|
||||||
TBBUTTONINFO info = { 0 };
|
TBBUTTONINFO info = { 0 };
|
||||||
info.cbSize = sizeof(TBBUTTONINFO);
|
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 };
|
TBBUTTONINFO info = { 0 };
|
||||||
info.cbSize = sizeof(TBBUTTONINFO);
|
info.cbSize = sizeof(TBBUTTONINFO);
|
||||||
|
@ -909,7 +927,7 @@ HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REF
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
LPITEMIDLIST CMenuSFToolbar::GetPidlFromId(UINT uItem, INT* pIndex)
|
LPITEMIDLIST CMenuSFToolbar::GetPidlFromId(INT uItem, INT* pIndex)
|
||||||
{
|
{
|
||||||
TBBUTTONINFO info = { 0 };
|
TBBUTTONINFO info = { 0 };
|
||||||
info.cbSize = sizeof(TBBUTTONINFO);
|
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);
|
return m_menuBand->_CallCBWithItemPidl(GetPidlFromId(wParam), SMC_SFEXEC, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuSFToolbar::PopupItem(UINT uItem)
|
HRESULT CMenuSFToolbar::PopupItem(INT uItem)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
UINT uId;
|
UINT uId;
|
||||||
|
@ -1005,7 +1023,7 @@ HRESULT CMenuSFToolbar::PopupItem(UINT uItem)
|
||||||
return PopupSubMenu(uItem, index, shellMenu);
|
return PopupSubMenu(uItem, index, shellMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuSFToolbar::HasSubMenu(UINT uItem)
|
HRESULT CMenuSFToolbar::HasSubMenu(INT uItem)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
LPCITEMIDLIST pidl = GetPidlFromId(uItem);
|
LPCITEMIDLIST pidl = GetPidlFromId(uItem);
|
||||||
|
|
|
@ -33,12 +33,14 @@ protected:
|
||||||
CMenuBand * m_menuBand;
|
CMenuBand * m_menuBand;
|
||||||
HWND m_hwndToolbar;
|
HWND m_hwndToolbar;
|
||||||
DWORD m_dwMenuFlags;
|
DWORD m_dwMenuFlags;
|
||||||
INT m_hotItem;
|
|
||||||
INT m_popupItem;
|
|
||||||
WNDPROC m_SubclassOld;
|
WNDPROC m_SubclassOld;
|
||||||
BOOL m_hasIdealSize;
|
BOOL m_hasIdealSize;
|
||||||
SIZE m_idealSize;
|
SIZE m_idealSize;
|
||||||
BOOL m_usePager;
|
BOOL m_usePager;
|
||||||
|
CMenuToolbarBase * m_hotBar;
|
||||||
|
INT m_hotItem;
|
||||||
|
CMenuToolbarBase * m_popupBar;
|
||||||
|
INT m_popupItem;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
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);
|
HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
||||||
|
|
||||||
virtual HRESULT FillToolbar() = 0;
|
HRESULT OnHotItemChanged(CMenuToolbarBase * toolbar, INT item);
|
||||||
virtual HRESULT PopupItem(UINT uItem) = 0;
|
HRESULT OnPopupItemChanged(CMenuToolbarBase * toolbar, INT item);
|
||||||
virtual HRESULT HasSubMenu(UINT uItem) = 0;
|
|
||||||
virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
|
|
||||||
|
|
||||||
HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
|
HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
|
||||||
HRESULT PopupSubMenu(UINT index, HMENU menu);
|
HRESULT PopupSubMenu(UINT index, HMENU menu);
|
||||||
|
@ -72,6 +72,11 @@ public:
|
||||||
|
|
||||||
void InvalidateDraw();
|
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:
|
protected:
|
||||||
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
||||||
|
|
||||||
|
@ -94,8 +99,8 @@ public:
|
||||||
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
|
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
|
||||||
|
|
||||||
virtual HRESULT FillToolbar();
|
virtual HRESULT FillToolbar();
|
||||||
virtual HRESULT PopupItem(UINT uItem);
|
virtual HRESULT PopupItem(INT uItem);
|
||||||
virtual HRESULT HasSubMenu(UINT uItem);
|
virtual HRESULT HasSubMenu(INT uItem);
|
||||||
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
||||||
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
|
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
|
||||||
|
|
||||||
|
@ -117,11 +122,11 @@ public:
|
||||||
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
|
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
|
||||||
|
|
||||||
virtual HRESULT FillToolbar();
|
virtual HRESULT FillToolbar();
|
||||||
virtual HRESULT PopupItem(UINT uItem);
|
virtual HRESULT PopupItem(INT uItem);
|
||||||
virtual HRESULT HasSubMenu(UINT uItem);
|
virtual HRESULT HasSubMenu(INT uItem);
|
||||||
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
||||||
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
|
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LPITEMIDLIST GetPidlFromId(UINT uItem, INT* pIndex = NULL);
|
LPITEMIDLIST GetPidlFromId(INT uItem, INT* pIndex = NULL);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue