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.
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.
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
19 #include "CSearchBar.h"
20 #include <psdk/wingdi.h>
22 WINE_DEFAULT_DEBUG_CHANNEL(shellfind
);
27 #define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__)
30 CSearchBar::CSearchBar() :
37 CSearchBar::~CSearchBar()
41 void CSearchBar::InitializeSearchBar()
43 CreateWindowExW(0, WC_STATIC
, L
"Search by any or all of the criteria below.",
44 WS_CHILD
| WS_VISIBLE
,
47 _AtlBaseModule
.GetModuleInstance(), NULL
);
49 CreateWindowExW(0, WC_STATIC
, L
"A &word or phrase in the file:",
50 WS_CHILD
| WS_VISIBLE
,
53 _AtlBaseModule
.GetModuleInstance(), NULL
);
54 CreateWindowExW(WS_EX_CLIENTEDGE
, WC_EDITW
, NULL
,
55 WS_BORDER
| WS_CHILD
| WS_VISIBLE
,
58 _AtlBaseModule
.GetModuleInstance(), NULL
);
60 CreateWindowExW(0, WC_STATIC
, L
"&Look in:",
61 WS_CHILD
| WS_VISIBLE
,
64 _AtlBaseModule
.GetModuleInstance(), NULL
);
65 CreateWindowExW(WS_EX_CLIENTEDGE
, WC_EDITW
, NULL
,
66 WS_BORDER
| WS_CHILD
| WS_VISIBLE
,
69 _AtlBaseModule
.GetModuleInstance(), NULL
);
71 CreateWindowExW(0, WC_STATIC
, L
"&Look in:",
72 WS_CHILD
| WS_VISIBLE
,
75 _AtlBaseModule
.GetModuleInstance(), NULL
);
76 CreateWindowExW(WS_EX_CLIENTEDGE
, WC_EDITW
, NULL
,
77 WS_BORDER
| WS_CHILD
| WS_VISIBLE
,
80 _AtlBaseModule
.GetModuleInstance(), NULL
);
82 CreateWindowExW(0, WC_BUTTON
, L
"Sea&rch",
83 WS_BORDER
| WS_CHILD
| WS_VISIBLE
,
86 _AtlBaseModule
.GetModuleInstance(), NULL
);
89 HRESULT
CSearchBar::ExecuteCommand(CComPtr
<IContextMenu
>& menu
, UINT nCmd
)
91 CComPtr
<IOleWindow
> pBrowserOleWnd
;
92 CMINVOKECOMMANDINFO cmi
;
96 hr
= IUnknown_QueryService(pSite
, SID_SShellBrowser
, IID_PPV_ARG(IOleWindow
, &pBrowserOleWnd
));
97 if (FAILED_UNEXPECTEDLY(hr
))
100 hr
= pBrowserOleWnd
->GetWindow(&browserWnd
);
101 if (FAILED_UNEXPECTEDLY(hr
))
104 ZeroMemory(&cmi
, sizeof(cmi
));
105 cmi
.cbSize
= sizeof(cmi
);
106 cmi
.lpVerb
= MAKEINTRESOURCEA(nCmd
);
107 cmi
.hwnd
= browserWnd
;
108 if (GetKeyState(VK_SHIFT
) & 0x8000)
109 cmi
.fMask
|= CMIC_MASK_SHIFT_DOWN
;
110 if (GetKeyState(VK_CONTROL
) & 0x8000)
111 cmi
.fMask
|= CMIC_MASK_CONTROL_DOWN
;
113 return menu
->InvokeCommand(&cmi
);
117 // *** ATL event handlers ***
118 LRESULT
CSearchBar::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
121 IUnknown_OnFocusChangeIS(pSite
, reinterpret_cast<IUnknown
*>(this), TRUE
);
126 HRESULT
CSearchBar::GetSearchResultsFolder(IShellBrowser
**ppShellBrowser
, HWND
*pHwnd
, IShellFolder
**ppShellFolder
)
129 CComPtr
<IShellBrowser
> pShellBrowser
;
131 ppShellBrowser
= &pShellBrowser
;
132 if (!*ppShellBrowser
)
134 hr
= IUnknown_QueryService(m_pSite
, SID_SShellBrowser
, IID_PPV_ARG(IShellBrowser
, ppShellBrowser
));
135 if (FAILED_UNEXPECTEDLY(hr
))
139 CComPtr
<IShellView
> pShellView
;
140 hr
= (*ppShellBrowser
)->QueryActiveShellView(&pShellView
);
141 if (FAILED(hr
) || !pShellView
)
144 CComPtr
<IFolderView
> pFolderView
;
145 hr
= pShellView
->QueryInterface(IID_PPV_ARG(IFolderView
, &pFolderView
));
146 if (FAILED(hr
) || !pFolderView
)
149 CComPtr
<IShellFolder
> pShellFolder
;
151 ppShellFolder
= &pShellFolder
;
152 hr
= pFolderView
->GetFolder(IID_PPV_ARG(IShellFolder
, ppShellFolder
));
153 if (FAILED(hr
) || !pShellFolder
)
157 hr
= IUnknown_GetClassID(*ppShellFolder
, &clsid
);
160 if (clsid
!= CLSID_FindFolder
)
165 hr
= pShellView
->GetWindow(pHwnd
);
166 if (FAILED_UNEXPECTEDLY(hr
))
173 LRESULT
CSearchBar::OnSearchButtonClicked(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
& bHandled
)
175 CComPtr
<IShellBrowser
> pShellBrowser
;
176 HRESULT hr
= IUnknown_QueryService(pSite
, SID_SShellBrowser
, IID_PPV_ARG(IShellBrowser
, &pShellBrowser
));
177 if (FAILED_UNEXPECTEDLY(hr
))
181 if (FAILED(GetSearchResultsFolder(&pShellBrowser
, &hwnd
, NULL
)))
183 WCHAR szShellGuid
[MAX_PATH
];
184 const WCHAR shellGuidPrefix
[] = L
"shell:::";
185 memcpy(szShellGuid
, shellGuidPrefix
, sizeof(shellGuidPrefix
));
186 hr
= StringFromGUID2(CLSID_FindFolder
, szShellGuid
+ _countof(shellGuidPrefix
) - 1,
187 _countof(szShellGuid
) - _countof(shellGuidPrefix
));
188 if (FAILED_UNEXPECTEDLY(hr
))
191 CComHeapPtr
<ITEMIDLIST
> findFolderPidl
;
192 hr
= SHParseDisplayName(szShellGuid
, NULL
, &findFolderPidl
, 0, NULL
);
193 if (FAILED_UNEXPECTEDLY(hr
))
196 hr
= pShellBrowser
->BrowseObject(findFolderPidl
, 0);
197 if (FAILED_UNEXPECTEDLY(hr
))
201 GetSearchResultsFolder(&pShellBrowser
, &hwnd
, NULL
);
203 ::PostMessageW(hwnd
, WM_SEARCH_START
, 0, (LPARAM
) StrDupW(L
"Starting search..."));
208 LRESULT
CSearchBar::OnClicked(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
211 HRESULT hr
= GetSearchResultsFolder(NULL
, &hwnd
, NULL
);
214 LPCWSTR path
= L
"C:\\readme.txt";
215 ::PostMessageW(hwnd
, WM_SEARCH_ADD_RESULT
, 0, (LPARAM
) StrDupW(path
));
222 // *** IOleWindow methods ***
223 HRESULT STDMETHODCALLTYPE
CSearchBar::GetWindow(HWND
*lphwnd
)
231 HRESULT STDMETHODCALLTYPE
CSearchBar::ContextSensitiveHelp(BOOL fEnterMode
)
238 // *** IDockingWindow methods ***
239 HRESULT STDMETHODCALLTYPE
CSearchBar::CloseDW(DWORD dwReserved
)
241 // We do nothing, we don't have anything to save yet
242 TRACE("CloseDW called\n");
246 HRESULT STDMETHODCALLTYPE
CSearchBar::ResizeBorderDW(const RECT
*prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
248 /* Must return E_NOTIMPL according to MSDN */
252 HRESULT STDMETHODCALLTYPE
CSearchBar::ShowDW(BOOL fShow
)
260 // *** IDeskBand methods ***
261 HRESULT STDMETHODCALLTYPE
CSearchBar::GetBandInfo(DWORD dwBandID
, DWORD dwViewMode
, DESKBANDINFO
*pdbi
)
268 if (pdbi
->dwMask
& DBIM_MINSIZE
)
270 pdbi
->ptMinSize
.x
= 200;
271 pdbi
->ptMinSize
.y
= 30;
274 if (pdbi
->dwMask
& DBIM_MAXSIZE
)
276 pdbi
->ptMaxSize
.y
= -1;
279 if (pdbi
->dwMask
& DBIM_INTEGRAL
)
281 pdbi
->ptIntegral
.y
= 1;
284 if (pdbi
->dwMask
& DBIM_ACTUAL
)
286 pdbi
->ptActual
.x
= 200;
287 pdbi
->ptActual
.y
= 30;
290 if (pdbi
->dwMask
& DBIM_TITLE
)
292 if (!LoadStringW(_AtlBaseModule
.GetResourceInstance(), IDS_SEARCHLABEL
, pdbi
->wszTitle
, _countof(pdbi
->wszTitle
)))
293 return HRESULT_FROM_WIN32(GetLastError());
296 if (pdbi
->dwMask
& DBIM_MODEFLAGS
)
298 pdbi
->dwModeFlags
= DBIMF_NORMAL
| DBIMF_VARIABLEHEIGHT
;
301 if (pdbi
->dwMask
& DBIM_BKCOLOR
)
303 pdbi
->dwMask
&= ~DBIM_BKCOLOR
;
308 LRESULT CALLBACK
MyWindowProc(
318 // *** IObjectWithSite methods ***
319 HRESULT STDMETHODCALLTYPE
CSearchBar::SetSite(IUnknown
*pUnkSite
)
324 if (pUnkSite
== pSite
)
327 TRACE("SetSite called \n");
334 if (pUnkSite
!= pSite
)
342 hr
= IUnknown_GetWindow(pUnkSite
, &parentWnd
);
345 ERR("Could not get parent's window ! Status: %08lx\n", hr
);
354 SetParent(parentWnd
);
358 CWindowImpl::Create(parentWnd
);
360 InitializeSearchBar();
365 HRESULT STDMETHODCALLTYPE
CSearchBar::GetSite(REFIID riid
, void **ppvSite
)
374 // *** IOleCommandTarget methods ***
375 HRESULT STDMETHODCALLTYPE
CSearchBar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
381 HRESULT STDMETHODCALLTYPE
CSearchBar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
388 // *** IServiceProvider methods ***
389 HRESULT STDMETHODCALLTYPE
CSearchBar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
391 /* FIXME: we probably want to handle more services here */
392 return IUnknown_QueryService(pSite
, SID_SShellBrowser
, riid
, ppvObject
);
396 // *** IInputObject methods ***
397 HRESULT STDMETHODCALLTYPE
CSearchBar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
404 // TODO: handle message
407 TranslateMessage(lpMsg
);
408 DispatchMessage(lpMsg
);
413 HRESULT STDMETHODCALLTYPE
CSearchBar::HasFocusIO()
415 return bFocused
? S_OK
: S_FALSE
;
418 HRESULT STDMETHODCALLTYPE
CSearchBar::TranslateAcceleratorIO(LPMSG lpMsg
)
420 if (lpMsg
->hwnd
== m_hWnd
)
422 TranslateMessage(lpMsg
);
423 DispatchMessage(lpMsg
);
430 // *** IPersist methods ***
431 HRESULT STDMETHODCALLTYPE
CSearchBar::GetClassID(CLSID
*pClassID
)
435 memcpy(pClassID
, &CLSID_FileSearchBand
, sizeof(CLSID
));
440 // *** IPersistStream methods ***
441 HRESULT STDMETHODCALLTYPE
CSearchBar::IsDirty()
447 HRESULT STDMETHODCALLTYPE
CSearchBar::Load(IStream
*pStm
)
453 HRESULT STDMETHODCALLTYPE
CSearchBar::Save(IStream
*pStm
, BOOL fClearDirty
)
459 HRESULT STDMETHODCALLTYPE
CSearchBar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
461 // TODO: calculate max size
467 // *** IWinEventHandler methods ***
468 HRESULT STDMETHODCALLTYPE
CSearchBar::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
473 HRESULT STDMETHODCALLTYPE
CSearchBar::IsWindowOwner(HWND hWnd
)
475 return (hWnd
== m_hWnd
) ? S_OK
: S_FALSE
;
478 // *** IBandNavigate methods ***
479 HRESULT STDMETHODCALLTYPE
CSearchBar::Select(long paramC
)
485 // *** INamespaceProxy ***
486 HRESULT STDMETHODCALLTYPE
CSearchBar::GetNavigateTarget(long paramC
, long param10
, long param14
)
492 HRESULT STDMETHODCALLTYPE
CSearchBar::Invoke(long paramC
)
498 HRESULT STDMETHODCALLTYPE
CSearchBar::OnSelectionChanged(long paramC
)
504 HRESULT STDMETHODCALLTYPE
CSearchBar::RefreshFlags(long paramC
, long param10
, long param14
)
510 HRESULT STDMETHODCALLTYPE
CSearchBar::CacheItem(long paramC
)
516 // *** IDispatch methods ***
517 HRESULT STDMETHODCALLTYPE
CSearchBar::GetTypeInfoCount(UINT
*pctinfo
)
523 HRESULT STDMETHODCALLTYPE
CSearchBar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
529 HRESULT STDMETHODCALLTYPE
CSearchBar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
535 HRESULT STDMETHODCALLTYPE
CSearchBar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
537 TRACE("Unknown dispid requested: %08x\n", dispIdMember
);