[SHELL32] Initial partial IShellFolderViewCB implementation.

This commit is contained in:
Mark Jansen 2017-12-18 23:27:05 +01:00
parent 3f15a0d473
commit 0d07967a27
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B
2 changed files with 42 additions and 5 deletions

View file

@ -72,6 +72,7 @@ class CDefView :
private: private:
CComPtr<IShellFolder> m_pSFParent; CComPtr<IShellFolder> m_pSFParent;
CComPtr<IShellFolder2> m_pSF2Parent; CComPtr<IShellFolder2> m_pSF2Parent;
CComPtr<IShellFolderViewCB> m_pShellFolderViewCB;
CComPtr<IShellBrowser> m_pShellBrowser; CComPtr<IShellBrowser> m_pShellBrowser;
CComPtr<ICommDlgBrowser> m_pCommDlgBrowser; CComPtr<ICommDlgBrowser> m_pCommDlgBrowser;
CComPtr<IShellFolderViewDual> m_pShellFolderViewDual; CComPtr<IShellFolderViewDual> m_pShellFolderViewDual;
@ -113,6 +114,7 @@ class CDefView :
private: private:
HRESULT _MergeToolbar(); HRESULT _MergeToolbar();
BOOL _Sort(); BOOL _Sort();
VOID _DoFolderViewCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
public: public:
CDefView(); CDefView();
@ -951,6 +953,8 @@ HRESULT CDefView::FillList()
/*turn the listview's redrawing back on and force it to draw*/ /*turn the listview's redrawing back on and force it to draw*/
m_ListView.SetRedraw(TRUE); m_ListView.SetRedraw(TRUE);
_DoFolderViewCB(SFVM_LISTREFRESHED, NULL, NULL);
return S_OK; 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); 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)); m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW));
UpdateStatusbar(); UpdateStatusbar();
@ -1410,6 +1416,8 @@ LRESULT CDefView::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled
::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE); ::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE);
} }
_DoFolderViewCB(SFVM_SIZE, 0, 0);
return 0; return 0;
} }
@ -1757,6 +1765,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
TRACE("-- LVN_ITEMCHANGED %p\n", this); TRACE("-- LVN_ITEMCHANGED %p\n", this);
OnStateChange(CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */ OnStateChange(CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
UpdateStatusbar(); UpdateStatusbar();
_DoFolderViewCB(SFVM_SELECTIONCHANGED, NULL/* FIXME */, NULL/* FIXME */);
break; break;
case LVN_BEGINDRAG: case LVN_BEGINDRAG:
@ -2588,6 +2597,8 @@ HRESULT STDMETHODCALLTYPE CDefView::CreateViewWindow3(IShellBrowser *psb, IShell
if (!*hwnd) if (!*hwnd)
return E_FAIL; return E_FAIL;
_DoFolderViewCB(SFVM_WINDOWCREATED, (WPARAM)m_hWnd, NULL);
SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
UpdateWindow(); UpdateWindow();
@ -2796,8 +2807,11 @@ HRESULT STDMETHODCALLTYPE CDefView::GetItemSpacing(ITEMSPACING *spacing)
HRESULT STDMETHODCALLTYPE CDefView::SetCallback(IShellFolderViewCB *new_cb, IShellFolderViewCB **old_cb) HRESULT STDMETHODCALLTYPE CDefView::SetCallback(IShellFolderViewCB *new_cb, IShellFolderViewCB **old_cb)
{ {
FIXME("(%p)->(%p %p) stub\n", this, new_cb, old_cb); if (old_cb)
return E_NOTIMPL; *old_cb = m_pShellFolderViewCB.Detach();
m_pShellFolderViewCB = new_cb;
return S_OK;
} }
HRESULT STDMETHODCALLTYPE CDefView::Select(UINT flags) HRESULT STDMETHODCALLTYPE CDefView::Select(UINT flags)
@ -3231,6 +3245,14 @@ HRESULT CDefView::_MergeToolbar()
return S_OK; 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) HRESULT CDefView_CreateInstance(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut)
{ {
return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut); return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
@ -3273,6 +3295,15 @@ HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv,
if (FAILED(hRes)) if (FAILED(hRes))
return 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(); *ppsv = psv.Detach();
return hRes; return hRes;
} }

View file

@ -369,18 +369,24 @@ CDefaultContextMenu::LoadDynamicContextMenuHandler(HKEY hKey, const CLSID *pclsi
CComPtr<IContextMenu> pcm; CComPtr<IContextMenu> pcm;
hr = SHCoCreateInstance(NULL, pclsid, NULL, IID_PPV_ARG(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; return hr;
}
CComPtr<IShellExtInit> pExtInit; CComPtr<IShellExtInit> pExtInit;
hr = pcm->QueryInterface(IID_PPV_ARG(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; return hr;
}
hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey); hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey);
if (FAILED(hr)) 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; return hr;
} }