mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 03:05:40 +00:00
[EXPLORER-NEW]
* Refactor startmnu.cpp into three separate files. startctxmnu.cpp contains the context menu handler for the start button, and startmnusite.cpp contains the former IStartMenuSiteImpl, renamed to CStartMenuSite. svn path=/branches/shell-experiments/; revision=65200
This commit is contained in:
parent
d2f5f7f14f
commit
d2d3c97622
5 changed files with 693 additions and 641 deletions
|
@ -11,7 +11,9 @@ list(APPEND SOURCE
|
||||||
rshell.cpp
|
rshell.cpp
|
||||||
settings.cpp
|
settings.cpp
|
||||||
shellservice.cpp
|
shellservice.cpp
|
||||||
|
startctxmnu.cpp
|
||||||
startmnu.cpp
|
startmnu.cpp
|
||||||
|
startmnusite.cpp
|
||||||
startup.cpp
|
startup.cpp
|
||||||
taskband.cpp
|
taskband.cpp
|
||||||
taskswnd.cpp
|
taskswnd.cpp
|
||||||
|
|
|
@ -243,7 +243,7 @@ IN PCTSTR pszValueName,
|
||||||
IN DWORD dwValue);
|
IN DWORD dwValue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* startup.c
|
* startup.cpp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -257,7 +257,7 @@ VOID
|
||||||
DisplayTrayProperties(IN HWND hwndOwner);
|
DisplayTrayProperties(IN HWND hwndOwner);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* desktop.c
|
* desktop.cpp
|
||||||
*/
|
*/
|
||||||
HANDLE
|
HANDLE
|
||||||
DesktopCreateWindow(IN OUT ITrayWindow *Tray);
|
DesktopCreateWindow(IN OUT ITrayWindow *Tray);
|
||||||
|
@ -266,7 +266,7 @@ VOID
|
||||||
DesktopDestroyShellWindow(IN HANDLE hDesktop);
|
DesktopDestroyShellWindow(IN HANDLE hDesktop);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* taskband.c
|
* taskband.cpp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Internal Task Band CLSID */
|
/* Internal Task Band CLSID */
|
||||||
|
@ -297,7 +297,7 @@ ITaskBand *
|
||||||
CreateTaskBand(IN OUT ITrayWindow *Tray);
|
CreateTaskBand(IN OUT ITrayWindow *Tray);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tbsite.c
|
* tbsite.cpp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define INTERFACE ITrayBandSite
|
#define INTERFACE ITrayBandSite
|
||||||
|
@ -339,7 +339,7 @@ OUT HWND *phWndRebar,
|
||||||
OUT HWND *phWndTaskSwitch);
|
OUT HWND *phWndTaskSwitch);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* startmnu.c
|
* startmnu.cpp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern const TRAYWINDOW_CTXMENU StartMenuBtnCtxMenu;
|
extern const TRAYWINDOW_CTXMENU StartMenuBtnCtxMenu;
|
||||||
|
@ -374,6 +374,13 @@ UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
|
||||||
IN HBITMAP hbmBanner OPTIONAL,
|
IN HBITMAP hbmBanner OPTIONAL,
|
||||||
IN BOOL bSmallIcons);
|
IN BOOL bSmallIcons);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* startmnusite.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
HRESULT
|
||||||
|
CreateStartMenuSite(IN OUT ITrayWindow *Tray, const IID & riid, PVOID * ppv);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* trayntfy.c
|
* trayntfy.c
|
||||||
*/
|
*/
|
||||||
|
|
263
base/shell/explorer-new/startctxmnu.cpp
Normal file
263
base/shell/explorer-new/startctxmnu.cpp
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
/*
|
||||||
|
* ReactOS Explorer
|
||||||
|
*
|
||||||
|
* Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start menu button context menu
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TODO: Convert into an IContextMenu
|
||||||
|
|
||||||
|
typedef struct _STARTMNU_CTMENU_CTX
|
||||||
|
{
|
||||||
|
IContextMenu *pcm;
|
||||||
|
LPITEMIDLIST pidl;
|
||||||
|
} STARTMNU_CTMENU_CTX, *PSTARTMNU_CTMENU_CTX;
|
||||||
|
|
||||||
|
static HMENU
|
||||||
|
CreateStartContextMenu(IN HWND hWndOwner,
|
||||||
|
IN PVOID *ppcmContext,
|
||||||
|
IN PVOID Context OPTIONAL);
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
OnStartContextMenuCommand(IN HWND hWndOwner,
|
||||||
|
IN UINT uiCmdId,
|
||||||
|
IN PVOID pcmContext OPTIONAL,
|
||||||
|
IN PVOID Context OPTIONAL);
|
||||||
|
|
||||||
|
const TRAYWINDOW_CTXMENU StartMenuBtnCtxMenu = {
|
||||||
|
CreateStartContextMenu,
|
||||||
|
OnStartContextMenuCommand
|
||||||
|
};
|
||||||
|
|
||||||
|
static HMENU
|
||||||
|
CreateContextMenuFromShellFolderPidl(IN HWND hWndOwner,
|
||||||
|
IN OUT IShellFolder *psf,
|
||||||
|
IN OUT LPITEMIDLIST pidl,
|
||||||
|
OUT IContextMenu **ppcm)
|
||||||
|
{
|
||||||
|
CComPtr<IContextMenu> pcm;
|
||||||
|
HRESULT hRet;
|
||||||
|
HMENU hPopup;
|
||||||
|
|
||||||
|
hRet = psf->GetUIObjectOf(hWndOwner, 1, (LPCITEMIDLIST *) &pidl, IID_NULL_PPV_ARG(IContextMenu, &pcm));
|
||||||
|
if (SUCCEEDED(hRet))
|
||||||
|
{
|
||||||
|
hPopup = CreatePopupMenu();
|
||||||
|
|
||||||
|
if (hPopup != NULL)
|
||||||
|
{
|
||||||
|
hRet = pcm->QueryContextMenu(
|
||||||
|
hPopup,
|
||||||
|
0,
|
||||||
|
ID_SHELL_CMD_FIRST,
|
||||||
|
ID_SHELL_CMD_LAST,
|
||||||
|
CMF_VERBSONLY);
|
||||||
|
|
||||||
|
if (SUCCEEDED(hRet))
|
||||||
|
{
|
||||||
|
*ppcm = pcm;
|
||||||
|
return hPopup;
|
||||||
|
}
|
||||||
|
|
||||||
|
DestroyMenu(hPopup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
OnStartContextMenuCommand(IN HWND hWndOwner,
|
||||||
|
IN UINT uiCmdId,
|
||||||
|
IN PVOID pcmContext OPTIONAL,
|
||||||
|
IN PVOID Context OPTIONAL)
|
||||||
|
{
|
||||||
|
PSTARTMNU_CTMENU_CTX psmcmc = (PSTARTMNU_CTMENU_CTX) pcmContext;
|
||||||
|
|
||||||
|
if (uiCmdId != 0)
|
||||||
|
{
|
||||||
|
if ((uiCmdId >= ID_SHELL_CMD_FIRST) && (uiCmdId <= ID_SHELL_CMD_LAST))
|
||||||
|
{
|
||||||
|
CMINVOKECOMMANDINFO cmici = { 0 };
|
||||||
|
CHAR szDir[MAX_PATH];
|
||||||
|
|
||||||
|
/* Setup and invoke the shell command */
|
||||||
|
cmici.cbSize = sizeof(cmici);
|
||||||
|
cmici.hwnd = hWndOwner;
|
||||||
|
cmici.lpVerb = (LPCSTR) MAKEINTRESOURCE(uiCmdId - ID_SHELL_CMD_FIRST);
|
||||||
|
cmici.nShow = SW_NORMAL;
|
||||||
|
|
||||||
|
/* FIXME: Support Unicode!!! */
|
||||||
|
if (SHGetPathFromIDListA(psmcmc->pidl,
|
||||||
|
szDir))
|
||||||
|
{
|
||||||
|
cmici.lpDirectory = szDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
psmcmc->pcm->InvokeCommand(&cmici);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ITrayWindow * TrayWnd = (ITrayWindow *) Context;
|
||||||
|
TrayWnd->ExecContextMenuCmd(uiCmdId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
psmcmc->pcm->Release();
|
||||||
|
|
||||||
|
HeapFree(hProcessHeap, 0, psmcmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
AddStartContextMenuItems(IN HWND hWndOwner, IN HMENU hPopup)
|
||||||
|
{
|
||||||
|
WCHAR szBuf[MAX_PATH];
|
||||||
|
HRESULT hRet;
|
||||||
|
|
||||||
|
/* Add the "Open All Users" menu item */
|
||||||
|
if (LoadString(hExplorerInstance,
|
||||||
|
IDS_PROPERTIES,
|
||||||
|
szBuf,
|
||||||
|
sizeof(szBuf) / sizeof(szBuf[0])))
|
||||||
|
{
|
||||||
|
AppendMenu(hPopup,
|
||||||
|
MF_STRING,
|
||||||
|
ID_SHELL_CMD_PROPERTIES,
|
||||||
|
szBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SHRestricted(REST_NOCOMMONGROUPS))
|
||||||
|
{
|
||||||
|
/* Check if we should add menu items for the common start menu */
|
||||||
|
hRet = SHGetFolderPath(hWndOwner,
|
||||||
|
CSIDL_COMMON_STARTMENU,
|
||||||
|
NULL,
|
||||||
|
SHGFP_TYPE_CURRENT,
|
||||||
|
szBuf);
|
||||||
|
if (SUCCEEDED(hRet) && hRet != S_FALSE)
|
||||||
|
{
|
||||||
|
/* The directory exists, but only show the items if the
|
||||||
|
user can actually make any changes to the common start
|
||||||
|
menu. This is most likely only the case if the user
|
||||||
|
has administrative rights! */
|
||||||
|
if (IsUserAnAdmin())
|
||||||
|
{
|
||||||
|
AppendMenu(hPopup,
|
||||||
|
MF_SEPARATOR,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
/* Add the "Open All Users" menu item */
|
||||||
|
if (LoadString(hExplorerInstance,
|
||||||
|
IDS_OPEN_ALL_USERS,
|
||||||
|
szBuf,
|
||||||
|
sizeof(szBuf) / sizeof(szBuf[0])))
|
||||||
|
{
|
||||||
|
AppendMenu(hPopup,
|
||||||
|
MF_STRING,
|
||||||
|
ID_SHELL_CMD_OPEN_ALL_USERS,
|
||||||
|
szBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add the "Explore All Users" menu item */
|
||||||
|
if (LoadString(hExplorerInstance,
|
||||||
|
IDS_EXPLORE_ALL_USERS,
|
||||||
|
szBuf,
|
||||||
|
sizeof(szBuf) / sizeof(szBuf[0])))
|
||||||
|
{
|
||||||
|
AppendMenu(hPopup,
|
||||||
|
MF_STRING,
|
||||||
|
ID_SHELL_CMD_EXPLORE_ALL_USERS,
|
||||||
|
szBuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static HMENU
|
||||||
|
CreateStartContextMenu(IN HWND hWndOwner,
|
||||||
|
IN PVOID *ppcmContext,
|
||||||
|
IN PVOID Context OPTIONAL)
|
||||||
|
{
|
||||||
|
LPITEMIDLIST pidlStart, pidlLast;
|
||||||
|
CComPtr<IShellFolder> psfStart;
|
||||||
|
CComPtr<IShellFolder> psfDesktop;
|
||||||
|
CComPtr<IContextMenu> pcm;
|
||||||
|
HRESULT hRet;
|
||||||
|
HMENU hPopup;
|
||||||
|
|
||||||
|
pidlStart = SHCloneSpecialIDList(hWndOwner,
|
||||||
|
CSIDL_STARTMENU,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
if (pidlStart != NULL)
|
||||||
|
{
|
||||||
|
pidlLast = ILClone(ILFindLastID(pidlStart));
|
||||||
|
ILRemoveLastID(pidlStart);
|
||||||
|
|
||||||
|
if (pidlLast != NULL)
|
||||||
|
{
|
||||||
|
hRet = SHGetDesktopFolder(&psfDesktop);
|
||||||
|
if (SUCCEEDED(hRet))
|
||||||
|
{
|
||||||
|
hRet = psfDesktop->BindToObject(pidlStart, NULL, IID_PPV_ARG(IShellFolder, &psfStart));
|
||||||
|
if (SUCCEEDED(hRet))
|
||||||
|
{
|
||||||
|
hPopup = CreateContextMenuFromShellFolderPidl(hWndOwner,
|
||||||
|
psfStart,
|
||||||
|
pidlLast,
|
||||||
|
&pcm);
|
||||||
|
|
||||||
|
if (hPopup != NULL)
|
||||||
|
{
|
||||||
|
PSTARTMNU_CTMENU_CTX psmcmc;
|
||||||
|
|
||||||
|
psmcmc = (PSTARTMNU_CTMENU_CTX) HeapAlloc(hProcessHeap, 0, sizeof(*psmcmc));
|
||||||
|
if (psmcmc != NULL)
|
||||||
|
{
|
||||||
|
psmcmc->pcm = pcm;
|
||||||
|
psmcmc->pidl = pidlLast;
|
||||||
|
|
||||||
|
AddStartContextMenuItems(hWndOwner,
|
||||||
|
hPopup);
|
||||||
|
|
||||||
|
*ppcmContext = psmcmc;
|
||||||
|
return hPopup;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DestroyMenu(hPopup);
|
||||||
|
hPopup = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ILFree(pidlLast);
|
||||||
|
}
|
||||||
|
|
||||||
|
ILFree(pidlStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
|
@ -20,638 +20,6 @@
|
||||||
|
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* Start menu button context menu
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _STARTMNU_CTMENU_CTX
|
|
||||||
{
|
|
||||||
IContextMenu *pcm;
|
|
||||||
LPITEMIDLIST pidl;
|
|
||||||
} STARTMNU_CTMENU_CTX, *PSTARTMNU_CTMENU_CTX;
|
|
||||||
|
|
||||||
static HMENU
|
|
||||||
CreateStartContextMenu(IN HWND hWndOwner,
|
|
||||||
IN PVOID *ppcmContext,
|
|
||||||
IN PVOID Context OPTIONAL);
|
|
||||||
|
|
||||||
static VOID
|
|
||||||
OnStartContextMenuCommand(IN HWND hWndOwner,
|
|
||||||
IN UINT uiCmdId,
|
|
||||||
IN PVOID pcmContext OPTIONAL,
|
|
||||||
IN PVOID Context OPTIONAL);
|
|
||||||
|
|
||||||
const TRAYWINDOW_CTXMENU StartMenuBtnCtxMenu = {
|
|
||||||
CreateStartContextMenu,
|
|
||||||
OnStartContextMenuCommand
|
|
||||||
};
|
|
||||||
|
|
||||||
static HMENU
|
|
||||||
CreateContextMenuFromShellFolderPidl(IN HWND hWndOwner,
|
|
||||||
IN OUT IShellFolder *psf,
|
|
||||||
IN OUT LPITEMIDLIST pidl,
|
|
||||||
OUT IContextMenu **ppcm)
|
|
||||||
{
|
|
||||||
CComPtr<IContextMenu> pcm;
|
|
||||||
HRESULT hRet;
|
|
||||||
HMENU hPopup;
|
|
||||||
|
|
||||||
hRet = psf->GetUIObjectOf(hWndOwner, 1, (LPCITEMIDLIST *)&pidl, IID_NULL_PPV_ARG(IContextMenu, &pcm));
|
|
||||||
if (SUCCEEDED(hRet))
|
|
||||||
{
|
|
||||||
hPopup = CreatePopupMenu();
|
|
||||||
|
|
||||||
if (hPopup != NULL)
|
|
||||||
{
|
|
||||||
hRet = pcm->QueryContextMenu(
|
|
||||||
hPopup,
|
|
||||||
0,
|
|
||||||
ID_SHELL_CMD_FIRST,
|
|
||||||
ID_SHELL_CMD_LAST,
|
|
||||||
CMF_VERBSONLY);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hRet))
|
|
||||||
{
|
|
||||||
*ppcm = pcm;
|
|
||||||
return hPopup;
|
|
||||||
}
|
|
||||||
|
|
||||||
DestroyMenu(hPopup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VOID
|
|
||||||
OnStartContextMenuCommand(IN HWND hWndOwner,
|
|
||||||
IN UINT uiCmdId,
|
|
||||||
IN PVOID pcmContext OPTIONAL,
|
|
||||||
IN PVOID Context OPTIONAL)
|
|
||||||
{
|
|
||||||
PSTARTMNU_CTMENU_CTX psmcmc = (PSTARTMNU_CTMENU_CTX) pcmContext;
|
|
||||||
|
|
||||||
if (uiCmdId != 0)
|
|
||||||
{
|
|
||||||
if ((uiCmdId >= ID_SHELL_CMD_FIRST) && (uiCmdId <= ID_SHELL_CMD_LAST))
|
|
||||||
{
|
|
||||||
CMINVOKECOMMANDINFO cmici = {0};
|
|
||||||
CHAR szDir[MAX_PATH];
|
|
||||||
|
|
||||||
/* Setup and invoke the shell command */
|
|
||||||
cmici.cbSize = sizeof(cmici);
|
|
||||||
cmici.hwnd = hWndOwner;
|
|
||||||
cmici.lpVerb = (LPCSTR)MAKEINTRESOURCE(uiCmdId - ID_SHELL_CMD_FIRST);
|
|
||||||
cmici.nShow = SW_NORMAL;
|
|
||||||
|
|
||||||
/* FIXME: Support Unicode!!! */
|
|
||||||
if (SHGetPathFromIDListA(psmcmc->pidl,
|
|
||||||
szDir))
|
|
||||||
{
|
|
||||||
cmici.lpDirectory = szDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
psmcmc->pcm->InvokeCommand(&cmici);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ITrayWindow * TrayWnd = (ITrayWindow *) Context;
|
|
||||||
TrayWnd->ExecContextMenuCmd(uiCmdId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
psmcmc->pcm->Release();
|
|
||||||
|
|
||||||
HeapFree(hProcessHeap, 0, psmcmc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VOID
|
|
||||||
AddStartContextMenuItems(IN HWND hWndOwner,
|
|
||||||
IN HMENU hPopup)
|
|
||||||
{
|
|
||||||
WCHAR szBuf[MAX_PATH];
|
|
||||||
HRESULT hRet;
|
|
||||||
|
|
||||||
/* Add the "Open All Users" menu item */
|
|
||||||
if (LoadString(hExplorerInstance,
|
|
||||||
IDS_PROPERTIES,
|
|
||||||
szBuf,
|
|
||||||
sizeof(szBuf) / sizeof(szBuf[0])))
|
|
||||||
{
|
|
||||||
AppendMenu(hPopup,
|
|
||||||
MF_STRING,
|
|
||||||
ID_SHELL_CMD_PROPERTIES,
|
|
||||||
szBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SHRestricted(REST_NOCOMMONGROUPS))
|
|
||||||
{
|
|
||||||
/* Check if we should add menu items for the common start menu */
|
|
||||||
hRet = SHGetFolderPath(hWndOwner,
|
|
||||||
CSIDL_COMMON_STARTMENU,
|
|
||||||
NULL,
|
|
||||||
SHGFP_TYPE_CURRENT,
|
|
||||||
szBuf);
|
|
||||||
if (SUCCEEDED(hRet) && hRet != S_FALSE)
|
|
||||||
{
|
|
||||||
/* The directory exists, but only show the items if the
|
|
||||||
user can actually make any changes to the common start
|
|
||||||
menu. This is most likely only the case if the user
|
|
||||||
has administrative rights! */
|
|
||||||
if (IsUserAnAdmin())
|
|
||||||
{
|
|
||||||
AppendMenu(hPopup,
|
|
||||||
MF_SEPARATOR,
|
|
||||||
0,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
/* Add the "Open All Users" menu item */
|
|
||||||
if (LoadString(hExplorerInstance,
|
|
||||||
IDS_OPEN_ALL_USERS,
|
|
||||||
szBuf,
|
|
||||||
sizeof(szBuf) / sizeof(szBuf[0])))
|
|
||||||
{
|
|
||||||
AppendMenu(hPopup,
|
|
||||||
MF_STRING,
|
|
||||||
ID_SHELL_CMD_OPEN_ALL_USERS,
|
|
||||||
szBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add the "Explore All Users" menu item */
|
|
||||||
if (LoadString(hExplorerInstance,
|
|
||||||
IDS_EXPLORE_ALL_USERS,
|
|
||||||
szBuf,
|
|
||||||
sizeof(szBuf) / sizeof(szBuf[0])))
|
|
||||||
{
|
|
||||||
AppendMenu(hPopup,
|
|
||||||
MF_STRING,
|
|
||||||
ID_SHELL_CMD_EXPLORE_ALL_USERS,
|
|
||||||
szBuf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static HMENU
|
|
||||||
CreateStartContextMenu(IN HWND hWndOwner,
|
|
||||||
IN PVOID *ppcmContext,
|
|
||||||
IN PVOID Context OPTIONAL)
|
|
||||||
{
|
|
||||||
LPITEMIDLIST pidlStart, pidlLast;
|
|
||||||
CComPtr<IShellFolder> psfStart;
|
|
||||||
CComPtr<IShellFolder> psfDesktop;
|
|
||||||
CComPtr<IContextMenu> pcm;
|
|
||||||
HRESULT hRet;
|
|
||||||
HMENU hPopup;
|
|
||||||
|
|
||||||
pidlStart = SHCloneSpecialIDList(hWndOwner,
|
|
||||||
CSIDL_STARTMENU,
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
if (pidlStart != NULL)
|
|
||||||
{
|
|
||||||
pidlLast = ILClone(ILFindLastID(pidlStart));
|
|
||||||
ILRemoveLastID(pidlStart);
|
|
||||||
|
|
||||||
if (pidlLast != NULL)
|
|
||||||
{
|
|
||||||
hRet = SHGetDesktopFolder(&psfDesktop);
|
|
||||||
if (SUCCEEDED(hRet))
|
|
||||||
{
|
|
||||||
hRet = psfDesktop->BindToObject(pidlStart, NULL, IID_PPV_ARG(IShellFolder, &psfStart));
|
|
||||||
if (SUCCEEDED(hRet))
|
|
||||||
{
|
|
||||||
hPopup = CreateContextMenuFromShellFolderPidl(hWndOwner,
|
|
||||||
psfStart,
|
|
||||||
pidlLast,
|
|
||||||
&pcm);
|
|
||||||
|
|
||||||
if (hPopup != NULL)
|
|
||||||
{
|
|
||||||
PSTARTMNU_CTMENU_CTX psmcmc;
|
|
||||||
|
|
||||||
psmcmc = (PSTARTMNU_CTMENU_CTX) HeapAlloc(hProcessHeap, 0, sizeof(*psmcmc));
|
|
||||||
if (psmcmc != NULL)
|
|
||||||
{
|
|
||||||
psmcmc->pcm = pcm;
|
|
||||||
psmcmc->pidl = pidlLast;
|
|
||||||
|
|
||||||
AddStartContextMenuItems(hWndOwner,
|
|
||||||
hPopup);
|
|
||||||
|
|
||||||
*ppcmContext = psmcmc;
|
|
||||||
return hPopup;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DestroyMenu(hPopup);
|
|
||||||
hPopup = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ILFree(pidlLast);
|
|
||||||
}
|
|
||||||
|
|
||||||
ILFree(pidlStart);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
** IStartMenuSite ***********************************************************
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
class IStartMenuSiteImpl :
|
|
||||||
public CComCoClass<IStartMenuSiteImpl>,
|
|
||||||
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
|
||||||
public IStartMenuSite,
|
|
||||||
public IServiceProvider,
|
|
||||||
public ITrayPriv,
|
|
||||||
public IOleCommandTarget,
|
|
||||||
public IMenuPopup
|
|
||||||
{
|
|
||||||
CComPtr<ITrayWindow> Tray;
|
|
||||||
CComPtr<IMenuPopup> StartMenuPopup;
|
|
||||||
|
|
||||||
public:
|
|
||||||
IStartMenuSiteImpl()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~IStartMenuSiteImpl() { }
|
|
||||||
|
|
||||||
/*******************************************************************/
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE QueryService(
|
|
||||||
IN REFGUID guidService,
|
|
||||||
IN REFIID riid,
|
|
||||||
OUT PVOID *ppvObject)
|
|
||||||
{
|
|
||||||
if (IsEqualGUID(guidService, SID_SMenuPopup))
|
|
||||||
{
|
|
||||||
return QueryInterface(riid, ppvObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************/
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE GetWindow(
|
|
||||||
OUT HWND *phwnd)
|
|
||||||
{
|
|
||||||
TRACE("ITrayPriv::GetWindow\n");
|
|
||||||
|
|
||||||
*phwnd = Tray->GetHWND();
|
|
||||||
if (*phwnd != NULL)
|
|
||||||
return S_OK;
|
|
||||||
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(
|
|
||||||
IN BOOL fEnterMode)
|
|
||||||
{
|
|
||||||
TRACE("ITrayPriv::ContextSensitiveHelp\n");
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE Execute(
|
|
||||||
IN IShellFolder *pShellFolder,
|
|
||||||
IN LPCITEMIDLIST pidl)
|
|
||||||
{
|
|
||||||
HMODULE hShlwapi;
|
|
||||||
HRESULT ret = S_FALSE;
|
|
||||||
|
|
||||||
TRACE("ITrayPriv::Execute\n");
|
|
||||||
|
|
||||||
hShlwapi = GetModuleHandle(TEXT("SHLWAPI.DLL"));
|
|
||||||
if (hShlwapi != NULL)
|
|
||||||
{
|
|
||||||
SHINVDEFCMD SHInvokeDefCmd;
|
|
||||||
|
|
||||||
/* SHInvokeDefaultCommand */
|
|
||||||
SHInvokeDefCmd = (SHINVDEFCMD) GetProcAddress(hShlwapi,
|
|
||||||
(LPCSTR) ((LONG) 279));
|
|
||||||
if (SHInvokeDefCmd != NULL)
|
|
||||||
{
|
|
||||||
ret = SHInvokeDefCmd(Tray->GetHWND(),
|
|
||||||
pShellFolder,
|
|
||||||
pidl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE Unknown(
|
|
||||||
IN PVOID Unknown1,
|
|
||||||
IN PVOID Unknown2,
|
|
||||||
IN PVOID Unknown3,
|
|
||||||
IN PVOID Unknown4)
|
|
||||||
{
|
|
||||||
TRACE("ITrayPriv::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1, Unknown2, Unknown3, Unknown4);
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual BOOL
|
|
||||||
ShowUndockMenuItem(VOID)
|
|
||||||
{
|
|
||||||
TRACE("ShowUndockMenuItem() not implemented!\n");
|
|
||||||
/* FIXME: How do we detect this?! */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual BOOL
|
|
||||||
ShowSynchronizeMenuItem(VOID)
|
|
||||||
{
|
|
||||||
TRACE("ShowSynchronizeMenuItem() not implemented!\n");
|
|
||||||
/* FIXME: How do we detect this?! */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE AppendMenu(
|
|
||||||
OUT HMENU* phMenu)
|
|
||||||
{
|
|
||||||
HMENU hMenu, hSettingsMenu;
|
|
||||||
DWORD dwLogoff;
|
|
||||||
BOOL bWantLogoff;
|
|
||||||
UINT uLastItemsCount = 5; /* 5 menu items below the last separator */
|
|
||||||
WCHAR szUser[128];
|
|
||||||
|
|
||||||
TRACE("ITrayPriv::AppendMenu\n");
|
|
||||||
|
|
||||||
hMenu = LoadPopupMenu(hExplorerInstance,
|
|
||||||
MAKEINTRESOURCE(IDM_STARTMENU));
|
|
||||||
*phMenu = hMenu;
|
|
||||||
if (hMenu == NULL)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
/* Remove menu items that don't apply */
|
|
||||||
|
|
||||||
dwLogoff = SHRestricted(REST_STARTMENULOGOFF);
|
|
||||||
bWantLogoff = (dwLogoff == 2 ||
|
|
||||||
SHRestricted(REST_FORCESTARTMENULOGOFF) ||
|
|
||||||
GetExplorerRegValueSet(HKEY_CURRENT_USER,
|
|
||||||
TEXT("Advanced"),
|
|
||||||
TEXT("StartMenuLogoff")));
|
|
||||||
|
|
||||||
/* Favorites */
|
|
||||||
if (!GetExplorerRegValueSet(HKEY_CURRENT_USER,
|
|
||||||
TEXT("Advanced"),
|
|
||||||
TEXT("StartMenuFavorites")))
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_FAVORITES,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Documents */
|
|
||||||
if (SHRestricted(REST_NORECENTDOCSMENU))
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_DOCUMENTS,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Settings */
|
|
||||||
hSettingsMenu = FindSubMenu(hMenu,
|
|
||||||
IDM_SETTINGS,
|
|
||||||
FALSE);
|
|
||||||
if (hSettingsMenu != NULL)
|
|
||||||
{
|
|
||||||
if (SHRestricted(REST_NOSETFOLDERS))
|
|
||||||
{
|
|
||||||
/* Control Panel */
|
|
||||||
if (SHRestricted(REST_NOCONTROLPANEL))
|
|
||||||
{
|
|
||||||
DeleteMenu(hSettingsMenu,
|
|
||||||
IDM_CONTROLPANEL,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
|
|
||||||
/* Delete the separator below it */
|
|
||||||
DeleteMenu(hSettingsMenu,
|
|
||||||
0,
|
|
||||||
MF_BYPOSITION);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Network Connections */
|
|
||||||
if (SHRestricted(REST_NONETWORKCONNECTIONS))
|
|
||||||
{
|
|
||||||
DeleteMenu(hSettingsMenu,
|
|
||||||
IDM_NETWORKCONNECTIONS,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Printers and Faxes */
|
|
||||||
DeleteMenu(hSettingsMenu,
|
|
||||||
IDM_PRINTERSANDFAXES,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Security */
|
|
||||||
if (GetSystemMetrics(SM_REMOTECONTROL) == 0 ||
|
|
||||||
SHRestricted(REST_NOSECURITY))
|
|
||||||
{
|
|
||||||
DeleteMenu(hSettingsMenu,
|
|
||||||
IDM_SECURITY,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetMenuItemCount(hSettingsMenu) == 0)
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_SETTINGS,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Search */
|
|
||||||
/* FIXME: Enable after implementing */
|
|
||||||
/* if (SHRestricted(REST_NOFIND)) */
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_SEARCH,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: Help */
|
|
||||||
|
|
||||||
/* Run */
|
|
||||||
if (SHRestricted(REST_NORUN))
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_RUN,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Synchronize */
|
|
||||||
if (!ShowSynchronizeMenuItem())
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_SYNCHRONIZE,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
uLastItemsCount--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Log off */
|
|
||||||
if (dwLogoff != 1 && bWantLogoff)
|
|
||||||
{
|
|
||||||
/* FIXME: We need a more sophisticated way to determine whether to show
|
|
||||||
or hide it, it might be hidden in too many cases!!! */
|
|
||||||
|
|
||||||
/* Update Log Off menu item */
|
|
||||||
if (!GetCurrentLoggedOnUserName(szUser,
|
|
||||||
sizeof(szUser) / sizeof(szUser[0])))
|
|
||||||
{
|
|
||||||
szUser[0] = _T('\0');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!FormatMenuString(hMenu,
|
|
||||||
IDM_LOGOFF,
|
|
||||||
MF_BYCOMMAND,
|
|
||||||
szUser))
|
|
||||||
{
|
|
||||||
/* We couldn't update the menu item, delete it... */
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_LOGOFF,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_LOGOFF,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
uLastItemsCount--;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Disconnect */
|
|
||||||
if (GetSystemMetrics(SM_REMOTECONTROL) == 0)
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_DISCONNECT,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
uLastItemsCount--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Undock computer */
|
|
||||||
if (!ShowUndockMenuItem())
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_UNDOCKCOMPUTER,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
uLastItemsCount--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Shut down */
|
|
||||||
if (SHRestricted(REST_NOCLOSE))
|
|
||||||
{
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_SHUTDOWN,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
uLastItemsCount--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uLastItemsCount == 0)
|
|
||||||
{
|
|
||||||
/* Remove the separator at the end of the menu */
|
|
||||||
DeleteMenu(hMenu,
|
|
||||||
IDM_LASTSTARTMENU_SEPARATOR,
|
|
||||||
MF_BYCOMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************/
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE QueryStatus(
|
|
||||||
IN const GUID *pguidCmdGroup OPTIONAL,
|
|
||||||
IN ULONG cCmds,
|
|
||||||
IN OUT OLECMD *prgCmds,
|
|
||||||
IN OUT OLECMDTEXT *pCmdText OPTIONAL)
|
|
||||||
{
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE Exec(
|
|
||||||
IN const GUID *pguidCmdGroup OPTIONAL,
|
|
||||||
IN DWORD nCmdID,
|
|
||||||
IN DWORD nCmdExecOpt,
|
|
||||||
IN VARIANTARG *pvaIn OPTIONAL,
|
|
||||||
IN VARIANTARG *pvaOut OPTIONAL)
|
|
||||||
{
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************/
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient)
|
|
||||||
{
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown ** ppunkClient)
|
|
||||||
{
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(RECT *prc)
|
|
||||||
{
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags)
|
|
||||||
{
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType)
|
|
||||||
{
|
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE SetSubMenu(IMenuPopup *pmp, BOOL fSet)
|
|
||||||
{
|
|
||||||
if (!fSet)
|
|
||||||
{
|
|
||||||
return Tray_OnStartMenuDismissed();
|
|
||||||
}
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************/
|
|
||||||
|
|
||||||
HRESULT Initialize(IN ITrayWindow *tray)
|
|
||||||
{
|
|
||||||
Tray = tray;
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
DECLARE_NOT_AGGREGATABLE(IStartMenuSiteImpl)
|
|
||||||
|
|
||||||
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
||||||
BEGIN_COM_MAP(IStartMenuSiteImpl)
|
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
|
|
||||||
COM_INTERFACE_ENTRY_IID(IID_ITrayPriv, ITrayPriv)
|
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
|
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup)
|
|
||||||
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
|
|
||||||
END_COM_MAP()
|
|
||||||
};
|
|
||||||
|
|
||||||
HRESULT CreateStartMenuSite(IN OUT ITrayWindow *Tray, const IID & riid, PVOID * ppv)
|
|
||||||
{
|
|
||||||
return ShellObjectCreatorInit<IStartMenuSiteImpl>(Tray, riid, ppv);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
|
UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
|
||||||
IN HBITMAP hbmBanner OPTIONAL,
|
IN HBITMAP hbmBanner OPTIONAL,
|
||||||
|
@ -663,7 +31,7 @@ UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
|
||||||
hRet = pMenuPopup->QueryInterface(IID_PPV_ARG(IBanneredBar, &pbb));
|
hRet = pMenuPopup->QueryInterface(IID_PPV_ARG(IBanneredBar, &pbb));
|
||||||
if (SUCCEEDED(hRet))
|
if (SUCCEEDED(hRet))
|
||||||
{
|
{
|
||||||
hRet = pbb->SetBitmap( hbmBanner);
|
hRet = pbb->SetBitmap(hbmBanner);
|
||||||
|
|
||||||
/* Update the icon size */
|
/* Update the icon size */
|
||||||
hRet = pbb->SetIconSize(bSmallIcons ? BMICON_SMALL : BMICON_LARGE);
|
hRet = pbb->SetIconSize(bSmallIcons ? BMICON_SMALL : BMICON_LARGE);
|
||||||
|
@ -739,7 +107,7 @@ CreateStartMenu(IN ITrayWindow *Tray,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = pMp->GetClient( &pUnk);
|
hr = pMp->GetClient(&pUnk);
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
{
|
{
|
||||||
TRACE("IMenuPopup_GetClient failed: %x\n", hr);
|
TRACE("IMenuPopup_GetClient failed: %x\n", hr);
|
||||||
|
@ -755,14 +123,14 @@ CreateStartMenu(IN ITrayWindow *Tray,
|
||||||
|
|
||||||
/* Finally we have the IBandSite interface, there's only one
|
/* Finally we have the IBandSite interface, there's only one
|
||||||
band in it that apparently provides the IMenuBand interface */
|
band in it that apparently provides the IMenuBand interface */
|
||||||
hr = pBs->EnumBands( 0, &dwBandId);
|
hr = pBs->EnumBands(0, &dwBandId);
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
{
|
{
|
||||||
TRACE("IBandSite_EnumBands failed: %x\n", hr);
|
TRACE("IBandSite_EnumBands failed: %x\n", hr);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = pBs->GetBandObject( dwBandId, IID_PPV_ARG(IMenuBand, &pMb));
|
hr = pBs->GetBandObject(dwBandId, IID_PPV_ARG(IMenuBand, &pMb));
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
{
|
{
|
||||||
TRACE("IBandSite_GetBandObject failed: %x\n", hr);
|
TRACE("IBandSite_GetBandObject failed: %x\n", hr);
|
||||||
|
|
412
base/shell/explorer-new/startmnusite.cpp
Normal file
412
base/shell/explorer-new/startmnusite.cpp
Normal file
|
@ -0,0 +1,412 @@
|
||||||
|
/*
|
||||||
|
* ReactOS Explorer
|
||||||
|
*
|
||||||
|
* Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
** IStartMenuSite ***********************************************************
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
class CStartMenuSite :
|
||||||
|
public CComCoClass<CStartMenuSite>,
|
||||||
|
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
||||||
|
public IStartMenuSite,
|
||||||
|
public IServiceProvider,
|
||||||
|
public ITrayPriv,
|
||||||
|
public IOleCommandTarget,
|
||||||
|
public IMenuPopup
|
||||||
|
{
|
||||||
|
CComPtr<ITrayWindow> Tray;
|
||||||
|
CComPtr<IMenuPopup> StartMenuPopup;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CStartMenuSite()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~CStartMenuSite() {}
|
||||||
|
|
||||||
|
/*******************************************************************/
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE QueryService(
|
||||||
|
IN REFGUID guidService,
|
||||||
|
IN REFIID riid,
|
||||||
|
OUT PVOID *ppvObject)
|
||||||
|
{
|
||||||
|
if (IsEqualGUID(guidService, SID_SMenuPopup))
|
||||||
|
{
|
||||||
|
return QueryInterface(riid, ppvObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************/
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE GetWindow(
|
||||||
|
OUT HWND *phwnd)
|
||||||
|
{
|
||||||
|
TRACE("ITrayPriv::GetWindow\n");
|
||||||
|
|
||||||
|
*phwnd = Tray->GetHWND();
|
||||||
|
if (*phwnd != NULL)
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(
|
||||||
|
IN BOOL fEnterMode)
|
||||||
|
{
|
||||||
|
TRACE("ITrayPriv::ContextSensitiveHelp\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE Execute(
|
||||||
|
IN IShellFolder *pShellFolder,
|
||||||
|
IN LPCITEMIDLIST pidl)
|
||||||
|
{
|
||||||
|
HMODULE hShlwapi;
|
||||||
|
HRESULT ret = S_FALSE;
|
||||||
|
|
||||||
|
TRACE("ITrayPriv::Execute\n");
|
||||||
|
|
||||||
|
hShlwapi = GetModuleHandle(TEXT("SHLWAPI.DLL"));
|
||||||
|
if (hShlwapi != NULL)
|
||||||
|
{
|
||||||
|
SHINVDEFCMD SHInvokeDefCmd;
|
||||||
|
|
||||||
|
/* SHInvokeDefaultCommand */
|
||||||
|
SHInvokeDefCmd = (SHINVDEFCMD) GetProcAddress(hShlwapi,
|
||||||
|
(LPCSTR) ((LONG) 279));
|
||||||
|
if (SHInvokeDefCmd != NULL)
|
||||||
|
{
|
||||||
|
ret = SHInvokeDefCmd(Tray->GetHWND(),
|
||||||
|
pShellFolder,
|
||||||
|
pidl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE Unknown(
|
||||||
|
IN PVOID Unknown1,
|
||||||
|
IN PVOID Unknown2,
|
||||||
|
IN PVOID Unknown3,
|
||||||
|
IN PVOID Unknown4)
|
||||||
|
{
|
||||||
|
TRACE("ITrayPriv::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1, Unknown2, Unknown3, Unknown4);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual BOOL
|
||||||
|
ShowUndockMenuItem(VOID)
|
||||||
|
{
|
||||||
|
TRACE("ShowUndockMenuItem() not implemented!\n");
|
||||||
|
/* FIXME: How do we detect this?! */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual BOOL
|
||||||
|
ShowSynchronizeMenuItem(VOID)
|
||||||
|
{
|
||||||
|
TRACE("ShowSynchronizeMenuItem() not implemented!\n");
|
||||||
|
/* FIXME: How do we detect this?! */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE AppendMenu(
|
||||||
|
OUT HMENU* phMenu)
|
||||||
|
{
|
||||||
|
HMENU hMenu, hSettingsMenu;
|
||||||
|
DWORD dwLogoff;
|
||||||
|
BOOL bWantLogoff;
|
||||||
|
UINT uLastItemsCount = 5; /* 5 menu items below the last separator */
|
||||||
|
WCHAR szUser[128];
|
||||||
|
|
||||||
|
TRACE("ITrayPriv::AppendMenu\n");
|
||||||
|
|
||||||
|
hMenu = LoadPopupMenu(hExplorerInstance,
|
||||||
|
MAKEINTRESOURCE(IDM_STARTMENU));
|
||||||
|
*phMenu = hMenu;
|
||||||
|
if (hMenu == NULL)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
/* Remove menu items that don't apply */
|
||||||
|
|
||||||
|
dwLogoff = SHRestricted(REST_STARTMENULOGOFF);
|
||||||
|
bWantLogoff = (dwLogoff == 2 ||
|
||||||
|
SHRestricted(REST_FORCESTARTMENULOGOFF) ||
|
||||||
|
GetExplorerRegValueSet(HKEY_CURRENT_USER,
|
||||||
|
TEXT("Advanced"),
|
||||||
|
TEXT("StartMenuLogoff")));
|
||||||
|
|
||||||
|
/* Favorites */
|
||||||
|
if (!GetExplorerRegValueSet(HKEY_CURRENT_USER,
|
||||||
|
TEXT("Advanced"),
|
||||||
|
TEXT("StartMenuFavorites")))
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_FAVORITES,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Documents */
|
||||||
|
if (SHRestricted(REST_NORECENTDOCSMENU))
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_DOCUMENTS,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Settings */
|
||||||
|
hSettingsMenu = FindSubMenu(hMenu,
|
||||||
|
IDM_SETTINGS,
|
||||||
|
FALSE);
|
||||||
|
if (hSettingsMenu != NULL)
|
||||||
|
{
|
||||||
|
if (SHRestricted(REST_NOSETFOLDERS))
|
||||||
|
{
|
||||||
|
/* Control Panel */
|
||||||
|
if (SHRestricted(REST_NOCONTROLPANEL))
|
||||||
|
{
|
||||||
|
DeleteMenu(hSettingsMenu,
|
||||||
|
IDM_CONTROLPANEL,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
|
||||||
|
/* Delete the separator below it */
|
||||||
|
DeleteMenu(hSettingsMenu,
|
||||||
|
0,
|
||||||
|
MF_BYPOSITION);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Network Connections */
|
||||||
|
if (SHRestricted(REST_NONETWORKCONNECTIONS))
|
||||||
|
{
|
||||||
|
DeleteMenu(hSettingsMenu,
|
||||||
|
IDM_NETWORKCONNECTIONS,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Printers and Faxes */
|
||||||
|
DeleteMenu(hSettingsMenu,
|
||||||
|
IDM_PRINTERSANDFAXES,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Security */
|
||||||
|
if (GetSystemMetrics(SM_REMOTECONTROL) == 0 ||
|
||||||
|
SHRestricted(REST_NOSECURITY))
|
||||||
|
{
|
||||||
|
DeleteMenu(hSettingsMenu,
|
||||||
|
IDM_SECURITY,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetMenuItemCount(hSettingsMenu) == 0)
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_SETTINGS,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Search */
|
||||||
|
/* FIXME: Enable after implementing */
|
||||||
|
/* if (SHRestricted(REST_NOFIND)) */
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_SEARCH,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Help */
|
||||||
|
|
||||||
|
/* Run */
|
||||||
|
if (SHRestricted(REST_NORUN))
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_RUN,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Synchronize */
|
||||||
|
if (!ShowSynchronizeMenuItem())
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_SYNCHRONIZE,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
uLastItemsCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Log off */
|
||||||
|
if (dwLogoff != 1 && bWantLogoff)
|
||||||
|
{
|
||||||
|
/* FIXME: We need a more sophisticated way to determine whether to show
|
||||||
|
or hide it, it might be hidden in too many cases!!! */
|
||||||
|
|
||||||
|
/* Update Log Off menu item */
|
||||||
|
if (!GetCurrentLoggedOnUserName(szUser,
|
||||||
|
sizeof(szUser) / sizeof(szUser[0])))
|
||||||
|
{
|
||||||
|
szUser[0] = _T('\0');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FormatMenuString(hMenu,
|
||||||
|
IDM_LOGOFF,
|
||||||
|
MF_BYCOMMAND,
|
||||||
|
szUser))
|
||||||
|
{
|
||||||
|
/* We couldn't update the menu item, delete it... */
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_LOGOFF,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_LOGOFF,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
uLastItemsCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Disconnect */
|
||||||
|
if (GetSystemMetrics(SM_REMOTECONTROL) == 0)
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_DISCONNECT,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
uLastItemsCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Undock computer */
|
||||||
|
if (!ShowUndockMenuItem())
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_UNDOCKCOMPUTER,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
uLastItemsCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shut down */
|
||||||
|
if (SHRestricted(REST_NOCLOSE))
|
||||||
|
{
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_SHUTDOWN,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
uLastItemsCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uLastItemsCount == 0)
|
||||||
|
{
|
||||||
|
/* Remove the separator at the end of the menu */
|
||||||
|
DeleteMenu(hMenu,
|
||||||
|
IDM_LASTSTARTMENU_SEPARATOR,
|
||||||
|
MF_BYCOMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************/
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE QueryStatus(
|
||||||
|
IN const GUID *pguidCmdGroup OPTIONAL,
|
||||||
|
IN ULONG cCmds,
|
||||||
|
IN OUT OLECMD *prgCmds,
|
||||||
|
IN OUT OLECMDTEXT *pCmdText OPTIONAL)
|
||||||
|
{
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE Exec(
|
||||||
|
IN const GUID *pguidCmdGroup OPTIONAL,
|
||||||
|
IN DWORD nCmdID,
|
||||||
|
IN DWORD nCmdExecOpt,
|
||||||
|
IN VARIANTARG *pvaIn OPTIONAL,
|
||||||
|
IN VARIANTARG *pvaOut OPTIONAL)
|
||||||
|
{
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************/
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient)
|
||||||
|
{
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown ** ppunkClient)
|
||||||
|
{
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(RECT *prc)
|
||||||
|
{
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags)
|
||||||
|
{
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType)
|
||||||
|
{
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE SetSubMenu(IMenuPopup *pmp, BOOL fSet)
|
||||||
|
{
|
||||||
|
if (!fSet)
|
||||||
|
{
|
||||||
|
return Tray_OnStartMenuDismissed();
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************/
|
||||||
|
|
||||||
|
HRESULT Initialize(IN ITrayWindow *tray)
|
||||||
|
{
|
||||||
|
Tray = tray;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_NOT_AGGREGATABLE(CStartMenuSite)
|
||||||
|
|
||||||
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
||||||
|
BEGIN_COM_MAP(CStartMenuSite)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_ITrayPriv, ITrayPriv)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
|
||||||
|
END_COM_MAP()
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT CreateStartMenuSite(IN OUT ITrayWindow *Tray, const IID & riid, PVOID * ppv)
|
||||||
|
{
|
||||||
|
return ShellObjectCreatorInit<CStartMenuSite>(Tray, riid, ppv);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue