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 class CStartMenuSite
:
24 public CComCoClass
<CStartMenuSite
>,
25 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
26 public IServiceProvider
,
28 public IOleCommandTarget
,
31 CComPtr
<ITrayWindow
> m_Tray
;
38 virtual ~CStartMenuSite() {}
40 /*******************************************************************/
42 virtual HRESULT STDMETHODCALLTYPE
QueryService(
43 IN REFGUID guidService
,
47 if (IsEqualGUID(guidService
, SID_SMenuPopup
))
49 return QueryInterface(riid
, ppvObject
);
55 /*******************************************************************/
57 virtual HRESULT STDMETHODCALLTYPE
GetWindow(
60 TRACE("ITrayPriv::GetWindow\n");
62 *phwnd
= m_Tray
->GetHWND();
69 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(
72 TRACE("ITrayPriv::ContextSensitiveHelp\n");
76 virtual HRESULT STDMETHODCALLTYPE
Execute(
77 IN IShellFolder
*pShellFolder
,
78 IN LPCITEMIDLIST pidl
)
80 HRESULT ret
= S_FALSE
;
82 TRACE("ITrayPriv::Execute\n");
84 ret
= SHInvokeDefaultCommand(m_Tray
->GetHWND(), pShellFolder
, pidl
);
89 virtual HRESULT STDMETHODCALLTYPE
Unknown(
95 TRACE("ITrayPriv::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1
, Unknown2
, Unknown3
, Unknown4
);
100 ShowUndockMenuItem(VOID
)
102 TRACE("ShowUndockMenuItem() not implemented!\n");
103 /* FIXME: How do we detect this?! */
108 ShowSynchronizeMenuItem(VOID
)
110 TRACE("ShowSynchronizeMenuItem() not implemented!\n");
111 /* FIXME: How do we detect this?! */
115 virtual HRESULT STDMETHODCALLTYPE
AppendMenu(
118 HMENU hMenu
, hSettingsMenu
;
121 UINT uLastItemsCount
= 5; /* 5 menu items below the last separator */
124 TRACE("ITrayPriv::AppendMenu\n");
126 hMenu
= LoadPopupMenu(hExplorerInstance
,
127 MAKEINTRESOURCE(IDM_STARTMENU
));
132 /* Remove menu items that don't apply */
134 dwLogoff
= SHRestricted(REST_STARTMENULOGOFF
);
135 bWantLogoff
= (dwLogoff
== 2 ||
136 SHRestricted(REST_FORCESTARTMENULOGOFF
) ||
137 GetExplorerRegValueSet(HKEY_CURRENT_USER
,
139 TEXT("StartMenuLogoff")));
142 if (!GetExplorerRegValueSet(HKEY_CURRENT_USER
,
144 TEXT("StartMenuFavorites")))
152 if (SHRestricted(REST_NORECENTDOCSMENU
))
160 hSettingsMenu
= FindSubMenu(hMenu
,
163 if (hSettingsMenu
!= NULL
)
165 if (SHRestricted(REST_NOSETFOLDERS
))
168 if (SHRestricted(REST_NOCONTROLPANEL
))
170 DeleteMenu(hSettingsMenu
,
174 /* Delete the separator below it */
175 DeleteMenu(hSettingsMenu
,
180 /* Network Connections */
181 if (SHRestricted(REST_NONETWORKCONNECTIONS
))
183 DeleteMenu(hSettingsMenu
,
184 IDM_NETWORKCONNECTIONS
,
188 /* Printers and Faxes */
189 DeleteMenu(hSettingsMenu
,
190 IDM_PRINTERSANDFAXES
,
195 if (GetSystemMetrics(SM_REMOTECONTROL
) == 0 ||
196 SHRestricted(REST_NOSECURITY
))
198 DeleteMenu(hSettingsMenu
,
203 if (GetMenuItemCount(hSettingsMenu
) == 0)
212 /* FIXME: Enable after implementing */
213 /* if (SHRestricted(REST_NOFIND)) */
223 if (SHRestricted(REST_NORUN
))
231 if (!ShowSynchronizeMenuItem())
240 if (dwLogoff
!= 1 && bWantLogoff
)
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!!! */
245 /* Update Log Off menu item */
246 if (!GetCurrentLoggedOnUserName(szUser
,
247 sizeof(szUser
) / sizeof(szUser
[0])))
249 szUser
[0] = _T('\0');
252 if (!FormatMenuString(hMenu
,
257 /* We couldn't update the menu item, delete it... */
273 if (GetSystemMetrics(SM_REMOTECONTROL
) == 0)
281 /* Undock computer */
282 if (!ShowUndockMenuItem())
291 if (SHRestricted(REST_NOCLOSE
))
299 if (uLastItemsCount
== 0)
301 /* Remove the separator at the end of the menu */
303 IDM_LASTSTARTMENU_SEPARATOR
,
310 /*******************************************************************/
312 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(
313 IN
const GUID
*pguidCmdGroup OPTIONAL
,
315 IN OUT OLECMD
*prgCmds
,
316 IN OUT OLECMDTEXT
*pCmdText OPTIONAL
)
321 virtual HRESULT STDMETHODCALLTYPE
Exec(
322 IN
const GUID
*pguidCmdGroup OPTIONAL
,
324 IN DWORD nCmdExecOpt
,
325 IN VARIANTARG
*pvaIn OPTIONAL
,
326 IN VARIANTARG
*pvaOut OPTIONAL
)
331 /*******************************************************************/
333 virtual HRESULT STDMETHODCALLTYPE
SetClient(IUnknown
*punkClient
)
338 virtual HRESULT STDMETHODCALLTYPE
GetClient(IUnknown
** ppunkClient
)
343 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(RECT
*prc
)
348 virtual HRESULT STDMETHODCALLTYPE
Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
353 virtual HRESULT STDMETHODCALLTYPE
OnSelect(DWORD dwSelectType
)
358 virtual HRESULT STDMETHODCALLTYPE
SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
362 return Tray_OnStartMenuDismissed(m_Tray
);
368 /*******************************************************************/
370 HRESULT
Initialize(IN ITrayWindow
*tray
)
376 DECLARE_NOT_AGGREGATABLE(CStartMenuSite
)
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
)
388 HRESULT
CreateStartMenuSite(IN OUT ITrayWindow
*Tray
, const IID
& riid
, PVOID
* ppv
)
390 return ShellObjectCreatorInit
<CStartMenuSite
>(Tray
, riid
, ppv
);