//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 2000. // // File: srch.hxx // // Contents: // // History: 15 Aug 1996 DLee Created // //-------------------------------------------------------------------------- #pragma once // private window messages const UINT wmSetState = WM_APP + 1; const UINT wmSetString = WM_APP + 2; const UINT wmAccelerator = WM_APP + 4; const UINT wmNewFont = WM_APP + 5; const UINT wmDisplaySubwindows = WM_APP + 6; const UINT wmMenuCommand = WM_APP + 7; const UINT wmGiveFocus = WM_APP + 8; const UINT wmCmndLine = WM_APP + 9; const UINT wmInitMenu = WM_APP + 10; const UINT wmUpdate = WM_APP + 11; const UINT wmResSetString = WM_APP + 12; const UINT wmAppClosing = WM_APP + 13; const UINT wmNotification = WM_APP + 14; const UINT wmOpenCatalog = WM_APP + 15; const UINT wmListNotify = WM_APP + 16; const UINT wmListFont = WM_APP + 17; const UINT wmDrawItem = WM_APP + 18; const UINT wmMeasureItem = WM_APP + 19; const UINT wmSetCountBefore = WM_APP + 20; const UINT wmSetCount = WM_APP + 21; const UINT wmResetContents = WM_APP + 22; const UINT wmInsertItem = WM_APP + 23; const UINT wmDeleteItem = WM_APP + 24; const UINT wmUpdateItem = WM_APP + 25; const UINT wmContextMenuHitTest = WM_APP + 26; const WPARAM listScrollLineUp = 1; const WPARAM listScrollLineDn = 2; const WPARAM listScrollPageUp = 3; const WPARAM listScrollPageDn = 4; const WPARAM listScrollTop = 5; const WPARAM listScrollBottom = 6; const WPARAM listScrollPos = 7; const WPARAM listSize = 8; const WPARAM listSelect = 9; const WPARAM listSelectUp = 10; const WPARAM listSelectDown = 11; const ULONG odtListView = 100; // window classes #define APP_CLASS L"SrchWClass" #define SEARCH_CLASS L"SrchSearchWClass" #define BROWSE_CLASS L"SrchBrowseWClass" #define LIST_VIEW_CLASS L"SrchListViewWClass" #define SORT_UP 0 #define SORT_DOWN 1 const unsigned cwcBufSize = 400; const unsigned maxBoundCols = 30; const unsigned cwcResBuf = 300; class CResString { public: CResString() { _awc[ 0 ] = 0; } inline CResString( UINT strIDS ); inline BOOL Load( UINT strIDS ); WCHAR* Get() { return _awc; } private: WCHAR _awc[ cwcResBuf ]; }; class CWaitCursor { public: CWaitCursor () { _hcurOld = SetCursor(LoadCursor(NULL,IDC_WAIT)); } ~CWaitCursor () { SetCursor(_hcurOld); } private: HCURSOR _hcurOld; }; // computer name lengths can be really big (server.redmond.corp.microsoft.com) #define SRCH_COMPUTERNAME_LENGTH MAX_PATH struct SScopeCatalogMachine { SScopeCatalogMachine() { *awcScope = 0; *awcCatalog = 0; *awcMachine = 0; fDeep = FALSE; } WCHAR awcScope[MAX_PATH]; WCHAR awcCatalog[MAX_PATH]; WCHAR awcMachine[SRCH_COMPUTERNAME_LENGTH + 1]; BOOL fDeep; }; // big global object for the app class CSearchApp { public: CSearchApp(); ~CSearchApp (); void Init (HINSTANCE hInst,int nCmdShow,LPSTR pcCmdLine); void Shutdown( HINSTANCE hInst ); int MessageLoop(); LRESULT WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); HINSTANCE Instance() { return _hInst; } NUMBERFMT & NumberFormat() { return _NumberFmt; } NUMBERFMT & NumberFormatFloat() { return _NumberFmtFloat; } HFONT AppFont() { return _hfontApp; } HFONT BrowseFont() { return _hfontBrowse; } HBRUSH BtnFaceBrush() { return _hbrushBtnFace; } HBRUSH BtnHiliteBrush() { return _hbrushBtnHilite; } HBRUSH HiliteBrush() { return _hbrushHilite; } HBRUSH WindowBrush() { return _hbrushWindow; } WCHAR * GetSortProp() { return _awcSort; } int & GetSortDir() { return _sortDir; } void SetLocale( LCID lcid ) { _lcid = lcid; } LCID GetLocale() { return _lcid; } HWND CreateBrowser(WCHAR const *pwcPath,LPARAM lp) { return _MakeMDI(pwcPath,BROWSE_CLASS,0, 0/*WS_VSCROLL */ ,lp); } HWND AppWindow() { return _hAppWnd; } HWND ToolBarWindow() { return _hToolBarWnd; } HWND StatusBarWindow() { return _hStatusBarWnd; } LOGFONT & BrowseLogFont() { return _lfBrowse; } HWND GetActiveMDI() { return (HWND) SendMessage(_hMDIClientWnd,WM_MDIGETACTIVE,0,0); } void ZoomMDI( HWND hwnd ) { PostMessage(_hMDIClientWnd,WM_MDIMAXIMIZE,(WPARAM) hwnd,0); } WCHAR * GetTrue() { return _strTrue.Get(); } WCHAR * GetFalse() { return _strFalse.Get(); } WCHAR * GetAttrib() { return _strAttrib.Get(); } WCHAR * GetBlob() { return _strBlob.Get(); } WCHAR * GetYes() { return _strYes.Get(); } WCHAR * GetNo() { return _strNo.Get(); } XGrowable CatalogList() const { return _xCatList; } ISimpleCommandCreator * GetCommandCreator() { return _xCmdCreator.GetPointer(); } HWND & GetCurrentDialog() { return _hdlgCurrent; } BOOL & ForceUseCI() { return _fForceUseCI; } ULONG & Dialect() { return _ulDialect; } ULONG & Limit() { return _ulLimit; } ULONG & FirstRows() { return _ulFirstRows; } SCODE & BrowseLastError() { return _scBrowseLastError; } WCHAR * GetDefaultQuery() { return _awcDefaultQuery; } private: HWND _MakeMDI(WCHAR const * pwcTitle,WCHAR * pwcClass,UINT uiState, DWORD dwFlags,LPARAM lpCreate); int _CountMDIChildren(); int _CountMDISearch(); LRESULT _SendToMDIChildren(UINT msg,WPARAM wParam,LPARAM lParam); LRESULT _SendToSpecificChildren(WCHAR *pwcClass,UINT msg,WPARAM wParam,LPARAM lParam); LRESULT _SendToActiveMDI(UINT msg,WPARAM wParam,LPARAM lParam); int _SaveWindowState(BOOL bApp); void _SizeMDIAndBars(BOOL fMove,int iDX,int iDY); void _SaveProfileData(); void _ReadDefaultFonts(); void _GetPaths(); void _InitInstance(LPSTR pcCmdLine); void _InitApplication(); void _CreateFonts(); void _UnMarshallFont(LOGFONT &lf,WCHAR *pwcFont,WCHAR *pwcRegEntry); void _MarshallFont(LOGFONT &lf,WCHAR *pwcOriginal,WCHAR *pwcRegEntry); void _ShowHelp(UINT uiID,DWORD dw); HINSTANCE _hInst; HWND _hMDIClientWnd; HWND _hAppWnd; HWND _hStatusBarWnd; HWND _hToolBarWnd; HWND _hdlgCurrent; HACCEL _hAccTable; HBRUSH _hbrushBtnFace; HBRUSH _hbrushBtnHilite; HBRUSH _hbrushHilite; HBRUSH _hbrushWindow; NUMBERFMT _NumberFmt; NUMBERFMT _NumberFmtFloat; HFONT _hfontApp; HFONT _hfontBrowse; BOOL _fHelp; int _iAppCmdShow; int _iStartupState,_iMDIStartupState; WCHAR _awcAppFont[MAX_PATH],_awcBrowseFont[MAX_PATH]; LOGFONT _lfApp,_lfBrowse; WCHAR _awcAppPath[MAX_PATH]; WCHAR _awcHelpFile[MAX_PATH]; SCODE _scBrowseLastError; XGrowable _xCatList; WCHAR _awcDefaultQuery[ MAX_PATH ]; WCHAR _awcSort[MAX_PATH]; int _sortDir; LCID _lcid; // locale id for query BOOL _fToolBarOn; BOOL _fStatusBarOn; BOOL _fForceUseCI; ULONG _ulDialect; // tripolish version 1 or 2 or SQL ULONG _ulLimit; // CiMaxRecordsInResultSet ULONG _ulFirstRows; WCHAR _awcSortINI[MAX_PATH]; int _sortDirINI; LCID _lcidINI; BOOL _fToolBarOnINI; BOOL _fStatusBarOnINI; BOOL _fForceUseCIINI; ULONG _ulDialectINI; ULONG _ulLimitINI; ULONG _ulFirstRowsINI; CResString _strTrue; CResString _strFalse; CResString _strAttrib; CResString _strBlob; CResString _strYes; CResString _strNo; XInterface _xCmdCreator; }; // whomping global state data extern CSearchApp App; inline CResString::CResString( UINT strIDS ) { _awc[ 0 ] = 0; LoadString( App.Instance(), strIDS, _awc, sizeof _awc / sizeof WCHAR ); } inline BOOL CResString::Load( UINT strIDS ) { _awc[ 0 ] = 0; LoadString( App.Instance(), strIDS, _awc, sizeof _awc / sizeof WCHAR ); return ( 0 != _awc[ 0 ] ); } // name of the helpfile #define CISEARCH_HELPFILE L"srch.chm" // registry entry names #define CISEARCH_PARENT_REG_KEY L"software\\microsoft" #define CISEARCH_REG_SUBKEY L"CI Search" #define CISEARCH_REG_TOOLBAR L"Show Icon bar" #define CISEARCH_REG_STATUSBAR L"Show Status bar" #define CISEARCH_REG_POSITION L"Position" #define CISEARCH_REG_STATUSPOSITION L"Status Position" #define CISEARCH_REG_FONT L"Results Font" #define CISEARCH_REG_SORTPROP L"Sort property" #define CISEARCH_REG_SORTDIR L"Sort direction" #define CISEARCH_REG_LOCALE L"Locale Id" #define CISEARCH_REG_BROWSEFONT L"Browse Font" #define CISEARCH_REG_BROWSE L"Browse tool" #define CISEARCH_REG_BROWSESTRIP L"Browse strip" #define CISEARCH_REG_DISPLAYPROPS L"Displayed properties" #define CISEARCH_REG_FORCEUSECI L"Force use CI" #define CISEARCH_REG_EDITOR L"Editor" #define CISEARCH_REG_DIALECT L"Dialect" #define CISEARCH_REG_LIMIT L"Limit" #define CISEARCH_REG_FIRSTROWS L"FirstRows" // built-in browser options #define BROWSER L"browse" #define BROWSER_SLICK L"s %ws" #define BROWSER_SLICK_SEARCH L"s %ws -#/%ws/" #define DEFAULT_DISPLAYED_PROPERTIES L"Size,Write,Path" #define DEFAULT_SORT_PROPERTIES L"Path" // T must be based on a basic type template BOOL isOdd(T value) { return 0 != (value & 1); } // srch.cxx INT_PTR WINAPI BrowseToolDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam); // toolbar.cxx HWND CreateTBar( HWND hParent, HINSTANCE hInstance ); LRESULT ToolBarNotify( HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam, HINSTANCE hInst ); void UpdateButtons( UINT *aid, UINT cid, BOOL fEnabled ); // srchwnd.cxx LRESULT WINAPI SearchWndProc(HWND,UINT,WPARAM,LPARAM); INT_PTR WINAPI ScopeDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam); INT_PTR WINAPI FilterScopeDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam); INT_PTR WINAPI StatusDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam); // brcrtl.cxx LRESULT WINAPI BrowseWndProc(HWND,UINT,WPARAM,LPARAM); // lview.cxx LRESULT WINAPI ListViewWndProc(HWND,UINT,WPARAM,LPARAM); // srchutil.cxx void FormatSrchError( SCODE sc, WCHAR * pwc, LCID lcid ); void SearchError(HWND hParent,ULONG dwErrorID,WCHAR const *pwcTitle); void SetReg(WCHAR const *pwcName,WCHAR const *pwcValue); BOOL GetReg(WCHAR const *pwcName,WCHAR *pwcValue,DWORD *pdwSize); int GetRegInt(WCHAR const *pwcName,int iDef); void SetRegInt(WCHAR const *pwcName,int iValue); LCID GetRegLCID(WCHAR const *pwcName,LCID defLCID); void SetRegLCID(WCHAR const *pwcName,LCID lcid); void LoadNumberFormatInfo(NUMBERFMT &rFormat); void FreeNumberFormatInfo(NUMBERFMT &rFormat); void SaveWindowRect( HWND hwnd, WCHAR const *pwc ); BOOL LoadWindowRect(int *left, int *top, int *right, int *bottom, WCHAR const *pwc ); void WINAPI CenterDialog(HWND hdlg); void PassOnToEdit(UINT,WPARAM,LPARAM); int GetLineHeight(HWND hwnd,HFONT hfont=0); INT_PTR DoModalDialog(DLGPROC,HWND,WCHAR *,LPARAM); void ShowResError(HWND,UINT,BOOL); int SaveWindowState(BOOL); int GetWindowState(BOOL); BOOL IsSpecificClass(HWND,WCHAR const *); int GetAvgWidth(HWND hwnd,HFONT hFont); void PutInClipboard(WCHAR const *pwc); void ExecApp( WCHAR const *pwcCmd ); BOOL GetCatListItem( const XGrowable & const_xCatList, unsigned iItem, WCHAR * pwszMachine, WCHAR * pwszCatalog, WCHAR * pwszScope, BOOL & fDeep ); enum enumViewFile { fileBrowse, fileEdit, fileOpen }; BOOL ViewFile( WCHAR const *pwcFile, enumViewFile eViewType, int iLineNumber = 1, DBCOMMANDTREE * prstQuery = 0 ); // handy macros inline WORD MyWmCommandID(WPARAM wp,LPARAM lp) { return LOWORD(wp); } inline HWND MyWmCommandHWnd(WPARAM wp,LPARAM lp) { return (HWND) lp; } inline WORD MyWmCommandCmd(WPARAM wp,LPARAM lp) { return HIWORD(wp); } inline LRESULT MySendWmCommand(HWND hwnd,UINT id,HWND hctl,UINT cmd) { return SendMessage(hwnd,WM_COMMAND, (WPARAM) MAKELONG(id,cmd),(LPARAM) hctl); } inline BOOL MyPostWmCommand(HWND hwnd,UINT id,HWND hctl,UINT cmd) { return PostMessage(hwnd,WM_COMMAND, (WPARAM) MAKELONG(id,cmd),(LPARAM) hctl); } inline LRESULT MySendEMSetSel(HWND hwnd,UINT uiStart,UINT uiEnd) { return SendMessage(hwnd,EM_SETSEL, (WPARAM) uiStart,(LPARAM) uiEnd); } inline UINT MyMenuSelectCmd(WPARAM wp,LPARAM lp) { return LOWORD(wp); } inline UINT MyMenuSelectFlags(WPARAM wp,LPARAM lp) { return HIWORD(wp); } inline HMENU MyMenuSelectHMenu(WPARAM wp,LPARAM lp) { return (HMENU) lp; } inline UINT MyGetWindowID(HWND hwnd) { return (UINT) GetWindowLong(hwnd,GWL_ID); } inline HINSTANCE MyGetWindowInstance(HWND hwnd) { return (HINSTANCE) GetWindowLongPtr(hwnd,GWLP_HINSTANCE); } #ifndef SMOOTHSCROLLINFO extern "C" { #define SSI_DEFAULT ((UINT)-1) #define SSIF_SCROLLPROC 0x0001 #define SSIF_MAXSCROLLTIME 0x0002 #define SSIF_MINSCROLL 0x0003 typedef int (CALLBACK *PFNSMOOTHSCROLLPROC)( HWND hWnd, int dx, int dy, CONST RECT *prcScroll, CONST RECT *prcClip , HRGN hrgnUpdate, LPRECT prcUpdate, UINT flags); typedef struct tagSSWInfo{ UINT cbSize; DWORD fMask; HWND hwnd; int dx; int dy; LPCRECT lprcSrc; LPCRECT lprcClip; HRGN hrgnUpdate; LPRECT lprcUpdate; UINT fuScroll; UINT uMaxScrollTime; UINT cxMinScroll; UINT cyMinScroll; PFNSMOOTHSCROLLPROC pfnScrollProc; // we'll call this back instead } SMOOTHSCROLLINFO, *PSMOOTHSCROLLINFO; WINCOMMCTRLAPI INT WINAPI SmoothScrollWindow(PSMOOTHSCROLLINFO pssi); #define SSW_EX_NOTIMELIMIT 0x00010000 #define SSW_EX_IMMEDIATE 0x00020000 #define SSW_EX_IGNORESETTINGS 0x00040000 // ignore system settings to turn on/off smooth scroll } #endif // SMOOTHSCROLLINFO inline void MyScrollWindow( HWND hwnd, int dx, int dy, CONST RECT * pRect, CONST RECT * pClipRect, BOOL fSmooth = TRUE ) { #if 1 if ( fSmooth ) { SMOOTHSCROLLINFO ssi; ssi.cbSize = sizeof ssi; ssi.fMask = SSIF_MINSCROLL | SSIF_MAXSCROLLTIME; //0; ssi.hwnd = hwnd; ssi.dx = dx; ssi.dy = dy; ssi.lprcSrc = pRect; ssi.lprcClip = pClipRect; ssi.hrgnUpdate = 0; ssi.lprcUpdate = 0; ssi.fuScroll = SW_INVALIDATE | SW_ERASE; ssi.uMaxScrollTime = GetDoubleClickTime() / 6; //SSI_DEFAULT, ssi.cxMinScroll = 1; //SSI_DEFAULT, ssi.cyMinScroll = 1; //SSI_DEFAULT, ssi.pfnScrollProc = 0; SmoothScrollWindow( &ssi ); } else #endif { ScrollWindow( hwnd, dx, dy, pRect, pClipRect ); } } //MyScrollWindow struct SLocaleEntry { DWORD iMenuOption; LCID lcid; }; extern const SLocaleEntry aLocaleEntries[]; extern const ULONG cLocaleEntries; class CQueryResult { public: CQueryResult( WCHAR const * pwcPath, DBCOMMANDTREE const * pTree, BOOL fDelete ) : _pwcPath( pwcPath ), _pTree( pTree ), _fDeleteWhenDone( fDelete ) {} WCHAR const * _pwcPath; DBCOMMANDTREE const * _pTree; BOOL _fDeleteWhenDone; }; class CColumnList { public: CColumnList() : _aColumns(0), _cColumns(0) {} ~CColumnList() { if ( 0 != _aColumns ) { UINT iColumn; for( iColumn = 0; iColumn < _cColumns; iColumn++ ) delete [] _aColumns[ iColumn ]; delete [] _aColumns; } } void SetColumn( WCHAR const * wcsColumn, UINT uPos ) { // does _aColumns need to be extended? if( uPos >= _cColumns ) { WCHAR ** pwcsTemp = new WCHAR *[ uPos + 1 ]; UINT cCol; // copy the old pointers and 0 any new ones for( cCol = 0; cCol < uPos + 1; cCol++ ) { if( cCol < _cColumns ) pwcsTemp[ cCol ] = _aColumns[ cCol ]; else pwcsTemp[ cCol ] = 0; } delete [] _aColumns; _cColumns = uPos + 1; _aColumns = pwcsTemp; } // free any previous column string delete [] _aColumns[ uPos ]; // copy & set the column if( wcsColumn == 0 ) { _aColumns[ uPos ] = 0; } else { int iLength = wcslen( wcsColumn ) + 1; _aColumns[ uPos ] = new WCHAR[ iLength ]; memcpy( _aColumns[ uPos ], wcsColumn, iLength * sizeof(WCHAR) ); } } WCHAR const * GetColumn( UINT uPos ) const { if( uPos >= _cColumns ) return 0; return _aColumns[ uPos ]; } void SetNumberOfColumns( UINT cCol ) { if( cCol < _cColumns ) { for( ; cCol < _cColumns; cCol++ ) { delete [] _aColumns[ cCol ]; _aColumns[ cCol ] = 0; } } } UINT NumberOfColumns() const { UINT cCol; for( cCol = 0; cCol < _cColumns; cCol++ ) { if( _aColumns[ cCol ] == 0 ) break; } return cCol; } void MakeList( XArray &a ) { UINT cCol; UINT cwc = 0; for ( cCol = 0; cCol < _cColumns; cCol++ ) { if ( _aColumns[ cCol ] == 0 ) break; cwc += wcslen( _aColumns[cCol] ) + 1; } cwc++; a.ReSize( cwc ); WCHAR *pwc = a.GetPointer(); for ( cCol = 0; cCol < _cColumns; cCol++ ) { if ( _aColumns[ cCol ] == 0 ) break; if ( 0 != cCol ) *pwc++ = L','; WCHAR *p = _aColumns[cCol]; while ( 0 != *p ) *pwc++ = *p++; } *pwc = 0; } private: WCHAR ** _aColumns; UINT _cColumns; }; class CSortList { public: CSortList() : _pwcSort(0) {} ~CSortList() { delete [] _pwcSort; } void SetSort( WCHAR const * pwc, int iDir ) { _iSortDir = iDir; if ( 0 != _pwcSort ) { delete [] _pwcSort; _pwcSort = 0; } int cwc = wcslen( pwc ) + 1; _pwcSort = new WCHAR[ cwc ]; wcscpy( _pwcSort, pwc ); } int GetSortDir() { return _iSortDir; } WCHAR const * pwcGetSort() { return _pwcSort; } void MakeList( XArray & a ) { int cwc = wcslen( _pwcSort ); a.ReSize( cwc + 1 + 3 ); wcscpy( a.Get(), _pwcSort ); a[cwc] = L'['; a[cwc + 1] = ( SORT_UP == _iSortDir ) ? L'a' : L'd'; a[cwc + 2] = L']'; a[cwc + 3] = 0; } private: int _iSortDir; WCHAR * _pwcSort; };