From: Brock Mammen Date: Sun, 25 Aug 2019 22:03:44 +0000 (-0500) Subject: [SHELLFIND] Subscribe to folders that are already opened X-Git-Tag: 0.4.14-dev~95 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=e6a5821e0c4e97ee7381bf1791d6b5c8aae5270a [SHELLFIND] Subscribe to folders that are already opened --- diff --git a/dll/win32/browseui/shellfind/CSearchBar.cpp b/dll/win32/browseui/shellfind/CSearchBar.cpp index fcfdc01d1b5..468569de36b 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.cpp +++ b/dll/win32/browseui/shellfind/CSearchBar.cpp @@ -46,24 +46,20 @@ LRESULT CSearchBar::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & if (FAILED_UNEXPECTEDLY(hResult)) return hResult; - CComPtr pShellService; - hResult = m_AddressEditBox->QueryInterface(IID_PPV_ARG(IShellService, &pShellService)); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; hResult = m_AddressEditBox->Init(hCombobox, hEditControl, 0, m_pSite); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; - CComPtr pDispatch; - hResult = m_AddressEditBox->QueryInterface(IID_PPV_ARG(IDispatch, &pDispatch)); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; - DISPPARAMS params = {0}; - hResult = pDispatch->Invoke(DISPID_NAVIGATECOMPLETE2, GUID_NULL, 0, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL); + // Subscribe to navigation events + CComPtr pShellBrowser; + hResult = IUnknown_QueryService(m_pSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pShellBrowser)); + DWORD dwAdviseCookie; + if (SUCCEEDED(hResult)) + AtlAdvise(pShellBrowser, static_cast(this), DIID_DWebBrowserEvents, &dwAdviseCookie); - hResult = pShellService->SetOwner(NULL); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; + // Invoke the navigate event in case a search results folder is already open + DISPPARAMS params = {0}; + Invoke(DISPID_NAVIGATECOMPLETE2, GUID_NULL, 0, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL); return 0; } @@ -188,14 +184,7 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndC if (FAILED_UNEXPECTEDLY(hr)) return hr; - CComPtr pShellFolder; - hr = GetSearchResultsFolder(*pShellBrowser, &hwnd, &pShellFolder); - if (FAILED_UNEXPECTEDLY(hr)) - return hr; - - // Subscribe to search events - DWORD fAdviseCookie; - hr = AtlAdvise(pShellFolder, static_cast(this), DIID_DSearchCommandEvents, &fAdviseCookie); + hr = GetSearchResultsFolder(&pShellBrowser, &hwnd, NULL); if (FAILED_UNEXPECTEDLY(hr)) return hr; } @@ -232,8 +221,9 @@ BOOL CSearchBar::GetAddressEditBoxPath(WCHAR (&szPath)[MAX_PATH]) item.cchTextMax = _countof(szItemText); SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item); - if (!wcscmp(szItemText, szPath) && SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szPath)) + if (!wcscmp(szItemText, szPath) && SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szItemText)) { + StringCbCopyW(szPath, MAX_PATH * sizeof(WCHAR), szItemText); return TRUE; } } @@ -588,12 +578,34 @@ void CSearchBar::SetSearchInProgress(BOOL bInProgress) ::PostMessage(hProgressBar, PBM_SETMARQUEE, bInProgress, 0); } +HRESULT CSearchBar::TrySubscribeToSearchEvents() +{ + CComPtr pShellFolder; + HRESULT hr = GetSearchResultsFolder(NULL, NULL, &pShellFolder); + if (FAILED(hr)) + return hr; + + DWORD fAdviseCookie; + hr = AtlAdvise(pShellFolder, static_cast(this), DIID_DSearchCommandEvents, &fAdviseCookie); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + return S_OK; +} + HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { - if (dispIdMember == DISPID_SEARCHCOMPLETE || dispIdMember == DISPID_SEARCHABORT) + switch (dispIdMember) { + case DISPID_NAVIGATECOMPLETE2: + case DISPID_DOCUMENTCOMPLETE: + TrySubscribeToSearchEvents(); + return S_OK; + case DISPID_SEARCHCOMPLETE: + case DISPID_SEARCHABORT: SetSearchInProgress(FALSE); return S_OK; + default: + return E_INVALIDARG; } - return E_INVALIDARG; } diff --git a/dll/win32/browseui/shellfind/CSearchBar.h b/dll/win32/browseui/shellfind/CSearchBar.h index 3459baae824..a885d08289a 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.h +++ b/dll/win32/browseui/shellfind/CSearchBar.h @@ -35,6 +35,7 @@ private: BOOL GetAddressEditBoxPath(WCHAR (&szPath)[MAX_PATH]); void SetSearchInProgress(BOOL bInProgress); HRESULT ExecuteCommand(CComPtr& menu, UINT nCmd); + HRESULT TrySubscribeToSearchEvents(); // *** ATL event handlers *** LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); @@ -113,6 +114,7 @@ public: BEGIN_COM_MAP(CSearchBar) COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) + COM_INTERFACE_ENTRY_IID(DIID_DWebBrowserEvents, IDispatch) COM_INTERFACE_ENTRY_IID(DIID_DSearchCommandEvents, IDispatch) COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate)