ReactOS 0.4.16-dev-983-g23ad936
CMenuSite.cpp
Go to the documentation of this file.
1/*
2 * Shell Menu Site
3 *
4 * Copyright 2014 David Quintana
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 St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20#include "shellmenu.h"
21#include <atlwin.h>
22#include <shlwapi_undoc.h>
23
24#include "CMenuSite.h"
25
27 m_DeskBarSite(NULL),
28 m_BandObject(NULL),
29 m_DeskBand(NULL),
30 m_WinEventHandler(NULL),
31 m_hWndBand(NULL)
32{
33}
34
35// Child Band management (simplified due to only supporting one single child)
37{
38 HRESULT hr;
39
40 // Little helper, for readability
41#define TO_HRESULT(x) ((HRESULT)(S_OK+(x)))
42
43 CComPtr<IUnknown> pUnknown;
44
46
48 return TO_HRESULT(0);
49
50 if (m_BandObject)
51 {
54 return hr;
55 }
56
61
62 if (!pUnknown)
63 return TO_HRESULT(0);
64
67 return hr;
68
71 return hr;
72
74 if (FAILED_UNEXPECTEDLY(hr))
75 return hr;
76
79 return hr;
80
82
83 return TO_HRESULT(0);
84}
85
87{
88 if (uBand == UINT(-1))
89 return GetBandCount();
90
91 if (uBand != 0)
92 return E_FAIL;
93
94 *pdwBandID = 0;
95
96 return S_OK;
97}
98
100{
101 if (dwBandID != 0 || m_BandObject == NULL)
102 {
103 *ppv = NULL;
104 return E_NOINTERFACE;
105 }
106
107 return m_BandObject->QueryInterface(riid, ppv);
108}
109
111{
112 if (dwBandID != 0)
113 return E_FAIL;
114
115 if (!m_BandObject)
116 {
117 *ppstb = NULL;
118 return E_NOINTERFACE;
119 }
120
121 HRESULT hr = m_BandObject->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
122
123 *pdwState = 1;
124
125 if (cchName > 0)
126 pszName[0] = 0;
127
128 return hr;
129}
130
132{
133 memset(prc, 0, sizeof(*prc));
134
135 if (dwWhich != 0)
136 return S_OK;
137
138 if (m_DeskBand == NULL)
139 return S_OK;
140
141 DESKBANDINFO info = { 0 };
142 info.dwMask = DBIM_MAXSIZE;
143
144 m_DeskBand->GetBandInfo(0, 0, &info);
145
146 prc->right = info.ptMaxSize.x;
147 prc->bottom = info.ptMaxSize.y;
148
149 return S_OK;
150}
151
153{
154 if (!IsWindow())
155 return E_FAIL;
156
157 *phwnd = m_hWnd;
158
159 return S_OK;
160}
161
163{
164 if (hWnd == m_hWnd)
165 return S_OK;
166
168 return S_FALSE;
169
170 return m_WinEventHandler->IsWindowOwner(hWnd);
171}
172
174{
176 return S_OK;
177
178 return m_WinEventHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);
179}
180
182{
183 *ppvObject = NULL;
184
185 if (IsEqualGUID(guidService, SID_SMenuBandBottom) ||
186 IsEqualGUID(guidService, SID_SMenuBandBottomSelected) ||
187 IsEqualGUID(guidService, SID_SMenuBandChild))
188 {
189 if (m_BandObject == NULL)
190 return E_NOINTERFACE;
191
192 return IUnknown_QueryService(m_BandObject, guidService, riid, ppvObject);
193 }
194
195 if (!m_DeskBarSite)
196 return E_NOINTERFACE;
197
198 return IUnknown_QueryService(m_DeskBarSite, guidService, riid, ppvObject);
199}
200
201HRESULT STDMETHODCALLTYPE CMenuSite::Exec(const GUID * pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
202{
203 // Forward Exec calls directly to the parent deskbar
204 return IUnknown_Exec(m_DeskBarSite, *pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
205}
206
207HRESULT STDMETHODCALLTYPE CMenuSite::QueryStatus(const GUID * pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
208{
209 // Forward QueryStatus calls directly to the parent deskbar
210 return IUnknown_QueryStatus(m_DeskBarSite, *pguidCmdGroup, cCmds, prgCmds, pCmdText);
211}
212
214{
215 HRESULT hr;
216
217 CComPtr<IUnknown> protectThis(this->ToIUnknown());
218
219 // Only initialize if a parent site is being assigned
220 if (punkSite)
221 {
222 HWND hWndSite;
223
225
226 hr = IUnknown_GetWindow(punkSite, &hWndSite);
227
228 if (FAILED(hr) || !hWndSite)
229 return E_FAIL;
230
231 if (!m_hWnd)
232 {
233 Create(hWndSite, NULL, L"MenuSite");
234 }
235
236 m_DeskBarSite = punkSite;
237 }
238 else
239 {
240 // Otherwise, deinitialize.
241 if (m_DeskBand)
242 {
243 m_DeskBand->CloseDW(0);
244 }
245
247
252 if (m_hWnd)
255 }
256
257 return S_OK;
258}
259
261{
262 if (!m_DeskBand)
263 return S_OK;
264
265 return m_DeskBand->ShowDW(dwState != 0);
266}
267
269{
270 if (lpMsg)
271 return E_FAIL;
272
273 return IUnknown_UIActivateIO(m_BandObject, fActivate, lpMsg);
274}
275
277{
278 HWND hWndTarget = NULL;
279 CComPtr<IUnknown> protectThis(this->ToIUnknown());
280
281 switch (uMsg)
282 {
283 case WM_SIZE:
284 if (m_BandObject)
285 {
286 CComPtr<IMenuPopup> pMenuPopup;
287 if (SUCCEEDED(m_BandObject->QueryInterface(IID_PPV_ARG(IMenuPopup, &pMenuPopup))))
288 {
289 RECT Rect = { 0 };
291 pMenuPopup->OnPosRectChangeDB(&Rect);
292 }
293 }
294 hWndTarget = hWnd;
295 lResult = 1;
296 break;
297 case WM_NOTIFY:
298 hWndTarget = reinterpret_cast<LPNMHDR>(lParam)->hwndFrom;
299 break;
300 case WM_COMMAND:
301 hWndTarget = (HWND) lParam;
302 break;
303 default:
304 return FALSE;
305 }
306
307 if (hWndTarget && m_WinEventHandler &&
308 m_WinEventHandler->IsWindowOwner(hWndTarget) == S_OK)
309 {
310 if (SUCCEEDED(m_WinEventHandler->OnWinEvent(hWndTarget, uMsg, wParam, lParam, &lResult)))
311 return TRUE;
312 }
313
314 return FALSE;
315}
316
318{
319 return E_NOTIMPL;
320}
321
323{
324 return E_NOTIMPL;
325}
326
328{
329 return E_NOTIMPL;
330}
331
333{
334 return E_NOTIMPL;
335}
336
338{
339 return E_NOTIMPL;
340}
341
343{
344 return E_NOTIMPL;
345}
346
348{
349 return S_FALSE;
350}
351
353{
354 return S_FALSE;
355}
356
358{
359 return S_OK;
360}
361
362extern "C"
364{
365 return ShellObjectCreator<CMenuSite>(riid, ppv);
366}
#define TO_HRESULT(x)
HRESULT WINAPI RSHELL_CMenuSite_CreateInstance(REFIID riid, LPVOID *ppv)
Definition: CMenuSite.cpp:363
HWND hWnd
Definition: settings.c:17
@ Create
Definition: registry.c:563
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
STDMETHOD() SetDeskBarSite(IUnknown *punkSite) override
Definition: CMenuSite.cpp:213
STDMETHOD() QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) override
Definition: CMenuSite.cpp:207
STDMETHOD() GetBandObject(DWORD dwBandID, REFIID riid, VOID **ppv) override
Definition: CMenuSite.cpp:99
STDMETHOD() QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override
Definition: CMenuSite.cpp:181
STDMETHOD() ContextSensitiveHelp(BOOL fEnterMode) override
Definition: CMenuSite.cpp:317
STDMETHOD() GetSize(DWORD dwWhich, LPRECT prc) override
Definition: CMenuSite.cpp:131
STDMETHOD() OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override
Definition: CMenuSite.cpp:173
STDMETHOD() HasFocusIO() override
Definition: CMenuSite.cpp:352
UINT GetBandCount()
Definition: CMenuSite.h:107
STDMETHOD() UIActivateIO(BOOL fActivate, LPMSG lpMsg) override
Definition: CMenuSite.cpp:268
STDMETHOD() SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState) override
Definition: CMenuSite.cpp:337
STDMETHOD() UIActivateDBC(DWORD dwState) override
Definition: CMenuSite.cpp:260
STDMETHOD() EnumBands(UINT uBand, DWORD *pdwBandID) override
Definition: CMenuSite.cpp:86
STDMETHOD() GetBandSiteInfo(BANDSITEINFO *pbsinfo) override
Definition: CMenuSite.cpp:322
virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD mapId=0)
Definition: CMenuSite.cpp:276
STDMETHOD() SetBandSiteInfo(const BANDSITEINFO *pbsinfo) override
Definition: CMenuSite.cpp:332
STDMETHOD() GetWindow(HWND *phwnd) override
Definition: CMenuSite.cpp:152
CComPtr< IDeskBand > m_DeskBand
Definition: CMenuSite.h:37
IUnknown * ToIUnknown()
Definition: CMenuSite.h:106
STDMETHOD() RemoveBand(DWORD dwBandID) override
Definition: CMenuSite.cpp:327
STDMETHOD() SetModeDBC(DWORD dwMode) override
Definition: CMenuSite.cpp:342
HWND m_hWndBand
Definition: CMenuSite.h:39
CComPtr< IUnknown > m_DeskBarSite
Definition: CMenuSite.h:35
STDMETHOD() QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) override
Definition: CMenuSite.cpp:110
STDMETHOD() OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus) override
Definition: CMenuSite.cpp:357
STDMETHOD() AddBand(IUnknown *punk) override
Definition: CMenuSite.cpp:36
STDMETHOD() IsWindowOwner(HWND hWnd) override
Definition: CMenuSite.cpp:162
CComPtr< IUnknown > m_BandObject
Definition: CMenuSite.h:36
STDMETHOD() Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override
Definition: CMenuSite.cpp:201
STDMETHOD() TranslateAcceleratorIO(LPMSG lpMsg) override
Definition: CMenuSite.cpp:347
CComPtr< IWinEventHandler > m_WinEventHandler
Definition: CMenuSite.h:38
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HANDLE HWND
Definition: compat.h:19
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI IUnknown_UIActivateIO(IUnknown *unknown, BOOL activate, LPMSG msg)
Definition: ordinal.c:1633
HRESULT WINAPI IUnknown_QueryStatus(IUnknown *lpUnknown, REFGUID pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText)
Definition: ordinal.c:1048
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1501
HRESULT WINAPI IUnknown_Exec(IUnknown *lpUnknown, REFGUID pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
Definition: ordinal.c:1087
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:1336
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1411
_In_ PUNKNOWN pUnknown
Definition: drmk.h:76
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
unsigned int UINT
Definition: ndis.h:50
_Out_ LPRECT prc
Definition: ntgdi.h:1658
#define L(x)
Definition: ntvdm.h:50
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define WM_NOTIFY
Definition: richedit.h:61
#define memset(x, y, z)
Definition: compat.h:39
HRESULT hr
Definition: shlfolder.c:183
Definition: scsiwmi.h:51
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
uint32_t ULONG
Definition: typedefs.h:59
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2798
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_SIZE
Definition: winuser.h:1622
#define WM_COMMAND
Definition: winuser.h:1751
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI DestroyWindow(_In_ HWND)
#define IID_PPV_ARG(Itype, ppType)
WCHAR * LPWSTR
Definition: xmlstorage.h:184