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
24 WINE_DEFAULT_DEBUG_CHANNEL(menusite
);
27 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
29 public IDeskBarClient
,
30 public IOleCommandTarget
,
32 public IInputObjectSite
,
33 public IWinEventHandler
,
34 public IServiceProvider
40 HRESULT
InitWrap(IBandSite
* bandSite
);
43 CComPtr
<IBandSite
> m_IBandSite
;
44 CComPtr
<IDeskBarClient
> m_IDeskBarClient
;
45 CComPtr
<IOleWindow
> m_IOleWindow
;
46 CComPtr
<IOleCommandTarget
> m_IOleCommandTarget
;
47 CComPtr
<IInputObject
> m_IInputObject
;
48 CComPtr
<IInputObjectSite
> m_IInputObjectSite
;
49 CComPtr
<IWinEventHandler
> m_IWinEventHandler
;
50 CComPtr
<IServiceProvider
> m_IServiceProvider
;
54 virtual HRESULT STDMETHODCALLTYPE
AddBand(IUnknown
* punk
);
55 virtual HRESULT STDMETHODCALLTYPE
EnumBands(UINT uBand
, DWORD
* pdwBandID
);
56 virtual HRESULT STDMETHODCALLTYPE
QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
);
57 virtual HRESULT STDMETHODCALLTYPE
GetBandObject(DWORD dwBandID
, REFIID riid
, VOID
**ppv
);
58 virtual HRESULT STDMETHODCALLTYPE
GetBandSiteInfo(BANDSITEINFO
*pbsinfo
);
59 virtual HRESULT STDMETHODCALLTYPE
RemoveBand(DWORD dwBandID
);
60 virtual HRESULT STDMETHODCALLTYPE
SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
);
61 virtual HRESULT STDMETHODCALLTYPE
SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
);
64 virtual HRESULT STDMETHODCALLTYPE
SetDeskBarSite(IUnknown
*punkSite
);
65 virtual HRESULT STDMETHODCALLTYPE
SetModeDBC(DWORD dwMode
);
66 virtual HRESULT STDMETHODCALLTYPE
GetSize(DWORD dwWhich
, LPRECT prc
);
67 virtual HRESULT STDMETHODCALLTYPE
UIActivateDBC(DWORD dwState
);
70 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*phwnd
);
71 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
74 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
* pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
);
75 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
* pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
78 virtual HRESULT STDMETHODCALLTYPE
UIActivateIO(BOOL fActivate
, LPMSG lpMsg
);
79 virtual HRESULT STDMETHODCALLTYPE
HasFocusIO();
80 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorIO(LPMSG lpMsg
);
83 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
86 virtual HRESULT STDMETHODCALLTYPE
IsWindowOwner(HWND hWnd
);
87 virtual HRESULT STDMETHODCALLTYPE
OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
90 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
92 DECLARE_NOT_AGGREGATABLE(CMenuSiteWrap
)
93 DECLARE_PROTECT_FINAL_CONSTRUCT()
94 BEGIN_COM_MAP(CMenuSiteWrap
)
95 COM_INTERFACE_ENTRY_IID(IID_IBandSite
, IBandSite
)
96 COM_INTERFACE_ENTRY_IID(IID_IDeskBarClient
, IDeskBarClient
)
97 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
98 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
99 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
100 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
101 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler
, IWinEventHandler
)
102 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
107 HRESULT WINAPI
CMenuSite_Wrapper(IBandSite
* bandSite
, REFIID riid
, LPVOID
*ppv
)
113 CMenuSiteWrap
* site
= new CComObject
<CMenuSiteWrap
>();
116 return E_OUTOFMEMORY
;
118 hr
= site
->InitWrap(bandSite
);
119 if (FAILED_UNEXPECTEDLY(hr
))
125 hr
= site
->QueryInterface(riid
, ppv
);
127 if (FAILED_UNEXPECTEDLY(hr
))
133 HRESULT
CMenuSiteWrap::InitWrap(IBandSite
* bandSite
)
139 m_IBandSite
= bandSite
;
141 hr
= bandSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &m_IDeskBarClient
));
142 if (FAILED_UNEXPECTEDLY(hr
)) return hr
;
143 hr
= bandSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_IOleWindow
));
144 if (FAILED_UNEXPECTEDLY(hr
)) return hr
;
145 hr
= bandSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &m_IOleCommandTarget
));
146 if (FAILED_UNEXPECTEDLY(hr
)) return hr
;
147 hr
= bandSite
->QueryInterface(IID_PPV_ARG(IInputObject
, &m_IInputObject
));
148 if (FAILED_UNEXPECTEDLY(hr
)) return hr
;
149 hr
= bandSite
->QueryInterface(IID_PPV_ARG(IInputObjectSite
, &m_IInputObjectSite
));
150 if (FAILED_UNEXPECTEDLY(hr
)) return hr
;
151 hr
= bandSite
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &m_IWinEventHandler
));
152 if (FAILED_UNEXPECTEDLY(hr
)) return hr
;
153 hr
= bandSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &m_IServiceProvider
));
157 CMenuSiteWrap::~CMenuSiteWrap()
163 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::AddBand(IUnknown
* punk
)
165 WrapLogEnter("CMenuSiteWrap<%p>::AddBand(IUnknown * punk=%p)\n", this, punk
);
166 HRESULT hr
= m_IBandSite
->AddBand(punk
);
167 WrapLogExit("CMenuSiteWrap::AddBand()", hr
);
171 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::EnumBands(UINT uBand
, DWORD
* pdwBandID
)
173 WrapLogEnter("CMenuSiteWrap<%p>::EnumBands(UINT uBand=%u, DWORD* pdwBandID=%p)\n", this, uBand
, pdwBandID
);
174 HRESULT hr
= m_IBandSite
->EnumBands(uBand
, pdwBandID
);
175 if (pdwBandID
) WrapLogPost("*pdwBandID=%d\n", *pdwBandID
);
176 WrapLogExit("CMenuSiteWrap::EnumBands()", hr
);
180 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
182 WrapLogEnter("CMenuSiteWrap<%p>::QueryBand(DWORD dwBandID=%d, IDeskBand **ppstb=%p, DWORD *pdwState=%p, LPWSTR pszName=%p, int cchName=%d)\n", this, dwBandID
, ppstb
, pdwState
, pszName
, cchName
);
183 HRESULT hr
= m_IBandSite
->QueryBand(dwBandID
, ppstb
, pdwState
, pszName
, cchName
);
184 if (ppstb
) WrapLogPost("*ppstb=%p\n", *ppstb
);
185 if (pdwState
) WrapLogPost("*pdwState=%d\n", *pdwState
);
186 WrapLogExit("CMenuSiteWrap::QueryBand()", hr
);
190 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::GetBandObject(DWORD dwBandID
, REFIID riid
, VOID
**ppv
)
192 WrapLogEnter("CMenuSiteWrap<%p>::GetBandObject(DWORD dwBandID=%d, REFIID riid=%s, VOID **ppv=%p)\n", this, dwBandID
, Wrap(riid
), ppv
);
193 HRESULT hr
= m_IBandSite
->GetBandObject(dwBandID
, riid
, ppv
);
194 if (ppv
) WrapLogPost("*ppv=%p\n", *ppv
);
195 WrapLogExit("CMenuSiteWrap::GetBandObject()", hr
);
199 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
201 WrapLogEnter("CMenuSiteWrap<%p>::GetBandSiteInfo(BANDSITEINFO *pbsinfo=%p)\n", this, pbsinfo
);
202 HRESULT hr
= m_IBandSite
->GetBandSiteInfo(pbsinfo
);
203 if (pbsinfo
) WrapLogPost("*pbsinfo=%s\n", Wrap(*pbsinfo
));
204 WrapLogExit("CMenuSiteWrap::GetBandSiteInfo()", hr
);
208 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::RemoveBand(DWORD dwBandID
)
210 WrapLogEnter("CMenuSiteWrap<%p>::RemoveBand(DWORD dwBandID=%d)\n", this, dwBandID
);
211 HRESULT hr
= m_IBandSite
->RemoveBand(dwBandID
);
212 WrapLogExit("CMenuSiteWrap::RemoveBand()", hr
);
216 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
218 WrapLogEnter("CMenuSiteWrap<%p>::SetBandSiteInfo(const BANDSITEINFO *pbsinfo=%p)\n", this, pbsinfo
);
219 //if (phwnd) WrapLogPost("*pbsinfo=%s\n", Wrap(*pbsinfo));
220 HRESULT hr
= m_IBandSite
->SetBandSiteInfo(pbsinfo
);
221 WrapLogExit("CMenuSiteWrap::SetBandSiteInfo()", hr
);
225 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
227 WrapLogEnter("CMenuSiteWrap<%p>::SetBandState(DWORD dwBandID=%d, DWORD dwMask=%08x, DWORD dwState=%d)\n", this, dwBandID
, dwMask
, dwState
);
228 HRESULT hr
= m_IBandSite
->SetBandState(dwBandID
, dwMask
, dwState
);
229 WrapLogExit("CMenuSiteWrap::SetBandState()", hr
);
233 // *** IDeskBarClient ***
234 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::SetDeskBarSite(IUnknown
*punkSite
)
236 WrapLogEnter("CMenuSiteWrap<%p>::SetDeskBarSite(IUnknown *punkSite=%p)\n", this, punkSite
);
237 HRESULT hr
= m_IDeskBarClient
->SetDeskBarSite(punkSite
);
238 WrapLogExit("CMenuSiteWrap::SetDeskBarSite()", hr
);
242 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::SetModeDBC(DWORD dwMode
)
244 WrapLogEnter("CMenuSiteWrap<%p>::SetModeDBC(DWORD dwMode=%d)\n", this, dwMode
);
245 HRESULT hr
= m_IDeskBarClient
->SetModeDBC(dwMode
);
246 WrapLogExit("CMenuSiteWrap::SetModeDBC()", hr
);
250 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::GetSize(DWORD dwWhich
, LPRECT prc
)
252 WrapLogEnter("CMenuSiteWrap<%p>::GetSize(DWORD dwWhich=%d, LPRECT prc=%p)\n", this, dwWhich
, prc
);
253 HRESULT hr
= m_IDeskBarClient
->GetSize(dwWhich
, prc
);
254 if (prc
) WrapLogPost("*prc=%s\n", Wrap(*prc
));
255 WrapLogExit("CMenuSiteWrap::GetSize()", hr
);
259 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::UIActivateDBC(DWORD dwState
)
261 WrapLogEnter("CMenuSiteWrap<%p>::UIActivateDBC(DWORD dwState=%d)\n", this, dwState
);
262 HRESULT hr
= m_IDeskBarClient
->UIActivateDBC(dwState
);
263 WrapLogExit("CMenuSiteWrap::UIActivateDBC()", hr
);
267 // *** IOleWindow methods ***
268 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::GetWindow(HWND
*phwnd
)
270 WrapLogEnter("CMenuSiteWrap<%p>::GetWindow(HWND *phwnd=%p)\n", this, phwnd
);
271 HRESULT hr
= m_IOleWindow
->GetWindow(phwnd
);
272 if (phwnd
) WrapLogPost("*phwnd=%p\n", *phwnd
);
273 WrapLogExit("CMenuSiteWrap::GetWindow()", hr
);
277 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::ContextSensitiveHelp(BOOL fEnterMode
)
279 WrapLogEnter("CMenuSiteWrap<%p>::ContextSensitiveHelp(BOOL fEnterMode=%d)\n", this, fEnterMode
);
280 HRESULT hr
= m_IOleWindow
->ContextSensitiveHelp(fEnterMode
);
281 WrapLogExit("CMenuSiteWrap::ContextSensitiveHelp()", hr
);
285 // *** IOleCommandTarget methods ***
286 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
288 WrapLogEnter("CMenuSiteWrap<%p>::QueryStatus(const GUID *pguidCmdGroup=%p, ULONG cCmds=%u, prgCmds=%p, pCmdText=%p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
289 HRESULT hr
= m_IOleCommandTarget
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
290 if (pguidCmdGroup
) WrapLogPost("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
291 WrapLogExit("CMenuSiteWrap::QueryStatus()", hr
);
295 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
297 WrapLogEnter("CMenuSiteWrap<%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
);
298 if (pguidCmdGroup
) WrapLogPre("*pguidCmdGroup=%s\n", Wrap(*pguidCmdGroup
));
299 HRESULT hr
= m_IOleCommandTarget
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
300 WrapLogExit("CMenuSiteWrap::Exec()", hr
);
304 // *** IInputObject methods ***
305 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
307 WrapLogEnter("CMenuSiteWrap<%p>::UIActivateIO(BOOL fActivate=%d, LPMSG lpMsg=%p)\n", this, fActivate
, lpMsg
);
308 HRESULT hr
= m_IInputObject
->UIActivateIO(fActivate
, lpMsg
);
309 WrapLogExit("CMenuSiteWrap::UIActivateIO()", hr
);
313 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::HasFocusIO()
315 WrapLogEnter("CMenuSiteWrap<%p>::HasFocusIO()\n", this);
316 HRESULT hr
= m_IInputObject
->HasFocusIO();
317 WrapLogExit("CMenuSiteWrap::HasFocusIO()", hr
);
321 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::TranslateAcceleratorIO(LPMSG lpMsg
)
323 WrapLogEnter("CMenuSiteWrap<%p>::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", this, lpMsg
);
324 if (lpMsg
) WrapLogPre("*lpMsg=%s\n", Wrap(*lpMsg
));
325 HRESULT hr
= m_IInputObject
->TranslateAcceleratorIO(lpMsg
);
326 WrapLogExit("CMenuSiteWrap::TranslateAcceleratorIO()", hr
);
330 // *** IInputObjectSite methods ***
331 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::OnFocusChangeIS(LPUNKNOWN lpUnknown
, BOOL bFocus
)
333 WrapLogEnter("CMenuSiteWrap<%p>::OnFocusChangeIS(LPUNKNOWN lpUnknown=%p, BOOL bFocus=%d)\n", this, lpUnknown
, bFocus
);
334 HRESULT hr
= m_IInputObjectSite
->OnFocusChangeIS(lpUnknown
, bFocus
);
335 WrapLogExit("CMenuSiteWrap::OnFocusChangeIS()", hr
);
339 // *** IWinEventHandler methods ***
340 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
342 //WrapLogEnter("CMenuSiteWrap<%p>::OnWinEvent(HWND hWnd=%p, UINT uMsg=%u, WPARAM wParam=%08x, LPARAM lParam=%08x, LRESULT *theResult=%p)\n", this, hWnd, uMsg, wParam, lParam, theResult);
343 HRESULT hr
= m_IWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
344 //WrapLogExit("CMenuSiteWrap::OnWinEvent()", hr);
348 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::IsWindowOwner(HWND hWnd
)
350 //WrapLogEnter("CMenuSiteWrap<%p>::IsWindowOwner(HWND hWnd=%08x)\n", this, hWnd);
351 HRESULT hr
= m_IWinEventHandler
->IsWindowOwner(hWnd
);
352 //WrapLogExit("CMenuSiteWrap::IsWindowOwner()", hr);
356 // *** IServiceProvider methods ***
357 HRESULT STDMETHODCALLTYPE
CMenuSiteWrap::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
359 WrapLogEnter("CMenuSiteWrap<%p>::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", this, Wrap(guidService
), Wrap(riid
), ppvObject
);
360 HRESULT hr
= m_IServiceProvider
->QueryService(guidService
, riid
, ppvObject
);
361 if (ppvObject
) WrapLogPost("*ppvObject=%p\n", *ppvObject
);
362 WrapLogExit("CMenuSiteWrap::QueryService()", hr
);