#include <windowsx.h>
#include <commoncontrols.h>
#include <shlwapi_undoc.h>
+#include <uxtheme.h>
#include "CMenuBand.h"
#include "CMenuToolbars.h"
switch (uMsg)
{
case WM_COMMAND:
- return OnCommand(wParam, lParam, theResult);
+ //return OnCommand(wParam, lParam, theResult);
+ return S_OK;
case WM_NOTIFY:
hdr = reinterpret_cast<LPNMHDR>(lParam);
return OnPagerCalcSize(reinterpret_cast<LPNMPGCALCSIZE>(hdr));
case TBN_DROPDOWN:
- return OnCommand(reinterpret_cast<LPNMTOOLBAR>(hdr)->iItem, 0, theResult);
+ return ProcessClick(reinterpret_cast<LPNMTOOLBAR>(hdr)->iItem);
case TBN_HOTITEMCHANGE:
//return OnHotItemChange(reinterpret_cast<LPNMTBHOTITEM>(hdr), theResult);
isHot = m_hotBar == this && (int) cdraw->nmcd.dwItemSpec == m_hotItem;
isPopup = m_popupBar == this && (int) cdraw->nmcd.dwItemSpec == m_popupItem;
- if (m_initFlags & SMINIT_VERTICAL)
+ if (m_initFlags & SMINIT_VERTICAL || IsAppThemed())
{
// Remove HOT and CHECKED flags (will restore HOT if necessary)
cdraw->nmcd.uItemState &= ~(CDIS_HOT | CDIS_CHECKED);
return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
}
-HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult)
+HRESULT CMenuToolbarBase::ProcessClick(INT iItem)
{
if (m_disableMouseTrack)
{
- *theResult = 1;
TRACE("Item click prevented by DisableMouseTrack\n");
return S_OK;
}
return S_FALSE;
}
- *theResult = 0;
-
- INT iItem = (INT)wParam;
-
if (PopupItem(iItem, FALSE) == S_OK)
{
TRACE("PopupItem returned S_OK\n");
return m_menuBand->_MenuItemHotTrack(MPOS_EXECUTE);
}
-HRESULT CMenuToolbarBase::ExecuteItem(INT iItem)
+HRESULT CMenuToolbarBase::MenuBarMouseDown(INT iIndex)
{
- m_menuBand->_KillPopupTimers();
+ TBBUTTON btn;
- INT index;
- DWORD_PTR data;
+ if (m_initFlags & SMINIT_VERTICAL)
+ return S_OK;
- GetDataFromId(iItem, &index, &data);
+ ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex, reinterpret_cast<LPARAM>(&btn));
+ return ProcessClick(btn.idCommand);
+}
+
+HRESULT CMenuToolbarBase::MenuBarMouseUp(INT iIndex)
+{
+ TBBUTTON btn;
- return InternalExecuteItem(iItem, index, data);
+ if (!(m_initFlags & SMINIT_VERTICAL))
+ return S_OK;
+
+ ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex, reinterpret_cast<LPARAM>(&btn));
+ return ProcessClick(btn.idCommand);
+}
+
+HRESULT CMenuToolbarBase::PrepareExecuteItem(INT iItem)
+{
+ this->m_menuBand->_KillPopupTimers();
+
+ m_executeItem = iItem;
+ return GetDataFromId(iItem, &m_executeIndex, &m_executeData);
+}
+
+HRESULT CMenuToolbarBase::ExecuteItem()
+{
+ return InternalExecuteItem(m_executeItem, m_executeItem, m_executeData);
}
HRESULT CMenuToolbarBase::OnContextMenu(NMMOUSE * rclick)
HRESULT hr = m_menuBand->_CallCBWithItemId(info.wID, SMC_GETINFO, 0, reinterpret_cast<LPARAM>(sminfo));
if (FAILED_UNEXPECTEDLY(hr))
+ {
+ delete sminfo;
return hr;
+ }
AddButton(info.wID, info.dwTypeData, info.hSubMenu != NULL, sminfo->iIcon, reinterpret_cast<DWORD_PTR>(sminfo), last);
IEnumIDList * eidl;
m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
- LPITEMIDLIST item = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(sizeof(ITEMIDLIST)));
- ULONG fetched;
- hr = eidl->Next(1, &item, &fetched);
- while (SUCCEEDED(hr) && fetched > 0)
+ LPITEMIDLIST item = NULL;
+ hr = eidl->Next(1, &item, NULL);
+ while (hr == S_OK)
{
INT index = 0;
INT indexOpen = 0;
- STRRET sr = { STRRET_CSTR, { 0 } };
+ if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_OK)
+ {
+ STRRET sr = { STRRET_CSTR, { 0 } };
- hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
- if (FAILED_UNEXPECTEDLY(hr))
- return hr;
+ hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
- StrRetToStr(&sr, NULL, &MenuString);
+ StrRetToStr(&sr, NULL, &MenuString);
- index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen);
+ index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen);
- LPCITEMIDLIST itemc = item;
+ LPCITEMIDLIST itemc = item;
- SFGAOF attrs = SFGAO_FOLDER;
- hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);
+ SFGAOF attrs = SFGAO_FOLDER;
+ hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);
- DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(ILClone(item));
+ DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(ILClone(item));
- // Fetch next item already, so we know if the current one is the last
- hr = eidl->Next(1, &item, &fetched);
+ // Fetch next item already, so we know if the current one is the last
+ hr = eidl->Next(1, &item, NULL);
- AddButton(++i, MenuString, attrs & SFGAO_FOLDER, index, dwData, FAILED(hr) || fetched == 0);
+ AddButton(++i, MenuString, attrs & SFGAO_FOLDER, index, dwData, hr != S_OK);
- CoTaskMemFree(MenuString);
+ CoTaskMemFree(MenuString);
+ }
+ else
+ {
+ // Fetch next item here also
+ hr = eidl->Next(1, &item, NULL);
+ }
}
- CoTaskMemFree(item);
+ ILFree(item);
// If no items were added, show the "empty" placeholder
if (i == 0)
pidl = ILClone(m_idList);
if (!pidl)
{
+ ERR("ILClone failed!\n");
(*reinterpret_cast<IUnknown**>(ppv))->Release();
return E_FAIL;
}