ReactOS  0.4.13-dev-961-g238ea69
startctxmnu.cpp
Go to the documentation of this file.
1 /*
2  * ReactOS Explorer
3  *
4  * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "precomp.h"
22 
23 /*
24  * Start menu button context menu
25  */
26 
28  public CComCoClass<CStartMenuBtnCtxMenu>,
29  public CComObjectRootEx<CComMultiThreadModelNoCS>,
30  public IContextMenu
31 {
35 
38 
40  {
41  HRESULT hRet;
42 
44  if (SUCCEEDED(hRet))
45  {
46  if (hPopup != NULL)
47  {
48  hRet = m_Inner->QueryContextMenu(
49  hPopup,
50  0,
53  CMF_VERBSONLY);
54 
55  if (SUCCEEDED(hRet))
56  {
57  return hRet;
58  }
59 
60  DestroyMenu(hPopup);
61  }
62  }
63 
64  return E_FAIL;
65  }
66 
68  {
69  WCHAR szBuf[MAX_PATH];
70  HRESULT hRet;
71 
72  /* Add the "Open All Users" menu item */
75  szBuf,
76  _countof(szBuf)))
77  {
78  AppendMenu(hPopup,
79  MF_STRING,
81  szBuf);
82  }
83 
85  {
86  /* Check if we should add menu items for the common start menu */
87  hRet = SHGetFolderPath(m_Owner,
89  NULL,
91  szBuf);
92  if (SUCCEEDED(hRet) && hRet != S_FALSE)
93  {
94  /* The directory exists, but only show the items if the
95  user can actually make any changes to the common start
96  menu. This is most likely only the case if the user
97  has administrative rights! */
98  if (IsUserAnAdmin())
99  {
100  AppendMenu(hPopup,
101  MF_SEPARATOR,
102  0,
103  NULL);
104 
105  /* Add the "Open All Users" menu item */
108  szBuf,
109  _countof(szBuf)))
110  {
111  AppendMenu(hPopup,
112  MF_STRING,
114  szBuf);
115  }
116 
117  /* Add the "Explore All Users" menu item */
120  szBuf,
121  _countof(szBuf)))
122  {
123  AppendMenu(hPopup,
124  MF_STRING,
126  szBuf);
127  }
128  }
129  }
130  }
131  }
132 
133 public:
134  HRESULT Initialize(ITrayWindow * pTrayWnd, IN HWND hWndOwner)
135  {
136  m_TrayWnd = pTrayWnd;
137  m_Owner = hWndOwner;
138  return S_OK;
139  }
140 
141  virtual HRESULT STDMETHODCALLTYPE
143  UINT indexMenu,
144  UINT idCmdFirst,
145  UINT idCmdLast,
146  UINT uFlags)
147  {
148  LPITEMIDLIST pidlStart;
149  CComPtr<IShellFolder> psfDesktop;
150  HRESULT hRet;
151 
152  psfDesktop = NULL;
153  m_Inner = NULL;
154 
156 
157  if (pidlStart != NULL)
158  {
159  m_FolderPidl = ILClone(ILFindLastID(pidlStart));
160  ILRemoveLastID(pidlStart);
161 
162  if (m_FolderPidl != NULL)
163  {
164  hRet = SHGetDesktopFolder(&psfDesktop);
165  if (SUCCEEDED(hRet))
166  {
167  hRet = psfDesktop->BindToObject(pidlStart, NULL, IID_PPV_ARG(IShellFolder, &m_Folder));
168  if (SUCCEEDED(hRet))
169  {
171  AddStartContextMenuItems(hPopup);
172  }
173  }
174  }
175 
176  ILFree(pidlStart);
177  }
178 
179  return S_OK;
180  }
181 
182  virtual HRESULT STDMETHODCALLTYPE
184  {
185  UINT uiCmdId = PtrToUlong(lpici->lpVerb);
186  if (uiCmdId != 0)
187  {
188  if ((uiCmdId >= ID_SHELL_CMD_FIRST) && (uiCmdId <= ID_SHELL_CMD_LAST))
189  {
190  CMINVOKECOMMANDINFO cmici = { 0 };
191  CHAR szDir[MAX_PATH];
192 
193  /* Setup and invoke the shell command */
194  cmici.cbSize = sizeof(cmici);
195  cmici.hwnd = m_Owner;
196  cmici.lpVerb = MAKEINTRESOURCEA(uiCmdId - ID_SHELL_CMD_FIRST);
197  cmici.nShow = SW_NORMAL;
198 
199  /* FIXME: Support Unicode!!! */
201  {
202  cmici.lpDirectory = szDir;
203  }
204 
205  m_Inner->InvokeCommand(&cmici);
206  }
207  else
208  {
209  m_TrayWnd->ExecContextMenuCmd(uiCmdId);
210  }
211  }
212  return S_OK;
213  }
214 
215  virtual HRESULT STDMETHODCALLTYPE
217  UINT uType,
218  UINT *pwReserved,
219  LPSTR pszName,
220  UINT cchMax)
221  {
222  return E_NOTIMPL;
223  }
224 
226  {
227  }
228 
230  {
231  if (m_FolderPidl)
233  }
234 
236  COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
237  END_COM_MAP()
238 };
239 
240 HRESULT CStartMenuBtnCtxMenu_CreateInstance(ITrayWindow * m_TrayWnd, IN HWND m_Owner, IContextMenu ** ppCtxMenu)
241 {
243  mnu->Initialize(m_TrayWnd, m_Owner);
244  *ppCtxMenu = mnu;
245  return S_OK;
246 }
#define IN
Definition: typedefs.h:38
#define SW_NORMAL
Definition: winuser.h:763
#define ID_SHELL_CMD_LAST
Definition: resource.h:184
#define TRUE
Definition: types.h:120
BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath)
Definition: pidl.c:1264
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
#define ID_SHELL_CMD_PROPERTIES
Definition: resource.h:185
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL fCreate)
Definition: pidl.c:434
virtual HRESULT STDMETHODCALLTYPE GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax)
#define _countof(array)
Definition: fontsub.cpp:30
char CHAR
Definition: xmlstorage.h:175
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define SHGetFolderPath
Definition: shlobj.h:2001
#define MF_STRING
Definition: winuser.h:138
virtual HRESULT STDMETHODCALLTYPE QueryContextMenu(HMENU hPopup, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:212
#define IDS_PROPERTIES
Definition: resource.h:101
UINT uFlags
Definition: api.c:60
char * LPSTR
Definition: xmlstorage.h:182
#define IID_PPV_ARG(Itype, ppType)
#define E_FAIL
Definition: ddrawi.h:102
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define ID_SHELL_CMD_FIRST
Definition: resource.h:183
#define S_FALSE
Definition: winerror.h:2357
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI IsUserAnAdmin(VOID)
Definition: shellord.c:2141
#define MF_SEPARATOR
Definition: winuser.h:137
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:189
#define ID_SHELL_CMD_EXPLORE_ALL_USERS
Definition: resource.h:187
#define CSIDL_COMMON_STARTMENU
Definition: shlobj.h:2024
virtual HRESULT STDMETHODCALLTYPE InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
#define PtrToUlong(u)
Definition: config.h:107
HRESULT CreateContextMenuFromShellFolderPidl(HMENU hPopup)
Definition: startctxmnu.cpp:39
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:541
#define IID_NULL_PPV_ARG(Itype, ppType)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define AppendMenu
Definition: winuser.h:5632
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
HINSTANCE hExplorerInstance
Definition: explorer.cpp:24
#define MAX_PATH
Definition: compat.h:26
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
UINT cchMax
CComPtr< IShellFolder > m_Folder
Definition: startctxmnu.cpp:34
#define IDS_OPEN_ALL_USERS
Definition: resource.h:99
VOID AddStartContextMenuItems(IN HMENU hPopup)
Definition: startctxmnu.cpp:67
#define ID_SHELL_CMD_OPEN_ALL_USERS
Definition: resource.h:186
BOOL WINAPI DestroyMenu(_In_ HMENU)
HRESULT CStartMenuBtnCtxMenu_CreateInstance(ITrayWindow *m_TrayWnd, IN HWND m_Owner, IContextMenu **ppCtxMenu)
CComPtr< ITrayWindow > m_TrayWnd
Definition: startctxmnu.cpp:32
CComPtr< IContextMenu > m_Inner
Definition: startctxmnu.cpp:33
#define S_OK
Definition: intsafe.h:59
HRESULT Initialize(ITrayWindow *pTrayWnd, IN HWND hWndOwner)
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
virtual ~CStartMenuBtnCtxMenu()
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:561
#define E_NOTIMPL
Definition: ddrawi.h:99
unsigned int UINT
Definition: ndis.h:50
#define CSIDL_STARTMENU
Definition: shlobj.h:2014
#define IDS_EXPLORE_ALL_USERS
Definition: resource.h:100
#define END_COM_MAP()
Definition: atlcom.h:552
LPITEMIDLIST m_FolderPidl
Definition: startctxmnu.cpp:37
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
DWORD WINAPI SHRestricted(RESTRICTIONS policy)
Definition: shpolicy.c:836
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define SUCCEEDED(hr)
Definition: intsafe.h:57