Minor changes for ATAPI Srb Functions
[reactos.git] / base / shell / explorer / startmnusite.cpp
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 class CStartMenuSite :
24 public CComCoClass<CStartMenuSite>,
25 public CComObjectRootEx<CComMultiThreadModelNoCS>,
26 public IServiceProvider,
27 public ITrayPriv,
28 public IOleCommandTarget,
29 public IMenuPopup
30 {
31 CComPtr<ITrayWindow> m_Tray;
32
33 public:
34 CStartMenuSite()
35 {
36 }
37
38 virtual ~CStartMenuSite() {}
39
40 /*******************************************************************/
41
42 virtual HRESULT STDMETHODCALLTYPE QueryService(
43 IN REFGUID guidService,
44 IN REFIID riid,
45 OUT PVOID *ppvObject)
46 {
47 if (IsEqualGUID(guidService, SID_SMenuPopup))
48 {
49 return QueryInterface(riid, ppvObject);
50 }
51
52 return E_NOINTERFACE;
53 }
54
55 /*******************************************************************/
56
57 virtual HRESULT STDMETHODCALLTYPE GetWindow(
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
69 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(
70 IN BOOL fEnterMode)
71 {
72 TRACE("ITrayPriv::ContextSensitiveHelp\n");
73 return E_NOTIMPL;
74 }
75
76 virtual HRESULT STDMETHODCALLTYPE Execute(
77 IN IShellFolder *pShellFolder,
78 IN LPCITEMIDLIST pidl)
79 {
80 HRESULT ret = S_FALSE;
81
82 TRACE("ITrayPriv::Execute\n");
83
84 ret = SHInvokeDefaultCommand(m_Tray->GetHWND(), pShellFolder, pidl);
85
86 return ret;
87 }
88
89 virtual HRESULT STDMETHODCALLTYPE Unknown(
90 IN PVOID Unknown1,
91 IN PVOID Unknown2,
92 IN PVOID Unknown3,
93 IN PVOID Unknown4)
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
100 ShowUndockMenuItem(VOID)
101 {
102 TRACE("ShowUndockMenuItem() not implemented!\n");
103 /* FIXME: How do we detect this?! */
104 return FALSE;
105 }
106
107 virtual BOOL
108 ShowSynchronizeMenuItem(VOID)
109 {
110 TRACE("ShowSynchronizeMenuItem() not implemented!\n");
111 /* FIXME: How do we detect this?! */
112 return FALSE;
113 }
114
115 virtual HRESULT STDMETHODCALLTYPE AppendMenu(
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
126 hMenu = LoadPopupMenu(hExplorerInstance,
127 MAKEINTRESOURCE(IDM_STARTMENU));
128 *phMenu = hMenu;
129 if (hMenu == NULL)
130 return E_FAIL;
131
132 /* Remove menu items that don't apply */
133
134 dwLogoff = SHRestricted(REST_STARTMENULOGOFF);
135 bWantLogoff = (dwLogoff == 2 ||
136 SHRestricted(REST_FORCESTARTMENULOGOFF) ||
137 GetExplorerRegValueSet(HKEY_CURRENT_USER,
138 TEXT("Advanced"),
139 TEXT("StartMenuLogoff")));
140
141 /* Favorites */
142 if (!GetExplorerRegValueSet(HKEY_CURRENT_USER,
143 TEXT("Advanced"),
144 TEXT("StartMenuFavorites")))
145 {
146 DeleteMenu(hMenu,
147 IDM_FAVORITES,
148 MF_BYCOMMAND);
149 }
150
151 /* Documents */
152 if (SHRestricted(REST_NORECENTDOCSMENU))
153 {
154 DeleteMenu(hMenu,
155 IDM_DOCUMENTS,
156 MF_BYCOMMAND);
157 }
158
159 /* Settings */
160 hSettingsMenu = FindSubMenu(hMenu,
161 IDM_SETTINGS,
162 FALSE);
163 if (hSettingsMenu != NULL)
164 {
165 if (SHRestricted(REST_NOSETFOLDERS))
166 {
167 /* Control Panel */
168 if (SHRestricted(REST_NOCONTROLPANEL))
169 {
170 DeleteMenu(hSettingsMenu,
171 IDM_CONTROLPANEL,
172 MF_BYCOMMAND);
173
174 /* Delete the separator below it */
175 DeleteMenu(hSettingsMenu,
176 0,
177 MF_BYPOSITION);
178 }
179
180 /* Network Connections */
181 if (SHRestricted(REST_NONETWORKCONNECTIONS))
182 {
183 DeleteMenu(hSettingsMenu,
184 IDM_NETWORKCONNECTIONS,
185 MF_BYCOMMAND);
186 }
187
188 /* Printers and Faxes */
189 DeleteMenu(hSettingsMenu,
190 IDM_PRINTERSANDFAXES,
191 MF_BYCOMMAND);
192 }
193
194 /* Security */
195 if (GetSystemMetrics(SM_REMOTECONTROL) == 0 ||
196 SHRestricted(REST_NOSECURITY))
197 {
198 DeleteMenu(hSettingsMenu,
199 IDM_SECURITY,
200 MF_BYCOMMAND);
201 }
202
203 if (GetMenuItemCount(hSettingsMenu) == 0)
204 {
205 DeleteMenu(hMenu,
206 IDM_SETTINGS,
207 MF_BYCOMMAND);
208 }
209 }
210
211 /* Search */
212 /* FIXME: Enable after implementing */
213 /* if (SHRestricted(REST_NOFIND)) */
214 {
215 DeleteMenu(hMenu,
216 IDM_SEARCH,
217 MF_BYCOMMAND);
218 }
219
220 /* FIXME: Help */
221
222 /* Run */
223 if (SHRestricted(REST_NORUN))
224 {
225 DeleteMenu(hMenu,
226 IDM_RUN,
227 MF_BYCOMMAND);
228 }
229
230 /* Synchronize */
231 if (!ShowSynchronizeMenuItem())
232 {
233 DeleteMenu(hMenu,
234 IDM_SYNCHRONIZE,
235 MF_BYCOMMAND);
236 uLastItemsCount--;
237 }
238
239 /* Log off */
240 if (dwLogoff != 1 && bWantLogoff)
241 {
242 /* FIXME: We need a more sophisticated way to determine whether to show
243 or hide it, it might be hidden in too many cases!!! */
244
245 /* Update Log Off menu item */
246 if (!GetCurrentLoggedOnUserName(szUser,
247 sizeof(szUser) / sizeof(szUser[0])))
248 {
249 szUser[0] = _T('\0');
250 }
251
252 if (!FormatMenuString(hMenu,
253 IDM_LOGOFF,
254 MF_BYCOMMAND,
255 szUser))
256 {
257 /* We couldn't update the menu item, delete it... */
258 DeleteMenu(hMenu,
259 IDM_LOGOFF,
260 MF_BYCOMMAND);
261 }
262 }
263 else
264 {
265 DeleteMenu(hMenu,
266 IDM_LOGOFF,
267 MF_BYCOMMAND);
268 uLastItemsCount--;
269 }
270
271
272 /* Disconnect */
273 if (GetSystemMetrics(SM_REMOTECONTROL) == 0)
274 {
275 DeleteMenu(hMenu,
276 IDM_DISCONNECT,
277 MF_BYCOMMAND);
278 uLastItemsCount--;
279 }
280
281 /* Undock computer */
282 if (!ShowUndockMenuItem())
283 {
284 DeleteMenu(hMenu,
285 IDM_UNDOCKCOMPUTER,
286 MF_BYCOMMAND);
287 uLastItemsCount--;
288 }
289
290 /* Shut down */
291 if (SHRestricted(REST_NOCLOSE))
292 {
293 DeleteMenu(hMenu,
294 IDM_SHUTDOWN,
295 MF_BYCOMMAND);
296 uLastItemsCount--;
297 }
298
299 if (uLastItemsCount == 0)
300 {
301 /* Remove the separator at the end of the menu */
302 DeleteMenu(hMenu,
303 IDM_LASTSTARTMENU_SEPARATOR,
304 MF_BYCOMMAND);
305 }
306
307 return S_OK;
308 }
309
310 /*******************************************************************/
311
312 virtual HRESULT STDMETHODCALLTYPE QueryStatus(
313 IN const GUID *pguidCmdGroup OPTIONAL,
314 IN ULONG cCmds,
315 IN OUT OLECMD *prgCmds,
316 IN OUT OLECMDTEXT *pCmdText OPTIONAL)
317 {
318 return E_NOTIMPL;
319 }
320
321 virtual HRESULT STDMETHODCALLTYPE Exec(
322 IN const GUID *pguidCmdGroup OPTIONAL,
323 IN DWORD nCmdID,
324 IN DWORD nCmdExecOpt,
325 IN VARIANTARG *pvaIn OPTIONAL,
326 IN VARIANTARG *pvaOut OPTIONAL)
327 {
328 return E_NOTIMPL;
329 }
330
331 /*******************************************************************/
332
333 virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient)
334 {
335 return E_NOTIMPL;
336 }
337
338 virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown ** ppunkClient)
339 {
340 return E_NOTIMPL;
341 }
342
343 virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(RECT *prc)
344 {
345 return E_NOTIMPL;
346 }
347
348 virtual HRESULT STDMETHODCALLTYPE Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags)
349 {
350 return E_NOTIMPL;
351 }
352
353 virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType)
354 {
355 return E_NOTIMPL;
356 }
357
358 virtual HRESULT STDMETHODCALLTYPE SetSubMenu(IMenuPopup *pmp, BOOL fSet)
359 {
360 if (!fSet)
361 {
362 return Tray_OnStartMenuDismissed(m_Tray);
363 }
364
365 return S_OK;
366 }
367
368 /*******************************************************************/
369
370 HRESULT Initialize(IN ITrayWindow *tray)
371 {
372 m_Tray = tray;
373 return S_OK;
374 }
375
376 DECLARE_NOT_AGGREGATABLE(CStartMenuSite)
377
378 DECLARE_PROTECT_FINAL_CONSTRUCT()
379 BEGIN_COM_MAP(CStartMenuSite)
380 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
381 COM_INTERFACE_ENTRY_IID(IID_ITrayPriv, ITrayPriv)
382 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
383 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup)
384 COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
385 END_COM_MAP()
386 };
387
388 HRESULT CreateStartMenuSite(IN OUT ITrayWindow *Tray, const IID & riid, PVOID * ppv)
389 {
390 return ShellObjectCreatorInit<CStartMenuSite>(Tray, riid, ppv);
391 }