mirror of
https://github.com/reactos/reactos.git
synced 2025-06-22 23:20:16 +00:00
[RSHELL]
* Fixed the context menu for shell items. * Some more code style improvements. * Moved the toggles between using system classes and rshell classes into the constructor functions, so the code is easier to read. CORE-7586 svn path=/branches/shell-experiments/; revision=62752
This commit is contained in:
parent
9b472f38cb
commit
ba203171e1
6 changed files with 151 additions and 150 deletions
|
@ -35,6 +35,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand);
|
||||||
extern "C"
|
extern "C"
|
||||||
HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
|
HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
|
||||||
{
|
{
|
||||||
|
#if USE_SYSTEM_MENUBAND
|
||||||
|
hr = CoCreateInstance(CLSID_MenuBand,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_INPROC_SERVER,
|
||||||
|
riid, ppv);
|
||||||
|
#else
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
|
|
||||||
CMenuBand * site = new CComObject<CMenuBand>();
|
CMenuBand * site = new CComObject<CMenuBand>();
|
||||||
|
@ -48,6 +54,7 @@ HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
|
||||||
site->Release();
|
site->Release();
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CMenuBand::CMenuBand() :
|
CMenuBand::CMenuBand() :
|
||||||
|
@ -687,18 +694,11 @@ HRESULT CMenuBand::_CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam, UINT id, LPI
|
||||||
HRESULT CMenuBand::_TrackSubMenu(HMENU popup, INT x, INT y, RECT& rcExclude)
|
HRESULT CMenuBand::_TrackSubMenu(HMENU popup, INT x, INT y, RECT& rcExclude)
|
||||||
{
|
{
|
||||||
TPMPARAMS params = { sizeof(TPMPARAMS), rcExclude };
|
TPMPARAMS params = { sizeof(TPMPARAMS), rcExclude };
|
||||||
|
UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN;
|
||||||
UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN;
|
HWND hwnd = m_menuOwner ? m_menuOwner : m_topLevelWindow;
|
||||||
|
|
||||||
m_focusManager->PushTrackedPopup(popup);
|
m_focusManager->PushTrackedPopup(popup);
|
||||||
if (m_menuOwner)
|
::TrackPopupMenuEx(popup, flags, x, y, hwnd, ¶ms);
|
||||||
{
|
|
||||||
::TrackPopupMenuEx(popup, flags, x, y, m_menuOwner, ¶ms);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
::TrackPopupMenuEx(popup, flags, x, y, m_topLevelWindow, ¶ms);
|
|
||||||
}
|
|
||||||
m_focusManager->PopTrackedPopup(popup);
|
m_focusManager->PopTrackedPopup(popup);
|
||||||
|
|
||||||
_DisableMouseTrack(FALSE);
|
_DisableMouseTrack(FALSE);
|
||||||
|
@ -715,27 +715,34 @@ HRESULT CMenuBand::_TrackContextMenu(IContextMenu * contextMenu, INT x, INT y)
|
||||||
if (popup == NULL)
|
if (popup == NULL)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
|
DbgPrint("Before Query\n");
|
||||||
hr = contextMenu->QueryContextMenu(popup, 0, 0, UINT_MAX, CMF_NORMAL);
|
hr = contextMenu->QueryContextMenu(popup, 0, 0, UINT_MAX, CMF_NORMAL);
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
{
|
{
|
||||||
|
DbgPrint("Query failed\n");
|
||||||
DestroyMenu(popup);
|
DestroyMenu(popup);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND hwnd = m_menuOwner ? m_menuOwner : m_topLevelWindow;
|
HWND hwnd = m_menuOwner ? m_menuOwner : m_topLevelWindow;
|
||||||
|
|
||||||
m_focusManager->PushTrackedPopup(popup);
|
DbgPrint("Before Tracking\n");
|
||||||
uCommand = ::TrackPopupMenuEx(popup, TPM_RETURNCMD, x, y, m_menuOwner, NULL);
|
uCommand = ::TrackPopupMenuEx(popup, TPM_RETURNCMD, x, y, hwnd, NULL);
|
||||||
m_focusManager->PopTrackedPopup(popup);
|
|
||||||
|
|
||||||
if (uCommand == 0)
|
if (uCommand != 0)
|
||||||
return S_FALSE;
|
{
|
||||||
|
DbgPrint("Before InvokeCommand\n");
|
||||||
CMINVOKECOMMANDINFO cmi = { 0 };
|
CMINVOKECOMMANDINFO cmi = { 0 };
|
||||||
cmi.cbSize = sizeof(cmi);
|
cmi.cbSize = sizeof(cmi);
|
||||||
cmi.lpVerb = MAKEINTRESOURCEA(uCommand);
|
cmi.lpVerb = MAKEINTRESOURCEA(uCommand);
|
||||||
cmi.hwnd = hwnd;
|
cmi.hwnd = hwnd;
|
||||||
hr = contextMenu->InvokeCommand(&cmi);
|
hr = contextMenu->InvokeCommand(&cmi);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DbgPrint("TrackPopupMenu failed. Code=%d, LastError=%d\n", uCommand, GetLastError());
|
||||||
|
hr = S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
DestroyMenu(popup);
|
DestroyMenu(popup);
|
||||||
return hr;
|
return hr;
|
||||||
|
@ -787,7 +794,7 @@ HRESULT CMenuBand::_KeyboardItemChange(DWORD change)
|
||||||
if (!tb)
|
if (!tb)
|
||||||
{
|
{
|
||||||
// If no hot item was selected
|
// If no hot item was selected
|
||||||
// choose the first toolbar (prefer shell-folder, which will be positionedat the top)
|
// choose the first toolbar (prefer shell-folder, which will be positioned at the top)
|
||||||
|
|
||||||
if (m_SFToolbar)
|
if (m_SFToolbar)
|
||||||
tb = m_SFToolbar;
|
tb = m_SFToolbar;
|
||||||
|
@ -895,26 +902,11 @@ HRESULT CMenuBand::_OnPopupSubMenu(IShellMenu * childShellMenu, POINTL * pAt, RE
|
||||||
IDeskBar* pDeskBar;
|
IDeskBar* pDeskBar;
|
||||||
|
|
||||||
// Create the necessary objects
|
// Create the necessary objects
|
||||||
|
|
||||||
#if USE_SYSTEM_MENUSITE
|
|
||||||
hr = CoCreateInstance(CLSID_MenuBandSite,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
IID_PPV_ARG(IBandSite, &pBandSite));
|
|
||||||
#else
|
|
||||||
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
|
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
|
||||||
#endif
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
#if USE_SYSTEM_MENUDESKBAR
|
|
||||||
hr = CoCreateInstance(CLSID_MenuDeskBar,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
IID_PPV_ARG(IDeskBar, &pDeskBar));
|
|
||||||
#else
|
|
||||||
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
|
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
|
||||||
#endif
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,12 @@ const static GUID CGID_MenuDeskBar = { 0x5C9F0A12, 0x959E, 0x11D0, { 0xA3, 0xA4,
|
||||||
extern "C"
|
extern "C"
|
||||||
HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv)
|
HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv)
|
||||||
{
|
{
|
||||||
|
#if USE_SYSTEM_MENUDESKBAR
|
||||||
|
hr = CoCreateInstance(CLSID_MenuDeskBar,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_INPROC_SERVER,
|
||||||
|
riid, ppv);
|
||||||
|
#else
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
|
|
||||||
CMenuDeskBar * deskbar = new CComObject<CMenuDeskBar>();
|
CMenuDeskBar * deskbar = new CComObject<CMenuDeskBar>();
|
||||||
|
@ -43,6 +49,7 @@ HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv)
|
||||||
deskbar->Release();
|
deskbar->Release();
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CMenuDeskBar::CMenuDeskBar() :
|
CMenuDeskBar::CMenuDeskBar() :
|
||||||
|
|
|
@ -28,6 +28,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(menusite);
|
||||||
extern "C"
|
extern "C"
|
||||||
HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv)
|
HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv)
|
||||||
{
|
{
|
||||||
|
#if USE_SYSTEM_MENUSITE
|
||||||
|
hr = CoCreateInstance(CLSID_MenuBandSite,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_INPROC_SERVER,
|
||||||
|
riid, ppv);
|
||||||
|
#else
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
|
|
||||||
CMenuSite * site = new CComObject<CMenuSite>();
|
CMenuSite * site = new CComObject<CMenuSite>();
|
||||||
|
@ -41,6 +47,7 @@ HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv)
|
||||||
site->Release();
|
site->Release();
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CMenuSite::CMenuSite() :
|
CMenuSite::CMenuSite() :
|
||||||
|
|
|
@ -539,7 +539,7 @@ HRESULT CMenuToolbarBase::OnGetInfoTip(NMTBGETINFOTIP * tip)
|
||||||
|
|
||||||
GetDataFromId(iItem, &index, &dwData);
|
GetDataFromId(iItem, &index, &dwData);
|
||||||
|
|
||||||
return GetInfoTip(tip->pszText, tip->cchTextMax, iItem, index, dwData);
|
return InternalGetTooltip(iItem, index, dwData, tip->pszText, tip->cchTextMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuToolbarBase::OnPopupTimer(DWORD timerId)
|
HRESULT CMenuToolbarBase::OnPopupTimer(DWORD timerId)
|
||||||
|
@ -784,13 +784,14 @@ HRESULT CMenuToolbarBase::PopupSubMenu(UINT iItem, UINT index, HMENU menu)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuToolbarBase::DoContextMenu(IContextMenu* contextMenu)
|
HRESULT CMenuToolbarBase::TrackContextMenu(IContextMenu* contextMenu, POINT pt)
|
||||||
{
|
{
|
||||||
// Calculate the context menu position
|
// Cancel submenus
|
||||||
DWORD dwPos = GetMessagePos();
|
m_menuBand->_KillPopupTimers();
|
||||||
POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };
|
if (m_popupBar)
|
||||||
|
m_menuBand->_CancelCurrentPopup();
|
||||||
|
|
||||||
// Display the submenu
|
// Display the context menu
|
||||||
return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
|
return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -827,7 +828,24 @@ HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theRe
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
return OnCommandInternal(wParam, lParam, theResult);
|
INT iItem = wParam;
|
||||||
|
INT index;
|
||||||
|
DWORD_PTR data;
|
||||||
|
|
||||||
|
GetDataFromId(iItem, &index, &data);
|
||||||
|
|
||||||
|
return InternalExecuteItem(iItem, index, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT CMenuToolbarBase::OnContextMenu(NMMOUSE * rclick)
|
||||||
|
{
|
||||||
|
INT iItem = rclick->dwItemSpec;
|
||||||
|
INT index = rclick->dwHitInfo;
|
||||||
|
DWORD_PTR data = rclick->dwItemData;
|
||||||
|
|
||||||
|
GetDataFromId(iItem, &index, &data);
|
||||||
|
|
||||||
|
return InternalContextMenu(iItem, index, data, rclick->pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType)
|
HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType)
|
||||||
|
@ -839,14 +857,6 @@ HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType)
|
||||||
{
|
{
|
||||||
int count = SendMessage(m_hwndToolbar, TB_BUTTONCOUNT, 0, 0);
|
int count = SendMessage(m_hwndToolbar, TB_BUTTONCOUNT, 0, 0);
|
||||||
|
|
||||||
if (m_hotItem >= 0)
|
|
||||||
{
|
|
||||||
TBBUTTONINFO info = { 0 };
|
|
||||||
info.cbSize = sizeof(TBBUTTONINFO);
|
|
||||||
info.dwMask = 0;
|
|
||||||
index = SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, m_hotItem, reinterpret_cast<LPARAM>(&info));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dwSelectType == VK_HOME)
|
if (dwSelectType == VK_HOME)
|
||||||
{
|
{
|
||||||
index = 0;
|
index = 0;
|
||||||
|
@ -857,26 +867,37 @@ HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType)
|
||||||
index = count - 1;
|
index = count - 1;
|
||||||
dwSelectType = VK_UP;
|
dwSelectType = VK_UP;
|
||||||
}
|
}
|
||||||
else if (index < 0)
|
|
||||||
{
|
|
||||||
if (dwSelectType == VK_UP)
|
|
||||||
{
|
|
||||||
index = count - 1;
|
|
||||||
}
|
|
||||||
else if (dwSelectType == VK_DOWN)
|
|
||||||
{
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (dwSelectType == VK_UP)
|
if (m_hotItem >= 0)
|
||||||
{
|
{
|
||||||
index--;
|
TBBUTTONINFO info = { 0 };
|
||||||
|
info.cbSize = sizeof(TBBUTTONINFO);
|
||||||
|
info.dwMask = 0;
|
||||||
|
index = SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, m_hotItem, reinterpret_cast<LPARAM>(&info));
|
||||||
}
|
}
|
||||||
else if (dwSelectType == VK_DOWN)
|
|
||||||
|
if (index < 0)
|
||||||
{
|
{
|
||||||
index++;
|
if (dwSelectType == VK_UP)
|
||||||
|
{
|
||||||
|
index = count - 1;
|
||||||
|
}
|
||||||
|
else if (dwSelectType == VK_DOWN)
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (dwSelectType == VK_UP)
|
||||||
|
{
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
else if (dwSelectType == VK_DOWN)
|
||||||
|
{
|
||||||
|
index++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -980,6 +1001,15 @@ HRESULT CMenuToolbarBase::AddPlaceholder()
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT CMenuToolbarBase::ClearToolbar()
|
||||||
|
{
|
||||||
|
while (SendMessage(m_hwndToolbar, TB_DELETEBUTTON, 0, 0))
|
||||||
|
{
|
||||||
|
// empty;
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT CMenuToolbarBase::GetDataFromId(INT iItem, INT* pIndex, DWORD_PTR* pData)
|
HRESULT CMenuToolbarBase::GetDataFromId(INT iItem, INT* pIndex, DWORD_PTR* pData)
|
||||||
{
|
{
|
||||||
if (pData)
|
if (pData)
|
||||||
|
@ -1086,10 +1116,7 @@ HRESULT CMenuStaticToolbar::FillToolbar(BOOL clearFirst)
|
||||||
|
|
||||||
if (clearFirst)
|
if (clearFirst)
|
||||||
{
|
{
|
||||||
while (SendMessage(m_hwndToolbar, TB_DELETEBUTTON, 0, 0))
|
ClearToolbar();
|
||||||
{
|
|
||||||
// empty;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
@ -1141,7 +1168,7 @@ HRESULT CMenuStaticToolbar::FillToolbar(BOOL clearFirst)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuStaticToolbar::GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData)
|
HRESULT CMenuStaticToolbar::InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax)
|
||||||
{
|
{
|
||||||
//SMINFO * info = reinterpret_cast<SMINFO*>(dwData);
|
//SMINFO * info = reinterpret_cast<SMINFO*>(dwData);
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
|
@ -1154,19 +1181,20 @@ HRESULT CMenuStaticToolbar::OnDeletingButton(const NMTOOLBAR * tb)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuStaticToolbar::OnContextMenu(NMMOUSE * rclick)
|
HRESULT CMenuStaticToolbar::InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)
|
||||||
{
|
{
|
||||||
CComPtr<IContextMenu> contextMenu;
|
CComPtr<IContextMenu> contextMenu;
|
||||||
HRESULT hr = m_menuBand->_CallCBWithItemId(rclick->dwItemSpec, SMC_GETOBJECT, reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu));
|
HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT,
|
||||||
|
reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu));
|
||||||
if (hr != S_OK)
|
if (hr != S_OK)
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
return DoContextMenu(contextMenu);
|
return TrackContextMenu(contextMenu, pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuStaticToolbar::OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult)
|
HRESULT CMenuStaticToolbar::InternalExecuteItem(INT iItem, INT index, DWORD_PTR data)
|
||||||
{
|
{
|
||||||
return m_menuBand->_CallCBWithItemId(wParam, SMC_EXEC, 0, 0);
|
return m_menuBand->_CallCBWithItemId(iItem, SMC_EXEC, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuStaticToolbar::InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData)
|
HRESULT CMenuStaticToolbar::InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData)
|
||||||
|
@ -1214,7 +1242,7 @@ HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
|
||||||
PWSTR MenuString;
|
PWSTR MenuString;
|
||||||
|
|
||||||
IEnumIDList * eidl;
|
IEnumIDList * eidl;
|
||||||
m_shellFolder->EnumObjects(m_hwndToolbar, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
|
m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
|
||||||
|
|
||||||
LPITEMIDLIST item = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(sizeof(ITEMIDLIST)));
|
LPITEMIDLIST item = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(sizeof(ITEMIDLIST)));
|
||||||
ULONG fetched;
|
ULONG fetched;
|
||||||
|
@ -1259,7 +1287,7 @@ HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuSFToolbar::GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData)
|
HRESULT CMenuSFToolbar::InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax)
|
||||||
{
|
{
|
||||||
//ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
|
//ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
|
@ -1312,25 +1340,27 @@ HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REF
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuSFToolbar::OnContextMenu(NMMOUSE * rclick)
|
HRESULT CMenuSFToolbar::InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
CComPtr<IContextMenu> contextMenu;
|
CComPtr<IContextMenu> contextMenu = NULL;
|
||||||
LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(rclick->dwItemData);
|
LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(dwData);
|
||||||
|
|
||||||
hr = m_shellFolder->GetUIObjectOf(m_hwndToolbar, 1, &pidl, IID_IContextMenu, NULL, reinterpret_cast<VOID **>(&contextMenu));
|
#define IID_NULL_PPV_ARG(Itype, ppType) IID_##Itype, NULL, reinterpret_cast<void**>((static_cast<Itype**>(ppType)))
|
||||||
if (hr != S_OK)
|
|
||||||
|
hr = m_shellFolder->GetUIObjectOf(GetToolbar(), 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
|
||||||
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
|
{
|
||||||
return hr;
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
return DoContextMenu(contextMenu);
|
hr = TrackContextMenu(contextMenu, pt);
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CMenuSFToolbar::OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult)
|
HRESULT CMenuSFToolbar::InternalExecuteItem(INT iItem, INT index, DWORD_PTR data)
|
||||||
{
|
{
|
||||||
DWORD_PTR data;
|
|
||||||
|
|
||||||
GetDataFromId(wParam, NULL, &data);
|
|
||||||
|
|
||||||
return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0);
|
return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1348,14 +1378,7 @@ HRESULT CMenuSFToolbar::InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData
|
||||||
if (!pidl)
|
if (!pidl)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
#if USE_SYSTEM_MENUBAND
|
|
||||||
hr = CoCreateInstance(CLSID_MenuBand,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
IID_PPV_ARG(IShellMenu, &shellMenu));
|
|
||||||
#else
|
|
||||||
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &shellMenu));
|
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &shellMenu));
|
||||||
#endif
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
|
|
|
@ -25,20 +25,19 @@ class CMenuFocusManager;
|
||||||
#define WM_USER_ISTRACKEDITEM (WM_APP+41)
|
#define WM_USER_ISTRACKEDITEM (WM_APP+41)
|
||||||
#define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
|
#define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
|
||||||
|
|
||||||
|
|
||||||
class CMenuToolbarBase
|
class CMenuToolbarBase
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
HWND m_hwnd; // May be the pager
|
HWND m_hwnd; // May be the pager
|
||||||
HFONT m_marlett;
|
HWND m_hwndToolbar;
|
||||||
BOOL m_useFlatMenus;
|
HFONT m_marlett;
|
||||||
|
BOOL m_useFlatMenus;
|
||||||
WNDPROC m_SubclassOld;
|
WNDPROC m_SubclassOld;
|
||||||
BOOL m_disableMouseTrack;
|
BOOL m_disableMouseTrack;
|
||||||
BOOL m_timerEnabled;
|
BOOL m_timerEnabled;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CMenuBand * m_menuBand;
|
CMenuBand * m_menuBand;
|
||||||
HWND m_hwndToolbar;
|
|
||||||
DWORD m_dwMenuFlags;
|
DWORD m_dwMenuFlags;
|
||||||
BOOL m_hasSizes;
|
BOOL m_hasSizes;
|
||||||
SIZE m_idealSize;
|
SIZE m_idealSize;
|
||||||
|
@ -55,6 +54,8 @@ protected:
|
||||||
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);
|
||||||
|
|
||||||
|
LRESULT SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager);
|
CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager);
|
||||||
virtual ~CMenuToolbarBase();
|
virtual ~CMenuToolbarBase();
|
||||||
|
@ -72,7 +73,7 @@ public:
|
||||||
|
|
||||||
HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
|
HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
|
||||||
HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu);
|
HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu);
|
||||||
HRESULT DoContextMenu(IContextMenu* contextMenu);
|
HRESULT TrackContextMenu(IContextMenu* contextMenu, POINT pt);
|
||||||
|
|
||||||
HRESULT KeyboardItemChange(DWORD changeType);
|
HRESULT KeyboardItemChange(DWORD changeType);
|
||||||
|
|
||||||
|
@ -87,7 +88,6 @@ public:
|
||||||
HRESULT DisableMouseTrack(BOOL bDisable);
|
HRESULT DisableMouseTrack(BOOL bDisable);
|
||||||
|
|
||||||
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
|
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
|
||||||
virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
|
|
||||||
|
|
||||||
HRESULT CancelCurrentPopup();
|
HRESULT CancelCurrentPopup();
|
||||||
HRESULT PopupItem(INT iItem);
|
HRESULT PopupItem(INT iItem);
|
||||||
|
@ -96,26 +96,28 @@ public:
|
||||||
HRESULT KillPopupTimer();
|
HRESULT KillPopupTimer();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual HRESULT OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult) = 0;
|
|
||||||
|
|
||||||
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0;
|
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0;
|
||||||
|
|
||||||
|
virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax) = 0;
|
||||||
|
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData) = 0;
|
||||||
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData) = 0;
|
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData) = 0;
|
||||||
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData) = 0;
|
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData) = 0;
|
||||||
|
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt) = 0;
|
||||||
virtual HRESULT GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData)=0;
|
|
||||||
|
|
||||||
LRESULT CALLBACK SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
||||||
|
|
||||||
HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last);
|
HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last);
|
||||||
HRESULT AddSeparator(BOOL last);
|
HRESULT AddSeparator(BOOL last);
|
||||||
HRESULT AddPlaceholder();
|
HRESULT AddPlaceholder();
|
||||||
|
HRESULT ClearToolbar();
|
||||||
|
|
||||||
HRESULT UpdateImageLists();
|
HWND GetToolbar() { return m_hwndToolbar; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
HRESULT UpdateImageLists();
|
||||||
|
|
||||||
HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
||||||
HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize);
|
HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize);
|
||||||
HRESULT OnPopupTimer(DWORD timerId);
|
HRESULT OnPopupTimer(DWORD timerId);
|
||||||
|
HRESULT OnContextMenu(NMMOUSE * rclick);
|
||||||
HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
|
HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
|
||||||
HRESULT OnGetInfoTip(NMTBGETINFOTIP * tip);
|
HRESULT OnGetInfoTip(NMTBGETINFOTIP * tip);
|
||||||
};
|
};
|
||||||
|
@ -134,16 +136,15 @@ public:
|
||||||
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
|
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
|
||||||
|
|
||||||
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
|
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
|
||||||
virtual HRESULT OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
|
||||||
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
|
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
|
||||||
|
|
||||||
virtual HRESULT GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData);
|
virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
|
||||||
|
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
|
||||||
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData);
|
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData);
|
||||||
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
|
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
|
||||||
|
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
|
||||||
};
|
};
|
||||||
|
|
||||||
class CMenuSFToolbar :
|
class CMenuSFToolbar :
|
||||||
|
@ -162,14 +163,13 @@ public:
|
||||||
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
|
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
|
||||||
|
|
||||||
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
|
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
|
||||||
virtual HRESULT OnCommandInternal(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
|
|
||||||
virtual HRESULT OnContextMenu(NMMOUSE * rclick);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
|
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
|
||||||
|
|
||||||
virtual HRESULT GetInfoTip(LPWSTR pszText, INT cchTextMax, INT iItem, INT index, DWORD_PTR dwData);
|
virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
|
||||||
|
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
|
||||||
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData);
|
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData);
|
||||||
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
|
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
|
||||||
|
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
|
||||||
};
|
};
|
||||||
|
|
|
@ -148,14 +148,7 @@ private:
|
||||||
case IDM_DOCUMENTS: csidl = CSIDL_RECENT; break;
|
case IDM_DOCUMENTS: csidl = CSIDL_RECENT; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_SYSTEM_MENUBAND
|
|
||||||
hr = CoCreateInstance(CLSID_MenuBand,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
IID_PPV_ARG(IShellMenu, &pShellMenu));
|
|
||||||
#else
|
|
||||||
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
|
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
|
||||||
#endif
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
|
@ -291,36 +284,15 @@ CStartMenu_Constructor(REFIID riid, void **ppv)
|
||||||
IShellFolder *psfStartMenuAll;
|
IShellFolder *psfStartMenuAll;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if USE_SYSTEM_MENUBAND
|
|
||||||
hr = CoCreateInstance(CLSID_MenuBand,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
IID_PPV_ARG(IShellMenu, &pShellMenu));
|
|
||||||
#else
|
|
||||||
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
|
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
|
||||||
#endif
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
#if USE_SYSTEM_MENUSITE
|
|
||||||
hr = CoCreateInstance(CLSID_MenuBandSite,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
IID_PPV_ARG(IBandSite, &pBandSite));
|
|
||||||
#else
|
|
||||||
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
|
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
|
||||||
#endif
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
#if USE_SYSTEM_MENUDESKBAR
|
|
||||||
hr = CoCreateInstance(CLSID_MenuDeskBar,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
IID_PPV_ARG(IDeskBar, &pDeskBar));
|
|
||||||
#else
|
|
||||||
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
|
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
|
||||||
#endif
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue