From f118c64d6241edf5c5ee2e442973e2fd23bc29ac Mon Sep 17 00:00:00 2001 From: David Hedberg Date: Wed, 25 Aug 2010 15:24:35 +0200 Subject: [PATCH] shell32: Implement CommDlgBrowser::OnDefaultCommand in the ExplorerBrowser control. --- dlls/shell32/ebrowser.c | 42 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/dlls/shell32/ebrowser.c b/dlls/shell32/ebrowser.c index d53d08e1669..3ba15b90d91 100644 --- a/dlls/shell32/ebrowser.c +++ b/dlls/shell32/ebrowser.c @@ -1082,8 +1082,46 @@ static HRESULT WINAPI ICommDlgBrowser3_fnOnDefaultCommand(ICommDlgBrowser3 *ifac IShellView *shv) { ExplorerBrowserImpl *This = impl_from_ICommDlgBrowser3(iface); - FIXME("stub, %p (%p)\n", This, shv); - return E_NOTIMPL; + IDataObject *pdo; + HRESULT hr; + HRESULT ret = S_FALSE; + + TRACE("%p (%p)\n", This, shv); + + hr = IShellView_GetItemObject(shv, SVGIO_SELECTION, &IID_IDataObject, (void**)&pdo); + if(SUCCEEDED(hr)) + { + FORMATETC fmt; + STGMEDIUM medium; + + fmt.cfFormat = RegisterClipboardFormatW(CFSTR_SHELLIDLISTW); + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = TYMED_HGLOBAL; + + hr = IDataObject_GetData(pdo, &fmt ,&medium); + IDataObject_Release(pdo); + if(SUCCEEDED(hr)) + { + LPIDA pida = GlobalLock(medium.u.hGlobal); + LPCITEMIDLIST pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[1]); + + /* Handle folders by browsing to them. */ + if(_ILIsFolder(pidl_child) || _ILIsDrive(pidl_child) || _ILIsSpecialFolder(pidl_child)) + { + IExplorerBrowser_BrowseToIDList((IExplorerBrowser*)This, pidl_child, SBSP_RELATIVE); + ret = S_OK; + } + GlobalUnlock(medium.u.hGlobal); + GlobalFree(medium.u.hGlobal); + } + else + ERR("Failed to get data from IDataObject.\n"); + } else + ERR("Failed to get IDataObject.\n"); + + return ret; } static HRESULT WINAPI ICommDlgBrowser3_fnOnStateChange(ICommDlgBrowser3 *iface, IShellView *shv, ULONG uChange)