4 * Copyright 2009 Andrew Hill
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 WINE_DEFAULT_DEBUG_CHANNEL(shell32start
);
25 CStartMenu::CStartMenu() :
31 CStartMenu::~CStartMenu()
35 HRESULT STDMETHODCALLTYPE
CStartMenu::ContextSensitiveHelp(BOOL fEnterMode
)
41 HRESULT STDMETHODCALLTYPE
CStartMenu::GetWindow(HWND
*phwnd
)
47 HRESULT STDMETHODCALLTYPE
CStartMenu::GetClient(IUnknown
**ppunkClient
)
49 TRACE("(%p, %p)\n", this, ppunkClient
);
51 *ppunkClient
= (IUnknown
*)m_pBandSite
;
52 (*ppunkClient
)->AddRef();
56 HRESULT STDMETHODCALLTYPE
CStartMenu::OnPosRectChangeDB(LPRECT prc
)
62 HRESULT STDMETHODCALLTYPE
CStartMenu::SetClient(IUnknown
*punkClient
)
68 HRESULT STDMETHODCALLTYPE
CStartMenu::OnSelect(DWORD dwSelectType
)
74 HRESULT STDMETHODCALLTYPE
CStartMenu::Popup(POINTL
*ppt
, RECTL
*prcExclude
, MP_POPUPFLAGS dwFlags
)
80 HRESULT STDMETHODCALLTYPE
CStartMenu::SetSubMenu(IMenuPopup
*pmp
, BOOL fSet
)
86 HRESULT STDMETHODCALLTYPE
CStartMenu::SetSite(IUnknown
*pUnkSite
)
88 TRACE("(%p, %p)\n", this, pUnkSite
);
91 m_pUnkSite
->Release();
92 m_pUnkSite
= pUnkSite
;
98 HRESULT STDMETHODCALLTYPE
CStartMenu::GetSite(REFIID riid
, void **ppvSite
)
100 TRACE("(%p, %s, %p)\n", this, debugstr_guid(&riid
), ppvSite
);
105 return m_pUnkSite
->QueryInterface(riid
, ppvSite
);
108 HRESULT STDMETHODCALLTYPE
CStartMenu::Initialize()
111 CComObject
<CMenuBandSite
> *pBandSiteObj
;
113 TRACE("(%p)\n", this);
115 //pBandSiteObj = new CComObject<CMenuBandSite>();
116 ATLTRY (pBandSiteObj
= new CComObject
<CMenuBandSite
>);
117 if (pBandSiteObj
== NULL
)
118 return E_OUTOFMEMORY
;
120 hr
= pBandSiteObj
->QueryInterface(IID_PPV_ARG(IBandSite
, &m_pBandSite
));
124 return m_pBandSite
->AddBand((IMenuBand
*)this);
127 HRESULT STDMETHODCALLTYPE
CStartMenu::IsMenuMessage(MSG
*pmsg
)
133 HRESULT STDMETHODCALLTYPE
CStartMenu::TranslateMenuMessage(MSG
*pmsg
, LRESULT
*plRet
)
139 CMenuBandSite::CMenuBandSite() :
145 CMenuBandSite::~CMenuBandSite()
149 HRESULT STDMETHODCALLTYPE
CMenuBandSite::AddBand(IUnknown
*punk
)
153 TRACE("punk %p\n", punk
);
158 pObjects
= (IUnknown
**)CoTaskMemAlloc(sizeof(IUnknown
*) * (m_cObjects
+ 1));
162 RtlMoveMemory(pObjects
, m_pObjects
, sizeof(IUnknown
*) * m_cObjects
);
164 CoTaskMemFree(m_pObjects
);
166 m_pObjects
= pObjects
;
168 m_pObjects
[m_cObjects
] = punk
;
176 HRESULT STDMETHODCALLTYPE
CMenuBandSite::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
178 ULONG Index
, ObjectCount
;
180 TRACE("uBand %uu pdwBandID %p\n", uBand
, pdwBandID
);
182 if (uBand
== (UINT
)-1)
187 for (Index
= 0; Index
< m_cObjects
; Index
++)
189 if (m_pObjects
[Index
] != NULL
)
191 if (uBand
== ObjectCount
)
202 HRESULT STDMETHODCALLTYPE
CMenuBandSite::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
208 HRESULT STDMETHODCALLTYPE
CMenuBandSite::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
214 HRESULT STDMETHODCALLTYPE
CMenuBandSite::RemoveBand(DWORD dwBandID
)
216 TRACE("dwBandID %u\n", dwBandID
);
218 if (m_cObjects
<= dwBandID
)
221 if (m_pObjects
[dwBandID
])
223 m_pObjects
[dwBandID
]->Release();
224 m_pObjects
[dwBandID
] = NULL
;
230 HRESULT STDMETHODCALLTYPE
CMenuBandSite::GetBandObject(DWORD dwBandID
, REFIID riid
, VOID
**ppv
)
232 TRACE("dwBandID %u riid %p ppv %p\n", dwBandID
, riid
, ppv
);
234 if (m_cObjects
<= dwBandID
)
237 if (m_pObjects
[dwBandID
])
239 return m_pObjects
[dwBandID
]->QueryInterface(riid
, ppv
);
245 HRESULT STDMETHODCALLTYPE
CMenuBandSite::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
251 HRESULT STDMETHODCALLTYPE
CMenuBandSite::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
257 HRESULT STDMETHODCALLTYPE
CMenuBandSite::GetWindow(HWND
*phwnd
)
263 HRESULT STDMETHODCALLTYPE
CMenuBandSite::ContextSensitiveHelp(BOOL fEnterMode
)
269 HRESULT STDMETHODCALLTYPE
CMenuBandSite::SetDeskBarSite(IUnknown
*punkSite
)
275 HRESULT STDMETHODCALLTYPE
CMenuBandSite::SetModeDBC(DWORD dwMode
)
281 HRESULT STDMETHODCALLTYPE
CMenuBandSite::UIActivateDBC(DWORD dwState
)
287 HRESULT STDMETHODCALLTYPE
CMenuBandSite::GetSize(DWORD dwWhich
, LPRECT prc
)
293 HRESULT STDMETHODCALLTYPE
CMenuBandSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
299 HRESULT STDMETHODCALLTYPE
CMenuBandSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
305 HRESULT STDMETHODCALLTYPE
CMenuBandSite::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
311 HRESULT STDMETHODCALLTYPE
CMenuBandSite::HasFocusIO()
317 HRESULT STDMETHODCALLTYPE
CMenuBandSite::TranslateAcceleratorIO(LPMSG lpMsg
)
323 HRESULT STDMETHODCALLTYPE
CMenuBandSite::OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
)
329 HRESULT STDMETHODCALLTYPE
CMenuBandSite::OnWinEvent(HWND paramC
, UINT param10
, WPARAM param14
, LPARAM param18
, LRESULT
*param1C
)
335 HRESULT STDMETHODCALLTYPE
CMenuBandSite::IsWindowOwner(HWND paramC
)
341 HRESULT STDMETHODCALLTYPE
CMenuBandSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)