[SHELLFIND] Remove unused function
[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 #include <commoncontrols.h>
22 #include <../browseui.h>
23 #include <shellapi.h>
24 #include <exdispid.h>
25
26 WINE_DEFAULT_DEBUG_CHANNEL(shellfind);
27
28 #if 1
29 #undef UNIMPLEMENTED
30
31 #define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__)
32 #endif
33
34 CSearchBar::CSearchBar() :
35 pSite(NULL),
36 fVisible(FALSE)
37 {
38 }
39
40 CSearchBar::~CSearchBar()
41 {
42 }
43
44 LRESULT CSearchBar::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
45 {
46 SetSearchInProgress(FALSE);
47
48 HWND hCombobox = GetDlgItem(IDC_SEARCH_COMBOBOX);
49 IImageList *pImageList;
50 HRESULT hResult = SHGetImageList(SHIL_SMALL, IID_PPV_ARG(IImageList, &pImageList));
51 SendMessage(hCombobox, CBEM_SETIMAGELIST, 0, FAILED_UNEXPECTEDLY(hResult) ? 0 : reinterpret_cast<LPARAM>(pImageList));
52
53 SendMessage(hCombobox, CBEM_SETEXTENDEDSTYLE,
54 CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT, CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT);
55 HWND hEditControl = reinterpret_cast<HWND>(SendMessage(hCombobox, CBEM_GETEDITCONTROL, 0, 0));
56 hResult = CAddressEditBox_CreateInstance(IID_PPV_ARG(IAddressEditBox, &m_AddressEditBox));
57 if (FAILED_UNEXPECTEDLY(hResult))
58 return hResult;
59
60 CComPtr<IShellService> pShellService;
61 hResult = fAddressEditBox->QueryInterface(IID_PPV_ARG(IShellService, &pShellService));
62 if (FAILED_UNEXPECTEDLY(hResult))
63 return hResult;
64 hResult = fAddressEditBox->Init(hCombobox, fEditControl, 0, pSite);
65 if (FAILED_UNEXPECTEDLY(hResult))
66 return hResult;
67
68 CComPtr<IDispatch> pDispatch;
69 hResult = fAddressEditBox->QueryInterface(IID_PPV_ARG(IDispatch, &pDispatch));
70 if (FAILED_UNEXPECTEDLY(hResult))
71 return hResult;
72 DISPPARAMS params = {0};
73 hResult = pDispatch->Invoke(DISPID_NAVIGATECOMPLETE2, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
74
75 hResult = pShellService->SetOwner(NULL);
76 if (FAILED_UNEXPECTEDLY(hResult))
77 return hResult;
78
79 return 0;
80 }
81
82 HRESULT CSearchBar::ExecuteCommand(CComPtr<IContextMenu>& menu, UINT nCmd)
83 {
84 CComPtr<IOleWindow> pBrowserOleWnd;
85 CMINVOKECOMMANDINFO cmi;
86 HWND browserWnd;
87 HRESULT hr;
88
89 hr = IUnknown_QueryService(pSite, SID_SShellBrowser, IID_PPV_ARG(IOleWindow, &pBrowserOleWnd));
90 if (FAILED_UNEXPECTEDLY(hr))
91 return hr;
92
93 hr = pBrowserOleWnd->GetWindow(&browserWnd);
94 if (FAILED_UNEXPECTEDLY(hr))
95 return hr;
96
97 ZeroMemory(&cmi, sizeof(cmi));
98 cmi.cbSize = sizeof(cmi);
99 cmi.lpVerb = MAKEINTRESOURCEA(nCmd);
100 cmi.hwnd = browserWnd;
101 if (GetKeyState(VK_SHIFT) & 0x8000)
102 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
103 if (GetKeyState(VK_CONTROL) & 0x8000)
104 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
105
106 return menu->InvokeCommand(&cmi);
107 }
108
109
110 // *** ATL event handlers ***
111 LRESULT CSearchBar::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
112 {
113 IUnknown_OnFocusChangeIS(pSite, reinterpret_cast<IUnknown*>(this), TRUE);
114 bHandled = FALSE;
115 return TRUE;
116 }
117
118 HRESULT CSearchBar::GetSearchResultsFolder(IShellBrowser **ppShellBrowser, HWND *pHwnd, IShellFolder **ppShellFolder)
119 {
120 HRESULT hr;
121 CComPtr<IShellBrowser> pShellBrowser;
122 if (!ppShellBrowser)
123 ppShellBrowser = &pShellBrowser;
124 if (!*ppShellBrowser)
125 {
126 hr = IUnknown_QueryService(m_pSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, ppShellBrowser));
127 if (FAILED_UNEXPECTEDLY(hr))
128 return hr;
129 }
130
131 CComPtr<IShellView> pShellView;
132 hr = (*ppShellBrowser)->QueryActiveShellView(&pShellView);
133 if (FAILED(hr) || !pShellView)
134 return hr;
135
136 CComPtr<IFolderView> pFolderView;
137 hr = pShellView->QueryInterface(IID_PPV_ARG(IFolderView, &pFolderView));
138 if (FAILED(hr) || !pFolderView)
139 return hr;
140
141 CComPtr<IShellFolder> pShellFolder;
142 if (!ppShellFolder)
143 ppShellFolder = &pShellFolder;
144 hr = pFolderView->GetFolder(IID_PPV_ARG(IShellFolder, ppShellFolder));
145 if (FAILED(hr) || !pShellFolder)
146 return hr;
147
148 CLSID clsid;
149 hr = IUnknown_GetClassID(*ppShellFolder, &clsid);
150 if (FAILED(hr))
151 return hr;
152 if (clsid != CLSID_FindFolder)
153 return E_FAIL;
154
155 if (pHwnd)
156 {
157 hr = pShellView->GetWindow(pHwnd);
158 if (FAILED_UNEXPECTEDLY(hr))
159 return hr;
160 }
161
162 return S_OK;
163 }
164
165 LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
166 {
167 CComHeapPtr<SearchStart> pSearchStart((SearchStart *)SHAlloc(sizeof(SearchStart)));
168 GetDlgItemText(IDC_SEARCH_FILENAME, pSearchStart->szFileName, _countof(pSearchStart->szFileName));
169 GetDlgItemText(IDC_SEARCH_QUERY, pSearchStart->szQuery, _countof(pSearchStart->szQuery));
170 if (!GetAddressEditBoxPath(pSearchStart->szPath))
171 {
172 ShellMessageBoxW(_AtlBaseModule.GetResourceInstance(), m_hWnd, MAKEINTRESOURCEW(IDS_SEARCHINVALID), MAKEINTRESOURCEW(IDS_SEARCHLABEL), MB_OK | MB_ICONERROR, pSearchStart->szPath);
173 return TRUE;
174 }
175
176 CComPtr<IShellBrowser> pShellBrowser;
177 HRESULT hr = IUnknown_QueryService(pSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pShellBrowser));
178 if (FAILED_UNEXPECTEDLY(hr))
179 return hr;
180
181 HWND hwnd;
182 if (FAILED(GetSearchResultsFolder(&pShellBrowser, &hwnd, NULL)))
183 {
184 // Open a new search results folder
185 WCHAR szShellGuid[MAX_PATH];
186 const WCHAR shellGuidPrefix[] = L"shell:::";
187 memcpy(szShellGuid, shellGuidPrefix, sizeof(shellGuidPrefix));
188 hr = StringFromGUID2(CLSID_FindFolder, szShellGuid + _countof(shellGuidPrefix) - 1,
189 _countof(szShellGuid) - _countof(shellGuidPrefix));
190 if (FAILED_UNEXPECTEDLY(hr))
191 return hr;
192
193 CComHeapPtr<ITEMIDLIST> findFolderPidl;
194 hr = SHParseDisplayName(szShellGuid, NULL, &findFolderPidl, 0, NULL);
195 if (FAILED_UNEXPECTEDLY(hr))
196 return hr;
197
198 hr = pShellBrowser->BrowseObject(findFolderPidl, 0);
199 if (FAILED_UNEXPECTEDLY(hr))
200 return hr;
201
202 CComPtr<IShellFolder> pShellFolder;
203 hr = GetSearchResultsFolder(*pShellBrowser, &hwnd, &pShellFolder);
204 if (FAILED_UNEXPECTEDLY(hr))
205 return hr;
206
207 // Subscribe to search events
208 DWORD fAdviseCookie;
209 hr = AtlAdvise(pShellFolder, static_cast<IDispatch *>(this), DIID_DSearchCommandEvents, &fAdviseCookie);
210 if (FAILED_UNEXPECTEDLY(hr))
211 return hr;
212 }
213
214 ::PostMessageW(hwnd, WM_SEARCH_START, 0, (LPARAM) pSearchStart.Detach());
215
216 SetSearchInProgress(TRUE);
217
218 return TRUE;
219 }
220
221 LRESULT CSearchBar::OnStopButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
222 {
223 HWND hwnd;
224 HRESULT hr = GetSearchResultsFolder(NULL, &hwnd, NULL);
225 if (SUCCEEDED(hr))
226 ::PostMessageW(hwnd, WM_SEARCH_STOP, 0, 0);
227
228 return TRUE;
229 }
230
231 BOOL CSearchBar::GetAddressEditBoxPath(WCHAR (&szPath)[MAX_PATH])
232 {
233 HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX);
234 ::GetWindowTextW(hComboboxEx, szPath, _countof(szPath));
235 INT iSelectedIndex = SendMessageW(hComboboxEx, CB_GETCURSEL, 0, 0);
236 if (iSelectedIndex != CB_ERR)
237 {
238 WCHAR szItemText[MAX_PATH];
239 COMBOBOXEXITEMW item = {0};
240 item.mask = CBEIF_LPARAM | CBEIF_TEXT;
241 item.iItem = iSelectedIndex;
242 item.pszText = szItemText;
243 item.cchTextMax = _countof(szItemText);
244 SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item);
245
246 if (!wcscmp(szItemText, szPath) && SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szPath))
247 {
248 return TRUE;
249 }
250 }
251
252 DWORD dwAttributes = GetFileAttributesW(szPath);
253 return dwAttributes != INVALID_FILE_ATTRIBUTES
254 && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY);
255 }
256
257 LRESULT CSearchBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
258 {
259 INT iWidth = LOWORD(lParam);
260 INT iPadding = 10;
261
262 ((CWindow)GetDlgItem(IDC_SEARCH_LABEL)).SetWindowPos(NULL, 0, 0, iWidth - iPadding, 40, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER);
263
264 HWND inputs[] = { GetDlgItem(IDC_SEARCH_FILENAME), GetDlgItem(IDC_SEARCH_QUERY), GetDlgItem(IDC_SEARCH_COMBOBOX), GetDlgItem(IDC_SEARCH_BUTTON), GetDlgItem(IDC_SEARCH_STOP_BUTTON), GetDlgItem(IDC_PROGRESS_BAR) };
265 for (SIZE_T i = 0; i < _countof(inputs); i++)
266 {
267 CWindow wFileName = (CWindow) inputs[i];
268 RECT rect;
269 wFileName.GetWindowRect(&rect);
270 POINT pt = { rect.left, rect.top };
271 ScreenToClient(&pt);
272 wFileName.MoveWindow(iPadding, pt.y, iWidth - iPadding * 2, rect.bottom - rect.top);
273 }
274
275 return 0;
276 }
277
278
279 // *** IOleWindow methods ***
280 HRESULT STDMETHODCALLTYPE CSearchBar::GetWindow(HWND *lphwnd)
281 {
282 if (!lphwnd)
283 return E_INVALIDARG;
284 *lphwnd = m_hWnd;
285 return S_OK;
286 }
287
288 HRESULT STDMETHODCALLTYPE CSearchBar::ContextSensitiveHelp(BOOL fEnterMode)
289 {
290 UNIMPLEMENTED;
291 return E_NOTIMPL;
292 }
293
294
295 // *** IDockingWindow methods ***
296 HRESULT STDMETHODCALLTYPE CSearchBar::CloseDW(DWORD dwReserved)
297 {
298 // We do nothing, we don't have anything to save yet
299 TRACE("CloseDW called\n");
300 return S_OK;
301 }
302
303 HRESULT STDMETHODCALLTYPE CSearchBar::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
304 {
305 /* Must return E_NOTIMPL according to MSDN */
306 return E_NOTIMPL;
307 }
308
309 HRESULT STDMETHODCALLTYPE CSearchBar::ShowDW(BOOL fShow)
310 {
311 fVisible = fShow;
312 ShowWindow(fShow);
313 return S_OK;
314 }
315
316
317 // *** IDeskBand methods ***
318 HRESULT STDMETHODCALLTYPE CSearchBar::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
319 {
320 if (!pdbi)
321 {
322 return E_INVALIDARG;
323 }
324
325 if (pdbi->dwMask & DBIM_MINSIZE)
326 {
327 pdbi->ptMinSize.x = 200;
328 pdbi->ptMinSize.y = 30;
329 }
330
331 if (pdbi->dwMask & DBIM_MAXSIZE)
332 {
333 pdbi->ptMaxSize.y = -1;
334 }
335
336 if (pdbi->dwMask & DBIM_INTEGRAL)
337 {
338 pdbi->ptIntegral.y = 1;
339 }
340
341 if (pdbi->dwMask & DBIM_ACTUAL)
342 {
343 pdbi->ptActual.x = 200;
344 pdbi->ptActual.y = 30;
345 }
346
347 if (pdbi->dwMask & DBIM_TITLE)
348 {
349 if (!LoadStringW(_AtlBaseModule.GetResourceInstance(), IDS_SEARCHLABEL, pdbi->wszTitle, _countof(pdbi->wszTitle)))
350 return HRESULT_FROM_WIN32(GetLastError());
351 }
352
353 if (pdbi->dwMask & DBIM_MODEFLAGS)
354 {
355 pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
356 }
357
358 if (pdbi->dwMask & DBIM_BKCOLOR)
359 {
360 pdbi->dwMask &= ~DBIM_BKCOLOR;
361 }
362 return S_OK;
363 }
364
365
366 // *** IObjectWithSite methods ***
367 HRESULT STDMETHODCALLTYPE CSearchBar::SetSite(IUnknown *pUnkSite)
368 {
369 HRESULT hr;
370 HWND parentWnd;
371
372 if (pUnkSite == pSite)
373 return S_OK;
374
375 TRACE("SetSite called \n");
376 if (!pUnkSite)
377 {
378 DestroyWindow();
379 m_hWnd = NULL;
380 }
381
382 if (pUnkSite != pSite)
383 {
384 pSite = NULL;
385 }
386
387 if(!pUnkSite)
388 return S_OK;
389
390 hr = IUnknown_GetWindow(pUnkSite, &parentWnd);
391 if (!SUCCEEDED(hr))
392 {
393 ERR("Could not get parent's window ! Status: %08lx\n", hr);
394 return E_INVALIDARG;
395 }
396
397 pSite = pUnkSite;
398
399 if (m_hWnd)
400 {
401 // Change its parent
402 SetParent(parentWnd);
403 }
404 else
405 {
406 CDialogImpl::Create(parentWnd);
407
408 }
409 return S_OK;
410 }
411
412 HRESULT STDMETHODCALLTYPE CSearchBar::GetSite(REFIID riid, void **ppvSite)
413 {
414 if (!ppvSite)
415 return E_POINTER;
416 *ppvSite = pSite;
417 return S_OK;
418 }
419
420
421 // *** IOleCommandTarget methods ***
422 HRESULT STDMETHODCALLTYPE CSearchBar::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
423 {
424 UNIMPLEMENTED;
425 return E_NOTIMPL;
426 }
427
428 HRESULT STDMETHODCALLTYPE CSearchBar::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
429 {
430 UNIMPLEMENTED;
431 return E_NOTIMPL;
432 }
433
434
435 // *** IServiceProvider methods ***
436 HRESULT STDMETHODCALLTYPE CSearchBar::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
437 {
438 /* FIXME: we probably want to handle more services here */
439 return IUnknown_QueryService(pSite, SID_SShellBrowser, riid, ppvObject);
440 }
441
442
443 // *** IInputObject methods ***
444 HRESULT STDMETHODCALLTYPE CSearchBar::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
445 {
446 if (fActivate)
447 {
448 //SetFocus();
449 SetActiveWindow();
450 }
451 // TODO: handle message
452 if(lpMsg)
453 {
454 TranslateMessage(lpMsg);
455 DispatchMessage(lpMsg);
456 }
457 return S_OK;
458 }
459
460 HRESULT STDMETHODCALLTYPE CSearchBar::HasFocusIO()
461 {
462 return S_OK;
463 }
464
465 HRESULT STDMETHODCALLTYPE CSearchBar::TranslateAcceleratorIO(LPMSG lpMsg)
466 {
467 if (IsDialogMessage(lpMsg))
468 return S_OK;
469
470 if ((lpMsg->hwnd == m_hWnd || IsChild(lpMsg->hwnd)))
471 {
472 TranslateMessage(lpMsg);
473 DispatchMessage(lpMsg);
474 return S_OK;
475 }
476
477 return S_FALSE;
478 }
479
480 // *** IPersist methods ***
481 HRESULT STDMETHODCALLTYPE CSearchBar::GetClassID(CLSID *pClassID)
482 {
483 if (!pClassID)
484 return E_POINTER;
485 memcpy(pClassID, &CLSID_FileSearchBand, sizeof(CLSID));
486 return S_OK;
487 }
488
489
490 // *** IPersistStream methods ***
491 HRESULT STDMETHODCALLTYPE CSearchBar::IsDirty()
492 {
493 UNIMPLEMENTED;
494 return E_NOTIMPL;
495 }
496
497 HRESULT STDMETHODCALLTYPE CSearchBar::Load(IStream *pStm)
498 {
499 UNIMPLEMENTED;
500 return E_NOTIMPL;
501 }
502
503 HRESULT STDMETHODCALLTYPE CSearchBar::Save(IStream *pStm, BOOL fClearDirty)
504 {
505 UNIMPLEMENTED;
506 return E_NOTIMPL;
507 }
508
509 HRESULT STDMETHODCALLTYPE CSearchBar::GetSizeMax(ULARGE_INTEGER *pcbSize)
510 {
511 // TODO: calculate max size
512 UNIMPLEMENTED;
513 return E_NOTIMPL;
514 }
515
516
517 // *** IWinEventHandler methods ***
518 HRESULT STDMETHODCALLTYPE CSearchBar::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
519 {
520 return S_OK;
521 }
522
523 HRESULT STDMETHODCALLTYPE CSearchBar::IsWindowOwner(HWND hWnd)
524 {
525 return (hWnd == m_hWnd) ? S_OK : S_FALSE;
526 }
527
528 // *** IBandNavigate methods ***
529 HRESULT STDMETHODCALLTYPE CSearchBar::Select(long paramC)
530 {
531 UNIMPLEMENTED;
532 return E_NOTIMPL;
533 }
534
535 // *** INamespaceProxy ***
536 HRESULT STDMETHODCALLTYPE CSearchBar::GetNavigateTarget(long paramC, long param10, long param14)
537 {
538 UNIMPLEMENTED;
539 return E_NOTIMPL;
540 }
541
542 HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(long paramC)
543 {
544 UNIMPLEMENTED;
545 return E_NOTIMPL;
546 }
547
548 HRESULT STDMETHODCALLTYPE CSearchBar::OnSelectionChanged(long paramC)
549 {
550 UNIMPLEMENTED;
551 return E_NOTIMPL;
552 }
553
554 HRESULT STDMETHODCALLTYPE CSearchBar::RefreshFlags(long paramC, long param10, long param14)
555 {
556 UNIMPLEMENTED;
557 return E_NOTIMPL;
558 }
559
560 HRESULT STDMETHODCALLTYPE CSearchBar::CacheItem(long paramC)
561 {
562 UNIMPLEMENTED;
563 return E_NOTIMPL;
564 }
565
566 // *** IDispatch methods ***
567 HRESULT STDMETHODCALLTYPE CSearchBar::GetTypeInfoCount(UINT *pctinfo)
568 {
569 UNIMPLEMENTED;
570 return E_NOTIMPL;
571 }
572
573 HRESULT STDMETHODCALLTYPE CSearchBar::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
574 {
575 UNIMPLEMENTED;
576 return E_NOTIMPL;
577 }
578
579 HRESULT STDMETHODCALLTYPE CSearchBar::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
580 {
581 UNIMPLEMENTED;
582 return E_NOTIMPL;
583 }
584
585 void CSearchBar::SetSearchInProgress(BOOL bInProgress)
586 {
587 ::ShowWindow(GetDlgItem(IDC_SEARCH_BUTTON), bInProgress ? SW_HIDE : SW_SHOW);
588 ::ShowWindow(GetDlgItem(IDC_SEARCH_STOP_BUTTON), bInProgress ? SW_SHOW : SW_HIDE);
589 HWND hProgressBar = GetDlgItem(IDC_PROGRESS_BAR);
590 ::ShowWindow(hProgressBar, bInProgress ? SW_SHOW : SW_HIDE);
591 ::PostMessage(hProgressBar, PBM_SETMARQUEE, bInProgress, 0);
592 }
593
594 HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
595 {
596 if (dispIdMember == DISPID_SEARCHCOMPLETE || dispIdMember == DISPID_SEARCHABORT)
597 {
598 SetSearchInProgress(FALSE);
599 return S_OK;
600 }
601 return E_INVALIDARG;
602 }