diff --git a/dll/win32/browseui/browseui.cpp b/dll/win32/browseui/browseui.cpp index d7aed778789..8ae993dfa65 100644 --- a/dll/win32/browseui/browseui.cpp +++ b/dll/win32/browseui/browseui.cpp @@ -155,6 +155,7 @@ OBJECT_ENTRY(CLSID_ExplorerBand, CExplorerBand) OBJECT_ENTRY(CLSID_FileSearchBand, CSearchBar) OBJECT_ENTRY(CLSID_ProgressDialog, CProgressDialog) OBJECT_ENTRY(CLSID_ISFBand, CISFBand) +OBJECT_ENTRY(CLSID_FindFolder, CFindFolder) END_OBJECT_MAP() CBrowseUIModule gModule; diff --git a/dll/win32/browseui/browseui.rc b/dll/win32/browseui/browseui.rc index f22d17ea9a3..6f6c28db4af 100644 --- a/dll/win32/browseui/browseui.rc +++ b/dll/win32/browseui/browseui.rc @@ -49,6 +49,7 @@ IDR_ISFBAND REGISTRY "res/isfband.rgs" IDR_ACLCUSTOMMRU REGISTRY "res/custommru.rgs" IDR_TASKBARLIST REGISTRY "res/taskbarlist.rgs" IDR_FILESEARCHBAND REGISTRY "res/filesearchband.rgs" +IDR_FINDFOLDER REGISTRY "res/findfolder.rgs" #include diff --git a/dll/win32/browseui/precomp.h b/dll/win32/browseui/precomp.h index b6c464dc25e..f119847b6fa 100644 --- a/dll/win32/browseui/precomp.h +++ b/dll/win32/browseui/precomp.h @@ -47,6 +47,7 @@ #include "shellbars/CBandSite.h" #include "shellbars/CBandSiteMenu.h" #include "shellbars/CISFBand.h" +#include "shellfind/CFindFolder.h" #include "shellfind/CSearchBar.h" #include "brandband.h" #include "internettoolbar.h" diff --git a/dll/win32/browseui/res/findfolder.rgs b/dll/win32/browseui/res/findfolder.rgs new file mode 100644 index 00000000000..1cc3d295969 --- /dev/null +++ b/dll/win32/browseui/res/findfolder.rgs @@ -0,0 +1,18 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {E17D4FC0-5564-11D1-83F2-00A0C90DC849} = s 'Search Results Folder' + { + DefaultIcon = e '%%SystemRoot%%\System32\shell32.dll,-134' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + ShellFolder + { + val Attributes = d '0x20180000' + } + } + } +} diff --git a/dll/win32/browseui/resource.h b/dll/win32/browseui/resource.h index 3dbe833c80e..bc9ad642b6a 100644 --- a/dll/win32/browseui/resource.h +++ b/dll/win32/browseui/resource.h @@ -106,6 +106,7 @@ #define IDR_ACLCUSTOMMRU 144 #define IDR_TASKBARLIST 145 #define IDR_FILESEARCHBAND 146 +#define IDR_FINDFOLDER 147 #define IDS_SMALLICONS 12301 #define IDS_LARGEICONS 12302 diff --git a/dll/win32/browseui/shellfind/CFindFolder.cpp b/dll/win32/browseui/shellfind/CFindFolder.cpp new file mode 100644 index 00000000000..c196187419a --- /dev/null +++ b/dll/win32/browseui/shellfind/CFindFolder.cpp @@ -0,0 +1,175 @@ +/* + * PROJECT: ReactOS Search Shell Extension + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Search results folder + * COPYRIGHT: Copyright 2019 Brock Mammen + */ + +#include "CFindFolder.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shellfind); + +struct FolderViewColumns +{ + LPCWSTR wzColumnName; + DWORD dwDefaultState; + int fmt; + int cxChar; +}; + +static FolderViewColumns g_ColumnDefs[] = +{ + {L"Name", SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 30}, + {L"In Folder", SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 30}, + {L"Relevance", SHCOLSTATE_TYPE_STR, LVCFMT_LEFT, 0} +}; + +// *** IShellFolder2 methods *** +STDMETHODIMP CFindFolder::GetDefaultSearchGUID(GUID *pguid) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CFindFolder::EnumSearches(IEnumExtraSearch **ppenum) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CFindFolder::GetDefaultColumn(DWORD, ULONG *pSort, ULONG *pDisplay) +{ + if (pSort) + *pSort = 0; + if (pDisplay) + *pDisplay = 0; + return S_OK; +} + +STDMETHODIMP CFindFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) +{ + if (!pcsFlags || iColumn >= _countof(g_ColumnDefs)) + return E_INVALIDARG; + *pcsFlags = g_ColumnDefs[iColumn].dwDefaultState; + return S_OK; +} + +STDMETHODIMP CFindFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CFindFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *pDetails) +{ + if (iColumn >= _countof(g_ColumnDefs)) + return E_FAIL; + + pDetails->cxChar = g_ColumnDefs[iColumn].cxChar; + pDetails->fmt = g_ColumnDefs[iColumn].fmt; + + if (!pidl) + return SHSetStrRet(&pDetails->str, g_ColumnDefs[iColumn].wzColumnName); + + return GetDisplayNameOf(pidl, SHGDN_NORMAL, &pDetails->str); +} + +STDMETHODIMP CFindFolder::MapColumnToSCID(UINT iColumn, SHCOLUMNID *pscid) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +// *** IShellFolder methods *** +STDMETHODIMP CFindFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, + PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CFindFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) +{ + *ppEnumIDList = NULL; + return S_FALSE; +} + +STDMETHODIMP CFindFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CFindFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CFindFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CFindFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) +{ + if (riid == IID_IShellView) + { + SFV_CREATE sfvparams = {}; + sfvparams.cbSize = sizeof(SFV_CREATE); + sfvparams.pshf = this; + HRESULT hr = SHCreateShellFolderView(&sfvparams, (IShellView **) ppvOut); + return hr; + } + return E_NOINTERFACE; +} + +STDMETHODIMP CFindFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) +{ + *rgfInOut = SFGAO_NONENUMERATED; + return S_OK; +} + +STDMETHODIMP CFindFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, + UINT *prgfInOut, LPVOID *ppvOut) +{ + return E_NOINTERFACE; +} + +STDMETHODIMP CFindFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET pName) +{ + return SHSetStrRet(pName, "search result"); +} + +STDMETHODIMP CFindFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, + PITEMID_CHILD *pPidlOut) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} +//// *** IPersistFolder2 methods *** +STDMETHODIMP CFindFolder::GetCurFolder(LPITEMIDLIST *pidl) +{ + *pidl = ILClone(m_pidl); + return S_OK; +} + +// *** IPersistFolder methods *** +STDMETHODIMP CFindFolder::Initialize(LPCITEMIDLIST pidl) +{ + m_pidl = ILClone(pidl); + if (!m_pidl) + return E_OUTOFMEMORY; + + return S_OK; +} + +// *** IPersist methods *** +STDMETHODIMP CFindFolder::GetClassID(CLSID *pClassId) +{ + if (pClassId == NULL) + return E_INVALIDARG; + memcpy(pClassId, &CLSID_FindFolder, sizeof(CLSID)); + return S_OK; +} diff --git a/dll/win32/browseui/shellfind/CFindFolder.h b/dll/win32/browseui/shellfind/CFindFolder.h new file mode 100644 index 00000000000..f7590fd4aac --- /dev/null +++ b/dll/win32/browseui/shellfind/CFindFolder.h @@ -0,0 +1,83 @@ +#pragma once + +#include "shellfind.h" + +#define SWM_ADD_ITEM (WM_USER + 0) +#define SWM_UPDATE_STATUS (WM_USER + 1) + +class CFindFolder : + public CComCoClass, + public CComObjectRootEx, + public IShellFolder2, + public IPersistFolder2 +{ + // *** IShellFolder2 methods *** + STDMETHODIMP GetDefaultSearchGUID(GUID *pguid); + + STDMETHODIMP EnumSearches(IEnumExtraSearch **ppenum); + + STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); + + STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); + + STDMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + + STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *pDetails); + + STDMETHODIMP MapColumnToSCID(UINT iColumn, SHCOLUMNID *pscid); + + + // *** IShellFolder methods *** + STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, + PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes); + + STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); + + STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + + STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + + STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); + + STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); + + STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + + STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, + LPVOID *ppvOut); + + STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET pName); + + STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, + PITEMID_CHILD *pPidlOut); + +private: + LPITEMIDLIST m_pidl; + + //// *** IPersistFolder2 methods *** + STDMETHODIMP GetCurFolder(LPITEMIDLIST *pidl); + + + // *** IPersistFolder methods *** + STDMETHODIMP Initialize(LPCITEMIDLIST pidl); + + + // *** IPersist methods *** + STDMETHODIMP GetClassID(CLSID *pClassId); + +public: + DECLARE_REGISTRY_RESOURCEID(IDR_FINDFOLDER) + + DECLARE_NOT_AGGREGATABLE(CFindFolder) + + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CFindFolder) + COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2) + COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder) + COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2) + COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + END_COM_MAP() +}; + diff --git a/dll/win32/browseui/shellfind/CMakeLists.txt b/dll/win32/browseui/shellfind/CMakeLists.txt index 4f031b46f55..54eb15caa32 100644 --- a/dll/win32/browseui/shellfind/CMakeLists.txt +++ b/dll/win32/browseui/shellfind/CMakeLists.txt @@ -10,6 +10,7 @@ include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/atl) list(APPEND SOURCE CSearchBar.cpp + CFindFolder.cpp shellfind.h) add_library(shellfind ${SOURCE}) diff --git a/sdk/include/reactos/shlguid_undoc.h b/sdk/include/reactos/shlguid_undoc.h index aaca7a5f421..b29fc467bc9 100644 --- a/sdk/include/reactos/shlguid_undoc.h +++ b/sdk/include/reactos/shlguid_undoc.h @@ -72,6 +72,7 @@ DEFINE_GUID(CLSID_SH_SearchBand, 0x21569614, 0xB795, 0x46B1, 0x85, 0xF DEFINE_GUID(CLSID_FileSearchBand, 0xC4EE31F3, 0x4768, 0x11D2, 0xBE, 0x5C, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA1); DEFINE_GUID(CLSID_IE_SearchBand, 0x30D02401, 0x6A81, 0x11D0, 0x82, 0x74, 0x00, 0xC0, 0x4F, 0xD5, 0xAE, 0x38); DEFINE_GUID(CLSID_ChannelsBand, 0xEFA24E63, 0xB078, 0x11D0, 0x89, 0xE4, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E); +DEFINE_GUID(CLSID_FindFolder, 0xE17D4FC0, 0x5564, 0x11D1, 0x83, 0xF2, 0x00, 0xA0, 0xC9, 0x0D, 0xC8, 0x49); // missing ResearchBand DEFINE_GUID(IID_IBandNavigate, 0x3697C30B, 0xCD88, 0x11D0, 0x8A, 0x3E, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E);