From 24010ffd8053336a5b55377fdad1b4f4edc41f57 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Mon, 19 May 2014 21:55:09 +0000 Subject: [PATCH] [BROWSEUI] * Moved some code from ParseNow into Execute, pending future improvements to the code flow. svn path=/branches/shell-experiments/; revision=63378 --- dll/win32/browseui/addressband.cpp | 1 + dll/win32/browseui/addresseditbox.cpp | 69 +++++++++++++++++++++------ dll/win32/browseui/addresseditbox.h | 4 +- dll/win32/browseui/shellbrowser.cpp | 3 ++ 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/dll/win32/browseui/addressband.cpp b/dll/win32/browseui/addressband.cpp index 7518e97adb6..d4f9892a157 100644 --- a/dll/win32/browseui/addressband.cpp +++ b/dll/win32/browseui/addressband.cpp @@ -525,6 +525,7 @@ LRESULT CAddressBand::OnNotifyClick(WPARAM wParam, NMHDR *notifyHeader, BOOL &bH if (notifyHeader->hwndFrom == fGoButton) { fAddressEditBox->ParseNow(0); + fAddressEditBox->Execute(0); } return 0; } diff --git a/dll/win32/browseui/addresseditbox.cpp b/dll/win32/browseui/addresseditbox.cpp index 2a3448a99a3..72643454b54 100644 --- a/dll/win32/browseui/addresseditbox.cpp +++ b/dll/win32/browseui/addresseditbox.cpp @@ -68,17 +68,25 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::Refresh(long param8) HRESULT STDMETHODCALLTYPE CAddressEditBox::Init(HWND comboboxEx, HWND editControl, long param14, IUnknown *param18) { + CComPtr browserService; + fCombobox.SubclassWindow(comboboxEx); fEditWindow.SubclassWindow(editControl); fSite = param18; - return S_OK; + + // take advice to watch events + HRESULT hResult = IUnknown_QueryService(param18, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService)); + if (SUCCEEDED(hResult)) + { + if (SUCCEEDED(hResult)) + hResult = AtlAdvise(browserService, static_cast(this), DIID_DWebBrowserEvents, &fAdviseCookie); + } + + return hResult; } HRESULT STDMETHODCALLTYPE CAddressEditBox::SetCurrentDir(long paramC) { - LPWSTR strC = reinterpret_cast(paramC); - fEditWindow.SetWindowText(strC); - return E_NOTIMPL; } @@ -86,7 +94,6 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC) { WCHAR address[4096]; ULONG eaten; - LPITEMIDLIST pidl; ULONG attributes; HRESULT hr; HWND topLevelWindow; @@ -100,17 +107,39 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC) CComPtr psfDesktop; hr = SHGetDesktopFolder(&psfDesktop); - hr = psfDesktop->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidl, &attributes); - if (SUCCEEDED(hr)) - { - hr = pisb->BrowseObject(pidl, 0); - } + hr = psfDesktop->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidlLastParsed, &attributes); return hr; } HRESULT STDMETHODCALLTYPE CAddressEditBox::Execute(long paramC) { - return E_NOTIMPL; + HRESULT hr; + + if (!pidlLastParsed) + return E_FAIL; + + CComPtr pisb; + hr = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pisb)); + if (SUCCEEDED(hr)) + { + hr = pisb->BrowseObject(pidlLastParsed, 0); + if (FAILED(hr)) + { + HWND topLevelWindow; + LPCITEMIDLIST pidlChild; + CComPtr sf; + CComPtr pisb; + + hr = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pisb)); + + IUnknown_GetWindow(pisb, &topLevelWindow); + + hr = SHBindToParent(pidlLastParsed, IID_PPV_ARG(IShellFolder, &sf), &pidlChild); + + SHInvokeDefaultCommand(topLevelWindow, sf, pidlChild); + } + } + return hr; } HRESULT STDMETHODCALLTYPE CAddressEditBox::Save(long paramC) @@ -127,7 +156,11 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::OnWinEvent( HRESULT STDMETHODCALLTYPE CAddressEditBox::IsWindowOwner(HWND hWnd) { - return E_NOTIMPL; + if (fCombobox.m_hWnd == hWnd) + return S_OK; + if (fEditWindow.m_hWnd == hWnd) + return S_OK; + return S_FALSE; } HRESULT STDMETHODCALLTYPE CAddressEditBox::QueryStatus( @@ -161,8 +194,16 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::GetIDsOfNames( HRESULT STDMETHODCALLTYPE CAddressEditBox::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { - // on navigate complete, change edit section of combobox - return E_NOTIMPL; + if (pDispParams == NULL) + return E_INVALIDARG; + + switch (dispIdMember) + { + case DISPID_NAVIGATECOMPLETE2: + case DISPID_DOCUMENTCOMPLETE: + pidlLastParsed = NULL; + } + return S_OK; } HRESULT STDMETHODCALLTYPE CAddressEditBox::GetClassID(CLSID *pClassID) diff --git a/dll/win32/browseui/addresseditbox.h b/dll/win32/browseui/addresseditbox.h index 4e6b4172afb..99cf799ce0e 100644 --- a/dll/win32/browseui/addresseditbox.h +++ b/dll/win32/browseui/addresseditbox.h @@ -35,7 +35,9 @@ class CAddressEditBox : private: CContainedWindow fCombobox; CContainedWindow fEditWindow; - CComPtr fSite; + DWORD fAdviseCookie; + CComPtr fSite; + LPITEMIDLIST pidlLastParsed; public: CAddressEditBox(); ~CAddressEditBox(); diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index 7f8351969ba..28631b20470 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -826,6 +826,9 @@ HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags) // called by shell view to browse to new folder // also called by explorer band to navigate to new folder hResult = SHBindToFolder(pidl, &newFolder); + if (FAILED(hResult)) + return hResult; + newFolderSettings.ViewMode = FVM_ICON; newFolderSettings.fFlags = 0; hResult = BrowseToPath(newFolder, pidl, &newFolderSettings, flags);