4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
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.
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.
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
23 /*****************************************************************************
24 ** IStartMenuSite ***********************************************************
25 *****************************************************************************/
27 class CStartMenuSite
:
28 public CComCoClass
<CStartMenuSite
>,
29 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
30 public IStartMenuSite
,
31 public IServiceProvider
,
33 public IOleCommandTarget
,
36 CComPtr
<ITrayWindow
> Tray
;
37 CComPtr
<IMenuPopup
> StartMenuPopup
;
44 virtual ~CStartMenuSite() {}
46 /*******************************************************************/
48 virtual HRESULT STDMETHODCALLTYPE
QueryService(
49 IN REFGUID guidService
,
53 if (IsEqualGUID(guidService
, SID_SMenuPopup
))
55 return QueryInterface(riid
, ppvObject
);
61 /*******************************************************************/
63 virtual HRESULT STDMETHODCALLTYPE
GetWindow(
66 TRACE("ITrayPriv::GetWindow\n");
68 *phwnd
= Tray
->GetHWND();
75 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(
78 TRACE("ITrayPriv::ContextSensitiveHelp\n");
82 virtual HRESULT STDMETHODCALLTYPE
Execute(
83 IN IShellFolder
*pShellFolder
,
84 IN LPCITEMIDLIST pidl
)
87 HRESULT ret
= S_FALSE
;
89 TRACE("ITrayPriv::Execute\n");
91 hShlwapi
= GetModuleHandle(TEXT("SHLWAPI.DLL"));
94 SHINVDEFCMD SHInvokeDefCmd
;
96 /* SHInvokeDefaultCommand */
97 SHInvokeDefCmd
= (SHINVDEFCMD
) GetProcAddress(hShlwapi
,
98 (LPCSTR
) ((LONG
) 279));
99 if (SHInvokeDefCmd
!= NULL
)
101 ret
= SHInvokeDefCmd(Tray
->GetHWND(),
110 virtual HRESULT STDMETHODCALLTYPE
Unknown(
116 TRACE("ITrayPriv::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1
, Unknown2
, Unknown3
, Unknown4
);
121 ShowUndockMenuItem(VOID
)
123 TRACE("ShowUndockMenuItem() not implemented!\n");
124 /* FIXME: How do we detect this?! */
129 ShowSynchronizeMenuItem(VOID
)
131 TRACE("ShowSynchronizeMenuItem() not implemented!\n");
132 /* FIXME: How do we detect this?! */
136 virtual HRESULT STDMETHODCALLTYPE
AppendMenu(
139 HMENU hMenu
, hSettingsMenu
;
142 UINT uLastItemsCount
= 5; /* 5 menu items below the last separator */
145 TRACE("ITrayPriv::AppendMenu\n");
147 hMenu
= LoadPopupMenu(hExplorerInstance
,
148 MAKEINTRESOURCE(IDM_STARTMENU
));
153 /* Remove menu items that don't apply */
155 dwLogoff
= SHRestricted(REST_STARTMENULOGOFF
);
156 bWantLogoff
= (dwLogoff
== 2 ||
157 SHRestricted(REST_FORCESTARTMENULOGOFF
) ||
158 GetExplorerRegValueSet(HKEY_CURRENT_USER
,
160 TEXT("StartMenuLogoff")));
163 if (!GetExplorerRegValueSet(HKEY_CURRENT_USER
,
165 TEXT("StartMenuFavorites")))
173 if (SHRestricted(REST_NORECENTDOCSMENU
))
181 hSettingsMenu
= FindSubMenu(hMenu
,
184 if (hSettingsMenu
!= NULL
)
186 if (SHRestricted(REST_NOSETFOLDERS
))
189 if (SHRestricted(REST_NOCONTROLPANEL
))
191 DeleteMenu(hSettingsMenu
,
195 /* Delete the separator below it */
196 DeleteMenu(hSettingsMenu
,
201 /* Network Connections */
202 if (SHRestricted(REST_NONETWORKCONNECTIONS
))
204 DeleteMenu(hSettingsMenu
,
205 IDM_NETWORKCONNECTIONS
,
209 /* Printers and Faxes */
210 DeleteMenu(hSettingsMenu
,
211 IDM_PRINTERSANDFAXES
,
216 if (GetSystemMetrics(SM_REMOTECONTROL
) == 0 ||
217 SHRestricted(REST_NOSECURITY
))
219 DeleteMenu(hSettingsMenu
,
224 if (GetMenuItemCount(hSettingsMenu
) == 0)
233 /* FIXME: Enable after implementing */
234 /* if (SHRestricted(REST_NOFIND)) */
244 if (SHRestricted(REST_NORUN
))
252 if (!ShowSynchronizeMenuItem())
261 if (dwLogoff
!= 1 && bWantLogoff
)
263 /* FIXME: We need a more sophisticated way to determine whether to show
264 or hide it, it might be hidden in too many cases!!! */
266 /* Update Log Off menu item */
267 if (!GetCurrentLoggedOnUserName(szUser
,
268 sizeof(szUser
) / sizeof(szUser
[0])))
270 szUser
[0] = _T('\0');
273 if (!FormatMenuString(hMenu
,
278 /* We couldn't update the menu item, delete it... */
294 if (GetSystemMetrics(SM_REMOTECONTROL
) == 0)
302 /* Undock computer */
303 if (!ShowUndockMenuItem())
312 if (SHRestricted(REST_NOCLOSE
))
320 if (uLastItemsCount
== 0)
322 /* Remove the separator at the end of the menu */
324 IDM_LASTSTARTMENU_SEPARATOR
,
331 /*******************************************************************/
333 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(
334 IN
const GUID
*pguidCmdGroup OPTIONAL
,
336 IN OUT OLECMD
*prgCmds
,
337 IN OUT OLECMDTEXT
*pCmdText OPTIONAL
)
342 virtual HRESULT STDMETHODCALLTYPE
Exec(
343 IN
const GUID
*pguidCmdGroup OPTIONAL
,
345 IN DWORD nCmdExecOpt
,
346 IN VARIANTARG
*pvaIn OPTIONAL
,
347 IN VARIANTARG
*pvaOut OPTIONAL
)
352 /*******************************************************************/
354 virtual HRESULT STDMETHODCALLTYPE
SetClient(IUnknown
*punkClient
)
359 virtual HRESULT STDMETHODCALLTYPE
GetClient(IUnknown
** ppunkClient
)
364 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(RECT
*prc
)
369 virtual HRESULT STDMETHODCALLTYPE
Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
374 virtual HRESULT STDMETHODCALLTYPE
OnSelect(DWORD dwSelectType
)
379 virtual HRESULT STDMETHODCALLTYPE
SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
383 return Tray_OnStartMenuDismissed();
389 /*******************************************************************/
391 HRESULT
Initialize(IN ITrayWindow
*tray
)
397 DECLARE_NOT_AGGREGATABLE(CStartMenuSite
)
399 DECLARE_PROTECT_FINAL_CONSTRUCT()
400 BEGIN_COM_MAP(CStartMenuSite
)
401 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
402 COM_INTERFACE_ENTRY_IID(IID_ITrayPriv
, ITrayPriv
)
403 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
404 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup
, IMenuPopup
)
405 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
409 HRESULT
CreateStartMenuSite(IN OUT ITrayWindow
*Tray
, const IID
& riid
, PVOID
* ppv
)
411 return ShellObjectCreatorInit
<CStartMenuSite
>(Tray
, riid
, ppv
);