2 * PROJECT: ReactOS Search Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Search results folder
5 * COPYRIGHT: Copyright 2019 Brock Mammen
8 #include "CFindFolder.h"
10 WINE_DEFAULT_DEBUG_CHANNEL(shellfind
);
12 struct FolderViewColumns
20 static FolderViewColumns g_ColumnDefs
[] =
22 {L
"Name", SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_LEFT
, 30},
23 {L
"In Folder", SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_LEFT
, 30},
24 {L
"Relevance", SHCOLSTATE_TYPE_STR
, LVCFMT_LEFT
, 0}
27 // *** IShellFolder2 methods ***
28 STDMETHODIMP
CFindFolder::GetDefaultSearchGUID(GUID
*pguid
)
34 STDMETHODIMP
CFindFolder::EnumSearches(IEnumExtraSearch
**ppenum
)
40 STDMETHODIMP
CFindFolder::GetDefaultColumn(DWORD
, ULONG
*pSort
, ULONG
*pDisplay
)
49 STDMETHODIMP
CFindFolder::GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
)
53 if (iColumn
>= _countof(g_ColumnDefs
))
54 return m_pisfInner
->GetDefaultColumnState(iColumn
- _countof(g_ColumnDefs
) + 1, pcsFlags
);
55 *pcsFlags
= g_ColumnDefs
[iColumn
].dwDefaultState
;
59 STDMETHODIMP
CFindFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
61 return m_pisfInner
->GetDetailsEx(pidl
, pscid
, pv
);
64 STDMETHODIMP
CFindFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*pDetails
)
66 if (iColumn
>= _countof(g_ColumnDefs
))
67 return m_pisfInner
->GetDetailsOf(pidl
, iColumn
- _countof(g_ColumnDefs
) + 1, pDetails
);
69 pDetails
->cxChar
= g_ColumnDefs
[iColumn
].cxChar
;
70 pDetails
->fmt
= g_ColumnDefs
[iColumn
].fmt
;
73 return SHSetStrRet(&pDetails
->str
, g_ColumnDefs
[iColumn
].wzColumnName
);
75 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &pDetails
->str
);
78 STDMETHODIMP
CFindFolder::MapColumnToSCID(UINT iColumn
, SHCOLUMNID
*pscid
)
84 // *** IShellFolder methods ***
85 STDMETHODIMP
CFindFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
, ULONG
*pchEaten
,
86 PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
)
92 STDMETHODIMP
CFindFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
98 STDMETHODIMP
CFindFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
104 STDMETHODIMP
CFindFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
110 STDMETHODIMP
CFindFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
112 return m_pisfInner
->CompareIDs(lParam
, pidl1
, pidl2
);
115 STDMETHODIMP
CFindFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
)
117 if (riid
== IID_IShellView
)
119 SFV_CREATE sfvparams
= {};
120 sfvparams
.cbSize
= sizeof(SFV_CREATE
);
121 sfvparams
.pshf
= this;
122 return SHCreateShellFolderView(&sfvparams
, (IShellView
**) ppvOut
);
124 return E_NOINTERFACE
;
127 STDMETHODIMP
CFindFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
129 return m_pisfInner
->GetAttributesOf(cidl
, apidl
, rgfInOut
);
132 STDMETHODIMP
CFindFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
,
133 UINT
*prgfInOut
, LPVOID
*ppvOut
)
135 return m_pisfInner
->GetUIObjectOf(hwndOwner
, cidl
, apidl
, riid
, prgfInOut
, ppvOut
);
138 STDMETHODIMP
CFindFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET pName
)
140 return m_pisfInner
->GetDisplayNameOf(pidl
, dwFlags
, pName
);
143 STDMETHODIMP
CFindFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, LPCOLESTR lpName
, DWORD dwFlags
,
144 PITEMID_CHILD
*pPidlOut
)
149 //// *** IPersistFolder2 methods ***
150 STDMETHODIMP
CFindFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
152 *pidl
= ILClone(m_pidl
);
156 // *** IPersistFolder methods ***
157 STDMETHODIMP
CFindFolder::Initialize(LPCITEMIDLIST pidl
)
159 m_pidl
= ILClone(pidl
);
161 return E_OUTOFMEMORY
;
163 return SHELL32_CoCreateInitSF(m_pidl
,
166 &CLSID_ShellFSFolder
,
167 IID_PPV_ARG(IShellFolder2
, &m_pisfInner
));
170 // *** IPersist methods ***
171 STDMETHODIMP
CFindFolder::GetClassID(CLSID
*pClassId
)
173 if (pClassId
== NULL
)
175 memcpy(pClassId
, &CLSID_FindFolder
, sizeof(CLSID
));