https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0d07967a27e747e57d551…
commit 0d07967a27e747e57d5518439e178565745f8f5b
Author: Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Mon Dec 18 23:27:05 2017 +0100
Commit: Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Sat Apr 7 15:29:53 2018 +0200
[SHELL32] Initial partial IShellFolderViewCB implementation.
---
dll/win32/shell32/CDefView.cpp | 35 +++++++++++++++++++++++++++++--
dll/win32/shell32/CDefaultContextMenu.cpp | 12 ++++++++---
2 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/dll/win32/shell32/CDefView.cpp b/dll/win32/shell32/CDefView.cpp
index 336b3fc534..33e5b5a760 100644
--- a/dll/win32/shell32/CDefView.cpp
+++ b/dll/win32/shell32/CDefView.cpp
@@ -72,6 +72,7 @@ class CDefView :
private:
CComPtr<IShellFolder> m_pSFParent;
CComPtr<IShellFolder2> m_pSF2Parent;
+ CComPtr<IShellFolderViewCB> m_pShellFolderViewCB;
CComPtr<IShellBrowser> m_pShellBrowser;
CComPtr<ICommDlgBrowser> m_pCommDlgBrowser;
CComPtr<IShellFolderViewDual> m_pShellFolderViewDual;
@@ -113,6 +114,7 @@ class CDefView :
private:
HRESULT _MergeToolbar();
BOOL _Sort();
+ VOID _DoFolderViewCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
public:
CDefView();
@@ -951,6 +953,8 @@ HRESULT CDefView::FillList()
/*turn the listview's redrawing back on and force it to draw*/
m_ListView.SetRedraw(TRUE);
+ _DoFolderViewCB(SFVM_LISTREFRESHED, NULL, NULL);
+
return S_OK;
}
@@ -1059,6 +1063,8 @@ LRESULT CDefView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL &bHandl
m_hNotify = SHChangeNotifyRegister(m_hWnd, SHCNRF_InterruptLevel |
SHCNRF_ShellLevel, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg);
}
+ /* _DoFolderViewCB(SFVM_GETNOTIFY, ?? ??) */
+
m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW));
UpdateStatusbar();
@@ -1410,6 +1416,8 @@ LRESULT CDefView::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL &bHandled
::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE);
}
+ _DoFolderViewCB(SFVM_SIZE, 0, 0);
+
return 0;
}
@@ -1757,6 +1765,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL &bHandl
TRACE("-- LVN_ITEMCHANGED %p\n", this);
OnStateChange(CDBOSC_SELCHANGE); /* the browser will get the IDataObject now
*/
UpdateStatusbar();
+ _DoFolderViewCB(SFVM_SELECTIONCHANGED, NULL/* FIXME */, NULL/* FIXME */);
break;
case LVN_BEGINDRAG:
@@ -2588,6 +2597,8 @@ HRESULT STDMETHODCALLTYPE CDefView::CreateViewWindow3(IShellBrowser
*psb, IShell
if (!*hwnd)
return E_FAIL;
+ _DoFolderViewCB(SFVM_WINDOWCREATED, (WPARAM)m_hWnd, NULL);
+
SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
UpdateWindow();
@@ -2796,8 +2807,11 @@ HRESULT STDMETHODCALLTYPE CDefView::GetItemSpacing(ITEMSPACING
*spacing)
HRESULT STDMETHODCALLTYPE CDefView::SetCallback(IShellFolderViewCB *new_cb,
IShellFolderViewCB **old_cb)
{
- FIXME("(%p)->(%p %p) stub\n", this, new_cb, old_cb);
- return E_NOTIMPL;
+ if (old_cb)
+ *old_cb = m_pShellFolderViewCB.Detach();
+
+ m_pShellFolderViewCB = new_cb;
+ return S_OK;
}
HRESULT STDMETHODCALLTYPE CDefView::Select(UINT flags)
@@ -3231,6 +3245,14 @@ HRESULT CDefView::_MergeToolbar()
return S_OK;
}
+VOID CDefView::_DoFolderViewCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ if (m_pShellFolderViewCB)
+ {
+ m_pShellFolderViewCB->MessageSFVCB(uMsg, wParam, lParam);
+ }
+}
+
HRESULT CDefView_CreateInstance(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut)
{
return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
@@ -3273,6 +3295,15 @@ HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv,
if (FAILED(hRes))
return hRes;
+ if (pcsfv->psfvcb)
+ {
+ CComPtr<IShellFolderView> sfv;
+ if (SUCCEEDED(psv->QueryInterface(IID_PPV_ARG(IShellFolderView, &sfv))))
+ {
+ sfv->SetCallback(pcsfv->psfvcb, NULL);
+ }
+ }
+
*ppsv = psv.Detach();
return hRes;
}
diff --git a/dll/win32/shell32/CDefaultContextMenu.cpp
b/dll/win32/shell32/CDefaultContextMenu.cpp
index fac9b50907..93ce54c984 100644
--- a/dll/win32/shell32/CDefaultContextMenu.cpp
+++ b/dll/win32/shell32/CDefaultContextMenu.cpp
@@ -369,18 +369,24 @@ CDefaultContextMenu::LoadDynamicContextMenuHandler(HKEY hKey, const
CLSID *pclsi
CComPtr<IContextMenu> pcm;
hr = SHCoCreateInstance(NULL, pclsid, NULL, IID_PPV_ARG(IContextMenu, &pcm));
- if (FAILED_UNEXPECTEDLY(hr))
+ if (FAILED(hr))
+ {
+ ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n",
wine_dbgstr_guid(pclsid), hr);
return hr;
+ }
CComPtr<IShellExtInit> pExtInit;
hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
- if (FAILED_UNEXPECTEDLY(hr))
+ if (FAILED(hr))
+ {
+ ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr
0x%x\n", wine_dbgstr_guid(pclsid), hr);
return hr;
+ }
hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey);
if (FAILED(hr))
{
- WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n",
wine_dbgstr_guid(pclsid), hr);
+ ERR("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n",
wine_dbgstr_guid(pclsid), hr);
return hr;
}