https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9a55c931f89915cbd69f9…
commit 9a55c931f89915cbd69f9401550a3398cf2e5d4f
Author: Whindmar Saksit <whindsaks(a)proton.me>
AuthorDate: Fri Feb 28 18:52:48 2025 +0100
Commit: GitHub <noreply(a)github.com>
CommitDate: Fri Feb 28 18:52:48 2025 +0100
[BROWSEUI][SHELL32] Fix desktop and computer find files locations (#7721)
- Searching the Desktop now searches the two desktop folders.
- Searching My Computer now searches all local disks.
- Adds a "Browse..." entry to the combobox list.
---
dll/win32/browseui/shellfind/CFindFolder.cpp | 28 ++-
dll/win32/browseui/shellfind/CSearchBar.cpp | 273 ++++++++++++++++++++++++---
dll/win32/browseui/shellfind/CSearchBar.h | 5 +-
dll/win32/browseui/shellfind/shellfind.h | 48 ++++-
dll/win32/shell32/lang/bg-BG.rc | 2 +
dll/win32/shell32/lang/ca-ES.rc | 2 +
dll/win32/shell32/lang/cs-CZ.rc | 2 +
dll/win32/shell32/lang/da-DK.rc | 2 +
dll/win32/shell32/lang/de-DE.rc | 2 +
dll/win32/shell32/lang/el-GR.rc | 2 +
dll/win32/shell32/lang/en-GB.rc | 2 +
dll/win32/shell32/lang/en-US.rc | 2 +
dll/win32/shell32/lang/es-ES.rc | 2 +
dll/win32/shell32/lang/et-EE.rc | 2 +
dll/win32/shell32/lang/eu-ES.rc | 2 +
dll/win32/shell32/lang/fi-FI.rc | 2 +
dll/win32/shell32/lang/fr-FR.rc | 2 +
dll/win32/shell32/lang/he-IL.rc | 3 +
dll/win32/shell32/lang/hi-IN.rc | 2 +
dll/win32/shell32/lang/hu-HU.rc | 2 +
dll/win32/shell32/lang/id-ID.rc | 2 +
dll/win32/shell32/lang/it-IT.rc | 2 +
dll/win32/shell32/lang/ja-JP.rc | 2 +
dll/win32/shell32/lang/ko-KR.rc | 2 +
dll/win32/shell32/lang/nl-NL.rc | 2 +
dll/win32/shell32/lang/no-NO.rc | 2 +
dll/win32/shell32/lang/pl-PL.rc | 2 +
dll/win32/shell32/lang/pt-BR.rc | 2 +
dll/win32/shell32/lang/pt-PT.rc | 2 +
dll/win32/shell32/lang/ro-RO.rc | 2 +
dll/win32/shell32/lang/ru-RU.rc | 2 +
dll/win32/shell32/lang/sk-SK.rc | 2 +
dll/win32/shell32/lang/sl-SI.rc | 2 +
dll/win32/shell32/lang/sq-AL.rc | 2 +
dll/win32/shell32/lang/sv-SE.rc | 2 +
dll/win32/shell32/lang/tr-TR.rc | 2 +
dll/win32/shell32/lang/uk-UA.rc | 2 +
dll/win32/shell32/lang/zh-CN.rc | 2 +
dll/win32/shell32/lang/zh-HK.rc | 2 +
dll/win32/shell32/lang/zh-TW.rc | 2 +
dll/win32/shell32/shresdef.h | 4 +
41 files changed, 398 insertions(+), 33 deletions(-)
diff --git a/dll/win32/browseui/shellfind/CFindFolder.cpp
b/dll/win32/browseui/shellfind/CFindFolder.cpp
index ea703158c30..4a08b8a0852 100644
--- a/dll/win32/browseui/shellfind/CFindFolder.cpp
+++ b/dll/win32/browseui/shellfind/CFindFolder.cpp
@@ -148,7 +148,7 @@ struct _SearchData
{
HWND hwnd;
HANDLE hStopEvent;
- CStringW szPath;
+ LOCATIONITEM *pPaths;
CStringW szFileName;
CStringA szQueryA;
CStringW szQueryW;
@@ -156,6 +156,11 @@ struct _SearchData
CStringA szQueryU8;
BOOL SearchHidden;
CComPtr<CFindFolder> pFindFolder;
+
+ ~_SearchData()
+ {
+ FreeList(pPaths);
+ }
};
template<typename TChar, typename TString, int (&StrNCmp)(const TChar *, const
TChar *, size_t)>
@@ -461,11 +466,17 @@ DWORD WINAPI CFindFolder::SearchThreadProc(LPVOID lpParameter)
{
_SearchData *data = static_cast<_SearchData*>(lpParameter);
+ SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
+
HRESULT hrCoInit = CoInitializeEx(NULL, COINIT_MULTITHREADED);
data->pFindFolder->NotifyConnections(DISPID_SEARCHSTART);
- UINT uTotalFound = RecursiveFind(data->szPath, data);
+ UINT uTotalFound = 0;
+ for (LOCATIONITEM *pLocation = data->pPaths; pLocation; pLocation =
pLocation->pNext)
+ {
+ uTotalFound += RecursiveFind(pLocation->szPath, data);
+ }
data->pFindFolder->NotifyConnections(DISPID_SEARCHCOMPLETE);
@@ -521,7 +532,7 @@ LRESULT CFindFolder::StartSearch(UINT uMsg, WPARAM wParam, LPARAM
lParam, BOOL &
pSearchData->hwnd = m_hWnd;
SearchStart *pSearchParams = (SearchStart *) lParam;
- pSearchData->szPath = pSearchParams->szPath;
+ pSearchData->pPaths = pSearchParams->pPaths;
pSearchData->szFileName = pSearchParams->szFileName;
pSearchData->szQueryA = pSearchParams->szQuery;
pSearchData->szQueryW = pSearchParams->szQuery;
@@ -589,12 +600,15 @@ LRESULT CFindFolder::StartSearch(UINT uMsg, WPARAM wParam, LPARAM
lParam, BOOL &
SetEvent(m_hStopEvent);
pSearchData->hStopEvent = m_hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- if (!SHCreateThread(SearchThreadProc, pSearchData, NULL, NULL))
+ if (!SHCreateThread(SearchThreadProc, pSearchData, 0, NULL))
{
- SHFree(pSearchData);
- return 0;
+ if (pSearchData->hStopEvent)
+ {
+ CloseHandle(pSearchData->hStopEvent);
+ m_hStopEvent = NULL;
+ }
+ delete pSearchData;
}
-
return 0;
}
diff --git a/dll/win32/browseui/shellfind/CSearchBar.cpp
b/dll/win32/browseui/shellfind/CSearchBar.cpp
index 2ff47bfaf24..543151394b3 100644
--- a/dll/win32/browseui/shellfind/CSearchBar.cpp
+++ b/dll/win32/browseui/shellfind/CSearchBar.cpp
@@ -47,8 +47,130 @@ static UINT GetShellViewItemCount(IShellView *pSV)
return 0;
}
+
+struct SPECIALFINDITEMID
+{
+ WORD cb;
+ BYTE Type, Id;
+ CLSID Cls;
+ WORD Terminator;
+};
+enum { SPECIAL_BROWSE = 42 };
+
+static const SPECIALFINDITEMID g_pidlBrowseDir = { FIELD_OFFSET(SPECIALFINDITEMID,
Terminator),
+ 0, SPECIAL_BROWSE, CLSID_FindFolder, 0
};
+
+static BYTE GetSpecial(PCIDLIST_ABSOLUTE pidl)
+{
+ if (pidl && pidl->mkid.cb == FIELD_OFFSET(SPECIALFINDITEMID,
Terminator))
+ {
+ SPECIALFINDITEMID *pSpecial = (SPECIALFINDITEMID*)pidl;
+ if (pSpecial->Type == g_pidlBrowseDir.Type && pSpecial->Cls ==
g_pidlBrowseDir.Cls &&
+ ILIsEmpty(ILGetNext(pidl)))
+ {
+ return pSpecial->Id;
+ }
+ }
+ return 0;
+}
+
+static HRESULT BindToObject(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv)
+{
+ PCUITEMID_CHILD pidlChild;
+ CComPtr<IShellFolder> psf;
+ HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf),
&pidlChild);
+ return SUCCEEDED(hr) ? psf->BindToObject(pidlChild, NULL, riid, ppv) : hr;
+}
+
+static HRESULT GetClassOfItem(PCIDLIST_ABSOLUTE pidl, CLSID *pCLSID)
+{
+ CComPtr<IShellFolder> psf;
+ HRESULT hr = BindToObject(pidl, IID_PPV_ARG(IShellFolder, &psf));
+ return SUCCEEDED(hr) ? IUnknown_GetClassID(psf, pCLSID) : hr;
+}
+
+void FreeList(LOCATIONITEM *pItems)
+{
+ while (pItems)
+ {
+ LOCATIONITEM *pNext = pItems->pNext;
+ CoTaskMemFree(pItems);
+ pItems = pNext;
+ }
+}
+
+static LOCATIONITEM* CreateLocationListItem(PCWSTR szPath)
+{
+ const SIZE_T cch = lstrlenW(szPath) + 1;
+ LOCATIONITEM *p = (LOCATIONITEM*)CoTaskMemAlloc(FIELD_OFFSET(LOCATIONITEM,
szPath[cch]));
+ if (p)
+ {
+ p->pNext = NULL;
+ CopyMemory(p->szPath, szPath, cch * sizeof(*szPath));
+ }
+ return p;
+}
+
+template<class T> static LOCATIONITEM* BuildLocationList(T **rgszPaths, SIZE_T
nCount)
+{
+ LOCATIONITEM *pStart = NULL, *pPrev = NULL;
+ for (SIZE_T i = 0; i < nCount; ++i)
+ {
+ LOCATIONITEM *pItem = CreateLocationListItem(rgszPaths[i]);
+ if (!pStart)
+ pStart = pItem;
+ else if (pPrev)
+ pPrev->pNext = pItem;
+ pPrev = pItem;
+ if (!pItem)
+ {
+ FreeList(pStart);
+ return NULL;
+ }
+ }
+ return pStart;
+}
+
+static LOCATIONITEM* GetDesktopLocations()
+{
+ SIZE_T nCount = 0;
+ PCWSTR rgszLocations[2];
+ WCHAR szUser[MAX_PATH], szCommon[MAX_PATH];
+
+ rgszLocations[nCount] = szUser;
+ nCount += !!SHGetSpecialFolderPathW(NULL, szUser, CSIDL_DESKTOPDIRECTORY, TRUE);
+ rgszLocations[nCount] = szCommon;
+ nCount += !!SHGetSpecialFolderPathW(NULL, szCommon, CSIDL_COMMON_DESKTOPDIRECTORY,
TRUE);
+ return BuildLocationList(rgszLocations, nCount);
+}
+
+static LOCATIONITEM* GetLocalDisksLocations()
+{
+ PCWSTR rgszLocations[26];
+ WCHAR rgszDrives[_countof(rgszLocations)][4];
+ UINT nCount = 0;
+ for (UINT i = 0, fDrives = GetLogicalDrives(); i < _countof(rgszLocations); ++i)
+ {
+ if (fDrives & (1 << i))
+ {
+ rgszDrives[nCount][0] = 'A' + i;
+ rgszDrives[nCount][1] = ':';
+ rgszDrives[nCount][2] = '\\';
+ rgszDrives[nCount][3] = UNICODE_NULL;
+ UINT fType = GetDriveTypeW(rgszDrives[nCount]);
+ if (fType == DRIVE_FIXED || fType == DRIVE_RAMDISK)
+ {
+ rgszLocations[nCount] = rgszDrives[nCount];
+ nCount++;
+ }
+ }
+ }
+ return BuildLocationList(rgszLocations, nCount);
+}
+
CSearchBar::CSearchBar() :
m_pSite(NULL),
+ m_RealItemIndex(0),
m_bVisible(FALSE)
{
}
@@ -194,11 +316,15 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD
wID, HWND hWndC
pSearchStart->SearchHidden = IsDlgButtonChecked(IDC_SEARCH_HIDDEN);
- if (!GetAddressEditBoxPath(pSearchStart->szPath))
+ WCHAR buf[MAX_PATH];
+ pSearchStart->pPaths = GetAddressEditBoxLocations(buf);
+ if (!pSearchStart->pPaths)
{
- ShellMessageBoxW(_AtlBaseModule.GetResourceInstance(), m_hWnd,
MAKEINTRESOURCEW(IDS_SEARCHINVALID), MAKEINTRESOURCEW(IDS_SEARCHLABEL), MB_OK |
MB_ICONERROR, pSearchStart->szPath);
+ ShellMessageBoxW(_AtlBaseModule.GetResourceInstance(), m_hWnd,
MAKEINTRESOURCEW(IDS_SEARCHINVALID),
+ MAKEINTRESOURCEW(IDS_SEARCHLABEL), MB_OK | MB_ICONERROR, buf);
return 0;
}
+ ScopedFreeLocationItems FreeLocationsHelper(pSearchStart->pPaths);
// See if we have an szFileName by testing for its entry lenth > 0 and our
searched FileName does not contain
// an asterisk or a question mark. If so, then prepend and append an asterisk to the
searched FileName.
@@ -255,6 +381,7 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID,
HWND hWndC
return 0;
}
+ FreeLocationsHelper.Detach();
::PostMessageW(hwnd, WM_SEARCH_START, 0, (LPARAM) pSearchStart.Detach());
SetSearchInProgress(TRUE);
@@ -272,31 +399,89 @@ LRESULT CSearchBar::OnStopButtonClicked(WORD wNotifyCode, WORD wID,
HWND hWndCtl
return 0;
}
-BOOL CSearchBar::GetAddressEditBoxPath(WCHAR *szPath)
+LRESULT CSearchBar::OnLocationEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL
&bHandled)
{
+ HWND hComboboxEx = hWndCtl;
+ INT_PTR idx = SendMessageW(hComboboxEx, CB_GETCURSEL, 0, 0);
+ if (idx < 0)
+ return 0;
+ COMBOBOXEXITEMW item;
+ item.mask = CBEIF_LPARAM;
+ item.iItem = idx;
+ item.cchTextMax = 0;
+ if (!SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item) ||
+ GetSpecial((LPITEMIDLIST)item.lParam) != SPECIAL_BROWSE)
+ {
+ m_RealItemIndex = idx;
+ return 0;
+ }
+
+ idx = max(m_RealItemIndex, 0);
+ SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0); // Reset to previous item
+
+ BROWSEINFOW bi = { hComboboxEx };
+ bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
+ if (PIDLIST_ABSOLUTE pidl = SHBrowseForFolderW(&bi))
+ {
+ idx = FindItemInComboEx(hComboboxEx, pidl, ILIsEqual, TRUE);
+ if (idx < 0)
+ {
+ SHFILEINFO shfi;
+ if (SHGetFileInfoW((WCHAR*)pidl, 0, &shfi, sizeof(shfi), SHGFI_PIDL |
SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX))
+ {
+ item.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_SELECTEDIMAGE |
CBEIF_IMAGE;
+ item.iItem = -1;
+ item.iImage = item.iSelectedImage = shfi.iIcon;
+ item.pszText = shfi.szDisplayName;
+ item.lParam = (LPARAM)pidl; // IAddressEditBox takes ownership
+ idx = SendMessageW(hComboboxEx, CBEM_INSERTITEMW, 0,
(LPARAM)&item);
+ }
+ }
+ if (idx >= 0)
+ SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0); // Select the browsed item
+ else
+ SHFree(pidl);
+ }
+ return 0;
+}
+
+LOCATIONITEM* CSearchBar::GetAddressEditBoxLocations(WCHAR *szPath)
+{
+ WCHAR szItemText[MAX_PATH], *pszPath = szPath;
HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX);
::GetWindowTextW(hComboboxEx, szPath, MAX_PATH);
INT iSelectedIndex = SendMessageW(hComboboxEx, CB_GETCURSEL, 0, 0);
if (iSelectedIndex != CB_ERR)
{
- WCHAR szItemText[MAX_PATH];
- COMBOBOXEXITEMW item = {0};
+ COMBOBOXEXITEMW item;
item.mask = CBEIF_LPARAM | CBEIF_TEXT;
item.iItem = iSelectedIndex;
item.pszText = szItemText;
item.cchTextMax = _countof(szItemText);
SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item);
-
- if (!wcscmp(szItemText, szPath) &&
SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szItemText))
+ if (!wcscmp(szItemText, szPath))
{
- StringCbCopyW(szPath, MAX_PATH * sizeof(WCHAR), szItemText);
- return TRUE;
+ LPCITEMIDLIST pidl = (LPCITEMIDLIST)item.lParam;
+ CLSID clsid;
+ HRESULT hr = GetClassOfItem(pidl, &clsid);
+ if (SUCCEEDED(hr) && clsid == CLSID_MyComputer)
+ return GetLocalDisksLocations();
+ // TODO: Shell enumerate the network neighborhood if it is chosen
+ if (!pidl || !pidl->mkid.cb)
+ return GetDesktopLocations();
+ if (GetSpecial(pidl) || !SHGetPathFromIDListW(pidl, szItemText))
+ return NULL;
+ pszPath = szItemText;
}
}
- DWORD dwAttributes = GetFileAttributesW(szPath);
- return dwAttributes != INVALID_FILE_ATTRIBUTES
- && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY);
+ DWORD dwAttributes = GetFileAttributesW(pszPath);
+ if (dwAttributes != INVALID_FILE_ATTRIBUTES && (dwAttributes &
FILE_ATTRIBUTE_DIRECTORY) &&
+ PathIsAbsolute(pszPath))
+ {
+ return BuildLocationList(&pszPath, 1);
+ }
+ return NULL;
}
LRESULT CSearchBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
@@ -607,30 +792,70 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember,
REFIID riid, L
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX);
- int index = SendMessageW(hComboboxEx, CB_GETCOUNT, 0, 0);
- if (index <= 0)
+ INT_PTR count = SendMessageW(hComboboxEx, CB_GETCOUNT, 0, 0);
+ if (count <= 0)
return S_OK;
COMBOBOXEXITEMW item = {0};
item.mask = CBEIF_LPARAM;
- item.iItem = index - 1;
+ item.iItem = count - 1;
SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item);
if (!item.lParam)
return S_OK;
- CComPtr<IShellFolder> pDesktopFolder;
- hResult = SHGetDesktopFolder(&pDesktopFolder);
- if (FAILED_UNEXPECTEDLY(hResult))
- return hResult;
- CComPtr<IShellFolder> pShellFolder;
- hResult = pDesktopFolder->BindToObject((LPCITEMIDLIST)item.lParam, NULL,
IID_PPV_ARG(IShellFolder, &pShellFolder));
- if (FAILED(hResult))
- return S_OK;
CLSID clsid;
- hResult = IUnknown_GetClassID(pShellFolder, &clsid);
+ hResult = GetClassOfItem((LPCITEMIDLIST)item.lParam, &clsid);
if (SUCCEEDED(hResult) && clsid == CLSID_FindFolder)
{
SendMessageW(hComboboxEx, CBEM_DELETEITEM, item.iItem, 0);
SendMessageW(hComboboxEx, CB_SETCURSEL, 0, 0);
+ // Starting in My Computer is better than just searching the desktop folder
+ PIDLIST_ABSOLUTE pidl;
+ if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidl)))
+ {
+ INT_PTR idx = FindItemInComboEx(hComboboxEx, pidl, ILIsEqual, TRUE);
+ if (idx >= 0)
+ SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0);
+ SHFree(pidl);
+ }
+ }
+
+ // Remove all non-filesystem items since we currently use FindFirstFile to
search
+ BOOL fFoundBrowse = FALSE;
+ for (item.iItem = 0; SendMessageW(hComboboxEx, CBEM_GETITEMW, 0,
(LPARAM)&item); item.iItem++)
+ {
+ LPCITEMIDLIST pidl = (LPCITEMIDLIST)item.lParam;
+ BYTE special = GetSpecial(pidl);
+ fFoundBrowse |= special == SPECIAL_BROWSE;
+ if (special)
+ continue;
+ const UINT fQuery = SFGAO_FILESYSTEM | SFGAO_FILESYSANCESTOR;
+ SHFILEINFO shfi;
+ shfi.dwAttributes = fQuery;
+ if (SHGetFileInfoW((WCHAR*)pidl, 0, &shfi, sizeof(shfi), SHGFI_PIDL |
SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED))
+ {
+ if (!(shfi.dwAttributes & fQuery))
+ {
+ if (SendMessageW(hComboboxEx, CBEM_DELETEITEM, item.iItem, 0) !=
CB_ERR)
+ item.iItem--;
+ }
+ }
}
+
+ // Add our custom Browse item
+ if (!fFoundBrowse)
+ {
+ WCHAR buf[200];
+ item.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_INDENT;
+ item.iItem = -1;
+ item.iIndent = -2; // Remove space reserved for the non-existing item icon
+ item.lParam = (LPARAM)ILClone((LPITEMIDLIST)&g_pidlBrowseDir);
+ item.pszText = const_cast<PWSTR>(L"...");
+ #define IDS_SEARCH_BROWSEITEM 10244 /* shell32 shresdef.h */
+ if (LoadStringW(GetModuleHandleW(L"SHELL32"),
IDS_SEARCH_BROWSEITEM, buf, _countof(buf)))
+ item.pszText = buf;
+ if (item.lParam)
+ SendMessageW(hComboboxEx, CBEM_INSERTITEMW, 0, (LPARAM)&item);
+ }
+
return S_OK;
}
case DISPID_SEARCHCOMPLETE:
diff --git a/dll/win32/browseui/shellfind/CSearchBar.h
b/dll/win32/browseui/shellfind/CSearchBar.h
index 0a4ead4d307..0e3710152f1 100644
--- a/dll/win32/browseui/shellfind/CSearchBar.h
+++ b/dll/win32/browseui/shellfind/CSearchBar.h
@@ -24,10 +24,11 @@ private:
// *** BaseBarSite information ***
CComPtr<IUnknown> m_pSite;
CComPtr<IAddressEditBox> m_AddressEditBox;
+ INT_PTR m_RealItemIndex;
BOOL m_bVisible;
HRESULT GetSearchResultsFolder(IShellBrowser **ppShellBrowser, HWND *pHwnd,
IShellFolder **ppShellFolder);
- BOOL GetAddressEditBoxPath(WCHAR *szPath);
+ LOCATIONITEM* GetAddressEditBoxLocations(WCHAR *szPath);
void SetSearchInProgress(BOOL bInProgress);
HRESULT TrySubscribeToSearchEvents();
void TrySetFocus(UINT Source);
@@ -37,6 +38,7 @@ private:
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL
&bHandled);
LRESULT OnStopButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL
&bHandled);
+ LRESULT OnLocationEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL
&bHandled);
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
public:
@@ -105,5 +107,6 @@ public:
MESSAGE_HANDLER(WM_SIZE, OnSize)
COMMAND_HANDLER(IDC_SEARCH_BUTTON, BN_CLICKED, OnSearchButtonClicked)
COMMAND_HANDLER(IDC_SEARCH_STOP_BUTTON, BN_CLICKED, OnStopButtonClicked)
+ COMMAND_HANDLER(IDC_SEARCH_COMBOBOX, CBN_EDITCHANGE, OnLocationEditChange)
END_MSG_MAP()
};
diff --git a/dll/win32/browseui/shellfind/shellfind.h
b/dll/win32/browseui/shellfind/shellfind.h
index 93256cb7970..1f42f99d7c1 100644
--- a/dll/win32/browseui/shellfind/shellfind.h
+++ b/dll/win32/browseui/shellfind/shellfind.h
@@ -31,12 +31,58 @@
#define WM_SEARCH_ADD_RESULT WM_USER + 2
#define WM_SEARCH_UPDATE_STATUS WM_USER + 3
+typedef struct tagLOCATIONITEM
+{
+ struct tagLOCATIONITEM *pNext;
+ WCHAR szPath[ANYSIZE_ARRAY];
+} LOCATIONITEM;
+
+void FreeList(LOCATIONITEM *pLI);
+
+struct ScopedFreeLocationItems
+{
+ LOCATIONITEM *m_ptr;
+ ScopedFreeLocationItems(LOCATIONITEM *ptr) : m_ptr(ptr) {}
+ ~ScopedFreeLocationItems() { FreeList(m_ptr); }
+ void Detach() { m_ptr = NULL; }
+};
+
struct SearchStart
{
- WCHAR szPath[MAX_PATH];
+ LOCATIONITEM *pPaths;
WCHAR szFileName[MAX_PATH];
WCHAR szQuery[MAX_PATH];
BOOL SearchHidden;
};
+template<class T, class F, class R>
+static INT_PTR FindItemInComboEx(HWND hCombo, T &FindItem, F CompareFunc, R
RetMatch)
+{
+ COMBOBOXEXITEMW item;
+ item.mask = CBEIF_LPARAM;
+ item.cchTextMax = 0;
+ for (item.iItem = 0; SendMessageW(hCombo, CBEM_GETITEMW, 0, (LPARAM)&item);
item.iItem++)
+ {
+ if (CompareFunc((T&)item.lParam, FindItem) == RetMatch)
+ return item.iItem;
+ }
+ return -1;
+}
+
+static inline bool PathIsOnDrive(PCWSTR Path)
+{
+ return PathGetDriveNumberW(Path) >= 0 && (Path[2] == '\\' ||
!Path[2]);
+}
+
+static inline BOOL PathIsOnUnc(PCWSTR Path)
+{
+ return PathIsUNCW(Path); // FIXME: Verify the path starts with
<\\Server\Share>[\]
+}
+
+static inline bool PathIsAbsolute(PCWSTR Path)
+{
+ // Note: PathIsRelativeW is too forgiving
+ return PathIsOnDrive(Path) || PathIsOnUnc(Path);
+}
+
#endif /* _SHELLFIND_PCH_ */
diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc
index a6f1ec66737..ffa7fa93d77 100644
--- a/dll/win32/shell32/lang/bg-BG.rc
+++ b/dll/win32/shell32/lang/bg-BG.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Обзор..."
+
IDS_TITLE_MYCOMP "Моят компютър"
IDS_TITLE_MYNET "Моята мрежа"
IDS_TITLE_BIN_1 "Кошче (пълно)"
diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc
index 50088b84052..e8f729c7c9e 100644
--- a/dll/win32/shell32/lang/ca-ES.rc
+++ b/dll/win32/shell32/lang/ca-ES.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Browse..."
+
IDS_TITLE_MYCOMP "My Computer"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc
index 744d8c727a7..9a2a3ebec95 100644
--- a/dll/win32/shell32/lang/cs-CZ.rc
+++ b/dll/win32/shell32/lang/cs-CZ.rc
@@ -1006,6 +1006,8 @@ BEGIN
IDS_OBJECTS "Položek: %d"
IDS_OBJECTS_SELECTED "Položek vybráno: %d"
+ IDS_SEARCH_BROWSEITEM "Procházet..."
+
IDS_TITLE_MYCOMP "Tento počítač"
IDS_TITLE_MYNET "Místa v síti"
IDS_TITLE_BIN_1 "Koš (plný)"
diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc
index 7cb598194ad..46bc8854b97 100644
--- a/dll/win32/shell32/lang/da-DK.rc
+++ b/dll/win32/shell32/lang/da-DK.rc
@@ -1005,6 +1005,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Gennemse..."
+
IDS_TITLE_MYCOMP "Min Computer"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc
index ecb87154a4b..1270e5c1702 100644
--- a/dll/win32/shell32/lang/de-DE.rc
+++ b/dll/win32/shell32/lang/de-DE.rc
@@ -999,6 +999,8 @@ BEGIN
IDS_OBJECTS "%d Objekte"
IDS_OBJECTS_SELECTED "%d Objekte ausgewählt"
+ IDS_SEARCH_BROWSEITEM "Durchsuchen..."
+
IDS_TITLE_MYCOMP "Arbeitsplatz"
IDS_TITLE_MYNET "Netzwerkumgebung"
IDS_TITLE_BIN_1 "Papierkorb (voll)"
diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc
index e26cab3ff42..906192f80db 100644
--- a/dll/win32/shell32/lang/el-GR.rc
+++ b/dll/win32/shell32/lang/el-GR.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Αναζήτηση..."
+
IDS_TITLE_MYCOMP "Ο υπολογιστής μου"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Κάδος ανακύκλωσης (γεμάτος)"
diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc
index 5c7426cba73..acc08e4f3bd 100644
--- a/dll/win32/shell32/lang/en-GB.rc
+++ b/dll/win32/shell32/lang/en-GB.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Browse..."
+
IDS_TITLE_MYCOMP "My Computer"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc
index be1df9decac..46a403aa4d6 100644
--- a/dll/win32/shell32/lang/en-US.rc
+++ b/dll/win32/shell32/lang/en-US.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Browse..."
+
IDS_TITLE_MYCOMP "My Computer"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc
index 0d4e112eada..8d515c6cbc0 100644
--- a/dll/win32/shell32/lang/es-ES.rc
+++ b/dll/win32/shell32/lang/es-ES.rc
@@ -1007,6 +1007,8 @@ BEGIN
IDS_OBJECTS "%d elementos"
IDS_OBJECTS_SELECTED "%d elementos seleccionados"
+ IDS_SEARCH_BROWSEITEM "Examinar..."
+
IDS_TITLE_MYCOMP "Mi equipo"
IDS_TITLE_MYNET "Mis sitios de red"
IDS_TITLE_BIN_1 "Papelera (llena)"
diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc
index 67324abb2da..35a11ea9b6e 100644
--- a/dll/win32/shell32/lang/et-EE.rc
+++ b/dll/win32/shell32/lang/et-EE.rc
@@ -1005,6 +1005,8 @@ BEGIN
IDS_OBJECTS "%d objekti"
IDS_OBJECTS_SELECTED "%d objekti valitud"
+ IDS_SEARCH_BROWSEITEM "Sirvi..."
+
IDS_TITLE_MYCOMP "Minu arvuti"
IDS_TITLE_MYNET "Minu võrgukohad"
IDS_TITLE_BIN_1 "Prügikast (täis)"
diff --git a/dll/win32/shell32/lang/eu-ES.rc b/dll/win32/shell32/lang/eu-ES.rc
index 0eb4c03261c..9ce6a760948 100644
--- a/dll/win32/shell32/lang/eu-ES.rc
+++ b/dll/win32/shell32/lang/eu-ES.rc
@@ -1003,6 +1003,8 @@ BEGIN
IDS_OBJECTS "%d elementuak"
IDS_OBJECTS_SELECTED "%d elementu hautatuak"
+ IDS_SEARCH_BROWSEITEM "Arakatu..."
+
IDS_TITLE_MYCOMP "Ordenagailua"
IDS_TITLE_MYNET "Nire sarelekuak"
IDS_TITLE_BIN_1 "Zakarrontzia (betea)"
diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc
index 1d7a4be529f..0743841d7e3 100644
--- a/dll/win32/shell32/lang/fi-FI.rc
+++ b/dll/win32/shell32/lang/fi-FI.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Selaa..."
+
IDS_TITLE_MYCOMP "Oma Tietokone"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc
index c38a47692fb..fbd939d7941 100644
--- a/dll/win32/shell32/lang/fr-FR.rc
+++ b/dll/win32/shell32/lang/fr-FR.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d objet(s)"
IDS_OBJECTS_SELECTED "%d objet(s) sélectionné(s)"
+ IDS_SEARCH_BROWSEITEM "Parcourir..."
+
IDS_TITLE_MYCOMP "Poste de travail"
IDS_TITLE_MYNET "Mon réseau"
IDS_TITLE_BIN_1 "Corbeille (pleine)"
diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc
index 5f3bd630847..4ae2969e694 100644
--- a/dll/win32/shell32/lang/he-IL.rc
+++ b/dll/win32/shell32/lang/he-IL.rc
@@ -1005,6 +1005,9 @@ BEGIN
IDS_OBJECTS "%d פריטים"
IDS_OBJECTS_SELECTED "%d פריטים נבחרו"
+ IDS_SEARCH_BROWSEITEM "עיון..."
+
+
IDS_TITLE_MYCOMP "המחשב שלי"
IDS_TITLE_MYNET "מיקומי הרשת שלי"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc
index 8a6ed3d42b3..fc38faac4f1 100644
--- a/dll/win32/shell32/lang/hi-IN.rc
+++ b/dll/win32/shell32/lang/hi-IN.rc
@@ -1000,6 +1000,8 @@ BEGIN
IDS_OBJECTS "%d वस्तुओं"
IDS_OBJECTS_SELECTED "%d वस्तुओं का चयन किया"
+ IDS_SEARCH_BROWSEITEM "ब्राउज़ करें..."
+
IDS_TITLE_MYCOMP "मेरा कंप्यूटर"
IDS_TITLE_MYNET "मेरे नेटवर्क स्थान"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc
index dca369f41aa..28a7923bb29 100644
--- a/dll/win32/shell32/lang/hu-HU.rc
+++ b/dll/win32/shell32/lang/hu-HU.rc
@@ -997,6 +997,8 @@ BEGIN
IDS_OBJECTS "%d elem"
IDS_OBJECTS_SELECTED "%d kijelölt elem"
+ IDS_SEARCH_BROWSEITEM "Böngészés..."
+
IDS_TITLE_MYCOMP "Számítógép"
IDS_TITLE_MYNET "Hálózati helyek"
IDS_TITLE_BIN_1 "Lomtár (tele)"
diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc
index 14851b34ba0..50250ed016b 100644
--- a/dll/win32/shell32/lang/id-ID.rc
+++ b/dll/win32/shell32/lang/id-ID.rc
@@ -995,6 +995,8 @@ BEGIN
IDS_OBJECTS "%d Obyek"
IDS_OBJECTS_SELECTED "%d Obyek terpilih"
+ IDS_SEARCH_BROWSEITEM "Jelajah..."
+
IDS_TITLE_MYCOMP "Komputer Saya"
IDS_TITLE_MYNET "Tempat Jaringan Saya"
IDS_TITLE_BIN_1 "Tampungan Daur Ulang (penuh)"
diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc
index 2f06fb39638..889df335f8a 100644
--- a/dll/win32/shell32/lang/it-IT.rc
+++ b/dll/win32/shell32/lang/it-IT.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Oggetti"
IDS_OBJECTS_SELECTED "%d Oggetti selezionati"
+ IDS_SEARCH_BROWSEITEM "Esplora..."
+
IDS_TITLE_MYCOMP "Risorse del Computer"
IDS_TITLE_MYNET "Risorse di rete"
IDS_TITLE_BIN_1 "Cestino (pieno)"
diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc
index b4002272715..a186027c5fe 100644
--- a/dll/win32/shell32/lang/ja-JP.rc
+++ b/dll/win32/shell32/lang/ja-JP.rc
@@ -995,6 +995,8 @@ BEGIN
IDS_OBJECTS "%d 個のオブジェクト"
IDS_OBJECTS_SELECTED "%d 個のオブジェクトが選択済み"
+ IDS_SEARCH_BROWSEITEM "参照..."
+
IDS_TITLE_MYCOMP "マイ コンピュータ"
IDS_TITLE_MYNET "マイ ネットワーク"
IDS_TITLE_BIN_1 "ごみ箱 (いっぱい)"
diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc
index b702a01f108..d6a31a17bdb 100644
--- a/dll/win32/shell32/lang/ko-KR.rc
+++ b/dll/win32/shell32/lang/ko-KR.rc
@@ -1005,6 +1005,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "찾아보기..."
+
IDS_TITLE_MYCOMP "내 컴퓨터"
IDS_TITLE_MYNET "내 네트워크 환경"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc
index 4ffb90d81eb..82d22450c87 100644
--- a/dll/win32/shell32/lang/nl-NL.rc
+++ b/dll/win32/shell32/lang/nl-NL.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Bladeren..."
+
IDS_TITLE_MYCOMP "My Computer"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc
index c0f8bd18da8..0321417fb24 100644
--- a/dll/win32/shell32/lang/no-NO.rc
+++ b/dll/win32/shell32/lang/no-NO.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Bla gjennom..."
+
IDS_TITLE_MYCOMP "Min datamaskin"
IDS_TITLE_MYNET "Mine nettverkssteder"
IDS_TITLE_BIN_1 "Papirkurv (full)"
diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc
index e495ffef72b..1614266d238 100644
--- a/dll/win32/shell32/lang/pl-PL.rc
+++ b/dll/win32/shell32/lang/pl-PL.rc
@@ -1007,6 +1007,8 @@ BEGIN
IDS_OBJECTS "Elementów: %d"
IDS_OBJECTS_SELECTED "Zaznaczonych elementów: %d"
+ IDS_SEARCH_BROWSEITEM "Przeglądaj..."
+
IDS_TITLE_MYCOMP "Mój komputer"
IDS_TITLE_MYNET "Moje miejsca sieciowe"
IDS_TITLE_BIN_1 "Kosz (pełny)"
diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc
index 16d1422681e..0b5c46f359f 100644
--- a/dll/win32/shell32/lang/pt-BR.rc
+++ b/dll/win32/shell32/lang/pt-BR.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Procurar..."
+
IDS_TITLE_MYCOMP "Meu Computador"
IDS_TITLE_MYNET "Meus Locais de Rede"
IDS_TITLE_BIN_1 "Lixeira (cheia)"
diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc
index 2236d5c1dae..d606c701112 100644
--- a/dll/win32/shell32/lang/pt-PT.rc
+++ b/dll/win32/shell32/lang/pt-PT.rc
@@ -1007,6 +1007,8 @@ BEGIN
IDS_OBJECTS "%d Objectos"
IDS_OBJECTS_SELECTED "%d Objectos seleccionados"
+ IDS_SEARCH_BROWSEITEM "Procurar..."
+
IDS_TITLE_MYCOMP "O Meu Computador"
IDS_TITLE_MYNET "Os Meus Locais na Rede"
IDS_TITLE_BIN_1 "Reciclagem (cheia)"
diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc
index 35ba49334c8..c5109abb36d 100644
--- a/dll/win32/shell32/lang/ro-RO.rc
+++ b/dll/win32/shell32/lang/ro-RO.rc
@@ -1006,6 +1006,8 @@ BEGIN
IDS_OBJECTS "%d Obiecte"
IDS_OBJECTS_SELECTED "%d Obiecte selectate"
+ IDS_SEARCH_BROWSEITEM "Răsfoire..."
+
IDS_TITLE_MYCOMP "Computerul meu"
IDS_TITLE_MYNET "Locaţii în reţea"
IDS_TITLE_BIN_1 "Coş de reciclare (plin)"
diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc
index 773dde053f5..f81a82b00da 100644
--- a/dll/win32/shell32/lang/ru-RU.rc
+++ b/dll/win32/shell32/lang/ru-RU.rc
@@ -1007,6 +1007,8 @@ BEGIN
IDS_OBJECTS "Объектов: %d"
IDS_OBJECTS_SELECTED "Выделено объектов: %d"
+ IDS_SEARCH_BROWSEITEM "Обзор..."
+
IDS_TITLE_MYCOMP "Мой компьютер"
IDS_TITLE_MYNET "Сетевое окружение"
IDS_TITLE_BIN_1 "Корзина (полная)"
diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc
index 59bb8bf6097..e17019cd76d 100644
--- a/dll/win32/shell32/lang/sk-SK.rc
+++ b/dll/win32/shell32/lang/sk-SK.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Prehľadávať..."
+
IDS_TITLE_MYCOMP "Tento počítač"
IDS_TITLE_MYNET "Miesta v sieti"
IDS_TITLE_BIN_1 "Kôš (plný)"
diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc
index 40013522a90..17b3d7d9bee 100644
--- a/dll/win32/shell32/lang/sl-SI.rc
+++ b/dll/win32/shell32/lang/sl-SI.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Prebrskaj..."
+
IDS_TITLE_MYCOMP "My Computer"
IDS_TITLE_MYNET "My Network Places"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc
index fcf87e2f734..6915235b1b3 100644
--- a/dll/win32/shell32/lang/sq-AL.rc
+++ b/dll/win32/shell32/lang/sq-AL.rc
@@ -1005,6 +1005,8 @@ BEGIN
IDS_OBJECTS "%d Objects"
IDS_OBJECTS_SELECTED "%d Objects Selected"
+ IDS_SEARCH_BROWSEITEM "Shfleto..."
+
IDS_TITLE_MYCOMP "Kompjuteri Im"
IDS_TITLE_MYNET "Vendi Rrjetit Tim"
IDS_TITLE_BIN_1 "Plehra (plot)"
diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc
index 9d5486e743d..9628f301240 100644
--- a/dll/win32/shell32/lang/sv-SE.rc
+++ b/dll/win32/shell32/lang/sv-SE.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d objekt"
IDS_OBJECTS_SELECTED "%d markerade objekt"
+ IDS_SEARCH_BROWSEITEM "Bläddra..."
+
IDS_TITLE_MYCOMP "Den här datorn"
IDS_TITLE_MYNET "Mina nätverksplatser"
IDS_TITLE_BIN_1 "Papperskorgen (full)"
diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc
index 2d52e60d51d..04a16690660 100644
--- a/dll/win32/shell32/lang/tr-TR.rc
+++ b/dll/win32/shell32/lang/tr-TR.rc
@@ -1007,6 +1007,8 @@ BEGIN
IDS_OBJECTS "%d Nesne"
IDS_OBJECTS_SELECTED "%d Nesne Seçili"
+ IDS_SEARCH_BROWSEITEM "Gözat..."
+
IDS_TITLE_MYCOMP "Bilgisayarım"
IDS_TITLE_MYNET "Ağ Bağlantılarım"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc
index 853f4041a02..0a943e91999 100644
--- a/dll/win32/shell32/lang/uk-UA.rc
+++ b/dll/win32/shell32/lang/uk-UA.rc
@@ -998,6 +998,8 @@ BEGIN
IDS_OBJECTS "%d об'єктів"
IDS_OBJECTS_SELECTED "Обрано %d об'єктів"
+ IDS_SEARCH_BROWSEITEM "Огляд..."
+
IDS_TITLE_MYCOMP "Мій комп'ютер"
IDS_TITLE_MYNET "Мережне оточення"
IDS_TITLE_BIN_1 "Кошик (повний)"
diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc
index 3d58230cc58..6685c210944 100644
--- a/dll/win32/shell32/lang/zh-CN.rc
+++ b/dll/win32/shell32/lang/zh-CN.rc
@@ -1008,6 +1008,8 @@ BEGIN
IDS_OBJECTS "%d 个对象"
IDS_OBJECTS_SELECTED "已选中 %d 个对象"
+ IDS_SEARCH_BROWSEITEM "浏览..."
+
IDS_TITLE_MYCOMP "我的电脑"
IDS_TITLE_MYNET "网上邻居"
IDS_TITLE_BIN_1 "回收站(满)"
diff --git a/dll/win32/shell32/lang/zh-HK.rc b/dll/win32/shell32/lang/zh-HK.rc
index e4700b57e72..dd7d89bef55 100644
--- a/dll/win32/shell32/lang/zh-HK.rc
+++ b/dll/win32/shell32/lang/zh-HK.rc
@@ -1006,6 +1006,8 @@ BEGIN
IDS_OBJECTS "%d 個物件"
IDS_OBJECTS_SELECTED "已選擇 %d 個物件"
+ IDS_SEARCH_BROWSEITEM "瀏覽..."
+
IDS_TITLE_MYCOMP "我的電腦"
IDS_TITLE_MYNET "網絡上的芳鄰"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc
index 2bc2ea7d49f..7d5a8e2b402 100644
--- a/dll/win32/shell32/lang/zh-TW.rc
+++ b/dll/win32/shell32/lang/zh-TW.rc
@@ -1007,6 +1007,8 @@ BEGIN
IDS_OBJECTS "%d 個物件"
IDS_OBJECTS_SELECTED "已選擇 %d 個物件"
+ IDS_SEARCH_BROWSEITEM "瀏覽..."
+
IDS_TITLE_MYCOMP "我的電腦"
IDS_TITLE_MYNET "網路上的芳鄰"
IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h
index d4c8422d29a..cc9a651da93 100644
--- a/dll/win32/shell32/shresdef.h
+++ b/dll/win32/shell32/shresdef.h
@@ -282,6 +282,10 @@
#define IDS_OBJECTS 6466
#define IDS_OBJECTS_SELECTED 6477
+/* Explorer file search */
+#define IDS_SEARCH_LOCALDRIVES 10241
+#define IDS_SEARCH_BROWSEITEM 10244
+
/* Desktop icon titles */
#define IDS_TITLE_MYCOMP 30386
#define IDS_TITLE_MYNET 30387