https://git.reactos.org/?p=reactos.git;a=commitdiff;h=556cc8a7b27c427a94ee22364624122f5df006f8
commit 556cc8a7b27c427a94ee22364624122f5df006f8 Author: Whindmar Saksit <whinds...@proton.me> AuthorDate: Fri Feb 28 16:57:08 2025 +0100 Commit: GitHub <nore...@github.com> CommitDate: Fri Feb 28 16:57:08 2025 +0100 [BROWSEUI] Set find files pane focus (#7722) CORE-16424 --- dll/win32/browseui/shellfind/CSearchBar.cpp | 50 +++++++++++++++++++++++++++++ dll/win32/browseui/shellfind/CSearchBar.h | 1 + 2 files changed, 51 insertions(+) diff --git a/dll/win32/browseui/shellfind/CSearchBar.cpp b/dll/win32/browseui/shellfind/CSearchBar.cpp index b7d97123798..2ff47bfaf24 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.cpp +++ b/dll/win32/browseui/shellfind/CSearchBar.cpp @@ -20,6 +20,33 @@ WINE_DEFAULT_DEBUG_CHANNEL(shellfind); #define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__) #endif +static BOOL IsWindowChildOf(const HWND hNeedle, const HWND hRoot) +{ + if (hNeedle != hRoot) + { + for (HWND hParent = hNeedle; hParent;) + { + hParent = GetParent(hParent); + if (hParent == hRoot) + return TRUE; + } + } + return FALSE; +} + +static UINT GetShellViewItemCount(IShellView *pSV) +{ + int signedCount; + CComQIIDPtr<I_ID(IFolderView)> pFV(pSV); + if (pFV && SUCCEEDED(pFV->ItemCount(SVGIO_ALLVIEW, &signedCount))) + return signedCount; + UINT unsignedCount; + CComQIIDPtr<I_ID(IShellFolderView)> pSFV(pSV); + if (pSFV && SUCCEEDED(pSFV->GetObjectCount(&unsignedCount))) + return unsignedCount; + return 0; +} + CSearchBar::CSearchBar() : m_pSite(NULL), m_bVisible(FALSE) @@ -336,6 +363,8 @@ HRESULT STDMETHODCALLTYPE CSearchBar::ShowDW(BOOL fShow) { m_bVisible = fShow; ShowWindow(fShow); + if (fShow) + TrySetFocus(DISPID_WINDOWSTATECHANGED); return S_OK; } @@ -562,6 +591,7 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, L case DISPID_DOCUMENTCOMPLETE: { TrySubscribeToSearchEvents(); + TrySetFocus(DISPID_NAVIGATECOMPLETE2); // Remove the search results folder from the address box CComPtr<IDispatch> pDispatch; @@ -606,8 +636,28 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, L case DISPID_SEARCHCOMPLETE: case DISPID_SEARCHABORT: SetSearchInProgress(FALSE); + TrySetFocus(DISPID_SEARCHCOMPLETE); return S_OK; default: return E_INVALIDARG; } } + +void CSearchBar::TrySetFocus(UINT Source) +{ + CComPtr<IShellBrowser> pBrowser; + CComPtr<IShellView> pResultsSV; + if (SUCCEEDED(GetSearchResultsFolder(&pBrowser, NULL, NULL))) + pBrowser->QueryActiveShellView(&pResultsSV); + UINT cItems = pResultsSV ? GetShellViewItemCount(pResultsSV) : 0; + + // Attempt to set the focus if we are not in the results folder or if there are no results + HWND hWndFocus = ::GetFocus(); + if (!hWndFocus || !pResultsSV || cItems == 0) + { + BOOL IsOnButton = GetDlgItem(IDC_SEARCH_BUTTON) == hWndFocus; + BOOL IsOnSelfPane = hWndFocus == m_hWnd; + if (!hWndFocus || IsOnSelfPane || IsOnButton || !IsWindowChildOf(hWndFocus, m_hWnd)) + SendMessageW(WM_NEXTDLGCTL, (WPARAM)GetDlgItem(IDC_SEARCH_FILENAME), TRUE); + } +} diff --git a/dll/win32/browseui/shellfind/CSearchBar.h b/dll/win32/browseui/shellfind/CSearchBar.h index a798e368d5c..0a4ead4d307 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.h +++ b/dll/win32/browseui/shellfind/CSearchBar.h @@ -30,6 +30,7 @@ private: BOOL GetAddressEditBoxPath(WCHAR *szPath); void SetSearchInProgress(BOOL bInProgress); HRESULT TrySubscribeToSearchEvents(); + void TrySetFocus(UINT Source); // *** ATL event handlers *** LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);