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
)
51 if (!pcsFlags
|| iColumn
>= _countof(g_ColumnDefs
))
53 *pcsFlags
= g_ColumnDefs
[iColumn
].dwDefaultState
;
57 STDMETHODIMP
CFindFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
63 STDMETHODIMP
CFindFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*pDetails
)
65 if (iColumn
>= _countof(g_ColumnDefs
))
68 pDetails
->cxChar
= g_ColumnDefs
[iColumn
].cxChar
;
69 pDetails
->fmt
= g_ColumnDefs
[iColumn
].fmt
;
72 return SHSetStrRet(&pDetails
->str
, g_ColumnDefs
[iColumn
].wzColumnName
);
74 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &pDetails
->str
);
77 STDMETHODIMP
CFindFolder::MapColumnToSCID(UINT iColumn
, SHCOLUMNID
*pscid
)
83 // *** IShellFolder methods ***
84 STDMETHODIMP
CFindFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
, ULONG
*pchEaten
,
85 PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
)
91 STDMETHODIMP
CFindFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
97 STDMETHODIMP
CFindFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
103 STDMETHODIMP
CFindFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
109 STDMETHODIMP
CFindFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE 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 HRESULT hr
= SHCreateShellFolderView(&sfvparams
, (IShellView
**) ppvOut
);
125 return E_NOINTERFACE
;
128 STDMETHODIMP
CFindFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
130 *rgfInOut
= SFGAO_NONENUMERATED
;
134 STDMETHODIMP
CFindFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
,
135 UINT
*prgfInOut
, LPVOID
*ppvOut
)
137 return E_NOINTERFACE
;
140 STDMETHODIMP
CFindFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET pName
)
142 return SHSetStrRet(pName
, "search result");
145 STDMETHODIMP
CFindFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, LPCOLESTR lpName
, DWORD dwFlags
,
146 PITEMID_CHILD
*pPidlOut
)
151 //// *** IPersistFolder2 methods ***
152 STDMETHODIMP
CFindFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
154 *pidl
= ILClone(m_pidl
);
158 // *** IPersistFolder methods ***
159 STDMETHODIMP
CFindFolder::Initialize(LPCITEMIDLIST pidl
)
161 m_pidl
= ILClone(pidl
);
163 return E_OUTOFMEMORY
;
168 // *** IPersist methods ***
169 STDMETHODIMP
CFindFolder::GetClassID(CLSID
*pClassId
)
171 if (pClassId
== NULL
)
173 memcpy(pClassId
, &CLSID_FindFolder
, sizeof(CLSID
));