diff --git a/reactos/dll/win32/shell32/shell32_main.cpp b/reactos/dll/win32/shell32/shell32_main.cpp index ddd2f3caab9..d76d27bc353 100644 --- a/reactos/dll/win32/shell32/shell32_main.cpp +++ b/reactos/dll/win32/shell32/shell32_main.cpp @@ -1287,7 +1287,7 @@ OBJECT_ENTRY(CLSID_AdminFolderShortcut, CAdminToolsFolder) OBJECT_ENTRY(CLSID_RecycleBin, CRecycleBin) OBJECT_ENTRY(CLSID_OpenWithMenu, COpenWithMenu) OBJECT_ENTRY(CLSID_NewMenu, CNewMenu) -OBJECT_ENTRY(CLSID_StartMenu, CStartMenuCallback) +OBJECT_ENTRY(CLSID_StartMenu, CStartMenu) OBJECT_ENTRY(CLSID_MenuBandSite, CMenuBandSite) END_OBJECT_MAP() diff --git a/reactos/dll/win32/shell32/startmenu.cpp b/reactos/dll/win32/shell32/startmenu.cpp index 4c22b2b4352..442147c020b 100644 --- a/reactos/dll/win32/shell32/startmenu.cpp +++ b/reactos/dll/win32/shell32/startmenu.cpp @@ -22,148 +22,324 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell32start); -CStartMenuCallback::CStartMenuCallback() +CStartMenu::CStartMenu() +{ + m_pBandSite = NULL; + m_pUnkSite = NULL; +} + +CStartMenu::~CStartMenu() { } -CStartMenuCallback::~CStartMenuCallback() -{ -} - -HRESULT STDMETHODCALLTYPE CStartMenuCallback::SetSite(IUnknown *pUnkSite) +HRESULT STDMETHODCALLTYPE CStartMenu::ContextSensitiveHelp(BOOL fEnterMode) { + UNIMPLEMENTED; return E_NOTIMPL; } -HRESULT STDMETHODCALLTYPE CStartMenuCallback::GetSite(REFIID riid, void **ppvSite) +HRESULT STDMETHODCALLTYPE CStartMenu::GetWindow(HWND *phwnd) { + UNIMPLEMENTED; return E_NOTIMPL; } -HRESULT STDMETHODCALLTYPE CStartMenuCallback::CallbackSM(LPSMDATA psmd, UINT uMsg, WPARAM wParam, LPARAM lParam) +HRESULT STDMETHODCALLTYPE CStartMenu::GetClient(IUnknown **ppunkClient) { + TRACE("(%p, %p)\n", this, ppunkClient); + + *ppunkClient = (IUnknown*)m_pBandSite; + (*ppunkClient)->AddRef(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::OnPosRectChangeDB(LPRECT prc) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::SetClient(IUnknown *punkClient) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::OnSelect(DWORD dwSelectType) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::SetSubMenu(IMenuPopup *pmp, BOOL fSet) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::SetSite(IUnknown *pUnkSite) +{ + TRACE("(%p, %p)\n", this, pUnkSite); + + if (m_pUnkSite) + m_pUnkSite->Release(); + m_pUnkSite = pUnkSite; + if (m_pUnkSite) + m_pUnkSite->AddRef(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::GetSite(REFIID riid, void **ppvSite) +{ + TRACE("(%p, %s, %p)\n", this, debugstr_guid(&riid), ppvSite); + + if (!m_pUnkSite) + return E_FAIL; + + return m_pUnkSite->QueryInterface(riid, ppvSite); +} + +HRESULT STDMETHODCALLTYPE CStartMenu::Initialize() +{ + HRESULT hr; + CComObject *pBandSiteObj; + + TRACE("(%p)\n", this); + + //pBandSiteObj = new CComObject(); + ATLTRY (pBandSiteObj = new CComObject); + if (pBandSiteObj == NULL) + return E_OUTOFMEMORY; + + hr = pBandSiteObj->QueryInterface(IID_IBandSite, (VOID**)&m_pBandSite); + if (FAILED(hr)) + return NULL; + + return m_pBandSite->AddBand((IMenuBand*)this); +} + +HRESULT STDMETHODCALLTYPE CStartMenu::IsMenuMessage(MSG *pmsg) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CStartMenu::TranslateMenuMessage(MSG *pmsg, LRESULT *plRet) +{ + UNIMPLEMENTED; return E_NOTIMPL; } CMenuBandSite::CMenuBandSite() { + m_pObjects = NULL; + m_cObjects = 0; } CMenuBandSite::~CMenuBandSite() { } -HRESULT STDMETHODCALLTYPE CMenuBandSite::GetWindow(HWND *phwnd) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::ContextSensitiveHelp(BOOL fEnterMode) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::SetDeskBarSite(IUnknown *punkSite) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::SetModeDBC(DWORD dwMode) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::UIActivateDBC(DWORD dwState) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::GetSize(DWORD dwWhich, LPRECT prc) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::UIActivateIO(BOOL fActivate, LPMSG lpMsg) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::HasFocusIO() -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::TranslateAcceleratorIO(LPMSG lpMsg) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::OnWinEvent(HWND paramC, UINT param10, WPARAM param14, LPARAM param18, LRESULT *param1C) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::IsWindowOwner(HWND paramC) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) -{ - return E_NOTIMPL; -} - -HRESULT STDMETHODCALLTYPE CMenuBandSite::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) -{ - return E_NOTIMPL; -} - HRESULT STDMETHODCALLTYPE CMenuBandSite::AddBand(IUnknown *punk) { - return E_NOTIMPL; + IUnknown **pObjects; + + TRACE("punk %p\n", punk); + + if (!punk) + return E_FAIL; + + pObjects = (IUnknown**)CoTaskMemAlloc(sizeof(IUnknown*) * (m_cObjects + 1)); + if (!pObjects) + return E_FAIL; + + RtlMoveMemory(pObjects, m_pObjects, sizeof(IUnknown*) * m_cObjects); + + CoTaskMemFree(m_pObjects); + + m_pObjects = pObjects; + + m_pObjects[m_cObjects] = punk; + punk->AddRef(); + + m_cObjects++; + + return S_OK; } HRESULT STDMETHODCALLTYPE CMenuBandSite::EnumBands(UINT uBand, DWORD *pdwBandID) { - return E_NOTIMPL; + ULONG Index, ObjectCount; + + TRACE("uBand %uu pdwBandID %p\n", uBand, pdwBandID); + + if (uBand == (UINT)-1) + return m_cObjects; + + ObjectCount = 0; + + for(Index = 0; Index < m_cObjects; Index++) + { + if (m_pObjects[Index] != NULL) + { + if (uBand == ObjectCount) + { + *pdwBandID = Index; + return S_OK; + } + ObjectCount++; + } + } + return E_FAIL; } HRESULT STDMETHODCALLTYPE CMenuBandSite::QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) { + UNIMPLEMENTED; return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMenuBandSite::SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState) { + UNIMPLEMENTED; return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMenuBandSite::RemoveBand(DWORD dwBandID) { - return E_NOTIMPL; + TRACE("dwBandID %u\n", dwBandID); + + if (m_cObjects <= dwBandID) + return E_FAIL; + + if (m_pObjects[dwBandID]) + { + m_pObjects[dwBandID]->Release(); + m_pObjects[dwBandID] = NULL; + } + + return S_OK; } HRESULT STDMETHODCALLTYPE CMenuBandSite::GetBandObject(DWORD dwBandID, REFIID riid, VOID **ppv) { - return E_NOTIMPL; + TRACE("dwBandID %u riid %p ppv %p\n", dwBandID, riid, ppv); + + if (m_cObjects <= dwBandID) + return E_FAIL; + + if (m_pObjects[dwBandID]) + { + return m_pObjects[dwBandID]->QueryInterface(riid, ppv); + } + + return E_FAIL; } HRESULT STDMETHODCALLTYPE CMenuBandSite::SetBandSiteInfo(const BANDSITEINFO *pbsinfo) { + UNIMPLEMENTED; return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMenuBandSite::GetBandSiteInfo(BANDSITEINFO *pbsinfo) { + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::GetWindow(HWND *phwnd) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::ContextSensitiveHelp(BOOL fEnterMode) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::SetDeskBarSite(IUnknown *punkSite) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::SetModeDBC(DWORD dwMode) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::UIActivateDBC(DWORD dwState) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::GetSize(DWORD dwWhich, LPRECT prc) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::HasFocusIO() +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::TranslateAcceleratorIO(LPMSG lpMsg) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::OnWinEvent(HWND paramC, UINT param10, WPARAM param14, LPARAM param18, LRESULT *param1C) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::IsWindowOwner(HWND paramC) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CMenuBandSite::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + UNIMPLEMENTED; return E_NOTIMPL; } diff --git a/reactos/dll/win32/shell32/startmenu.h b/reactos/dll/win32/shell32/startmenu.h index d9773da4bbd..aa94e9d96f0 100644 --- a/reactos/dll/win32/shell32/startmenu.h +++ b/reactos/dll/win32/shell32/startmenu.h @@ -21,51 +21,91 @@ #ifndef _STARTMENU_H_ #define _STARTMENU_H_ -class CStartMenuCallback : - public CComCoClass, +class CStartMenu : + public CComCoClass, public CComObjectRootEx, + public IMenuPopup, public IObjectWithSite, - public IShellMenuCallback + public IInitializeObject, + public IMenuBand // FIXME { private: + IBandSite *m_pBandSite; + IUnknown *m_pUnkSite; + public: - CStartMenuCallback(); - ~CStartMenuCallback(); + CStartMenu(); + ~CStartMenu(); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd); + + // *** IDeskBar methods *** + virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown **ppunkClient); + virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(LPRECT prc); + virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient); + + // *** IMenuPopup methods *** + virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType); + virtual HRESULT STDMETHODCALLTYPE Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags); + virtual HRESULT STDMETHODCALLTYPE SetSubMenu(IMenuPopup *pmp, BOOL fSet); // *** IObjectWithSite methods *** virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); - // *** IShellMenuCallback methods *** - virtual HRESULT STDMETHODCALLTYPE CallbackSM(LPSMDATA psmd, UINT uMsg, WPARAM wParam, LPARAM lParam); + // *** IInitializeObject methods *** + virtual HRESULT STDMETHODCALLTYPE Initialize(); + + // *** IMenuBand methods *** FIXME + virtual HRESULT STDMETHODCALLTYPE IsMenuMessage(MSG *pmsg); + virtual HRESULT STDMETHODCALLTYPE TranslateMenuMessage(MSG *pmsg, LRESULT *plRet); -DECLARE_NO_REGISTRY() -DECLARE_NOT_AGGREGATABLE(CStartMenuCallback) +DECLARE_REGISTRY_RESOURCEID(IDR_STARTMENU) +DECLARE_NOT_AGGREGATABLE(CStartMenu) DECLARE_PROTECT_FINAL_CONSTRUCT() -BEGIN_COM_MAP(CStartMenuCallback) +BEGIN_COM_MAP(CStartMenu) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IDeskBar, IDeskBar) + COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup) COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) - COM_INTERFACE_ENTRY_IID(IID_IShellMenuCallback, IShellMenuCallback) + COM_INTERFACE_ENTRY_IID(IID_IInitializeObject, IInitializeObject) + COM_INTERFACE_ENTRY_IID(IID_IMenuBand, IMenuBand) // FIXME: Win does not export it END_COM_MAP() }; class CMenuBandSite : public CComCoClass, public CComObjectRootEx, + public IBandSite, public IDeskBarClient, + public IOleCommandTarget, public IInputObject, public IInputObjectSite, public IWinEventHandler, - public IServiceProvider, - public IOleCommandTarget, - public IBandSite + public IServiceProvider { private: + IUnknown **m_pObjects; + ULONG m_cObjects; + public: CMenuBandSite(); ~CMenuBandSite(); - + + // *** IBandSite methods *** + virtual HRESULT STDMETHODCALLTYPE AddBand(IUnknown *punk); + virtual HRESULT STDMETHODCALLTYPE EnumBands(UINT uBand, DWORD *pdwBandID); + virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); + virtual HRESULT STDMETHODCALLTYPE SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState); + virtual HRESULT STDMETHODCALLTYPE RemoveBand(DWORD dwBandID); + virtual HRESULT STDMETHODCALLTYPE GetBandObject(DWORD dwBandID, REFIID riid, VOID **ppv); + virtual HRESULT STDMETHODCALLTYPE SetBandSiteInfo(const BANDSITEINFO *pbsinfo); + virtual HRESULT STDMETHODCALLTYPE GetBandSiteInfo(BANDSITEINFO *pbsinfo); + // *** IOleWindow methods *** virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd); virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); @@ -76,6 +116,10 @@ public: virtual HRESULT STDMETHODCALLTYPE UIActivateDBC(DWORD dwState); virtual HRESULT STDMETHODCALLTYPE GetSize(DWORD dwWhich, LPRECT prc); + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + // *** IInputObject methods *** virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); @@ -91,34 +135,20 @@ public: // *** IServiceProvider methods *** virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); - // *** IOleCommandTarget methods *** - virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); - virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); - - // *** IBandSite methods *** - virtual HRESULT STDMETHODCALLTYPE AddBand(IUnknown *punk); - virtual HRESULT STDMETHODCALLTYPE EnumBands(UINT uBand, DWORD *pdwBandID); - virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); - virtual HRESULT STDMETHODCALLTYPE SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState); - virtual HRESULT STDMETHODCALLTYPE RemoveBand(DWORD dwBandID); - virtual HRESULT STDMETHODCALLTYPE GetBandObject(DWORD dwBandID, REFIID riid, VOID **ppv); - virtual HRESULT STDMETHODCALLTYPE SetBandSiteInfo(const BANDSITEINFO *pbsinfo); - virtual HRESULT STDMETHODCALLTYPE GetBandSiteInfo(BANDSITEINFO *pbsinfo); - DECLARE_REGISTRY_RESOURCEID(IDR_MENUBANDSITE) DECLARE_NOT_AGGREGATABLE(CMenuBandSite) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CMenuBandSite) + COM_INTERFACE_ENTRY_IID(IID_IBandSite, IBandSite) COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) COM_INTERFACE_ENTRY_IID(IID_IDeskBarClient, IDeskBarClient) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) - COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) - COM_INTERFACE_ENTRY_IID(IID_IBandSite, IBandSite) END_COM_MAP() };