ReactOS 0.4.17-dev-1190-g4c812f4
CMenuSFToolbar Class Reference

#include <CMenuToolbars.h>

Inheritance diagram for CMenuSFToolbar:
Collaboration diagram for CMenuSFToolbar:

Public Member Functions

 CMenuSFToolbar (CMenuBand *menuBand)
 
virtual ~CMenuSFToolbar ()
 
HRESULT SetShellFolder (IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags)
 
HRESULT GetShellFolder (DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv)
 
virtual HRESULT FillToolbar (BOOL clearFirst=FALSE) override
 
- Public Member Functions inherited from CMenuToolbarBase
 CMenuToolbarBase (CMenuBand *menuBand, BOOL usePager)
 
virtual ~CMenuToolbarBase ()
 
HRESULT IsWindowOwner (HWND hwnd)
 
HRESULT CreateToolbar (HWND hwndParent, DWORD dwFlags)
 
HRESULT GetWindow (HWND *phwnd)
 
HRESULT ShowDW (BOOL fShow)
 
HRESULT Close ()
 
HRESULT OnWinEvent (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
 
HRESULT ChangeHotItem (CMenuToolbarBase *toolbar, INT item, DWORD dwFlags)
 
HRESULT ChangePopupItem (CMenuToolbarBase *toolbar, INT item)
 
HRESULT PopupSubMenu (UINT itemId, UINT index, IShellMenu *childShellMenu, BOOL keyInitiated)
 
HRESULT PopupSubMenu (UINT itemId, UINT index, HMENU menu)
 
HRESULT TrackContextMenu (IContextMenu *contextMenu, POINT pt)
 
HRESULT KeyboardItemChange (DWORD changeType)
 
HRESULT PrepareExecuteItem (INT iItem)
 
HRESULT ExecuteItem ()
 
HRESULT GetSizes (SIZE *pMinSize, SIZE *pMaxSize, SIZE *pIntegralSize)
 
HRESULT SetPosSize (int x, int y, int cx, int cy)
 
void InvalidateDraw ()
 
HRESULT DisableMouseTrack (BOOL bDisable)
 
virtual HRESULT FillToolbar (BOOL clearFirst=FALSE)=0
 
HRESULT CancelCurrentPopup ()
 
HRESULT PopupItem (INT iItem, BOOL keyInitiated)
 
HRESULT GetDataFromId (INT iItem, INT *pIndex, DWORD_PTR *pData)
 
HRESULT KillPopupTimer ()
 
HRESULT MenuBarMouseDown (INT iIndex, BOOL isLButton)
 
HRESULT MenuBarMouseUp (INT iIndex, BOOL isLButton)
 
HRESULT ProcessClick (INT iItem)
 
HRESULT ProcessContextMenu (INT iItem)
 
HRESULT BeforeCancelPopup ()
 

Protected Member Functions

virtual HRESULT OnDeletingButton (const NMTOOLBAR *tb) override
 
virtual HRESULT InternalGetTooltip (INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax) override
 
virtual HRESULT InternalExecuteItem (INT iItem, INT index, DWORD_PTR dwData) override
 
virtual HRESULT InternalPopupItem (INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated) override
 
virtual HRESULT InternalHasSubMenu (INT iItem, INT index, DWORD_PTR dwData) override
 
virtual HRESULT InternalContextMenu (INT iItem, INT index, DWORD_PTR dwData, POINT pt) override
 
- Protected Member Functions inherited from CMenuToolbarBase
virtual HRESULT OnDeletingButton (const NMTOOLBAR *tb) PURE
 
virtual HRESULT InternalGetTooltip (INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax) PURE
 
virtual HRESULT InternalExecuteItem (INT iItem, INT index, DWORD_PTR dwData) PURE
 
virtual HRESULT InternalPopupItem (INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated) PURE
 
virtual HRESULT InternalHasSubMenu (INT iItem, INT index, DWORD_PTR dwData) PURE
 
virtual HRESULT InternalContextMenu (INT iItem, INT index, DWORD_PTR dwData, POINT pt) PURE
 
HRESULT AddButton (DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last)
 
HRESULT AddSeparator (BOOL last)
 
HRESULT AddPlaceholder ()
 
HRESULT ClearToolbar ()
 
HWND GetToolbar ()
 

Private Attributes

CComPtr< IShellFolder > m_shellFolder
 
LPCITEMIDLIST m_idList
 
HKEY m_hKey
 

Additional Inherited Members

- Protected Attributes inherited from CMenuToolbarBase
CMenuBand * m_menuBand
 
DWORD m_dwMenuFlags
 
BOOL m_hasSizes
 
SIZE m_idealSize
 
SIZE m_itemSize
 
BOOL m_usePager
 
CMenuToolbarBase * m_hotBar
 
INT m_hotItem
 
CMenuToolbarBase * m_popupBar
 
INT m_popupItem
 
DWORD m_initFlags
 
BOOL m_isTrackingPopup
 
INT m_executeIndex
 
INT m_executeItem
 
DWORD_PTR m_executeData
 
BOOL m_cancelingPopup
 

Detailed Description

Definition at line 167 of file CMenuToolbars.h.

Constructor & Destructor Documentation

◆ CMenuSFToolbar()

CMenuSFToolbar::CMenuSFToolbar ( CMenuBand *  menuBand)

Definition at line 1318 of file CMenuToolbars.cpp.

1318 :
1319 CMenuToolbarBase(menuBand, TRUE),
1321 m_idList(NULL),
1322 m_hKey(NULL)
1323{
1324}
LPCITEMIDLIST m_idList
CComPtr< IShellFolder > m_shellFolder
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120

◆ ~CMenuSFToolbar()

CMenuSFToolbar::~CMenuSFToolbar ( )
virtual

Definition at line 1326 of file CMenuToolbars.cpp.

1327{
1328}

Member Function Documentation

◆ FillToolbar()

HRESULT CMenuSFToolbar::FillToolbar ( BOOL  clearFirst = FALSE)
overridevirtual

Implements CMenuToolbarBase.

Definition at line 1356 of file CMenuToolbars.cpp.

1357{
1358 HRESULT hr;
1359
1360 CComPtr<IEnumIDList> eidl;
1361 hr = m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
1363 return hr;
1364
1365 HDPA dpaSort = DPA_Create(10);
1366
1368 hr = eidl->Next(1, &item, NULL);
1369 while (hr == S_OK)
1370 {
1371 if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_FALSE)
1372 {
1373 DPA_AppendPtr(dpaSort, item);
1374 }
1375 else
1376 {
1378 }
1379
1380 hr = eidl->Next(1, &item, NULL);
1381 }
1382
1383 // If no items were added, show the "empty" placeholder
1384 if (DPA_GetPtrCount(dpaSort) == 0)
1385 {
1386 DPA_Destroy(dpaSort);
1387 return AddPlaceholder();
1388 }
1389
1390 TRACE("FillToolbar added %d items to the DPA\n", DPA_GetPtrCount(dpaSort));
1391
1393
1394 BOOL StartMenuAdminTools = SHRegGetBoolUSValueW(
1395 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
1396 L"StartMenuAdminTools", FALSE, TRUE);
1397
1398 BOOL bMustHideAdminTools = IsPidlPrograms(m_idList) && !StartMenuAdminTools;
1399 TRACE("StartMenuAdminTools: %d\n", StartMenuAdminTools);
1400 TRACE("bMustHideAdminTools: %d\n", bMustHideAdminTools);
1401
1402 WCHAR szAdminTools[MAX_PATH];
1403 if (bMustHideAdminTools)
1404 {
1406 szAdminTools, _countof(szAdminTools));
1407 }
1408
1409 for (int i = 0; i<DPA_GetPtrCount(dpaSort);)
1410 {
1411 item = (LPITEMIDLIST)DPA_GetPtr(dpaSort, i);
1412
1413 STRRET sr = { STRRET_CSTR };
1414 hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
1416 {
1417 DPA_Destroy(dpaSort);
1418 return hr;
1419 }
1420
1421 PWSTR MenuString;
1422 StrRetToStr(&sr, NULL, &MenuString);
1423
1424 if (bMustHideAdminTools && lstrcmpiW(MenuString, szAdminTools) == 0)
1425 {
1426 ++i;
1427 CoTaskMemFree(MenuString);
1428 continue;
1429 }
1430
1432 BOOL isPureFolder = GetFolderItemBaseType(m_shellFolder, item) == SFGAO_FOLDER; // Don't expand .cab/.zip
1433
1434 // Fetch next item already, so we know if the current one is the last
1435 i++;
1436
1437 AddButton(i, MenuString, isPureFolder, index, reinterpret_cast<DWORD_PTR>(item), i >= DPA_GetPtrCount(dpaSort));
1438
1439 CoTaskMemFree(MenuString);
1440 }
1441
1442 DPA_Destroy(dpaSort);
1443 return hr;
1444}
int CALLBACK PidlListSort(void *item1, void *item2, LPARAM lParam)
static BOOL IsPidlPrograms(LPCITEMIDLIST pidlTarget)
static SFGAOF GetFolderItemBaseType(UINT sfgao)
HRESULT _CallCBWithItemPidl(LPITEMIDLIST pidl, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CMenuBand.cpp:775
HRESULT AddPlaceholder()
CMenuBand * m_menuBand
Definition: CMenuToolbars.h:39
HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last)
HRESULT hr
Definition: delayimp.cpp:582
#define FALSE
Definition: types.h:117
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
BOOL WINAPI DPA_Sort(HDPA hdpa, PFNDPACOMPARE pfnCompare, LPARAM lParam)
Definition: dpa.c:813
BOOL WINAPI DPA_Destroy(HDPA hdpa)
Definition: dpa.c:396
HDPA WINAPI DPA_Create(INT nGrow)
Definition: dpa.c:950
#define MAX_PATH
Definition: compat.h:34
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
BOOL WINAPI SHRegGetBoolUSValueW(const WCHAR *subkey, const WCHAR *value, BOOL ignore_hkcu, BOOL default_value)
Definition: registry.c:4139
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint index
Definition: glext.h:6031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
Definition: iconcache.cpp:772
#define S_OK
Definition: intsafe.h:52
LONG_PTR LPARAM
Definition: minwindef.h:175
short WCHAR
Definition: pedump.c:58
#define DPA_AppendPtr(hdpa, pitem)
Definition: commctrl.h:4975
#define DPA_GetPtrCount(hdpa)
Definition: commctrl.h:4972
#define StrRetToStr
Definition: shlwapi.h:1252
#define LoadStringW
Definition: utils.h:64
#define IDS_ADMINISTRATIVETOOLS
Definition: shresdef.h:276
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
@ STRRET_CSTR
Definition: shtypes.idl:87
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
Definition: dpa.c:49
uint16_t * PWSTR
Definition: typedefs.h:56
uint32_t DWORD_PTR
Definition: typedefs.h:65
int32_t INT
Definition: typedefs.h:58
#define DPA_GetPtr
Definition: commctrl.h:5
#define S_FALSE
Definition: winerror.h:3451

Referenced by CMenuBand::SetShellFolder(), and CMenuBand::SetSite().

◆ GetShellFolder()

HRESULT CMenuSFToolbar::GetShellFolder ( DWORD *  pdwFlags,
LPITEMIDLIST *  ppidl,
REFIID  riid,
void **  ppv 
)

Definition at line 1472 of file CMenuToolbars.cpp.

1473{
1474 HRESULT hr;
1475
1476 hr = m_shellFolder->QueryInterface(riid, ppv);
1478 return hr;
1479
1480 if (pdwFlags)
1481 *pdwFlags = m_dwMenuFlags;
1482
1483 if (ppidl)
1484 {
1485 LPITEMIDLIST pidl = NULL;
1486
1487 if (m_idList)
1488 {
1489 pidl = ILClone(m_idList);
1490 if (!pidl)
1491 {
1492 ERR("ILClone failed!\n");
1493 (*reinterpret_cast<IUnknown**>(ppv))->Release();
1494 return E_FAIL;
1495 }
1496 }
1497
1498 *ppidl = pidl;
1499 }
1500
1501 return hr;
1502}
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_FAIL
Definition: ddrawi.h:102
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238

Referenced by CMenuBand::_CallCB(), and CMenuBand::GetShellFolder().

◆ InternalContextMenu()

HRESULT CMenuSFToolbar::InternalContextMenu ( INT  iItem,
INT  index,
DWORD_PTR  dwData,
POINT  pt 
)
overrideprotectedvirtual

Reimplemented from CMenuToolbarBase.

Definition at line 1504 of file CMenuToolbars.cpp.

1505{
1506 HRESULT hr;
1507 CComPtr<IContextMenu> contextMenu = NULL;
1508 LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(dwData);
1509
1510 hr = m_shellFolder->GetUIObjectOf(GetToolbar(), 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
1512 {
1513 return hr;
1514 }
1515
1516 hr = TrackContextMenu(contextMenu, pt);
1517
1518 return hr;
1519}
HRESULT TrackContextMenu(IContextMenu *contextMenu, POINT pt)
#define pt(x, y)
Definition: drawing.c:79
static HANDLE ULONG_PTR dwData
Definition: pipe.c:111
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define IID_NULL_PPV_ARG(Itype, ppType)

◆ InternalExecuteItem()

HRESULT CMenuSFToolbar::InternalExecuteItem ( INT  iItem,
INT  index,
DWORD_PTR  dwData 
)
overrideprotectedvirtual

Reimplemented from CMenuToolbarBase.

Definition at line 1521 of file CMenuToolbars.cpp.

1522{
1523 return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0);
1524}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

◆ InternalGetTooltip()

HRESULT CMenuSFToolbar::InternalGetTooltip ( INT  iItem,
INT  index,
DWORD_PTR  dwData,
LPWSTR  pszText,
INT  cchTextMax 
)
overrideprotectedvirtual

Reimplemented from CMenuToolbarBase.

Definition at line 1446 of file CMenuToolbars.cpp.

1447{
1448 //ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1450 return E_NOTIMPL;
1451}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ InternalHasSubMenu()

HRESULT CMenuSFToolbar::InternalHasSubMenu ( INT  iItem,
INT  index,
DWORD_PTR  dwData 
)
overrideprotectedvirtual

Reimplemented from CMenuToolbarBase.

Definition at line 1563 of file CMenuToolbars.cpp.

1564{
1565 LPCITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1566 BOOL isPureFolder = GetFolderItemBaseType(m_shellFolder, pidl) == SFGAO_FOLDER;
1567 return isPureFolder ? S_OK : S_FALSE;
1568}

◆ InternalPopupItem()

HRESULT CMenuSFToolbar::InternalPopupItem ( INT  iItem,
INT  index,
DWORD_PTR  dwData,
BOOL  keyInitiated 
)
overrideprotectedvirtual

Reimplemented from CMenuToolbarBase.

Definition at line 1526 of file CMenuToolbars.cpp.

1527{
1528 HRESULT hr;
1529 UINT uId;
1530 UINT uIdAncestor;
1531 DWORD flags;
1532 CComPtr<IShellMenuCallback> psmc;
1533 CComPtr<IShellMenu> shellMenu;
1534
1535 LPITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1536
1537 if (!pidl)
1538 return E_FAIL;
1539
1542 return hr;
1543
1544 m_menuBand->GetMenuInfo(&psmc, &uId, &uIdAncestor, &flags);
1545
1546 // FIXME: not sure what to use as uId/uIdAncestor here
1547 hr = shellMenu->Initialize(psmc, 0, uId, SMINIT_VERTICAL);
1549 return hr;
1550
1551 CComPtr<IShellFolder> childFolder;
1552 hr = m_shellFolder->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &childFolder));
1554 return hr;
1555
1556 hr = shellMenu->SetShellFolder(childFolder, NULL, NULL, SMSET_TOP);
1558 return hr;
1559
1560 return PopupSubMenu(iItem, index, shellMenu, keyInitiated);
1561}
#define IID_PPV_ARG(Itype, ppType)
STDMETHOD() GetMenuInfo(IShellMenuCallback **ppsmc, UINT *puId, UINT *puIdAncestor, DWORD *pdwFlags) override
Definition: CMenuBand.cpp:91
HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu *childShellMenu, BOOL keyInitiated)
unsigned long DWORD
Definition: ntddk_ex.h:95
GLbitfield flags
Definition: glext.h:7161
unsigned int UINT
Definition: sysinfo.c:13
#define CMenuBand_CreateInstance
Definition: shellmenu.h:80

◆ OnDeletingButton()

HRESULT CMenuSFToolbar::OnDeletingButton ( const NMTOOLBAR *  tb)
overrideprotectedvirtual

Reimplemented from CMenuToolbarBase.

Definition at line 1453 of file CMenuToolbars.cpp.

1454{
1455 ILFree(reinterpret_cast<LPITEMIDLIST>(tb->tbButton.dwData));
1456 return S_OK;
1457}
static const WCHAR tb[]
Definition: suminfo.c:431
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051

◆ SetShellFolder()

HRESULT CMenuSFToolbar::SetShellFolder ( IShellFolder *  psf,
LPCITEMIDLIST  pidlFolder,
HKEY  hKey,
DWORD  dwFlags 
)

Definition at line 1459 of file CMenuToolbars.cpp.

1460{
1461 m_shellFolder = psf;
1462 m_idList = ILClone(pidlFolder);
1463 m_hKey = hKey;
1465
1466 if (IsWindow())
1467 ClearToolbar();
1468
1469 return S_OK;
1470}
FxAutoRegKey hKey
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
BOOL WINAPI IsWindow(_In_opt_ HWND)

Referenced by CMenuBand::SetShellFolder().

Member Data Documentation

◆ m_hKey

HKEY CMenuSFToolbar::m_hKey
private

Definition at line 173 of file CMenuToolbars.h.

Referenced by SetShellFolder().

◆ m_idList

LPCITEMIDLIST CMenuSFToolbar::m_idList
private

Definition at line 172 of file CMenuToolbars.h.

Referenced by FillToolbar(), GetShellFolder(), and SetShellFolder().

◆ m_shellFolder

CComPtr<IShellFolder> CMenuSFToolbar::m_shellFolder
private

The documentation for this class was generated from the following files: