4 * Copyright 2014 David Quintana
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 St, Fifth Floor, Boston, MA 02110-1301, USA
23 class CMenuDeskBarWrap
:
24 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
25 public IOleCommandTarget
,
26 public IServiceProvider
,
27 public IInputObjectSite
,
30 public IObjectWithSite
,
32 public IInitializeObject
38 HRESULT
InitWrap(IDeskBar
* shellMenu
);
41 CComPtr
<IMenuPopup
> m_IMenuPopup
;
42 CComPtr
<IOleCommandTarget
> m_IOleCommandTarget
;
43 CComPtr
<IServiceProvider
> m_IServiceProvider
;
44 CComPtr
<IDeskBar
> m_IDeskBar
;
45 CComPtr
<IOleWindow
> m_IOleWindow
;
46 CComPtr
<IInputObjectSite
> m_IInputObjectSite
;
47 CComPtr
<IInputObject
> m_IInputObject
;
48 CComPtr
<IObjectWithSite
> m_IObjectWithSite
;
49 CComPtr
<IBanneredBar
> m_IBanneredBar
;
50 CComPtr
<IInitializeObject
> m_IInitializeObject
;
53 // *** IMenuPopup methods ***
54 virtual HRESULT STDMETHODCALLTYPE
Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
);
55 virtual HRESULT STDMETHODCALLTYPE
OnSelect(DWORD dwSelectType
);
56 virtual HRESULT STDMETHODCALLTYPE
SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
);
58 // *** IOleWindow methods ***
59 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*phwnd
);
60 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
62 // *** IObjectWithSite methods ***
63 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
);
64 virtual HRESULT STDMETHODCALLTYPE
GetSite(REFIID riid
, PVOID
*ppvSite
);
66 // *** IBanneredBar methods ***
67 virtual HRESULT STDMETHODCALLTYPE
SetIconSize(DWORD iIcon
);
68 virtual HRESULT STDMETHODCALLTYPE
GetIconSize(DWORD
* piIcon
);
69 virtual HRESULT STDMETHODCALLTYPE
SetBitmap(HBITMAP hBitmap
);
70 virtual HRESULT STDMETHODCALLTYPE
GetBitmap(HBITMAP
* phBitmap
);
72 // *** IInitializeObject methods ***
73 virtual HRESULT STDMETHODCALLTYPE
Initialize(THIS
);
75 // *** IOleCommandTarget methods ***
76 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
);
77 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
79 // *** IServiceProvider methods ***
80 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
82 // *** IInputObjectSite methods ***
83 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
);
85 // *** IInputObject methods ***
86 virtual HRESULT STDMETHODCALLTYPE
UIActivateIO(BOOL bActivating
, LPMSG lpMsg
);
87 virtual HRESULT STDMETHODCALLTYPE
HasFocusIO(THIS
);
88 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorIO(LPMSG lpMsg
);
90 // *** IDeskBar methods ***
91 virtual HRESULT STDMETHODCALLTYPE
SetClient(IUnknown
*punkClient
);
92 virtual HRESULT STDMETHODCALLTYPE
GetClient(IUnknown
**ppunkClient
);
93 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(LPRECT prc
);
95 DECLARE_NOT_AGGREGATABLE(CMenuDeskBarWrap
)
96 DECLARE_PROTECT_FINAL_CONSTRUCT()
98 BEGIN_COM_MAP(CMenuDeskBarWrap
)
99 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup
, IMenuPopup
)
100 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
101 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
102 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
103 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
104 COM_INTERFACE_ENTRY_IID(IID_IDeskBar
, IMenuPopup
)
105 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IMenuPopup
)
106 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
107 COM_INTERFACE_ENTRY_IID(IID_IBanneredBar
, IBanneredBar
)
108 COM_INTERFACE_ENTRY_IID(IID_IInitializeObject
, IInitializeObject
)
113 HRESULT WINAPI
CMenuDeskBar_Wrapper(IDeskBar
* deskBar
, REFIID riid
, LPVOID
*ppv
)
119 CMenuDeskBarWrap
* bar
= new CComObject
<CMenuDeskBarWrap
>();
121 return E_OUTOFMEMORY
;
123 hr
= bar
->InitWrap(deskBar
);
130 hr
= bar
->QueryInterface(riid
, ppv
);
138 HRESULT
CMenuDeskBarWrap::InitWrap(IDeskBar
* deskBar
)
144 m_IDeskBar
= deskBar
;
146 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &m_IOleCommandTarget
));
147 if (FAILED(hr
)) return hr
;
148 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &m_IServiceProvider
));
149 if (FAILED(hr
)) return hr
;
150 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IMenuPopup
, &m_IMenuPopup
));
151 if (FAILED(hr
)) return hr
;
152 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_IOleWindow
));
153 if (FAILED(hr
)) return hr
;
154 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IInputObjectSite
, &m_IInputObjectSite
));
155 if (FAILED(hr
)) return hr
;
156 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IInputObject
, &m_IInputObject
));
157 if (FAILED(hr
)) return hr
;
158 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &m_IObjectWithSite
));
159 if (FAILED(hr
)) return hr
;
160 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IBanneredBar
, &m_IBanneredBar
));
161 if (FAILED(hr
)) return hr
;
162 hr
= deskBar
->QueryInterface(IID_PPV_ARG(IInitializeObject
, &m_IInitializeObject
));
166 CMenuDeskBarWrap::~CMenuDeskBarWrap()
171 // *** IMenuPopup methods ***
172 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
174 WrapLogEnter("CMenuDeskBarWrap<%p>::Popup(POINTL *ppt=%p, RECTL *prcExclude=%p, MP_POPUPFLAGS dwFlags=%08x)\n", this, ppt
, prcExclude
, dwFlags
);
175 HRESULT hr
= m_IMenuPopup
->Popup(ppt
, prcExclude
, dwFlags
);
176 WrapLogExit("CMenuDeskBarWrap::Popup()", hr
);
180 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::OnSelect(DWORD dwSelectType
)
182 WrapLogEnter("CMenuDeskBarWrap<%p>::OnSelect(DWORD dwSelectType=%08x)\n", this, dwSelectType
);
183 HRESULT hr
= m_IMenuPopup
->OnSelect(dwSelectType
);
184 WrapLogExit("CMenuDeskBarWrap::OnSelect()", hr
);
188 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
190 WrapLogEnter("CMenuDeskBarWrap<%p>::SetSubMenu(IMenuPopup *pmp=%p, BOOL fSet=%d)\n", this, pmp
, fSet
);
191 HRESULT hr
= m_IMenuPopup
->SetSubMenu(pmp
, fSet
);
192 WrapLogExit("CMenuDeskBarWrap::SetSubMenu()", hr
);
196 // *** IOleWindow methods ***
197 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::GetWindow(HWND
*phwnd
)
199 WrapLogEnter("CMenuDeskBarWrap<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd
);
200 HRESULT hr
= m_IOleWindow
->GetWindow(phwnd
);
201 if (phwnd
) WrapLogPost("*phwnd=%p\n", *phwnd
);
202 WrapLogExit("CMenuDeskBarWrap::GetWindow()", hr
);
206 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::ContextSensitiveHelp(BOOL fEnterMode
)
208 WrapLogEnter("CMenuDeskBarWrap<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode
);
209 HRESULT hr
= m_IOleWindow
->ContextSensitiveHelp(fEnterMode
);
210 WrapLogExit("CMenuDeskBarWrap::ContextSensitiveHelp()", hr
);
214 // *** IObjectWithSite methods ***
215 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::SetSite(IUnknown
*pUnkSite
)
217 WrapLogEnter("CMenuDeskBarWrap<%p>::SetSite(IUnknown *pUnkSite=%p)\n", this, pUnkSite
);
220 CComPtr
<ITrayPriv
> inTp
;
221 HRESULT hr2
= pUnkSite
->QueryInterface(IID_PPV_ARG(ITrayPriv
, &inTp
));
225 hr2
= CStartMenuSite_Wrapper(inTp
, IID_PPV_ARG(ITrayPriv
, &outTp
));
236 HRESULT hr
= m_IObjectWithSite
->SetSite(pUnkSite
);
237 WrapLogExit("CMenuDeskBarWrap::SetSite()", hr
);
241 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::GetSite(REFIID riid
, PVOID
*ppvSite
)
243 WrapLogEnter("CMenuDeskBarWrap<%p>::GetSite(REFIID riid=%s, PVOID *ppvSite=%p)\n", this, Wrap(riid
), ppvSite
);
244 HRESULT hr
= m_IObjectWithSite
->GetSite(riid
, ppvSite
);
245 if (ppvSite
) WrapLogPost("*ppvSite=%p\n", *ppvSite
);
246 WrapLogExit("CMenuDeskBarWrap::GetSite()", hr
);
250 // *** IBanneredBar methods ***
251 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::SetIconSize(DWORD iIcon
)
253 WrapLogEnter("CMenuDeskBarWrap<%p>::SetIconSize(DWORD iIcon=%d)\n", this, iIcon
);
254 HRESULT hr
= m_IBanneredBar
->SetIconSize(iIcon
);
255 WrapLogExit("CMenuDeskBarWrap::SetIconSize()", hr
);
259 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::GetIconSize(DWORD
* piIcon
)
261 WrapLogEnter("CMenuDeskBarWrap<%p>::GetIconSize(DWORD* piIcon=%p)\n", this, piIcon
);
262 HRESULT hr
= m_IBanneredBar
->GetIconSize(piIcon
);
263 if (piIcon
) WrapLogPost("*piIcon=%d\n", *piIcon
);
264 WrapLogExit("CMenuDeskBarWrap::GetIconSize()", hr
);
268 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::SetBitmap(HBITMAP hBitmap
)
270 WrapLogEnter("CMenuDeskBarWrap<%p>::SetBitmap(HBITMAP hBitmap=%p)\n", this, hBitmap
);
271 HRESULT hr
= m_IBanneredBar
->SetBitmap(hBitmap
);
272 WrapLogExit("CMenuDeskBarWrap::SetBitmap()", hr
);
276 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::GetBitmap(HBITMAP
* phBitmap
)
278 WrapLogEnter("CMenuDeskBarWrap<%p>::GetBitmap(HBITMAP* phBitmap=%p)\n", this, phBitmap
);
279 HRESULT hr
= m_IBanneredBar
->GetBitmap(phBitmap
);
280 if (phBitmap
) WrapLogPost("*phBitmap=%p\n", *phBitmap
);
281 WrapLogExit("CMenuDeskBarWrap::GetBitmap()", hr
);
286 // *** IInitializeObject methods ***
287 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::Initialize(THIS
)
289 WrapLogEnter("CMenuDeskBarWrap<%p>::Initialize()\n", this);
290 HRESULT hr
= m_IInitializeObject
->Initialize();
291 WrapLogExit("CMenuDeskBarWrap::Initialize()", hr
);
295 // *** IOleCommandTarget methods ***
296 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
298 WrapLogEnter("CMenuDeskBarWrap<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
299 HRESULT hr
= m_IOleCommandTarget
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
300 if (pguidCmdGroup
) WrapLogPost("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
301 WrapLogExit("CMenuDeskBarWrap::QueryStatus()", hr
);
305 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
307 WrapLogEnter("CMenuDeskBarWrap<%p>::Exec(const GUID *pguidCmdGroup=%p, DWORD nCmdID=%d, DWORD nCmdexecopt=%d, VARIANT *pvaIn=%p, VARIANT *pvaOut=%p)\n", this, pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
308 if (pguidCmdGroup
) WrapLogPost("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
309 HRESULT hr
= m_IOleCommandTarget
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
310 WrapLogExit("CMenuDeskBarWrap::Exec()", hr
);
314 // *** IServiceProvider methods ***
315 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
317 WrapLogEnter("CMenuDeskBarWrap<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService
), Wrap(riid
), ppvObject
);
319 if (IsEqualIID(guidService
, SID_SMenuPopup
))
321 WrapLogPre("SID is SID_SMenuPopup. Using QueryInterface of self instead of wrapped object.\n");
322 HRESULT hr
= this->QueryInterface(riid
, ppvObject
);
325 if (ppvObject
) WrapLogPost("*ppvObject=%p\n", *ppvObject
);
326 WrapLogExit("CMenuDeskBarWrap::QueryService()", hr
);
331 WrapLogPre("QueryInterface on wrapper failed. Handing over to innter object.\n");
334 else if (IsEqualIID(guidService
, SID_SMenuBandParent
))
336 WrapLogPre("SID is SID_SMenuBandParent. Using QueryInterface of self instead of wrapped object.\n");
337 HRESULT hr
= this->QueryInterface(riid
, ppvObject
);
340 if (ppvObject
) WrapLogPost("*ppvObject=%p\n", *ppvObject
);
341 WrapLogExit("CMenuDeskBarWrap::QueryService()", hr
);
346 WrapLogPre("QueryInterface on wrapper failed. Handing over to innter object.\n");
349 else if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
351 WrapLogPre("SID is SID_STopLevelBrowser. Using QueryInterface of self instead of wrapped object.\n");
352 HRESULT hr
= this->QueryInterface(riid
, ppvObject
);
355 if (ppvObject
) WrapLogPost("*ppvObject=%p\n", *ppvObject
);
356 WrapLogExit("CMenuDeskBarWrap::QueryService()", hr
);
361 WrapLogPre("QueryInterface on wrapper failed. Handing over to innter object.\n");
366 WrapLogPre("SID not identified. Calling wrapped object's QueryService.\n");
368 HRESULT hr
= m_IServiceProvider
->QueryService(guidService
, riid
, ppvObject
);
369 if (ppvObject
) WrapLogPost("*ppvObject=%p\n", *ppvObject
);
370 WrapLogExit("CMenuDeskBarWrap::QueryService()", hr
);
374 // *** IInputObjectSite methods ***
375 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
)
377 WrapLogEnter("CMenuDeskBarWrap<%p>::OnFocusChangeIS(LPUNKNOWN lpUnknown=%p, BOOL bFocus=%d)\n", this, lpUnknown
, bFocus
);
378 HRESULT hr
= m_IInputObjectSite
->OnFocusChangeIS(lpUnknown
, bFocus
);
379 WrapLogExit("CMenuDeskBarWrap::OnFocusChangeIS()", hr
);
383 // *** IInputObject methods ***
384 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::UIActivateIO(BOOL bActivating
, LPMSG lpMsg
)
386 WrapLogEnter("CMenuDeskBarWrap<%p>::UIActivateIO(BOOL bActivating=%d, LPMSG lpMsg=%p)\n", this, bActivating
, lpMsg
);
387 HRESULT hr
= m_IInputObject
->UIActivateIO(bActivating
, lpMsg
);
388 WrapLogExit("CMenuDeskBarWrap::UIActivateIO()", hr
);
392 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::HasFocusIO(THIS
)
394 WrapLogEnter("CMenuDeskBarWrap<%p>::HasFocusIO()\n", this);
395 HRESULT hr
= m_IInputObject
->HasFocusIO();
396 WrapLogExit("CMenuDeskBarWrap::HasFocusIO()", hr
);
400 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::TranslateAcceleratorIO(LPMSG lpMsg
)
402 WrapLogEnter("CMenuDeskBarWrap<%p>::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", this, lpMsg
);
403 if (lpMsg
) WrapLogPre("*lpMsg=%s\n", Wrap(*lpMsg
));
404 HRESULT hr
= m_IInputObject
->TranslateAcceleratorIO(lpMsg
);
405 WrapLogExit("CMenuDeskBarWrap::TranslateAcceleratorIO()", hr
);
409 // *** IDeskBar methods ***
410 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::SetClient(IUnknown
*punkClient
)
412 WrapLogEnter("CMenuDeskBarWrap<%p>::SetClient(IUnknown *punkClient=%p)\n", this, punkClient
);
413 HRESULT hr
= m_IDeskBar
->SetClient(punkClient
);
414 WrapLogExit("CMenuDeskBarWrap::SetClient()", hr
);
416 CComPtr
<IDeskBarClient
> dbc
;
417 punkClient
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &dbc
));
418 dbc
->SetDeskBarSite(static_cast<IDeskBar
*>(this));
423 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::GetClient(IUnknown
**ppunkClient
)
425 WrapLogEnter("CMenuDeskBarWrap<%p>::GetClient(IUnknown **ppunkClient=%p)\n", this, ppunkClient
);
426 HRESULT hr
= m_IDeskBar
->GetClient(ppunkClient
);
427 if (ppunkClient
) WrapLogPost("*ppunkClient=%p\n", *ppunkClient
);
428 WrapLogExit("CMenuDeskBarWrap::GetClient()", hr
);
432 HRESULT STDMETHODCALLTYPE
CMenuDeskBarWrap::OnPosRectChangeDB(LPRECT prc
)
434 WrapLogEnter("CMenuDeskBarWrap<%p>::OnPosRectChangeDB(RECT *prc=%p)\n", this, prc
);
435 HRESULT hr
= m_IDeskBar
->OnPosRectChangeDB(prc
);
436 if (prc
) WrapLogPost("*prc=%s\n", Wrap(*prc
));
437 WrapLogExit("CMenuDeskBarWrap::OnPosRectChangeDB()", hr
);