windows-nt/Source/XPSP1/NT/shell/shell32/findband.h
2020-09-26 16:20:57 +08:00

344 lines
13 KiB
C++

// findband.h : Declaration of the CFileSearchBand
#ifndef __FSEARCH_H__
#define __FSEARCH_H__
#include "unicpp/stdafx.h"
#include "atldisp.h"
#include "shcombox.h" // shell combo methods
#include "finddlg.h"
class CFindFilesDlg;
#define FILESEARCHCTL_CLASS TEXT("ShellFileSearchControl")
// Band layout flags passed thru CFileSearchBand::UpdateLayout().
#define BLF_CALCSCROLL 0x00000001 // recalc scroll bars
#define BLF_SCROLLWINDOW 0x00000002 // scroll subdialog
#define BLF_RESIZECHILDREN 0x00000004 // resize subdialog
#define BLF_ALL 0xFFFFFFFF // do all layout ops
const UINT _icons[] = {
// replaced icons for fsearch, csearch with riff animations.
IDI_PSEARCH,
};
// CMetrics: maintains ctl metrics and resources.
class CMetrics
{
public:
CMetrics();
~CMetrics()
{
DestroyResources();
}
void Init(HWND hwndDlg);
void OnWinIniChange(HWND hwndDlg);
static COLORREF TextColor() { return GetSysColor(COLOR_WINDOWTEXT); }
static COLORREF BkgndColor() { return GetSysColor(COLOR_WINDOW); }
static COLORREF BorderColor() { return GetSysColor(COLOR_WINDOWTEXT); }
const HBRUSH& BkgndBrush() const { return _hbrBkgnd; }
const HBRUSH& BorderBrush() const { return _hbrBorder; }
POINT& ExpandOrigin() { return _ptExpandOrigin; }
RECT& CheckBoxRect() { return _rcCheckBox; }
int& TightMarginY() { return _cyTightMargin; }
int& LooseMarginY() { return _cyLooseMargin; }
int& CtlMarginX() { return _cxCtlMargin; }
HFONT BoldFont(HWND hwndDlg);
HICON CaptionIcon(UINT nIDIconResource);
protected:
BOOL CreateResources();
VOID DestroyResources();
static BOOL GetWindowLogFont(HWND hwnd, OUT LOGFONT* plf);
HBRUSH _hbrBkgnd;
HBRUSH _hbrBorder;
POINT _ptExpandOrigin; // left-top origin of subdlg expansion
RECT _rcCheckBox; // size of a check box
int _cyTightMargin; // v. distance between two tightly associated controls.
int _cyLooseMargin; // v. distance between two loosely associated controls.
int _cxCtlMargin; // distance between left or right dlg border and child window border.
HFONT _hfBold; // Bold font
HICON _rghiconCaption[ARRAYSIZE(_icons)];
};
class ATL_NO_VTABLE CFileSearchBand :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CFileSearchBand, &CLSID_FileSearchBand>,
public CComControl<CFileSearchBand>,
public CStockPropImpl<CFileSearchBand, IFileSearchBand, &IID_IFileSearchBand, &LIBID_Shell32>,
public IProvideClassInfo2Impl<&CLSID_FileSearchBand, NULL, &LIBID_Shell32>,
public IPersistStreamInitImpl<CFileSearchBand>,
public IPersistStorageImpl<CFileSearchBand>,
public IQuickActivateImpl<CFileSearchBand>,
public IOleControlImpl<CFileSearchBand>,
public IOleInPlaceActiveObjectImpl<CFileSearchBand>,
public IViewObjectExImpl<CFileSearchBand>,
public IOleInPlaceObjectWindowlessImpl<CFileSearchBand>,
public IDataObjectImpl<CFileSearchBand>,
public ISpecifyPropertyPagesImpl<CFileSearchBand>,
public IDeskBand,
public IObjectWithSite,
public IPersistStream,
public IInputObject,
public IServiceProvider,
public IOleCommandTarget,
// Must derive from CShell32AtlIDispatch<> and not IOleObjecImpl
// if this control resides in shell32.dll
public CShell32AtlIDispatch<CFileSearchBand, &CLSID_FileSearchBand, &IID_IFileSearchBand, &LIBID_Shell32, 1, 0, CComTypeInfoHolder>
{
public:
CFileSearchBand();
~CFileSearchBand();
static CWndClassInfo& GetWndClassInfo();
HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
DWORD dwStyle = WS_CHILD|WS_VISIBLE, DWORD dwExStyle = 0, UINT nID = 0);
void SetDeskbandWidth(int cx);
void FinalRelease();
public:
BOOL IsDeskBand() const { return _fDeskBand; }
static BOOL IsBandDebut();
CMetrics& GetMetrics() { return _metrics; }
static int MakeBandKey(OUT LPTSTR pszKey, IN UINT cchKey);
static int MakeBandSubKey(IN LPCTSTR pszSubKey, OUT LPTSTR pszKey, IN UINT cchKey);
static HKEY GetBandRegKey(BOOL bForceCreate = FALSE);
void UpdateLayout(ULONG fLayoutFlags = BLF_ALL);
void EnsureVisible(LPCRECT lprc /* in screen coords */);
BOOL IsKeyboardScroll(MSG* pmsg);
HRESULT IsDlgMessage(HWND hwnd, LPMSG pmsg);
HRESULT AutoActivate();
void SetDirty(BOOL bDirty = TRUE);
BOOL IsDirty() const { return _fDirty; }
BOOL IsValid() const { return _fValid; }
IUnknown* BandSite() { return _punkSite ? _punkSite : (IUnknown*)m_spClientSite; }
IOleClientSite* OleClientSite() { return m_spClientSite; }
DECLARE_NO_REGISTRY();
BEGIN_COM_MAP(CFileSearchBand)
COM_INTERFACE_ENTRY(IFileSearchBand)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY_IID(IID_IViewObject2, IViewObjectEx)
COM_INTERFACE_ENTRY_IID(IID_IViewObject, IViewObjectEx)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
//COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY_IID(IID_IDeskBand,IDeskBand)
COM_INTERFACE_ENTRY(IOleCommandTarget)
COM_INTERFACE_ENTRY_IID(IID_IInputObject,IInputObject)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
COM_INTERFACE_ENTRY(IPersistStream)
END_COM_MAP()
public:
BEGIN_PROPERTY_MAP(CFileSearchBand)
// PROP_ENTRY("Property Description", dispid, clsid)
PROP_PAGE(CLSID_StockColorPage)
END_PROPERTY_MAP()
// message map
BEGIN_MSG_MAP(CFileSearchBand)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_HSCROLL, OnScroll)
MESSAGE_HANDLER(WM_VSCROLL, OnScroll)
MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnWinIniChange)
MESSAGE_HANDLER(WM_SYSCOLORCHANGE, OnWinIniChange)
MESSAGE_HANDLER(WM_WININICHANGE, OnWinIniChange)
MESSAGE_HANDLER(WMU_BANDINFOUPDATE, OnBandInfoUpdate)
END_MSG_MAP()
//---------------------//
// Message handling
protected:
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnScroll(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnEraseBkgnd(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnMouseActivate(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnWinIniChange(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnBandInfoUpdate(UINT, WPARAM, LPARAM, BOOL&);
public:
// IFileSearchBand methods
STDMETHOD (SetFocus)();
STDMETHOD (SetSearchParameters)(IN BSTR* pbstrSearchID,
IN VARIANT_BOOL bNavToResults,
IN OPTIONAL VARIANT *pvarScope,
IN OPTIONAL VARIANT* pvarQueryFile);
STDMETHOD (get_SearchID)(OUT BSTR* pbstrSearchID);
STDMETHOD (get_Scope)(OUT VARIANT *pvarScope);
STDMETHOD (get_QueryFile)(OUT VARIANT *pvarFile);
STDMETHOD (FindFilesOrFolders)(BOOL bNavigateToResults = FALSE,
BOOL bDefaultFocusCtl = FALSE);
STDMETHOD (FindComputer)(BOOL bNavigateToResults = FALSE,
BOOL bDefaultFocusCtl = FALSE);
STDMETHOD (FindPrinter) (BOOL bNavigateToResults = FALSE,
BOOL bDefaultFocusCtl = FALSE);
STDMETHOD (FindPeople) (BOOL bNavigateToResults = FALSE,
BOOL bDefaultFocusCtl = FALSE);
STDMETHOD (FindOnWeb) (BOOL bNavigateToResults = FALSE,
BOOL bDefaultFocusCtl = FALSE);
HRESULT OnDraw(ATL_DRAWINFO& di) { return S_OK; }
STDMETHOD (SetObjectRects)(LPCRECT lprcPosRect, LPCRECT lprcClipRect);
// CShell32AtlIDispatch/IOleObject methods
STDMETHOD (PrivateQI)(REFIID iid, void** ppvObject);
STDMETHOD (DoVerbUIActivate)(LPCRECT prcPosRect, HWND hwndParent);
STDMETHOD (TranslateAcceleratorInternal)(MSG *pMsg, IOleClientSite * pocs);
// IViewObjectEx methods
STDMETHOD(GetViewStatus)(DWORD* pdwStatus)
{
ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n"));
*pdwStatus = VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE;
return S_OK;
}
// IOleInPlaceActiveObject methods
STDMETHOD (TranslateAccelerator)(LPMSG lpmsg);
// IDeskBand
STDMETHOD (GetBandInfo)(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi);
// IDockingWindow
STDMETHOD (ShowDW)(BOOL fShow);
STDMETHOD (CloseDW)(DWORD dwReserved);
STDMETHOD (ResizeBorderDW)(LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved);
// IOleWindow
STDMETHOD (GetWindow)(HWND * lphwnd) { *lphwnd = m_hWnd; return ::IsWindow(m_hWnd) ? S_OK : S_FALSE; }
STDMETHOD (ContextSensitiveHelp)(BOOL fEnterMode) { return E_NOTIMPL; }
// IObjectWithSite
STDMETHOD (SetSite)(IUnknown* punkSite);
STDMETHOD (GetSite)(REFIID riid, void** ppunkSite);
// IInputObject
STDMETHOD (HasFocusIO)(void);
STDMETHOD (TranslateAcceleratorIO)(LPMSG lpMsg);
STDMETHOD (UIActivateIO)(BOOL fActivate, LPMSG lpMsg);
// IOleCommandTarget
STDMETHOD (QueryStatus)(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText);
STDMETHOD (Exec)(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut);
// IServiceProvider
STDMETHOD (QueryService)(REFGUID guidService, REFIID riid, void** ppv);
// IPersist
STDMETHOD (GetClassID)(CLSID *pClassID); //
// IPersistStream
STDMETHOD (IsDirty)(void);
STDMETHOD (Load)(IStream *pStm); //
STDMETHOD (Save)(IStream *pStm, BOOL fClearDirty); //
STDMETHOD (GetSizeMax)(ULARGE_INTEGER *pcbSize);
BOOL SearchInProgress() const
{
if (_pBandDlg)
return _pBandDlg->SearchInProgress();
return FALSE;
};
void StopSearch()
{
if (_pBandDlg)
_pBandDlg->StopSearch();
};
private:
CBandDlg* GetBandDialog(REFGUID guidSearch);
HRESULT ShowBandDialog(REFGUID guidSearch,
BOOL bNavigateToResults = FALSE,
BOOL bDefaultFocusCtl = FALSE /* force focus to the band's default control */);
HRESULT AdvertiseBand(BOOL bAdvertise);
HRESULT BandInfoChanged();
void AddButtons(BOOL);
BOOL LoadImageLists();
void LayoutControls(int cx, int cy, ULONG fLayoutFlags = BLF_ALL);
void EnableControls();
void Scroll(int nBar, UINT uSBCode, int nNewPos = 0);
IShellBrowser* GetTopLevelBrowser();
BOOL IsBrowserAccelerator(LPMSG pmsg);
CBandDlg* BandDlg();
CFindFilesDlg _dlgFSearch;
CFindComputersDlg _dlgCSearch;
#ifdef __PSEARCH_BANDDLG__
CFindPrintersDlg _dlgPSearch;
#endif __PSEARCH_BANDDLG__
CBandDlg* _pBandDlg; // the active/visible band.
GUID _guidSearch; // the GUID of the active/visible band.
CMetrics _metrics;
SIZE _sizeMin,
_sizeMax;
IUnknown* _punkSite;
SCROLLINFO _siHorz,
_siVert;
BITBOOL _fValid : 1,
_fDirty : 1,
_fDeskBand : 1,
_fStrings : 1;
DWORD _dwBandID,
_dwBandViewMode;
HIMAGELIST _hilHot, // toolbar image lists
_hilDefault;
IShellBrowser* _psb; // top-level browser.
LONG_PTR _cbOffset;
BOOL _bSendFinishedDisplaying; // Have we sent FileType box message to start new thread?
};
// Index Server control
// these are in ntquery.h
// Query dialects:
#ifndef ISQLANG_V1
#define ISQLANG_V1 1
#endif //ISQLANG_V1
#ifndef ISQLANG_V2
#define ISQLANG_V2 2
#endif //ISQLANG_V2
STDAPI GetCIStatus(BOOL *pbRunning, BOOL *pbIndexed, BOOL *pbPermission);
STDAPI CatalogUptodate(LPCWSTR pszCatalog, LPCWSTR pszMachine);
STDAPI StartStopCI(BOOL bStart);
STDAPI_(BOOL) IsCiQuery(const VARIANT* pvarRaw, OUT VARIANT* pvarQuery, OUT ULONG* pulDialect);
#endif //__FSEARCH_H__