[BROWSEUI]

* Moved some code from ParseNow into Execute, pending future improvements to the code flow.

svn path=/branches/shell-experiments/; revision=63378
This commit is contained in:
David Quintana 2014-05-19 21:55:09 +00:00
parent 564f732c7c
commit 24010ffd80
4 changed files with 62 additions and 15 deletions

View file

@ -525,6 +525,7 @@ LRESULT CAddressBand::OnNotifyClick(WPARAM wParam, NMHDR *notifyHeader, BOOL &bH
if (notifyHeader->hwndFrom == fGoButton) if (notifyHeader->hwndFrom == fGoButton)
{ {
fAddressEditBox->ParseNow(0); fAddressEditBox->ParseNow(0);
fAddressEditBox->Execute(0);
} }
return 0; return 0;
} }

View file

@ -68,17 +68,25 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::Refresh(long param8)
HRESULT STDMETHODCALLTYPE CAddressEditBox::Init(HWND comboboxEx, HWND editControl, long param14, IUnknown *param18) HRESULT STDMETHODCALLTYPE CAddressEditBox::Init(HWND comboboxEx, HWND editControl, long param14, IUnknown *param18)
{ {
CComPtr<IBrowserService> browserService;
fCombobox.SubclassWindow(comboboxEx); fCombobox.SubclassWindow(comboboxEx);
fEditWindow.SubclassWindow(editControl); fEditWindow.SubclassWindow(editControl);
fSite = param18; 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<IDispatch *>(this), DIID_DWebBrowserEvents, &fAdviseCookie);
}
return hResult;
} }
HRESULT STDMETHODCALLTYPE CAddressEditBox::SetCurrentDir(long paramC) HRESULT STDMETHODCALLTYPE CAddressEditBox::SetCurrentDir(long paramC)
{ {
LPWSTR strC = reinterpret_cast<LPWSTR>(paramC);
fEditWindow.SetWindowText(strC);
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -86,7 +94,6 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC)
{ {
WCHAR address[4096]; WCHAR address[4096];
ULONG eaten; ULONG eaten;
LPITEMIDLIST pidl;
ULONG attributes; ULONG attributes;
HRESULT hr; HRESULT hr;
HWND topLevelWindow; HWND topLevelWindow;
@ -100,17 +107,39 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC)
CComPtr<IShellFolder> psfDesktop; CComPtr<IShellFolder> psfDesktop;
hr = SHGetDesktopFolder(&psfDesktop); hr = SHGetDesktopFolder(&psfDesktop);
hr = psfDesktop->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidl, &attributes); hr = psfDesktop->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidlLastParsed, &attributes);
if (SUCCEEDED(hr))
{
hr = pisb->BrowseObject(pidl, 0);
}
return hr; return hr;
} }
HRESULT STDMETHODCALLTYPE CAddressEditBox::Execute(long paramC) HRESULT STDMETHODCALLTYPE CAddressEditBox::Execute(long paramC)
{ {
return E_NOTIMPL; HRESULT hr;
if (!pidlLastParsed)
return E_FAIL;
CComPtr<IShellBrowser> 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<IShellFolder> sf;
CComPtr<IShellBrowser> 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) HRESULT STDMETHODCALLTYPE CAddressEditBox::Save(long paramC)
@ -127,7 +156,11 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::OnWinEvent(
HRESULT STDMETHODCALLTYPE CAddressEditBox::IsWindowOwner(HWND hWnd) 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( HRESULT STDMETHODCALLTYPE CAddressEditBox::QueryStatus(
@ -161,8 +194,16 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::GetIDsOfNames(
HRESULT STDMETHODCALLTYPE CAddressEditBox::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, HRESULT STDMETHODCALLTYPE CAddressEditBox::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{ {
// on navigate complete, change edit section of combobox if (pDispParams == NULL)
return E_NOTIMPL; return E_INVALIDARG;
switch (dispIdMember)
{
case DISPID_NAVIGATECOMPLETE2:
case DISPID_DOCUMENTCOMPLETE:
pidlLastParsed = NULL;
}
return S_OK;
} }
HRESULT STDMETHODCALLTYPE CAddressEditBox::GetClassID(CLSID *pClassID) HRESULT STDMETHODCALLTYPE CAddressEditBox::GetClassID(CLSID *pClassID)

View file

@ -35,7 +35,9 @@ class CAddressEditBox :
private: private:
CContainedWindow fCombobox; CContainedWindow fCombobox;
CContainedWindow fEditWindow; CContainedWindow fEditWindow;
CComPtr<IUnknown> fSite; DWORD fAdviseCookie;
CComPtr<IUnknown> fSite;
LPITEMIDLIST pidlLastParsed;
public: public:
CAddressEditBox(); CAddressEditBox();
~CAddressEditBox(); ~CAddressEditBox();

View file

@ -826,6 +826,9 @@ HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags)
// called by shell view to browse to new folder // called by shell view to browse to new folder
// also called by explorer band to navigate to new folder // also called by explorer band to navigate to new folder
hResult = SHBindToFolder(pidl, &newFolder); hResult = SHBindToFolder(pidl, &newFolder);
if (FAILED(hResult))
return hResult;
newFolderSettings.ViewMode = FVM_ICON; newFolderSettings.ViewMode = FVM_ICON;
newFolderSettings.fFlags = 0; newFolderSettings.fFlags = 0;
hResult = BrowseToPath(newFolder, pidl, &newFolderSettings, flags); hResult = BrowseToPath(newFolder, pidl, &newFolderSettings, flags);