// finddlg.h : Declaration of the file search band dialog classes #ifndef __FSEARCH_DLGS_H__ #define __FSEARCH_DLGS_H__ #pragma warning(disable:4127) // conditional expression is constant #include "resource.h" // main symbols #include #include "atldisp.h" #include "ids.h" class CFileSearchBand; // top-level (band/OC) window class CBandDlg; // base class for top-level dialogs class CSearchCmdDlg; // base class for band dlgs that employ an ISearchCmdExt interface class CFindFilesDlg; // top level file system search dialog class CFindComputersDlg; // top level net search dialog class CFindPrintersDlg; // top level printer search dialog class CSubDlg; // base class for subordinate dialogs class CDateDlg; // file date subordinate dialog class CTypeDlg; // file type subordinate dialog class CSizeDlg; // file size subordinate dialog class CAdvancedDlg; // advanced options subordinate dialog interface IStringMru; // private messages posted to subdialogs #define WMU_COMBOPOPULATIONCOMPLETE (WM_USER+0x200) // (wParam: HWND of combo). #define WMU_STATECHANGE (WM_USER+0x201) // #define WMU_UPDATELAYOUT (WM_USER+0x202) // (wParam: Band layout flags (BLF_)). #define WMU_RESTORESEARCH (WM_USER+0x203) // (wParam: n/a, lParam: n/a, ret: n/a). #define WMU_BANDINFOUPDATE (WM_USER+0x204) // (wParam: NULL). #define WMU_NAMESPACERECONCILE (WM_USER+0x205) // (wParam: n/a, LPARAM: n/a). #define WMU_BANDFINISHEDDISPLAYING (WM_USER+0x306) // (wParam: NULL). // async state data typedef struct tagFSEARCHTHREADSTATE { HWND hwndCtl; int cItems; void* pvParam; ULONG Reserved; BOOL fComplete; BOOL fCancel; IUnknown* punkBand; // constructor: tagFSEARCHTHREADSTATE() : hwndCtl(NULL), cItems(0), pvParam(NULL), Reserved(0), fComplete(FALSE), fCancel(FALSE), punkBand(NULL) {} ~tagFSEARCHTHREADSTATE() { ATOMICRELEASE(punkBand); } } FSEARCHTHREADSTATE; class CSubDlg // base class for subordinate dialogs { public: CSubDlg(CFileSearchBand* pfsb) : _pfsb(pfsb), _hwnd(NULL), _pBandDlg(NULL) {} virtual ~CSubDlg() {} HWND Hwnd() const { return _hwnd; } void SetBandDlg(CBandDlg* pBandDlg) { _pBandDlg = pBandDlg; } CBandDlg* BandDlg() const { return _pBandDlg; } STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd) PURE; STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue) PURE; STDMETHOD (TranslateAccelerator)(MSG *pmsg); virtual int GetIdealDeskbandWidth() const { return -1;} virtual BOOL Validate() { return TRUE; } virtual void Clear() PURE; virtual void LoadSaveUIState(UINT nIDCtl, BOOL bSave) {} virtual void OnWinIniChange() {} virtual void DoDelayedInit() {} // Called after search band displayed. protected: BEGIN_MSG_MAP(CSubDlg) MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcsize) MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColor) MESSAGE_HANDLER(WM_SIZE, OnSize) COMMAND_CODE_HANDLER(BN_SETFOCUS, OnChildSetFocusCmd) COMMAND_CODE_HANDLER(EN_SETFOCUS, OnChildSetFocusCmd) COMMAND_CODE_HANDLER(CBN_SETFOCUS, OnChildSetFocusCmd) NOTIFY_CODE_HANDLER(NM_SETFOCUS, OnChildSetFocusNotify) COMMAND_CODE_HANDLER(BN_KILLFOCUS, OnChildKillFocusCmd) COMMAND_CODE_HANDLER(EN_KILLFOCUS, OnChildKillFocusCmd) COMMAND_CODE_HANDLER(CBN_KILLFOCUS, OnChildKillFocusCmd) NOTIFY_CODE_HANDLER(NM_KILLFOCUS, OnChildKillFocusNotify) NOTIFY_CODE_HANDLER(CBEN_ENDEDIT, OnComboExEndEdit) END_MSG_MAP() LRESULT OnNcCalcsize(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnNcPaint(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnEraseBkgnd(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnPaint(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnCtlColor(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnChildSetFocusCmd(WORD, WORD, HWND, BOOL&); LRESULT OnChildSetFocusNotify(int, LPNMHDR, BOOL&); LRESULT OnChildKillFocusCmd(WORD, WORD, HWND, BOOL&); LRESULT OnChildKillFocusNotify(int, LPNMHDR, BOOL&); LRESULT OnComboExEndEdit(int, LPNMHDR, BOOL&); void _Attach(HWND hwnd) { _hwnd = hwnd; } CFileSearchBand* _pfsb; CBandDlg* _pBandDlg; private: HWND _hwnd; }; // file date subordinate dialog class CDateDlg : public CDialogImpl, public CSubDlg { public: CDateDlg(CFileSearchBand* pfsb) : CSubDlg(pfsb) {} ~CDateDlg() {} enum { IDD = DLG_FSEARCH_DATE }; STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd); STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue); virtual BOOL Validate(); virtual void Clear(); protected: BEGIN_MSG_MAP(CDateDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_SIZE, OnSize) NOTIFY_CODE_HANDLER(UDN_DELTAPOS, OnMonthDaySpin) COMMAND_CODE_HANDLER(BN_CLICKED, OnBtnClick) COMMAND_HANDLER(IDC_RECENT_MONTHS, EN_KILLFOCUS, OnMonthsKillFocus) COMMAND_HANDLER(IDC_RECENT_DAYS, EN_KILLFOCUS, OnDaysKillFocus) CHAIN_MSG_MAP(CSubDlg) END_MSG_MAP() // message handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnBtnClick(WORD,WORD,HWND,BOOL&); LRESULT OnMonthsKillFocus(WORD,WORD,HWND,BOOL&); LRESULT OnDaysKillFocus(WORD,WORD,HWND,BOOL&); LRESULT OnMonthDaySpin(int, LPNMHDR, BOOL&); // utility methods void EnableControls(); }; // file size subordinate dialog class CSizeDlg : public CDialogImpl, public CSubDlg { public: CSizeDlg(CFileSearchBand* pfsb) : CSubDlg(pfsb) {} ~CSizeDlg() {} enum { IDD = DLG_FSEARCH_SIZE }; STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd); STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue); virtual void Clear(); protected: BEGIN_MSG_MAP(CSizeDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) NOTIFY_HANDLER(IDC_FILESIZE_SPIN, UDN_DELTAPOS, OnSizeSpin) COMMAND_HANDLER(IDC_FILESIZE, EN_KILLFOCUS, OnSizeKillFocus) CHAIN_MSG_MAP(CSubDlg) END_MSG_MAP() // message handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSizeSpin(int, LPNMHDR, BOOL&); LRESULT OnSizeKillFocus(WORD,WORD,HWND,BOOL&); }; // CTypeDlg - file type subordinate dialog class CTypeDlg : public CDialogImpl, public CSubDlg { public: CTypeDlg(CFileSearchBand* pfsb); ~CTypeDlg(); enum { IDD = DLG_FSEARCH_TYPE }; STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd); STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue); virtual void Clear(); virtual void OnWinIniChange(); virtual void DoDelayedInit(); // Called after search band displayed. protected: BEGIN_MSG_MAP(CTypeDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WMU_COMBOPOPULATIONCOMPLETE, OnComboPopulationComplete) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) NOTIFY_HANDLER(IDC_FILE_TYPE, CBEN_DELETEITEM, OnFileTypeDeleteItem) CHAIN_MSG_MAP(CSubDlg) END_MSG_MAP() // message handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnFileTypeDeleteItem(int, LPNMHDR, BOOL&); LRESULT OnComboPopulationComplete(UINT, WPARAM, LPARAM, BOOL&); // utility methods static HRESULT AddItemNotify(ULONG, PCBXITEM, LPARAM); static DWORD FileAssocThreadProc(void* pv); static INT_PTR _FindExtension(HWND hwndCombo, TCHAR* pszExt); // data FSEARCHTHREADSTATE _threadState; TCHAR _szRestoredExt[MAX_PATH]; }; // CAdvancedDlg - advanced options subordinate dialog class CAdvancedDlg : public CDialogImpl, public CSubDlg { public: CAdvancedDlg(CFileSearchBand* pfsb) : CSubDlg(pfsb) {} ~CAdvancedDlg() {} enum { IDD = DLG_FSEARCH_ADVANCED }; STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd); STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue); virtual void Clear(); protected: BEGIN_MSG_MAP(CAdvancedDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) CHAIN_MSG_MAP(CSubDlg) END_MSG_MAP() // message handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&); }; class COptionsDlg : public CDialogImpl, public CSubDlg { public: COptionsDlg(CFileSearchBand* pfsb); ~COptionsDlg() {} STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd); STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue); STDMETHOD (TranslateAccelerator)(MSG *pmsg); virtual void LoadSaveUIState(UINT nIDCtl, BOOL bSave); virtual BOOL GetMinSize(LPSIZE pSize); virtual BOOL Validate(); virtual void Clear(); virtual void OnWinIniChange(); void UpdateSearchCmdStateUI(DISPID dispid = 0); LONG QueryHeight(LONG cx, LONG cy); virtual HWND GetBottomItem(); BOOL IsAdvancedOptionChecked(UINT nID) { return _dlgAdvanced.IsDlgButtonChecked(nID) ? TRUE : FALSE ; } void TakeFocus(); void DoDelayedInit(); enum { IDD = DLG_FSEARCH_OPTIONS }; protected: BEGIN_MSG_MAP(COptionsDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_SIZE, OnSize) COMMAND_CODE_HANDLER(BN_CLICKED, OnBtnClick) NOTIFY_HANDLER(IDC_INDEX_SERVER, NM_CLICK, OnIndexServerClick) NOTIFY_HANDLER(IDC_INDEX_SERVER, NM_RETURN, OnIndexServerClick) CHAIN_MSG_MAP(CSubDlg) END_MSG_MAP() // messsage handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnBtnClick(WORD,WORD,HWND,BOOL&); LRESULT OnIndexServerClick(int, LPNMHDR, BOOL&); // utility methods void LayoutControls(int cx = -1, int cy = -1); void SizeToFit(BOOL bScrollBand = FALSE); // data private: // private subdialog identifiers enum SUBDLGID { SUBDLG_DATE, SUBDLG_TYPE, SUBDLG_SIZE, SUBDLG_ADVANCED, SUBDLG_Count }; // subdialog instances CDateDlg _dlgDate; CTypeDlg _dlgType; CSizeDlg _dlgSize; CAdvancedDlg _dlgAdvanced; // subdialog data definition block. typedef struct { UINT nIDCheck; CSubDlg* pDlg; SIZE sizeDlg; RECT rcCheck; RECT rcDlg; } _SUBDLG; _SUBDLG _subdlgs[SUBDLG_Count]; // misc UINT _nCIStatusText; }; // top level dialog base class class CBandDlg { public: CBandDlg(CFileSearchBand* pfsb); ~CBandDlg(); HWND Hwnd() const { return _hwnd; } // manditory overrideables virtual HWND Create(HWND hwndParent) = 0; virtual UINT GetIconID() const = 0; virtual UINT GetCaptionID() const = 0; virtual UINT GetCaptionDivID() const = 0; STDMETHOD (TranslateAccelerator)(MSG *pmsg); virtual void RemoveToolbarTurds(int cyOffset); // optional overrideables virtual void LayoutControls(int cx = -1, int cy = -1); virtual BOOL Validate() { return TRUE; } virtual void Clear() {}; virtual BOOL GetMinSize(HWND hwndOC, LPSIZE pSize) const; virtual BOOL GetIdealSize(HWND hwndOC, LPSIZE pSize) const; virtual int GetIdealDeskbandWidth() const { return -1; } virtual void SetDefaultFocus(); virtual HWND GetFirstTabItem() const { return NULL; } virtual HWND GetLastTabItem() const { return NULL; } virtual BOOL GetAutoCompleteObjectForWindow(HWND hwnd, IAutoComplete2** ppac2); virtual void NavigateToResults(IWebBrowser2* pwb2) {} virtual void LoadSaveUIState(UINT nIDCtl, BOOL bSave) {} virtual HWND ShowHelp(HWND hwndOwner) { return NULL; } virtual void OnWinIniChange() {} virtual void WndPosChanging(HWND hwndOC, LPWINDOWPOS pwp); virtual void RememberFocus(HWND hwndFocus); virtual BOOL RestoreFocus(); virtual void OnBandShow(BOOL bShow) {} //**band** show/hide handler virtual void OnBandDialogShow(BOOL bShow) {} //band **dialog** show/hide handler virtual HRESULT SetScope(IN VARIANT* pvarScope, BOOL bTrack = FALSE); virtual HRESULT GetScope(OUT VARIANT* pvarScope); virtual HRESULT SetQueryFile(IN VARIANT* pvarScope); virtual HRESULT GetQueryFile(OUT VARIANT* pvarScope); virtual BOOL SearchInProgress() const { return FALSE; }; virtual void StopSearch() {}; protected: BEGIN_MSG_MAP(CBandDlg) MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColorStatic) COMMAND_CODE_HANDLER(BN_SETFOCUS, OnChildSetFocusCmd) COMMAND_CODE_HANDLER(EN_SETFOCUS, OnChildSetFocusCmd) COMMAND_CODE_HANDLER(CBN_SETFOCUS, OnChildSetFocusCmd) NOTIFY_CODE_HANDLER(NM_SETFOCUS, OnChildSetFocusNotify) COMMAND_CODE_HANDLER(BN_KILLFOCUS, OnChildKillFocusCmd) COMMAND_CODE_HANDLER(EN_KILLFOCUS, OnChildKillFocusCmd) COMMAND_CODE_HANDLER(CBN_KILLFOCUS, OnChildKillFocusCmd) NOTIFY_CODE_HANDLER(NM_KILLFOCUS, OnChildKillFocusNotify) NOTIFY_CODE_HANDLER(CBEN_ENDEDIT, OnComboExEndEdit) END_MSG_MAP() // message handlers LRESULT OnPaint(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnEraseBkgnd(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnCtlColorStatic(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSearchLink(int, LPNMHDR, BOOL&); LRESULT OnEditChange(WORD, WORD, HWND, BOOL&); LRESULT OnChildSetFocusCmd(WORD, WORD, HWND, BOOL&); LRESULT OnChildSetFocusNotify(int, LPNMHDR, BOOL&); LRESULT OnChildKillFocusCmd(WORD, WORD, HWND, BOOL&); LRESULT OnChildKillFocusNotify(int, LPNMHDR, BOOL&); LRESULT OnComboExEndEdit(int, LPNMHDR, BOOL&); // utility methods: void _Attach(HWND hwnd) { _hwnd = hwnd; } void _BeautifyCaption(UINT nIDCaption, UINT nIDIcon=0, UINT nIDIconResource=0); void _LayoutCaption(UINT nIDCaption, UINT nIDIcon, UINT nIDDiv, LONG cxDlg); void _LayoutSearchLinks(UINT nIDCaption, UINT nIDDiv, BOOL bShowDiv, LONG left, LONG right, LONG yMargin, LONG& yStart, const int rgLinkIDs[], LONG cLinkIDs); CFileSearchBand* _pfsb; // master band object VARIANT _varScope0; VARIANT _varQueryFile0; HWND _hwndLastFocus; private: HWND _hwnd; }; inline BOOL CBandDlg::GetMinSize(HWND hwndOC, LPSIZE pSize) const { pSize->cx = pSize->cy = 0; return TRUE; } inline BOOL CBandDlg::GetAutoCompleteObjectForWindow(HWND hwnd, IAutoComplete2** ppac2) { *ppac2 = NULL; return FALSE; } // Band dialog as searchCmdExt object wrap and event sink. class CSearchCmdDlg : public DSearchCommandEvents, public CBandDlg { public: CSearchCmdDlg(CFileSearchBand* pfsb); ~CSearchCmdDlg(); // ISearchCommandExt event sink // IUnknown STDMETHOD (QueryInterface) (REFIID riid, void** ppvObject); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); // IDispatch methods STDMETHOD(GetTypeInfoCount)(UINT*) { return E_NOTIMPL;} STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**) { return E_NOTIMPL;} STDMETHOD(GetIDsOfNames)(REFIID, OLECHAR**, UINT, LCID, DISPID*) { return E_NOTIMPL;} STDMETHOD(Invoke)(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*); // CBandDlg overrides virtual HWND Create(HWND hwndParent) = 0; virtual void Clear(); STDMETHOD (TranslateAccelerator)(MSG *pmsg); // CSearchCmdDlg methods ISearchCommandExt* GetSearchCmd(); virtual BOOL SearchInProgress() const { return _fSearchInProgress; } BOOL SearchAborted() const { return _fSearchAborted; } STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd) { return E_NOTIMPL; } STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue) { return E_NOTIMPL; } HRESULT StartSearch(); virtual void StopSearch(); HRESULT SetQueryFile(IN VARIANT* pvarScope); HRESULT DisconnectEvents(); static void EnableStartStopButton(HWND hwndBtn, BOOL bEnable); // Overrideables virtual int GetSearchType() const = 0; // ret: SCE_SEARCHFORxxx virtual HWND GetAnimation() { return NULL ; } virtual void UpdateSearchCmdStateUI(DISPID dispid = 0); virtual BOOL OnSearchCmdError(HRESULT hr, LPCTSTR pszError); virtual void UpdateStatusText(); virtual void StartStopAnimation(BOOL bStart) ; virtual void RestoreSearch() {}; virtual void OnBandShow(BOOL bShow) ; protected: BOOL ProcessCmdError(); BEGIN_MSG_MAP(CSearchCmdDlg) MESSAGE_HANDLER(WMU_RESTORESEARCH, OnRestoreSearch) CHAIN_MSG_MAP(CBandDlg) END_MSG_MAP() // message handlers LRESULT OnRestoreSearch(UINT, WPARAM, LPARAM, BOOL&); protected: // utility methods HRESULT Execute(BOOL bStart); // data IConnectionPoint* _pcp; DWORD _dwConnection; ISearchCommandExt* _pSrchCmd; BOOL _fSearchInProgress, _fSearchAborted, _fOnDestroy; }; // top level dialog for Search for Files and Folders UI class CFindFilesDlg : public CDialogImpl, public CSearchCmdDlg { public: CFindFilesDlg(CFileSearchBand* pfsb); ~CFindFilesDlg(); virtual HWND Create(HWND hwndParent); virtual UINT GetIconID() const { return IDC_FSEARCH_ICON; } virtual UINT GetCaptionID() const { return IDC_FSEARCH_CAPTION; } virtual UINT GetCaptionDivID() const { return IDC_FSEARCH_DIV1; } virtual void LayoutControls(int cx = -1, int cy = -1); virtual BOOL Validate(); virtual void Clear(); virtual BOOL GetMinSize(HWND hwndOC, LPSIZE pSize) const; virtual int GetIdealDeskbandWidth() const; virtual void NavigateToResults(IWebBrowser2* pwb2); virtual HWND ShowHelp(HWND hwndOwner); virtual HWND GetFirstTabItem() const; virtual HWND GetLastTabItem() const; virtual BOOL GetAutoCompleteObjectForWindow(HWND hwnd, IAutoComplete2** ppac2); STDMETHOD (TranslateAccelerator)(MSG *pmsg); virtual int GetSearchType() const { return SCE_SEARCHFORFILES; } virtual HWND GetAnimation() { return GetDlgItem(IDC_FSEARCH_ICON); } STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd); STDMETHOD (RestoreConstraint)(const BSTR bstrName, const VARIANT* pValue); virtual void UpdateSearchCmdStateUI(DISPID eventID = 0); virtual void RestoreSearch(); virtual void LoadSaveUIState(UINT nIDCtl, BOOL bSave); virtual BOOL OnSearchCmdError(HRESULT hr, LPCTSTR pszError); BOOL SetDefaultScope(); virtual void OnBandShow(BOOL bShow); virtual void OnBandDialogShow(BOOL bShow); virtual HRESULT SetScope(IN VARIANT* pvarScope, BOOL bTrack = FALSE); BOOL AssignNamespace(LPCTSTR pszPath, LPCITEMIDLIST pidl, LPCTSTR pszNamespace, BOOL bPassive /*only if no current selection*/); BOOL GetMinMaxInfo(HWND hwndOC, LPMINMAXINFO pmmi); void OnWinIniChange(); enum { IDD = DLG_FSEARCH_MAIN }; BEGIN_MSG_MAP(CFindFilesDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) MESSAGE_HANDLER(WM_TIMER, OnTimer) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) MESSAGE_HANDLER(WMU_COMBOPOPULATIONCOMPLETE, OnComboPopulationComplete) MESSAGE_HANDLER(WMU_STATECHANGE, OnStateChange) MESSAGE_HANDLER(WMU_UPDATELAYOUT, OnUpdateLayout) MESSAGE_HANDLER(WMU_NAMESPACERECONCILE, OnNamespaceReconcileMsg) MESSAGE_HANDLER(WMU_BANDFINISHEDDISPLAYING, OnBandFinishedDisplaying); COMMAND_HANDLER(IDC_FILESPEC, EN_CHANGE, OnEditChange) COMMAND_HANDLER(IDC_GREPTEXT, EN_CHANGE, OnEditChange) COMMAND_HANDLER(IDC_NAMESPACE, CBN_EDITCHANGE, OnNamespaceEditChange) COMMAND_HANDLER(IDC_NAMESPACE, CBN_SELENDOK, OnNamespaceSelEndOk) COMMAND_HANDLER(IDC_NAMESPACE, CBN_SELENDCANCEL, OnNamespaceReconcileCmd) COMMAND_HANDLER(IDC_NAMESPACE, CBN_DROPDOWN, OnNamespaceReconcileCmd) COMMAND_CODE_HANDLER(BN_CLICKED, OnBtnClick); NOTIFY_HANDLER(IDC_NAMESPACE, CBEN_DELETEITEM, OnNamespaceDeleteItem) NOTIFY_HANDLER(IDC_NAMESPACE, CBEN_ENDEDIT, OnNamespaceReconcileNotify) NOTIFY_HANDLER(IDC_SEARCHLINK_OPTIONS, NM_CLICK, OnOptions) NOTIFY_HANDLER(IDC_SEARCHLINK_OPTIONS, NM_RETURN, OnOptions) NOTIFY_HANDLER(IDC_GROUPBTN_OPTIONS, NM_CLICK, OnOptions) NOTIFY_HANDLER(IDC_GROUPBTN_OPTIONS, NM_RETURN, OnOptions) NOTIFY_HANDLER(IDC_GROUPBTN_OPTIONS, GBN_QUERYBUDDYHEIGHT, OnQueryOptionsHeight) NOTIFY_HANDLER(IDC_SEARCHLINK_FILES, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_FILES, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_COMPUTERS, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_COMPUTERS, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PRINTERS, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PRINTERS, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PEOPLE, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PEOPLE, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_INTERNET, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_INTERNET, NM_RETURN, OnSearchLink) CHAIN_MSG_MAP(CSearchCmdDlg) // fall through to base class handlers END_MSG_MAP() protected: // message handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnEraseBkgnd(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnComboPopulationComplete(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnStateChange(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnTimer(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnUpdateLayout(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnBtnClick(WORD, WORD, HWND, BOOL&); LRESULT OnNamespaceDeleteItem(int, LPNMHDR, BOOL&); LRESULT OnNamespaceEditChange(WORD, WORD, HWND, BOOL&); LRESULT OnNamespaceSelEndOk(WORD, WORD, HWND, BOOL&); LRESULT OnNamespaceReconcileCmd(WORD, WORD, HWND, BOOL&); LRESULT OnNamespaceReconcileNotify(int, LPNMHDR, BOOL&); LRESULT OnNamespaceReconcileMsg(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnOptions(int, LPNMHDR, BOOL&); LRESULT OnQueryOptionsHeight(int, LPNMHDR, BOOL&); LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnBandFinishedDisplaying(UINT, WPARAM, LPARAM, BOOL&); private: // misc utility methods void _ShowOptions(BOOL bShow = TRUE); LPARAM _GetComboData(UINT id, INT_PTR idx); // namespace scoping BOOL _SetPreassignedScope(); BOOL _SetFolderScope(); BOOL _SetLocalDefaultScope(); void _ShowNamespaceEditImage(BOOL bShow); // ad hoc namespace handling BOOL _PathFixup(LPTSTR pszDst, LPCTSTR pszSrc); BOOL _ShouldReconcileNamespace(); void _UIReconcileNamespace(BOOL bAsync = FALSE); INT_PTR _ReconcileNamespace(OPTIONAL BOOL bAsync = FALSE); INT_PTR _AddNamespace(LPCTSTR pszPath, LPCITEMIDLIST pidl, LPCTSTR pszName, BOOL bSelectItem); // namespace browsing void _BrowseAndAssignNamespace(); HRESULT _BrowseForNamespace(LPTSTR pszPath, UINT cchPath, LPITEMIDLIST* ppidlRet); static int _BrowseCallback(HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData); // more namespace helpers BOOL _IsSearchableFolder(LPCITEMIDLIST pidlFolder); HRESULT _GetTargetNamespace(IEnumIDList **ppenum); IEnumIDList *_GetItems(INT_PTR i); INT_PTR _FindNamespace(LPCTSTR pszPath, LPCITEMIDLIST pidl); private: // namespace combo thread static HRESULT AddNamespaceItemNotify(ULONG, PCBXITEM, LPARAM); static DWORD NamespaceThreadProc(void *pv); // data COptionsDlg _dlgOptions; FSEARCHTHREADSTATE _threadState; TCHAR _szInitialNames[MAX_PATH], // SHGDN_NORMAL _szInitialPath[MAX_PATH]; // SHGDN_FORPARSING LPITEMIDLIST _pidlInitial; // Stores the initial PDIL TCHAR _szCurrentPath[MAX_PATH]; TCHAR _szLocalDrives[MAX_URL_STRING]; ULONG _dwWarningFlags; // docfind warning bits. BOOL _dwRunOnceWarningFlags; LRESULT _iCurNamespace; // combobox item index for currently selected namespace. BOOL _fDebuted, // this band dialog has been displayed before. _bScoped, // ve assigned a value to the namespace combo. _fNamespace, // TRUE if the user has been typing in the namespace combo. _fDisplayOptions; // Search Options group box is displayed IAutoComplete2* _pacGrepText; // 'Containing Text' autocomplete object IStringMru* _pmruGrepText; // 'Containing Text' mru object IAutoComplete2* _pacFileSpec; // 'Files Named' autocomplete object IStringMru* _pmruFileSpec; // 'Files Named' mru object enum { TRACKSCOPE_NONE, TRACKSCOPE_GENERAL, TRACKSCOPE_SPECIFIC, } ; ULONG _fTrackScope; // defines scope-tracking behavior. See TRACKSCOPE_xxx flags BOOL _fBandFinishedDisplaying; // TRUE if we have already resceived WMU_BANDFINISHEDDISPLAYING }; inline HWND CFindFilesDlg::Create(HWND hwndParent) { return CDialogImpl::Create(hwndParent); } #ifdef __PSEARCH_BANDDLG__ // CFindPrintersDlg - top level dialog for Search for Printers UI class CFindPrintersDlg : public CDialogImpl, public CBandDlg { public: CFindPrintersDlg(CFileSearchBand* pfsb); ~CFindPrintersDlg(); // overrides of CBandDlg virtual HWND Create(HWND hwndParent); virtual UINT GetIconID() const { return IDC_PSEARCH_ICON; } virtual UINT GetCaptionID() const { return IDC_PSEARCH_CAPTION; } virtual UINT GetCaptionDivID() const { return IDC_FSEARCH_DIV1; } virtual void LayoutControls(int cx = -1, int cy = -1); virtual BOOL Validate(); virtual void Clear(); virtual BOOL GetMinSize(HWND hwndOC, LPSIZE pSize) const; virtual HWND GetFirstTabItem() const; virtual HWND GetLastTabItem() const; STDMETHOD (TranslateAccelerator)(MSG *pmsg); virtual void OnWinIniChange(); enum { IDD = DLG_PSEARCH }; protected: BEGIN_MSG_MAP(CFindPrintersDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_HANDLER(IDC_PSEARCH_NAME, EN_CHANGE, OnEditChange) COMMAND_HANDLER(IDC_PSEARCH_LOCATION, EN_CHANGE, OnEditChange) COMMAND_HANDLER(IDC_PSEARCH_MODEL, EN_CHANGE, OnEditChange) COMMAND_HANDLER(IDC_SEARCH_START, BN_CLICKED, OnSearchStartBtn) NOTIFY_HANDLER(IDC_SEARCHLINK_COMPUTERS, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_COMPUTERS, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_FILES, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_FILES, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PEOPLE, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PEOPLE, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_INTERNET, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_INTERNET, NM_RETURN, OnSearchLink) CHAIN_MSG_MAP(CBandDlg) END_MSG_MAP() // message handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSearchStartBtn(WORD, WORD, HWND, BOOL&); }; inline HWND CFindPrintersDlg::Create(HWND hwndParent) { return CDialogImpl::Create(hwndParent); } #endif __PSEARCH_BANDDLG__ // CFindComputersDlg - top level dialog for Search for Computers UI class CFindComputersDlg : public CDialogImpl, public CSearchCmdDlg { public: CFindComputersDlg(CFileSearchBand* pfsb); ~CFindComputersDlg(); // overrides of CBandDlg virtual HWND Create(HWND hwndParent); virtual UINT GetIconID() const { return IDC_CSEARCH_ICON; } virtual UINT GetCaptionID() const { return IDC_CSEARCH_CAPTION; } virtual UINT GetCaptionDivID() const { return IDC_FSEARCH_DIV1; } virtual void LayoutControls(int cx = -1, int cy = -1); virtual BOOL Validate(); virtual void Clear(); virtual BOOL GetMinSize(HWND hwndOC, LPSIZE pSize) const; virtual void NavigateToResults(IWebBrowser2* pwb2); virtual HWND ShowHelp(HWND hwndOwner); virtual HWND GetFirstTabItem() const; virtual HWND GetLastTabItem() const; virtual BOOL GetAutoCompleteObjectForWindow(HWND hwnd, IAutoComplete2** ppac2); STDMETHOD (TranslateAccelerator)(MSG *pmsg); virtual void OnWinIniChange(); virtual int GetSearchType() const { return SCE_SEARCHFORCOMPUTERS; } virtual HWND GetAnimation() { return GetDlgItem(IDC_CSEARCH_ICON); } STDMETHOD (AddConstraints)(ISearchCommandExt* pSrchCmd); virtual void UpdateStatusText(); virtual void RestoreSearch(); enum { IDD = DLG_CSEARCH }; protected: BEGIN_MSG_MAP(CFindComputersDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) COMMAND_HANDLER(IDC_CSEARCH_NAME, EN_CHANGE, OnEditChange) COMMAND_HANDLER(IDC_SEARCH_START, BN_CLICKED, OnSearchStartBtn) COMMAND_HANDLER(IDC_SEARCH_STOP, BN_CLICKED, OnSearchStopBtn) NOTIFY_HANDLER(IDC_SEARCHLINK_FILES, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_FILES, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PRINTERS, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PRINTERS, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PEOPLE, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_PEOPLE, NM_RETURN, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_INTERNET, NM_CLICK, OnSearchLink) NOTIFY_HANDLER(IDC_SEARCHLINK_INTERNET, NM_RETURN, OnSearchLink) CHAIN_MSG_MAP(CSearchCmdDlg) END_MSG_MAP() // message handlers LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&); LRESULT OnSearchStartBtn(WORD, WORD, HWND, BOOL&); LRESULT OnSearchStopBtn(WORD, WORD, HWND, BOOL&); // data IAutoComplete2* _pacComputerName; // 'Files Named' autocomplete object IStringMru* _pmruComputerName; // 'Files Named' mru object }; inline HWND CFindComputersDlg::Create(HWND hwndParent) { return CDialogImpl::Create(hwndParent); } DECLARE_INTERFACE_(IStringMru, IUnknown) { // *** IStringMru specific methods *** STDMETHOD(Add)(LPCOLESTR pwszAdd) PURE; }; extern const IID IID_IStringMru; class CStringMru : public IStringMru, public IEnumString { public: static HRESULT CreateInstance(HKEY hKey, LPCTSTR szSubKey, LONG cMaxStrings, BOOL bCaseSensitive, REFIID riid, void ** ppv); protected: // IUnknown virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); // IStringMru virtual STDMETHODIMP Add(LPCOLESTR pwsz); // adds or promotes a string // IEnumString virtual STDMETHODIMP Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched); virtual STDMETHODIMP Skip(ULONG celt); virtual STDMETHODIMP Reset(void); virtual STDMETHODIMP Clone(IEnumString **ppenum) { return E_NOTIMPL; } private: CStringMru(); ~CStringMru(); HRESULT _Open(); HRESULT _Read(OUT OPTIONAL LONG* pcRead = NULL /*count of strings read*/); HRESULT _Write(OUT OPTIONAL LONG* pcWritten = NULL /*count of strings written*/); HRESULT _Promote(LONG iString); void _Close(); void _Delete(); void _Clear(); HKEY _hKey, _hKeyRoot; TCHAR _szSubKey[MAX_PATH]; LONG _cRef; BOOL _bCaseSensitive; LONG _cMax; LONG _iString; HDPA _hdpaStrings; }; // DivWindow registration #define DIVWINDOW_CLASS TEXT("DivWindow") #define DWM_FIRST (WM_USER+0x300) #define DWM_SETHEIGHT (DWM_FIRST+0) // WPARAM: height in pixels, LPARAM: n/a, ret: BOOL #define DWM_SETBKCOLOR (DWM_FIRST+1) // WPARAM: COLORREF, LPARAM: n/a, ret: BOOL //--------------------// // Helper macros #define POINTSPERRECT (sizeof(RECT)/sizeof(POINT)) //---------------------// // Misc utility LONG _PixelsForDbu(HWND hwndDlg, LONG cDbu, BOOL bHorz); #endif //__FSEARCH_DLGS_H__