[SHELLFIND] Add CSearchBar
[reactos.git] / dll / win32 / browseui / shellfind / CSearchBar.cpp
1 /*
2 * ReactOS Explorer
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19 #include "CSearchBar.h"
20 #include <psdk/wingdi.h>
21
22 WINE_DEFAULT_DEBUG_CHANNEL(shellfind);
23
24 #if 1
25 #undef UNIMPLEMENTED
26
27 #define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__)
28 #endif
29
30 CSearchBar::CSearchBar() :
31 pSite(NULL),
32 fVisible(FALSE),
33 bFocused(FALSE)
34 {
35 }
36
37 CSearchBar::~CSearchBar()
38 {
39 }
40
41 void CSearchBar::InitializeSearchBar()
42 {
43 CreateWindowExW(0, WC_STATIC, L"Search by any or all of the criteria below.",
44 WS_CHILD | WS_VISIBLE,
45 10, 10, 200, 40,
46 m_hWnd, NULL,
47 _AtlBaseModule.GetModuleInstance(), NULL);
48
49 CreateWindowExW(0, WC_STATIC, L"A &word or phrase in the file:",
50 WS_CHILD | WS_VISIBLE,
51 10, 50, 500, 20,
52 m_hWnd, NULL,
53 _AtlBaseModule.GetModuleInstance(), NULL);
54 CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDITW, NULL,
55 WS_BORDER | WS_CHILD | WS_VISIBLE,
56 10, 70, 100, 20,
57 m_hWnd, NULL,
58 _AtlBaseModule.GetModuleInstance(), NULL);
59
60 CreateWindowExW(0, WC_STATIC, L"&Look in:",
61 WS_CHILD | WS_VISIBLE,
62 10, 100, 500, 20,
63 m_hWnd, NULL,
64 _AtlBaseModule.GetModuleInstance(), NULL);
65 CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDITW, NULL,
66 WS_BORDER | WS_CHILD | WS_VISIBLE,
67 10, 120, 100, 20,
68 m_hWnd, NULL,
69 _AtlBaseModule.GetModuleInstance(), NULL);
70
71 CreateWindowExW(0, WC_BUTTON, L"Sea&rch",
72 WS_BORDER | WS_CHILD | WS_VISIBLE,
73 10, 150, 100, 20,
74 m_hWnd, NULL,
75 _AtlBaseModule.GetModuleInstance(), NULL);
76 }
77
78 HRESULT CSearchBar::ExecuteCommand(CComPtr<IContextMenu>& menu, UINT nCmd)
79 {
80 CComPtr<IOleWindow> pBrowserOleWnd;
81 CMINVOKECOMMANDINFO cmi;
82 HWND browserWnd;
83 HRESULT hr;
84
85 hr = IUnknown_QueryService(pSite, SID_SShellBrowser, IID_PPV_ARG(IOleWindow, &pBrowserOleWnd));
86 if (FAILED_UNEXPECTEDLY(hr))
87 return hr;
88
89 hr = pBrowserOleWnd->GetWindow(&browserWnd);
90 if (FAILED_UNEXPECTEDLY(hr))
91 return hr;
92
93 ZeroMemory(&cmi, sizeof(cmi));
94 cmi.cbSize = sizeof(cmi);
95 cmi.lpVerb = MAKEINTRESOURCEA(nCmd);
96 cmi.hwnd = browserWnd;
97 if (GetKeyState(VK_SHIFT) & 0x8000)
98 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
99 if (GetKeyState(VK_CONTROL) & 0x8000)
100 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
101
102 return menu->InvokeCommand(&cmi);
103 }
104
105
106 // *** ATL event handlers ***
107 LRESULT CSearchBar::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
108 {
109 bFocused = TRUE;
110 IUnknown_OnFocusChangeIS(pSite, reinterpret_cast<IUnknown*>(this), TRUE);
111 bHandled = FALSE;
112 return TRUE;
113 }
114
115
116 // *** IOleWindow methods ***
117 HRESULT STDMETHODCALLTYPE CSearchBar::GetWindow(HWND *lphwnd)
118 {
119 if (!lphwnd)
120 return E_INVALIDARG;
121 *lphwnd = m_hWnd;
122 return S_OK;
123 }
124
125 HRESULT STDMETHODCALLTYPE CSearchBar::ContextSensitiveHelp(BOOL fEnterMode)
126 {
127 UNIMPLEMENTED;
128 return E_NOTIMPL;
129 }
130
131
132 // *** IDockingWindow methods ***
133 HRESULT STDMETHODCALLTYPE CSearchBar::CloseDW(DWORD dwReserved)
134 {
135 // We do nothing, we don't have anything to save yet
136 TRACE("CloseDW called\n");
137 return S_OK;
138 }
139
140 HRESULT STDMETHODCALLTYPE CSearchBar::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
141 {
142 /* Must return E_NOTIMPL according to MSDN */
143 return E_NOTIMPL;
144 }
145
146 HRESULT STDMETHODCALLTYPE CSearchBar::ShowDW(BOOL fShow)
147 {
148 fVisible = fShow;
149 ShowWindow(fShow);
150 return S_OK;
151 }
152
153
154 // *** IDeskBand methods ***
155 HRESULT STDMETHODCALLTYPE CSearchBar::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
156 {
157 if (!pdbi)
158 {
159 return E_INVALIDARG;
160 }
161
162 if (pdbi->dwMask & DBIM_MINSIZE)
163 {
164 pdbi->ptMinSize.x = 200;
165 pdbi->ptMinSize.y = 30;
166 }
167
168 if (pdbi->dwMask & DBIM_MAXSIZE)
169 {
170 pdbi->ptMaxSize.y = -1;
171 }
172
173 if (pdbi->dwMask & DBIM_INTEGRAL)
174 {
175 pdbi->ptIntegral.y = 1;
176 }
177
178 if (pdbi->dwMask & DBIM_ACTUAL)
179 {
180 pdbi->ptActual.x = 200;
181 pdbi->ptActual.y = 30;
182 }
183
184 if (pdbi->dwMask & DBIM_TITLE)
185 {
186 if (!LoadStringW(_AtlBaseModule.GetResourceInstance(), IDS_SEARCHLABEL, pdbi->wszTitle, _countof(pdbi->wszTitle)))
187 return HRESULT_FROM_WIN32(GetLastError());
188 }
189
190 if (pdbi->dwMask & DBIM_MODEFLAGS)
191 {
192 pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
193 }
194
195 if (pdbi->dwMask & DBIM_BKCOLOR)
196 {
197 pdbi->dwMask &= ~DBIM_BKCOLOR;
198 }
199 return S_OK;
200 }
201
202 LRESULT CALLBACK MyWindowProc(
203 _In_ HWND hwnd,
204 _In_ UINT uMsg,
205 _In_ WPARAM wParam,
206 _In_ LPARAM lParam
207 )
208 {
209 return 0;
210 }
211
212 // *** IObjectWithSite methods ***
213 HRESULT STDMETHODCALLTYPE CSearchBar::SetSite(IUnknown *pUnkSite)
214 {
215 HRESULT hr;
216 HWND parentWnd;
217
218 if (pUnkSite == pSite)
219 return S_OK;
220
221 TRACE("SetSite called \n");
222 if (!pUnkSite)
223 {
224 DestroyWindow();
225 m_hWnd = NULL;
226 }
227
228 if (pUnkSite != pSite)
229 {
230 pSite = NULL;
231 }
232
233 if(!pUnkSite)
234 return S_OK;
235
236 hr = IUnknown_GetWindow(pUnkSite, &parentWnd);
237 if (!SUCCEEDED(hr))
238 {
239 ERR("Could not get parent's window ! Status: %08lx\n", hr);
240 return E_INVALIDARG;
241 }
242
243 pSite = pUnkSite;
244
245 if (m_hWnd)
246 {
247 // Change its parent
248 SetParent(parentWnd);
249 }
250 else
251 {
252 CWindowImpl::Create(parentWnd);
253
254 InitializeSearchBar();
255 }
256 return S_OK;
257 }
258
259 HRESULT STDMETHODCALLTYPE CSearchBar::GetSite(REFIID riid, void **ppvSite)
260 {
261 if (!ppvSite)
262 return E_POINTER;
263 *ppvSite = pSite;
264 return S_OK;
265 }
266
267
268 // *** IOleCommandTarget methods ***
269 HRESULT STDMETHODCALLTYPE CSearchBar::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
270 {
271 UNIMPLEMENTED;
272 return E_NOTIMPL;
273 }
274
275 HRESULT STDMETHODCALLTYPE CSearchBar::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
276 {
277 UNIMPLEMENTED;
278 return E_NOTIMPL;
279 }
280
281
282 // *** IServiceProvider methods ***
283 HRESULT STDMETHODCALLTYPE CSearchBar::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
284 {
285 /* FIXME: we probably want to handle more services here */
286 return IUnknown_QueryService(pSite, SID_SShellBrowser, riid, ppvObject);
287 }
288
289
290 // *** IInputObject methods ***
291 HRESULT STDMETHODCALLTYPE CSearchBar::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
292 {
293 if (fActivate)
294 {
295 //SetFocus();
296 SetActiveWindow();
297 }
298 // TODO: handle message
299 if(lpMsg)
300 {
301 TranslateMessage(lpMsg);
302 DispatchMessage(lpMsg);
303 }
304 return S_OK;
305 }
306
307 HRESULT STDMETHODCALLTYPE CSearchBar::HasFocusIO()
308 {
309 return bFocused ? S_OK : S_FALSE;
310 }
311
312 HRESULT STDMETHODCALLTYPE CSearchBar::TranslateAcceleratorIO(LPMSG lpMsg)
313 {
314 if (lpMsg->hwnd == m_hWnd)
315 {
316 TranslateMessage(lpMsg);
317 DispatchMessage(lpMsg);
318 return S_OK;
319 }
320
321 return S_FALSE;
322 }
323
324 // *** IPersist methods ***
325 HRESULT STDMETHODCALLTYPE CSearchBar::GetClassID(CLSID *pClassID)
326 {
327 if (!pClassID)
328 return E_POINTER;
329 memcpy(pClassID, &CLSID_FileSearchBand, sizeof(CLSID));
330 return S_OK;
331 }
332
333
334 // *** IPersistStream methods ***
335 HRESULT STDMETHODCALLTYPE CSearchBar::IsDirty()
336 {
337 UNIMPLEMENTED;
338 return E_NOTIMPL;
339 }
340
341 HRESULT STDMETHODCALLTYPE CSearchBar::Load(IStream *pStm)
342 {
343 UNIMPLEMENTED;
344 return E_NOTIMPL;
345 }
346
347 HRESULT STDMETHODCALLTYPE CSearchBar::Save(IStream *pStm, BOOL fClearDirty)
348 {
349 UNIMPLEMENTED;
350 return E_NOTIMPL;
351 }
352
353 HRESULT STDMETHODCALLTYPE CSearchBar::GetSizeMax(ULARGE_INTEGER *pcbSize)
354 {
355 // TODO: calculate max size
356 UNIMPLEMENTED;
357 return E_NOTIMPL;
358 }
359
360
361 // *** IWinEventHandler methods ***
362 HRESULT STDMETHODCALLTYPE CSearchBar::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
363 {
364 return S_OK;
365 }
366
367 HRESULT STDMETHODCALLTYPE CSearchBar::IsWindowOwner(HWND hWnd)
368 {
369 return (hWnd == m_hWnd) ? S_OK : S_FALSE;
370 }
371
372 // *** IBandNavigate methods ***
373 HRESULT STDMETHODCALLTYPE CSearchBar::Select(long paramC)
374 {
375 UNIMPLEMENTED;
376 return E_NOTIMPL;
377 }
378
379 // *** INamespaceProxy ***
380 HRESULT STDMETHODCALLTYPE CSearchBar::GetNavigateTarget(long paramC, long param10, long param14)
381 {
382 UNIMPLEMENTED;
383 return E_NOTIMPL;
384 }
385
386 HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(long paramC)
387 {
388 UNIMPLEMENTED;
389 return E_NOTIMPL;
390 }
391
392 HRESULT STDMETHODCALLTYPE CSearchBar::OnSelectionChanged(long paramC)
393 {
394 UNIMPLEMENTED;
395 return E_NOTIMPL;
396 }
397
398 HRESULT STDMETHODCALLTYPE CSearchBar::RefreshFlags(long paramC, long param10, long param14)
399 {
400 UNIMPLEMENTED;
401 return E_NOTIMPL;
402 }
403
404 HRESULT STDMETHODCALLTYPE CSearchBar::CacheItem(long paramC)
405 {
406 UNIMPLEMENTED;
407 return E_NOTIMPL;
408 }
409
410 // *** IDispatch methods ***
411 HRESULT STDMETHODCALLTYPE CSearchBar::GetTypeInfoCount(UINT *pctinfo)
412 {
413 UNIMPLEMENTED;
414 return E_NOTIMPL;
415 }
416
417 HRESULT STDMETHODCALLTYPE CSearchBar::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
418 {
419 UNIMPLEMENTED;
420 return E_NOTIMPL;
421 }
422
423 HRESULT STDMETHODCALLTYPE CSearchBar::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
424 {
425 UNIMPLEMENTED;
426 return E_NOTIMPL;
427 }
428
429 HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
430 {
431 TRACE("Unknown dispid requested: %08x\n", dispIdMember);
432 return E_INVALIDARG;
433 }