ReactOS  0.4.14-dev-323-g6fe6a88
startmnusite.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 
24  public CComCoClass<CStartMenuSite>,
25  public CComObjectRootEx<CComMultiThreadModelNoCS>,
26  public IServiceProvider,
27  public ITrayPriv,
28  public IOleCommandTarget,
29  public IMenuPopup
30 {
32 
33 public:
35  {
36  }
37 
38  virtual ~CStartMenuSite() {}
39 
40  /*******************************************************************/
41 
43  IN REFGUID guidService,
44  IN REFIID riid,
46  {
47  if (IsEqualGUID(guidService, SID_SMenuPopup))
48  {
49  return QueryInterface(riid, ppvObject);
50  }
51 
52  return E_NOINTERFACE;
53  }
54 
55  /*******************************************************************/
56 
58  OUT HWND *phwnd)
59  {
60  TRACE("ITrayPriv::GetWindow\n");
61 
62  *phwnd = m_Tray->GetHWND();
63  if (*phwnd != NULL)
64  return S_OK;
65 
66  return E_FAIL;
67  }
68 
70  IN BOOL fEnterMode)
71  {
72  TRACE("ITrayPriv::ContextSensitiveHelp\n");
73  return E_NOTIMPL;
74  }
75 
77  IN IShellFolder *pShellFolder,
78  IN LPCITEMIDLIST pidl)
79  {
81 
82  TRACE("ITrayPriv::Execute\n");
83 
84  ret = SHInvokeDefaultCommand(m_Tray->GetHWND(), pShellFolder, pidl);
85 
86  return ret;
87  }
88 
90  IN PVOID Unknown1,
91  IN PVOID Unknown2,
94  {
95  TRACE("ITrayPriv::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1, Unknown2, Unknown3, Unknown4);
96  return E_NOTIMPL;
97  }
98 
99  virtual BOOL
101  {
102  TRACE("ShowUndockMenuItem() not implemented!\n");
103  /* FIXME: How do we detect this?! */
104  return FALSE;
105  }
106 
107  virtual BOOL
109  {
110  TRACE("ShowSynchronizeMenuItem() not implemented!\n");
111  /* FIXME: How do we detect this?! */
112  return FALSE;
113  }
114 
116  OUT HMENU* phMenu)
117  {
118  HMENU hMenu, hSettingsMenu;
119  DWORD dwLogoff;
120  BOOL bWantLogoff;
121  UINT uLastItemsCount = 5; /* 5 menu items below the last separator */
122  WCHAR szUser[128];
123 
124  TRACE("ITrayPriv::AppendMenu\n");
125 
127  *phMenu = hMenu;
128  if (hMenu == NULL)
129  return E_FAIL;
130 
131  /* Remove menu items that don't apply */
132 
134  bWantLogoff = (dwLogoff == 2 ||
137  L"Advanced",
138  L"StartMenuLogoff"));
139 
140  /* Favorites */
142  L"Advanced",
143  L"StartMenuFavorites"))
144  {
145  DeleteMenu(hMenu,
147  MF_BYCOMMAND);
148  }
149 
150  /* Documents */
152  {
153  DeleteMenu(hMenu,
155  MF_BYCOMMAND);
156  }
157 
158  /* Settings */
159  hSettingsMenu = FindSubMenu(hMenu,
160  IDM_SETTINGS,
161  FALSE);
162  if (hSettingsMenu != NULL)
163  {
165  {
166  /* Control Panel */
168  {
169  DeleteMenu(hSettingsMenu,
171  MF_BYCOMMAND);
172 
173  /* Delete the separator below it */
174  DeleteMenu(hSettingsMenu,
175  0,
176  MF_BYPOSITION);
177  }
178 
179  /* Network Connections */
181  {
182  DeleteMenu(hSettingsMenu,
184  MF_BYCOMMAND);
185  }
186 
187  /* Printers and Faxes */
188  DeleteMenu(hSettingsMenu,
190  MF_BYCOMMAND);
191  }
192 
193  /* Security */
194  if (GetSystemMetrics(SM_REMOTECONTROL) == 0 ||
196  {
197  DeleteMenu(hSettingsMenu,
198  IDM_SECURITY,
199  MF_BYCOMMAND);
200  }
201 
202  if (GetMenuItemCount(hSettingsMenu) == 0)
203  {
204  DeleteMenu(hMenu,
205  IDM_SETTINGS,
206  MF_BYCOMMAND);
207  }
208  }
209 
210  /* Search */
212  {
213  DeleteMenu(hMenu,
214  IDM_SEARCH,
215  MF_BYCOMMAND);
216  }
217 
218  /* FIXME: Help */
219 
220  /* Run */
222  {
223  DeleteMenu(hMenu,
224  IDM_RUN,
225  MF_BYCOMMAND);
226  }
227 
228  /* Synchronize */
230  {
231  DeleteMenu(hMenu,
233  MF_BYCOMMAND);
234  uLastItemsCount--;
235  }
236 
237  /* Log off */
238  if (dwLogoff != 1 && bWantLogoff)
239  {
240  /* FIXME: We need a more sophisticated way to determine whether to show
241  or hide it, it might be hidden in too many cases!!! */
242 
243  /* Update Log Off menu item */
244  if (!GetCurrentLoggedOnUserName(szUser, _countof(szUser)))
245  {
246  szUser[0] = _T('\0');
247  }
248 
249  if (!FormatMenuString(hMenu,
250  IDM_LOGOFF,
251  MF_BYCOMMAND,
252  szUser))
253  {
254  /* We couldn't update the menu item, delete it... */
255  DeleteMenu(hMenu,
256  IDM_LOGOFF,
257  MF_BYCOMMAND);
258  }
259  }
260  else
261  {
262  DeleteMenu(hMenu,
263  IDM_LOGOFF,
264  MF_BYCOMMAND);
265  uLastItemsCount--;
266  }
267 
268 
269  /* Disconnect */
270  if (GetSystemMetrics(SM_REMOTECONTROL) == 0)
271  {
272  DeleteMenu(hMenu,
274  MF_BYCOMMAND);
275  uLastItemsCount--;
276  }
277 
278  /* Undock computer */
279  if (!ShowUndockMenuItem())
280  {
281  DeleteMenu(hMenu,
283  MF_BYCOMMAND);
284  uLastItemsCount--;
285  }
286 
287  /* Shut down */
289  {
290  DeleteMenu(hMenu,
291  IDM_SHUTDOWN,
292  MF_BYCOMMAND);
293  uLastItemsCount--;
294  }
295 
296  if (uLastItemsCount == 0)
297  {
298  /* Remove the separator at the end of the menu */
299  DeleteMenu(hMenu,
301  MF_BYCOMMAND);
302  }
303 
304  return S_OK;
305  }
306 
307  /*******************************************************************/
308 
310  IN const GUID *pguidCmdGroup OPTIONAL,
311  IN ULONG cCmds,
312  IN OUT OLECMD *prgCmds,
313  IN OUT OLECMDTEXT *pCmdText OPTIONAL)
314  {
315  return E_NOTIMPL;
316  }
317 
319  IN const GUID *pguidCmdGroup OPTIONAL,
320  IN DWORD nCmdID,
321  IN DWORD nCmdExecOpt,
322  IN VARIANTARG *pvaIn OPTIONAL,
323  IN VARIANTARG *pvaOut OPTIONAL)
324  {
325  return E_NOTIMPL;
326  }
327 
328  /*******************************************************************/
329 
331  {
332  return E_NOTIMPL;
333  }
334 
335  virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown ** ppunkClient)
336  {
337  return E_NOTIMPL;
338  }
339 
341  {
342  return E_NOTIMPL;
343  }
344 
346  {
347  return E_NOTIMPL;
348  }
349 
350  virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType)
351  {
352  return E_NOTIMPL;
353  }
354 
356  {
357  if (!fSet)
358  {
360  }
361 
362  return S_OK;
363  }
364 
365  /*******************************************************************/
366 
367  HRESULT Initialize(IN ITrayWindow *tray)
368  {
369  m_Tray = tray;
370  return S_OK;
371  }
372 
374 
377  COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
378  COM_INTERFACE_ENTRY_IID(IID_ITrayPriv, ITrayPriv)
379  COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
380  COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup)
382  END_COM_MAP()
383 };
384 
386 {
387  return ShellObjectCreatorInit<CStartMenuSite>(Tray, riid, ppv);
388 }
#define IDM_LASTSTARTMENU_SEPARATOR
Definition: resource.h:79
BOOL GetCurrentLoggedOnUserName(OUT LPWSTR szBuffer, IN DWORD dwBufferSize)
Definition: util.cpp:73
virtual HRESULT STDMETHODCALLTYPE Execute(IN IShellFolder *pShellFolder, IN LPCITEMIDLIST pidl)
CComPtr< ITrayWindow > m_Tray
#define IN
Definition: typedefs.h:38
BOOL FormatMenuString(IN HMENU hMenu, IN UINT uPosition, IN UINT uFlags,...)
Definition: util.cpp:106
#define REFIID
Definition: guiddef.h:118
#define IDM_CONTROLPANEL
Definition: resource.h:66
#define E_NOINTERFACE
Definition: winerror.h:2364
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES IN DWORD Unknown3
Definition: conport.c:35
virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown **ppunkClient)
#define MF_BYCOMMAND
Definition: winuser.h:202
Definition: scsiwmi.h:51
virtual HRESULT STDMETHODCALLTYPE Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags)
virtual HRESULT STDMETHODCALLTYPE Exec(IN const GUID *pguidCmdGroup OPTIONAL, IN DWORD nCmdID, IN DWORD nCmdExecOpt, IN VARIANTARG *pvaIn OPTIONAL, IN VARIANTARG *pvaOut OPTIONAL)
REFIID riid
Definition: precomp.h:44
#define _countof(array)
Definition: fontsub.cpp:30
#define HKEY_CURRENT_USER
Definition: winreg.h:11
HRESULT WINAPI SHInvokeDefaultCommand(HWND hWnd, IShellFolder *lpFolder, LPCITEMIDLIST lpApidl)
Definition: ordinal.c:2928
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
REFIID LPVOID * ppv
Definition: atlbase.h:39
virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(RECT *prc)
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:611
#define IDM_SETTINGS
Definition: resource.h:65
virtual HRESULT STDMETHODCALLTYPE QueryStatus(IN const GUID *pguidCmdGroup OPTIONAL, IN ULONG cCmds, IN OUT OLECMD *prgCmds, IN OUT OLECMDTEXT *pCmdText OPTIONAL)
#define E_FAIL
Definition: ddrawi.h:102
#define IDM_NETWORKCONNECTIONS
Definition: resource.h:68
virtual BOOL ShowSynchronizeMenuItem(VOID)
unsigned int BOOL
Definition: ntddk_ex.h:94
virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType)
PRTL_UNICODE_STRING_BUFFER PULONG PULONG Unknown4
#define MF_BYPOSITION
Definition: winuser.h:203
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
#define IDM_FAVORITES
Definition: resource.h:63
#define S_FALSE
Definition: winerror.h:2357
#define IDM_LOGOFF
Definition: resource.h:75
smooth NULL
Definition: ftsmooth.c:416
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(IN BOOL fEnterMode)
BOOL GetExplorerRegValueSet(IN HKEY hKey, IN LPCWSTR lpSubKey, IN LPCWSTR lpValue)
Definition: util.cpp:144
#define IDM_SEARCH
Definition: resource.h:71
virtual ~CStartMenuSite()
#define IDM_DOCUMENTS
Definition: resource.h:64
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:541
virtual HRESULT STDMETHODCALLTYPE GetWindow(OUT HWND *phwnd)
virtual HRESULT STDMETHODCALLTYPE QueryService(IN REFGUID guidService, IN REFIID riid, OUT PVOID *ppvObject)
#define _T(x)
Definition: vfdio.h:22
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
HINSTANCE hExplorerInstance
Definition: explorer.cpp:24
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
int WINAPI GetSystemMetrics(_In_ int)
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IDM_DISCONNECT
Definition: resource.h:76
virtual BOOL ShowUndockMenuItem(VOID)
int ret
virtual HRESULT STDMETHODCALLTYPE Unknown(IN PVOID Unknown1, IN PVOID Unknown2, IN PVOID Unknown3, IN PVOID Unknown4)
static const WCHAR L[]
Definition: oid.c:1250
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
REFIID LPVOID * ppvObject
Definition: precomp.h:44
#define IDM_PRINTERSANDFAXES
Definition: resource.h:69
#define IDM_UNDOCKCOMPUTER
Definition: resource.h:77
HRESULT CStartMenuSite_CreateInstance(IN OUT ITrayWindow *Tray, const IID &riid, PVOID *ppv)
HMENU LoadPopupMenu(IN HINSTANCE hInstance, IN LPCWSTR lpMenuName)
Definition: util.cpp:33
#define S_OK
Definition: intsafe.h:59
#define IDM_SYNCHRONIZE
Definition: resource.h:74
virtual HRESULT STDMETHODCALLTYPE AppendMenu(OUT HMENU *phMenu)
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:561
#define E_NOTIMPL
Definition: ddrawi.h:99
#define IDM_STARTMENU
Definition: resource.h:56
unsigned int UINT
Definition: ndis.h:50
HRESULT Tray_OnStartMenuDismissed(ITrayWindow *Tray)
Definition: traywnd.cpp:3405
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:639
#define IDM_SHUTDOWN
Definition: resource.h:78
#define OUT
Definition: typedefs.h:39
const GUID IID_IOleWindow
unsigned int ULONG
Definition: retypes.h:1
#define const
Definition: zconf.h:230
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define END_COM_MAP()
Definition: atlcom.h:552
#define IDM_RUN
Definition: resource.h:73
_Out_ LPRECT prc
Definition: ntgdi.h:1658
DWORD WINAPI SHRestricted(RESTRICTIONS policy)
Definition: shpolicy.c:836
int MP_POPUPFLAGS
Definition: shobjidl.idl:2486
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
virtual HRESULT STDMETHODCALLTYPE SetSubMenu(IMenuPopup *pmp, BOOL fSet)
HRESULT Initialize(IN ITrayWindow *tray)
HMENU FindSubMenu(IN HMENU hMenu, IN UINT uItem, IN BOOL fByPosition)
Definition: util.cpp:55
virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient)
#define IDM_SECURITY
Definition: resource.h:67
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68