windows-nt/Source/XPSP1/NT/inetsrv/query/apps/srch/srchwnd.cxx
2020-09-26 16:20:57 +08:00

2882 lines
86 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: srchwnd.cxx
//
// Contents:
//
// History: 15 Aug 1996 DLee Created
//
//--------------------------------------------------------------------------
#include "pch.cxx"
#pragma hdrstop
#include <ntquery.h>
//
// Main Search Window procedure
//
LRESULT WINAPI SearchWndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
LRESULT lRet = 0;
// Find search control corresponding to this window
CSearchControl *pControl = (CSearchControl *) GetWindowLongPtr( hwnd, 0 );
switch (msg)
{
//
// Message sent to us by ListView
//
case wmListNotify:
lRet = pControl->wmListNotify (hwnd, wParam, lParam);
break;
case wmDrawItem :
lRet = pControl->wmDrawItem(wParam,lParam);
break;
case wmMeasureItem:
pControl->wmMeasureItem(wParam,lParam);
break;
// OLE DB notification
case wmNotification:
pControl->wmNotification(wParam,lParam);
break;
//------------------------------------
case wmAccelerator :
pControl->wmAccelerator(wParam,lParam);
break;
case WM_MDIACTIVATE :
lRet = pControl->wmActivate( hwnd, wParam, lParam );
break;
case WM_DRAWITEM :
lRet = pControl->wmRealDrawItem( hwnd, wParam, lParam );
break;
case WM_SIZE :
lRet = pControl->wmSize(wParam,lParam);
break;
case wmDisplaySubwindows :
pControl->wmDisplaySubwindows(wParam,lParam);
break;
case WM_CREATE :
{
CREATESTRUCT *pcs = (CREATESTRUCT *) lParam;
MDICREATESTRUCT *pmcs = (MDICREATESTRUCT *) pcs->lpCreateParams;
pControl = new CSearchControl(hwnd, (WCHAR *) pmcs->lParam);
PostMessage( hwnd, wmDisplaySubwindows, 0, 0 );
break;
}
case WM_CTLCOLORSTATIC :
SetTextColor((HDC) wParam, GetSysColor( COLOR_BTNTEXT ) );
// fall through
case WM_CTLCOLORBTN :
SetBkColor((HDC) wParam, GetSysColor( COLOR_BTNFACE ) );
lRet = (LRESULT) (LPVOID) App.BtnFaceBrush();
break;
case wmNewFont :
pControl->wmNewFont(wParam,lParam);
break;
case wmAppClosing :
pControl->wmAppClosing(wParam,lParam);
break;
case WM_CLOSE :
pControl->wmClose(wParam,lParam);
lRet = DefMDIChildProc(hwnd,msg,wParam,lParam);
break;
case WM_DESTROY :
delete pControl;
break;
case wmMenuCommand :
pControl->wmMenuCommand(wParam,lParam);
break;
case WM_SETFOCUS :
case wmGiveFocus :
pControl->wmSetFocus(wParam,lParam);
break;
case WM_COMMAND :
pControl->wmCommand(wParam,lParam);
break;
case wmInitMenu :
pControl->wmInitMenu(wParam,lParam);
break;
case WM_SYSCOLORCHANGE :
pControl->wmSysColorChange( wParam, lParam );
lRet = DefMDIChildProc( hwnd, msg, wParam, lParam );
break;
case WM_NOTIFY :
pControl->wmColumnNotify( wParam, lParam );
break;
case WM_CONTEXTMENU :
pControl->wmContextMenu( hwnd, wParam, lParam );
break;
default:
lRet = DefMDIChildProc( hwnd, msg, wParam, lParam );
break;
}
return lRet;
} //SearchWndProc
//
// Scope choice dialog box proc and helper functions
//
unsigned GetCatalogListCount( HWND hdlg )
{
unsigned cChecked = 0;
HWND hCatList = GetDlgItem( hdlg, ID_CATALOG_LIST );
Win4Assert( hCatList );
unsigned iItem = ListView_GetItemCount( hCatList ) ;
LVITEM lvi;
for ( ; iItem > 0; iItem-- )
{
lvi.iItem = iItem - 1;
if ( ListView_GetCheckState( hCatList, lvi.iItem ) )
cChecked++;
}
return cChecked;
} //GetCatalogListCount
void DeleteCatalogSelectedListItems( HWND hdlg )
{
HWND hCatList = GetDlgItem( hdlg, ID_CATALOG_LIST );
Win4Assert( hCatList );
unsigned iItem = ListView_GetItemCount( hCatList ) ;
for ( ; iItem > 0; iItem-- )
{
if ( LVIS_SELECTED == ListView_GetItemState( hCatList, iItem - 1, LVIS_SELECTED ) )
ListView_DeleteItem( hCatList, iItem - 1 );
}
} //DeleteCatalogSelectedListItems
BOOL IsInList(
HWND hCatList,
SScopeCatalogMachine const & scm,
int & item )
{
unsigned iItem = ListView_GetItemCount( hCatList ) ;
LVITEM lvi;
WCHAR wTemp[MAX_PATH];
lvi.pszText = (WCHAR*)wTemp;
lvi.cchTextMax = MAX_PATH;
for ( ; iItem > 0; iItem-- )
{
unsigned iCol = 0;
lvi.iItem = iItem - 1;
lvi.mask = LVIF_TEXT;
// machine
lvi.iSubItem = iCol++;
ListView_GetItem( hCatList, &lvi );
if ( !_wcsicmp( scm.awcMachine, lvi.pszText ) )
{
// catalog
lvi.iSubItem = iCol++;
ListView_GetItem( hCatList, &lvi );
if ( !_wcsicmp( scm.awcCatalog, lvi.pszText ) )
{
// scope
lvi.iSubItem = iCol++;
ListView_GetItem( hCatList, &lvi );
if ( !_wcsicmp( scm.awcScope, lvi.pszText ) )
{
item = lvi.iItem;
return TRUE;
}
}
}
}
return FALSE;
} //IsInList
void AddCatalogToList(
HWND hdlg,
SScopeCatalogMachine const & scm,
BOOL fChecked )
{
HWND hCatList = GetDlgItem( hdlg, ID_CATALOG_LIST );
Win4Assert( hCatList );
// Don't add duplicates, but check the checkbox if needed
int item;
if ( IsInList( hCatList, scm, item ) )
{
if ( fChecked )
ListView_SetCheckState( hCatList, item, fChecked );
return;
}
unsigned cItems = ListView_GetItemCount( hCatList ) ;
LVITEM lvItem;
unsigned iCol = 0;
// Machine
lvItem.mask = LVIF_TEXT;
lvItem.iItem = cItems;
lvItem.iSubItem = iCol++;
lvItem.pszText = (WCHAR*)scm.awcMachine;
ListView_InsertItem( hCatList, &lvItem );
// Catalog
lvItem.iSubItem = iCol++;
lvItem.pszText = (WCHAR*)scm.awcCatalog;
ListView_SetItem( hCatList, &lvItem );
// Scope
lvItem.iSubItem = iCol++;
lvItem.pszText = (WCHAR*)scm.awcScope;
ListView_SetItem( hCatList, &lvItem );
// Depth
lvItem.iSubItem = iCol++;
lvItem.pszText = ( TRUE == scm.fDeep ) ? App.GetYes() : App.GetNo();
ListView_SetItem( hCatList, &lvItem );
ListView_SetCheckState( hCatList, cItems, fChecked );
} //AddCatalogToList
void CheckItIfInList(
HWND hdlg,
SScopeCatalogMachine const & scm )
{
HWND hCatList = GetDlgItem( hdlg, ID_CATALOG_LIST );
Win4Assert( hCatList );
// Don't add duplicates, but check the checkbox if needed
int item;
if ( IsInList( hCatList, scm, item ) )
ListView_SetCheckState( hCatList, item, TRUE );
} //CheckItIfInList
BOOL VerifyCatalogInfo( HWND hdlg, SScopeCatalogMachine & scm )
{
CWaitCursor wait;
if (IsDlgButtonChecked(hdlg,ID_SCOPE_DEEP))
scm.fDeep = TRUE;
else
scm.fDeep = FALSE;
GetDlgItemText( hdlg,
ID_SCOPE_EDIT,
scm.awcScope,
MAX_PATH );
GetDlgItemText( hdlg,
ID_SCOPE_CATALOG_EDIT,
scm.awcCatalog,
MAX_PATH );
GetDlgItemText( hdlg,
ID_SCOPE_MACHINE_EDIT,
scm.awcMachine,
SRCH_COMPUTERNAME_LENGTH );
if ( 0 == scm.awcCatalog[0] )
{
//
// If the user didn't specify a Catalog, then look for one using scope.
//
ULONG ccCat = sizeof(scm.awcCatalog)/sizeof(WCHAR);
ULONG ccMachine = sizeof(scm.awcMachine)/sizeof(WCHAR);
SCODE sc = LocateCatalogs( scm.awcScope,
0,
scm.awcMachine,
&ccMachine,
scm.awcCatalog,
&ccCat );
}
// don't allow empty catalog names
if ( 0 == scm.awcCatalog[0] )
{
SearchError( hdlg,
IDS_ERR_NO_CATALOG_SPECIFIED,
L"" );
return FALSE;
}
// if scope is empty make it a global physical scope.
if ( 0 == scm.awcScope[0] )
wcscpy( scm.awcScope, L"\\" ); // entire catalog
// map empty machine name to local machine
if ( 0 == scm.awcMachine[0] )
wcscpy( scm.awcMachine, L"." ); // local machine
// remove leading two backslashes from machine name
if ( L'\\' == scm.awcMachine[0] &&
L'\\' == scm.awcMachine[1] )
{
WCHAR awc[SRCH_COMPUTERNAME_LENGTH + 1];
wcscpy( awc, scm.awcMachine+2 );
wcscpy( scm.awcMachine, awc );
}
CI_STATE cistate;
cistate.cbStruct = sizeof cistate;
if (STATUS_NOT_FOUND == CIState( scm.awcCatalog,
scm.awcMachine,
& cistate ) )
{
SearchError( hdlg,
IDS_ERR_BAD_CATALOG_SPECIFIED,
L"" );
return FALSE;
}
return TRUE;
} //VerifyCatalogInfo
void CatListToString( HWND hdlg, XGrowable<WCHAR> & xCatStr )
{
xCatStr.SetSize( 1 );
xCatStr[0] = 0;
HWND hCatList = GetDlgItem( hdlg, ID_CATALOG_LIST );
Win4Assert( hCatList );
unsigned iItem = ListView_GetItemCount( hCatList ) ;
LVITEM lvi;
WCHAR wTemp[MAX_PATH];
lvi.pszText = (WCHAR*)wTemp;
lvi.cchTextMax = MAX_PATH;
for ( ; iItem > 0; iItem-- )
{
unsigned iCol = 0;
unsigned cCatStr;
unsigned cText;
lvi.iItem = iItem - 1;
if ( ListView_GetCheckState( hCatList, lvi.iItem ) )
{
lvi.mask = LVIF_TEXT;
// machine
lvi.iSubItem = iCol++;
ListView_GetItem( hCatList, &lvi );
cCatStr = wcslen( xCatStr.Get() );
cText = wcslen( lvi.pszText );
xCatStr.SetSize( cCatStr + cText + 2 );
wcscat( xCatStr.Get(), lvi.pszText );
wcscat( xCatStr.Get(), L"," );
// catalog
lvi.iSubItem = iCol++;
ListView_GetItem( hCatList, &lvi );
cCatStr = wcslen( xCatStr.Get() );
cText = wcslen( lvi.pszText );
xCatStr.SetSize( cCatStr + cText + 2 );
wcscat( xCatStr.Get(), lvi.pszText );
wcscat( xCatStr.Get(), L"," );
// scope
lvi.iSubItem = iCol++;
ListView_GetItem( hCatList, &lvi );
cCatStr = wcslen( xCatStr.Get() );
cText = wcslen( lvi.pszText );
xCatStr.SetSize( cCatStr + cText + 2 );
wcscat( xCatStr.Get(), lvi.pszText );
wcscat( xCatStr.Get(), L"," );
// depth
lvi.iSubItem = iCol++;
ListView_GetItem( hCatList, &lvi );
cCatStr = wcslen( xCatStr.Get() );
cText = 1;
xCatStr.SetSize( cCatStr + cText + 2 );
wcscat( xCatStr.Get(),
!wcscmp( App.GetYes(), lvi.pszText ) ? L"d" : L"s" );
wcscat( xCatStr.Get(), L";" );
}
}
} //CatListToString
BOOL ScopeDlgInit(
HWND hdlg,
LPARAM lParam,
LPWSTR awcScopeOrig)
{
SScopeCatalogMachine scm;
// search control was passed as lParam
SetWindowLongPtr(hdlg, DWLP_USER, lParam);
XGrowable<WCHAR> *xCatList = (XGrowable<WCHAR> *) lParam;
CheckDlgButton( hdlg, ID_SCOPE_DEEP, TRUE );
SendDlgItemMessage( hdlg,
ID_SCOPE_MACHINE_EDIT,
EM_SETLIMITTEXT,
SRCH_COMPUTERNAME_LENGTH,
0 );
SendDlgItemMessage( hdlg,
ID_SCOPE_EDIT,
EM_SETLIMITTEXT,
MAX_PATH,
0 );
SendDlgItemMessage( hdlg,
ID_SCOPE_CATALOG_EDIT,
EM_SETLIMITTEXT,
MAX_PATH,
0 );
// Setup columns in the multi catalog list box
HWND hCatList = GetDlgItem( hdlg, ID_CATALOG_LIST );
Win4Assert( hCatList );
ListView_SetExtendedListViewStyleEx( hCatList,
LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT,
LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
CResString str;
LVCOLUMN lvc;
unsigned iCol = 0;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 100;
lvc.iSubItem = iCol++;
str.Load( IDS_CATLIST_COL_MACHINE );
lvc.pszText = str.Get();
ListView_InsertColumn( hCatList, iCol, &lvc) ;
lvc.cx = 90;
lvc.iSubItem = iCol++;
str.Load( IDS_CATLIST_COL_CATALOG );
lvc.pszText = str.Get();
ListView_InsertColumn( hCatList, iCol, &lvc) ;
lvc.cx = 90;
lvc.iSubItem = iCol++;
str.Load( IDS_CATLIST_COL_SCOPE );
lvc.pszText = str.Get();
ListView_InsertColumn( hCatList, iCol, &lvc) ;
lvc.cx = 50;
lvc.iSubItem = iCol++;
str.Load( IDS_CATLIST_COL_SUBDIRS );
lvc.pszText = str.Get();
ListView_InsertColumn( hCatList, iCol, &lvc) ;
BOOL fMultiCat = GetCatListItem( *xCatList,
1,
scm.awcMachine,
scm.awcCatalog,
scm.awcScope,
scm.fDeep );
scm.fDeep = TRUE;
//
// Add the catalogs from the user's environment if present.
// The SRCHDEFAULTS variable is of the form
//
// server\catalog:scope;server\catalog:scope;+server\catalog:scope
//
// + indicates that the server should be checked by default. If no
// scope is provided, then \ is used.
//
WCHAR wszDefaults[MAX_PATH];
DWORD dwResult = GetEnvironmentVariableW( L"SRCHDEFAULTS", wszDefaults, MAX_PATH );
if (dwResult && dwResult < MAX_PATH)
{
LPWSTR psz = wszDefaults;
while ( *psz )
{
BOOL fChecked = FALSE;
if ( *psz == L'+' )
{
fChecked = TRUE;
psz++;
}
// Everything up to the \ is the server name
LPWSTR pszT = wcschr( psz, L'\\' );
if ( 0 == pszT )
{
break;
}
*pszT++ = L'\0';
lstrcpynW( scm.awcMachine, psz, SRCH_COMPUTERNAME_LENGTH + 1 );
// Everything up to the ; or end of string is the catalog:scope
psz = pszT;
pszT = wcschr( psz, L';' );
if ( 0 != pszT )
{
*pszT++ = L'\0';
}
else
{
pszT = psz + wcslen( psz );
}
//
// If there is a : then that's the scope.
//
LPWSTR pszColon = wcschr( psz, L':' );
if ( 0 != pszColon )
{
*pszColon++ = L'\0';
lstrcpynW( scm.awcScope, pszColon, MAX_PATH );
}
else
{
// Default scope is "\"
wcscpy( scm.awcScope, L"\\" );
}
lstrcpynW( scm.awcCatalog, psz, MAX_PATH );
AddCatalogToList( hdlg, scm, fChecked );
psz = pszT;
}
}
else
{
// Add the well-known catalogs
wcscpy( scm.awcScope, L"\\" );
HRSRC hrc = FindResource( 0, (LPCWSTR) IDR_CATALOGS, RT_RCDATA );
if ( 0 != hrc )
{
HGLOBAL hg = LoadResource( 0, hrc );
if ( 0 != hg )
{
WCHAR * p = (WCHAR *) LockResource( hg );
while ( 0 != p && 0 != *p )
{
wcscpy( scm.awcMachine, p );
p += ( wcslen( p ) + 1 );
wcscpy( scm.awcCatalog, p );
p += ( wcslen( p ) + 1 );
AddCatalogToList( hdlg, scm, FALSE );
}
}
}
}
if ( ! fMultiCat )
{
if ( GetCatListItem( *xCatList,
0,
scm.awcMachine,
scm.awcCatalog,
scm.awcScope,
scm.fDeep ) )
{
SetDlgItemText( hdlg, ID_SCOPE_EDIT, scm.awcScope );
SetDlgItemText( hdlg, ID_SCOPE_CATALOG_EDIT, scm.awcCatalog );
SetDlgItemText( hdlg, ID_SCOPE_MACHINE_EDIT, scm.awcMachine );
CheckDlgButton( hdlg, ID_SCOPE_DEEP, scm.fDeep );
CheckItIfInList( hdlg, scm );
}
}
else
{
for ( unsigned ii = 0; ; ii ++ )
{
if ( GetCatListItem( *xCatList,
ii,
scm.awcMachine,
scm.awcCatalog,
scm.awcScope,
scm.fDeep ) )
AddCatalogToList( hdlg, scm, TRUE );
else
break;
}
}
wcscpy( awcScopeOrig, scm.awcScope );
UINT ctlID = ID_SCOPE_MACHINE_EDIT;
SetFocus( GetDlgItem( hdlg, ctlID ) );
MySendEMSetSel( GetDlgItem( hdlg, ctlID ), 0, (UINT) -1 );
CenterDialog( hdlg );
return FALSE;
} //ScopeDlgInit
INT_PTR WINAPI ScopeDlgProc(
HWND hdlg,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
BOOL fRet = FALSE;
// pointer to search control that will receive the new scope
// safe: can have one dlg up at a time!
SScopeCatalogMachine scm;
static WCHAR awcScopeOrig[MAX_PATH];
switch (msg)
{
case WM_INITDIALOG :
{
fRet = ScopeDlgInit( hdlg, lParam, awcScopeOrig );
break;
}
case WM_NOTIFY:
{
if ( ID_CATALOG_LIST == (int) wParam )
{
LPNMHDR pnmh = (LPNMHDR) lParam;
if ( LVN_KEYDOWN == pnmh->code )
{
NMLVKEYDOWN * pnkd = (NMLVKEYDOWN *) lParam;
if ( VK_DELETE == pnkd->wVKey )
DeleteCatalogSelectedListItems( hdlg );
}
}
break;
}
case WM_COMMAND :
{
UINT uiID = MyWmCommandID( wParam, lParam );
switch (uiID)
{
case ID_SCOPE_EDIT:
{
if ( EN_KILLFOCUS == HIWORD(wParam) )
{
// Try to locate a matching catalog
GetDlgItemText( hdlg,
ID_SCOPE_EDIT,
scm.awcScope,
MAX_PATH );
// only look for a cat if the scope changed
if ( 0 != wcscmp( scm.awcScope, awcScopeOrig ) )
{
CWaitCursor wait;
ULONG ccCat = sizeof(scm.awcCatalog)/sizeof(WCHAR);
ULONG ccMachine = sizeof(scm.awcMachine)/sizeof(WCHAR);
SCODE sc = LocateCatalogs( scm.awcScope,
0,
scm.awcMachine,
&ccMachine,
scm.awcCatalog,
&ccCat );
if ( S_OK == sc )
{
SetDlgItemText( hdlg, ID_SCOPE_CATALOG_EDIT, scm.awcCatalog );
SetDlgItemText( hdlg, ID_SCOPE_MACHINE_EDIT, scm.awcMachine );
}
}
}
break;
}
case ID_CATALOG_ADD:
{
if ( VerifyCatalogInfo( hdlg, scm ) )
{
AddCatalogToList( hdlg, scm, TRUE );
SetDlgItemText( hdlg, ID_SCOPE_EDIT, L"" );
SetDlgItemText( hdlg, ID_SCOPE_CATALOG_EDIT, L"" );
SetDlgItemText( hdlg, ID_SCOPE_MACHINE_EDIT, L"" );
SetFocus( GetDlgItem( hdlg, ID_SCOPE_MACHINE_EDIT ) );
}
break;
}
case IDOK:
{
XGrowable<WCHAR> *xCatList = reinterpret_cast<XGrowable<WCHAR> *>
(GetWindowLongPtr(hdlg, DWLP_USER));
GetDlgItemText( hdlg,
ID_SCOPE_EDIT,
scm.awcScope,
MAX_PATH );
GetDlgItemText( hdlg,
ID_SCOPE_CATALOG_EDIT,
scm.awcCatalog,
MAX_PATH );
GetDlgItemText( hdlg,
ID_SCOPE_MACHINE_EDIT,
scm.awcMachine,
SRCH_COMPUTERNAME_LENGTH );
// We look at the edit fields only if user has entered some
// value and nothing has been added to the catalog list.
// If anything has been added to catalog list, then we
// only look at the list and ignore these fields
if ( ( scm.awcScope[0] || scm.awcCatalog[0] || scm.awcMachine[0] )
&& 0 == GetCatalogListCount( hdlg ) )
{
if ( VerifyCatalogInfo( hdlg, scm ) )
AddCatalogToList( hdlg, scm, TRUE );
else
break;
}
CatListToString( hdlg, *xCatList );
if ( 0 == (*xCatList)[0] )
{
SearchError( hdlg,
IDS_ERR_NO_CATALOG_SPECIFIED,
L"" );
break;
}
}
// fall through!
case IDCANCEL:
EndDialog( hdlg, IDOK == uiID );
break;
}
break;
}
}
return fRet;
} //ScopeDlgProc
static WNDPROC g_DlgWndProc = 0;
INT_PTR WINAPI DisplayPropsDlgProc(
HWND hdlg,
UINT msg,
WPARAM wParam,
LPARAM lParam );
void EnableOrDisableButtons(
HWND hdlg,
HWND hAvail,
HWND hDisp )
{
int iSelAvail = (int) SendMessage( hAvail, LB_GETCURSEL, 0, 0 );
int iSelDisp = (int) SendMessage( hDisp, LB_GETCURSEL, 0, 0 );
HWND hAdd = GetDlgItem( hdlg, ID_PROP_ADD );
HWND hRemove = GetDlgItem( hdlg, ID_PROP_REMOVE );
if ( iSelAvail == -1 && GetFocus() == hAdd )
SetFocus( hAvail );
if ( iSelDisp == -1 && GetFocus() == hRemove )
SetFocus( hDisp );
EnableWindow( hAdd, iSelAvail != -1 );
EnableWindow( hRemove, iSelDisp != -1 );
} //EnableOrDisableButtons
LRESULT WINAPI DlgSubclassProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
static UINT msgDrag = RegisterWindowMessage( DRAGLISTMSGSTRING );
static iDraggedItem;
LRESULT lRet = 0;
if ( msgDrag == msg )
{
HWND hAvail = GetDlgItem( hwnd, ID_PROP_AVAIL );
HWND hDisp = GetDlgItem( hwnd, ID_PROP_DISP );
DRAGLISTINFO *pInfo = (DRAGLISTINFO *) lParam;
switch( pInfo->uNotification )
{
case DL_BEGINDRAG :
{
iDraggedItem = LBItemFromPt( pInfo->hWnd,
pInfo->ptCursor, TRUE );
lRet = TRUE;
break;
}
case DL_DRAGGING :
{
int i = -1;
HWND hDst = hDisp;
if ( pInfo->hWnd == hAvail )
{
i = LBItemFromPt( hDisp, pInfo->ptCursor, TRUE );
}
else
{
i = LBItemFromPt( hDisp, pInfo->ptCursor, TRUE );
if ( -1 == i )
{
i = LBItemFromPt( hAvail, pInfo->ptCursor, TRUE );
hDst = hAvail;
}
}
DrawInsert( hwnd, hDst, i );
if ( -1 == i )
lRet = DL_STOPCURSOR;
else
lRet = DL_MOVECURSOR;
break;
}
case DL_CANCELDRAG :
{
DrawInsert( hwnd, pInfo->hWnd, -1 );
lRet = DL_CURSORSET;
break;
}
case DL_DROPPED :
{
int i = -1;
HWND hDst = hDisp;
if ( pInfo->hWnd == hAvail )
{
i = LBItemFromPt( hDisp, pInfo->ptCursor, TRUE );
}
else
{
i = LBItemFromPt( hDisp, pInfo->ptCursor, TRUE );
if ( -1 == i )
{
i = LBItemFromPt( hAvail, pInfo->ptCursor, TRUE );
hDst = hAvail;
}
}
if ( ( -1 != i && -1 != iDraggedItem ) &&
( ! ( pInfo->hWnd == hDisp &&
hDst == hDisp &&
i == iDraggedItem ) ) )
{
if ( hDst == hAvail )
{
// move displayed to avail
DisplayPropsDlgProc( hwnd,
WM_COMMAND,
(WPARAM) MAKELONG(ID_PROP_REMOVE,0),
0 );
}
else if ( pInfo->hWnd == hAvail )
{
// move avail to displayed
WCHAR awcBuf[ cwcBufSize ];
SendMessage( hAvail, LB_GETTEXT, iDraggedItem, (LPARAM) awcBuf );
SendMessage( hDisp, LB_INSERTSTRING, i, (LPARAM ) awcBuf );
SendMessage( hAvail, LB_DELETESTRING, iDraggedItem, 0 );
}
else
{
// reorder displayed items
WCHAR awcBuf[ cwcBufSize ];
SendMessage( hDisp, LB_GETTEXT, iDraggedItem, (LPARAM) awcBuf );
SendMessage( hDisp, LB_INSERTSTRING, i, (LPARAM ) awcBuf );
if ( iDraggedItem > i )
iDraggedItem++;
SendMessage( hDisp, LB_DELETESTRING, iDraggedItem, 0 );
}
}
DrawInsert( hwnd, pInfo->hWnd, -1 );
lRet = DL_CURSORSET;
EnableOrDisableButtons( hwnd, hAvail, hDisp );
break;
}
}
return lRet;
}
if ( 0 != g_DlgWndProc )
lRet = g_DlgWndProc( hwnd, msg, wParam, lParam );
return lRet;
} //DlgSubclassProc
INT_PTR WINAPI DisplayPropsDlgProc(
HWND hdlg,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
// pointer to search control that will receive the new props
// safe: can have one dlg up at a time!
static CSearchControl *s_pControl = 0;
BOOL fRet = FALSE;
switch (msg)
{
case WM_INITDIALOG :
{
// subclass the dlgproc -- we need a window proc, not a dlgproc
g_DlgWndProc = (WNDPROC) GetWindowLongPtr( hdlg, GWLP_WNDPROC );
SetWindowLongPtr( hdlg, GWLP_WNDPROC, (LONG_PTR) DlgSubclassProc );
// search control was passed as lParam
s_pControl = (CSearchControl *) lParam;
CColumnList & columns = s_pControl->GetColumnList();
IColumnMapper & map = s_pControl->GetColumnMapper();
// fill the displayed and available listboxes
HWND hAvail = GetDlgItem( hdlg, ID_PROP_AVAIL );
HWND hDisp = GetDlgItem( hdlg, ID_PROP_DISP );
unsigned cDisp = columns.NumberOfColumns();
MakeDragList( hAvail );
MakeDragList( hDisp );
ULONG iEntry = 0;
WCHAR const *pwcName;
DBID *pdbid;
DBTYPE dbtype;
unsigned int uiWidth;
while ( SUCCEEDED( map.EnumPropInfo( iEntry,
&pwcName,
&pdbid,
&dbtype,
&uiWidth ) ) )
{
if ( 0 != uiWidth )
{
XArray<WCHAR> xLower( 1 + wcslen( pwcName ) );
wcscpy( xLower.Get(), pwcName );
_wcslwr( xLower.Get() + 1 );
BOOL fIsDisp = FALSE;
for ( unsigned i = 0; i < cDisp; i++ )
{
if ( !_wcsicmp( xLower.Get(), columns.GetColumn( i ) ) )
{
fIsDisp = TRUE;
break;
}
}
if (!fIsDisp)
SendMessage( hAvail,
LB_ADDSTRING,
0,
(LPARAM) xLower.Get() );
}
iEntry++;
}
for ( unsigned i = 0; i < cDisp; i++ )
SendMessage( hDisp, LB_ADDSTRING, 0,
(LPARAM) columns.GetColumn( i ) );
CenterDialog( hdlg );
EnableOrDisableButtons( hdlg, hAvail, hDisp );
fRet = FALSE;
break;
}
case WM_COMMAND :
{
HWND hAvail = GetDlgItem( hdlg, ID_PROP_AVAIL );
HWND hDisp = GetDlgItem( hdlg, ID_PROP_DISP );
WORD cmd = MyWmCommandCmd( wParam, lParam );
switch ( MyWmCommandID( wParam, lParam ) )
{
case ID_PROP_ADD :
{
int iSelDisp = (int) SendMessage( hDisp, LB_GETCURSEL, 0, 0 );
int iSelAvail = (int) SendMessage( hAvail, LB_GETCURSEL, 0, 0 );
if ( LB_ERR != iSelAvail )
{
WCHAR awcBuf[ cwcBufSize ];
SendMessage( hAvail, LB_GETTEXT, iSelAvail, (LPARAM) awcBuf );
SendMessage( hDisp,
LB_INSERTSTRING,
iSelDisp != LB_ERR ? iSelDisp : -1,
(LPARAM ) awcBuf );
SendMessage( hAvail, LB_DELETESTRING, iSelAvail, 0 );
}
EnableOrDisableButtons( hdlg, hAvail, hDisp );
break;
}
case ID_PROP_REMOVE :
{
int iSelDisp = (int) SendMessage( hDisp, LB_GETCURSEL, 0, 0 );
if ( LB_ERR != iSelDisp )
{
WCHAR awcBuf[ cwcBufSize ];
SendMessage( hDisp, LB_GETTEXT, iSelDisp, (LPARAM) awcBuf );
SendMessage( hAvail, LB_ADDSTRING, 0, (LPARAM ) awcBuf );
SendMessage( hDisp, LB_DELETESTRING, iSelDisp, 0 );
}
EnableOrDisableButtons( hdlg, hAvail, hDisp );
break;
}
case ID_PROP_AVAIL :
{
if ( LBN_DBLCLK == cmd )
DisplayPropsDlgProc( hdlg,
WM_COMMAND,
(WPARAM) MAKELONG(ID_PROP_ADD,0),
0 );
EnableOrDisableButtons( hdlg, hAvail, hDisp );
break;
}
case ID_PROP_DISP :
{
if ( LBN_DBLCLK == cmd )
DisplayPropsDlgProc( hdlg,
WM_COMMAND,
(WPARAM) MAKELONG(ID_PROP_REMOVE,0),
0 );
EnableOrDisableButtons( hdlg, hAvail, hDisp );
break;
}
case IDOK :
{
HWND hDisp = GetDlgItem( hdlg, ID_PROP_DISP );
ULONG cDisp = (ULONG)SendMessage( hDisp, LB_GETCOUNT, 0, 0 );
WCHAR awcDisp[ cwcBufSize ];
awcDisp[0] = 0;
cDisp = __min( cDisp, maxBoundCols );
for ( unsigned i = 0; i < cDisp; i++ )
{
WCHAR awcBuf[ cwcBufSize ];
SendMessage( hDisp, LB_GETTEXT, i, (LPARAM) awcBuf );
if ( 0 != awcDisp[0] )
wcscat( awcDisp, L"," );
wcscat( awcDisp, awcBuf );
}
SetReg( CISEARCH_REG_DISPLAYPROPS, awcDisp );
s_pControl->SetupDisplayProps( awcDisp );
EndDialog( hdlg, TRUE );
break;
}
case ID_PROP_DEFAULT :
{
WCHAR awcDisp[ cwcBufSize ];
wcscpy( awcDisp, DEFAULT_DISPLAYED_PROPERTIES );
SetReg( CISEARCH_REG_DISPLAYPROPS, awcDisp );
s_pControl->SetupDisplayProps( awcDisp );
EndDialog( hdlg, TRUE );
break;
}
case IDCANCEL :
{
EndDialog( hdlg, FALSE );
break;
}
}
break;
}
}
return fRet;
} //DisplayPropsDlgProc
//
// Subclass window procedure for edit control
//
LRESULT WINAPI EditSubclassProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
LRESULT lRet = 0;
HWND hParent = GetParent(GetParent(hwnd));
if (0 != hParent)
{
CSearchControl *pControl = (CSearchControl *) GetWindowLongPtr (hParent, 0);
if (0 != pControl)
lRet = pControl->EditSubclassEvent(hwnd,msg,wParam,lParam);
}
return lRet;
} //EditSubclassProc
//
// Search Control
//
CSearchControl::CSearchControl(
HWND hwnd,
WCHAR * pwcScope)
:
#pragma warning(disable : 4355)
_view( hwnd, *this, _columns ),
#pragma warning(default : 4355)
_hInst( 0 ),
_hwndSearch( hwnd ),
_hwndQuery( 0 ),
_hwndQueryTitle( 0 ),
_hwndHeader( 0 ),
_hwndList( 0 ),
_lpOrgEditProc( 0 ),
_pSearch( 0 ),
_fDeep( TRUE )
{
ISimpleCommandCreator & cmdCreator = *App.GetCommandCreator();
XInterface<IColumnMapperCreator> xMapper;
SCODE sc = cmdCreator.QueryInterface( IID_IColumnMapperCreator, xMapper.GetQIPointer() );
if ( FAILED( sc ) )
THROW( CException( sc ) );
sc = xMapper->GetColumnMapper( L".", L"SYSTEM", _xColumnMapper.GetPPointer() );
if ( FAILED( sc ) )
THROW( CException( sc ) );
SetWindowLongPtr( hwnd, 0, (LONG_PTR) this );
_sort.SetSort( App.GetSortProp(), App.GetSortDir() );
_lcid = App.GetLocale();
_hInst = MyGetWindowInstance( _hwndSearch );
_xCatList = App.CatalogList();
// Get the first cat item
GetCatListItem( App.CatalogList(), 0, _awcMachine, _awcCatalog, _awcScope, _fDeep );
ResetTitle();
InitPanes();
} //CSearchControl
LRESULT CSearchControl::wmActivate(
HWND hwnd,
WPARAM wParam,
LPARAM lParam )
{
if ( hwnd == (HWND) lParam )
{
SIZE size;
{
HDC hdc = GetDC( _hwndQueryTitle );
if ( 0 != hdc )
{
CResString str( IDS_COUNTTITLE );
GetTextExtentPoint32( hdc, str.Get(), wcslen( str.Get() ), &size );
ReleaseDC( _hwndQueryTitle, hdc );
}
}
int apos[] = { size.cx + 2, size.cx + 102, -1 };
SendMessage( App.StatusBarWindow(),
SB_SETPARTS,
sizeof apos / sizeof apos[ 0 ],
(LPARAM) apos );
_UpdateStatusWindow( L"", L"" );
UINT cDisable = 2;
static UINT aDisable[] = { IDM_PREVIOUS_HIT,
IDM_NEXT_HIT,
IDM_BROWSE, };
UINT cEnable = 4;
static UINT aEnable[] = { IDM_SEARCH,
IDM_SEARCHCLASSDEF,
IDM_SEARCHFUNCDEF,
IDM_DISPLAY_PROPS,
IDM_BROWSE };
if ( ( 0 != _pSearch ) &&
( _pSearch->IsSelected() ) )
cEnable++;
else
cDisable++;
UpdateButtons( aDisable, cDisable, FALSE );
UpdateButtons( aEnable, cEnable, TRUE );
_UpdateCount();
}
return 0;
} //wmActivate
void CSearchControl::_UpdateStatusWindow(
WCHAR const * pwcMsg,
WCHAR const * pwcReliability )
{
SendMessage( App.StatusBarWindow(), SB_SETTEXT, SBT_OWNERDRAW | idStatusRatio, 0 );
SendMessage( App.StatusBarWindow(), SB_SETTEXT, idStatusMsg, (LPARAM) pwcMsg );
SendMessage( App.StatusBarWindow(), SB_SETTEXT, idStatusReliability, (LPARAM) pwcReliability );
} //_UpdateStatusWindow
LRESULT CSearchControl::wmRealDrawItem(
HWND hwnd,
WPARAM wParam,
LPARAM lParam )
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if ( lpdis->hwndItem == App.StatusBarWindow() )
{
ULONG iPct = 0;
if ( 0 != _pSearch )
iPct = _pSearch->PctDone();
RECT rc;
CopyRect( &rc, &lpdis->rcItem );
rc.right += iPct;
FillRect( lpdis->hDC, &rc, App.BtnHiliteBrush() );
CopyRect( &rc, &lpdis->rcItem );
rc.left += iPct;
FillRect( lpdis->hDC, &rc, App.BtnFaceBrush() );
if ( 0 != _pSearch )
{
int iOldMode = SetBkMode( lpdis->hDC, TRANSPARENT );
COLORREF crOld = SetTextColor( lpdis->hDC,
GetSysColor( COLOR_BTNTEXT ) );
WCHAR awc[40];
if ( QUERY_FILL_STATUS( _pSearch->QueryStatus() ) == STAT_ERROR )
{
CResString strError( IDS_QUERYERROR );
wcscpy( awc, strError.Get() );
}
else if ( _pSearch->MostlyDone() )
{
CResString strDone( IDS_QUERYDONE );
wcscpy( awc, strDone.Get() );
}
else
wsprintf( awc, L"%d%%", iPct );
DrawText( lpdis->hDC, awc, wcslen( awc ), & lpdis->rcItem,
DT_SINGLELINE | DT_VCENTER | DT_CENTER );
SetTextColor( lpdis->hDC, crOld );
SetBkMode( lpdis->hDC, iOldMode );
}
}
return 1;
} //wmRealDrawItem
LRESULT CSearchControl::wmColumnNotify(
WPARAM wParam,
LPARAM lParam )
{
HD_NOTIFY * pn = (HD_NOTIFY *) lParam;
switch ( pn->hdr.code )
{
case HDN_ENDTRACK :
{
if ( (int) _view.ColumnWidth( pn->iItem ) != pn->pitem->cxy )
{
_view.SetColumnWidth( pn->iItem, pn->pitem->cxy );
InvalidateRect( _hwndList, 0, TRUE );
}
break;
}
case HDN_DIVIDERDBLCLICK :
{
HD_ITEM hdi;
hdi.mask = HDI_FORMAT | HDI_WIDTH | HDI_TEXT;
hdi.cxy = _view.SetDefColumnWidth( pn->iItem );
hdi.pszText = (WCHAR *) _columns.GetColumn( pn->iItem );
hdi.hbm = 0;
hdi.cchTextMax = wcslen( hdi.pszText );
hdi.fmt = HDF_STRING | HDF_LEFT;
hdi.lParam = 0;
Header_SetItem( _hwndHeader, pn->iItem, &hdi );
InvalidateRect( _hwndList, 0, TRUE );
break;
}
case HDN_ITEMCLICK :
{
//BOOL fUp = ( 0 == ( 0x8000 & GetAsyncKeyState( VK_CONTROL ) ) );
// invert the old sort order
int dir = ( _sort.GetSortDir() == SORT_UP ) ? SORT_DOWN : SORT_UP;
_sort.SetSort( _columns.GetColumn( pn->iItem ), dir );
wcscpy( App.GetSortProp(), _columns.GetColumn( pn->iItem ) );
App.GetSortDir() = dir;
PostMessage ( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
}
}
return DefMDIChildProc( _hwndSearch, WM_NOTIFY, wParam, lParam );
} //wmColumnNotify
void CSearchControl::SetupDisplayProps(
WCHAR *pwcProps )
{
_columns.SetNumberOfColumns( 0 );
WCHAR *pwc = pwcProps;
unsigned iPos = 0;
do
{
WCHAR *pwcStart = pwc;
while ( *pwc && ',' != *pwc )
pwc++;
if ( ',' == *pwc )
{
*pwc = 0;
pwc++;
}
if ( *pwcStart )
_columns.SetColumn( pwcStart, iPos++ );
else
break;
} while ( TRUE );
// if the list is bad -- no props added, add the default props
if ( 0 == iPos )
{
WCHAR awcProp[ cwcBufSize ];
wcscpy( awcProp, DEFAULT_DISPLAYED_PROPERTIES );
SetupDisplayProps( awcProp );
}
_view.ColumnsChanged();
_AddColumnHeadings();
} //SetupDisplayProps
void CSearchControl::_AddColumnHeadings()
{
// delete any existing column headers
int cItems = Header_GetItemCount( _hwndHeader );
for ( int i = 0; i < cItems; i++ )
Header_DeleteItem( _hwndHeader, 0 );
// add the current column headers
HD_ITEM hdi;
hdi.mask = HDI_FORMAT | HDI_WIDTH | HDI_TEXT;
hdi.hbm = 0;
hdi.fmt = HDF_STRING | HDF_LEFT;
hdi.lParam = 0;
for ( unsigned x = 0; x < _columns.NumberOfColumns(); x++ )
{
hdi.cxy = _view.ColumnWidth( x );
hdi.pszText = (WCHAR *) _columns.GetColumn( x );
hdi.cchTextMax = wcslen( hdi.pszText );
Header_InsertItem( _hwndHeader, x, &hdi );
}
} //_AddColumnHeadings
void CSearchControl::InitPanes ()
{
// Query pane
_hwndQuery = CreateWindow( L"COMBOBOX",
0,
WS_VSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP,
0, 0, 0, 0,
_hwndSearch,
(HMENU) idQueryChild,
_hInst,
0 );
// Get the edit field from the combobox
// This is a hack, but I can't find any way of getting the
// edit field from the combo box
HWND hEdit = FindWindowEx( _hwndQuery, 0, L"EDIT", 0 );
if ( 0 == hEdit )
return;
_lpOrgEditProc = (WNDPROC) GetWindowLongPtr( hEdit, GWLP_WNDPROC );
SetWindowLongPtr( hEdit, GWLP_WNDPROC, (LONG_PTR) EditSubclassProc );
_hLastToHaveFocus = _hwndQuery;
// List View pane
// to be replaced by ListView
_hwndList = CreateWindow( LIST_VIEW_CLASS,
L"",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP |
WS_VSCROLL | WS_BORDER,
0, 0, 0, 0,
_hwndSearch,
(HMENU) idListChild,
_hInst,
0 );
DWORD err;
if (_hwndList == 0)
err = GetLastError();
const long styleStatic = SS_LEFT | WS_CHILD;
CResString strQuery (IDS_QUERYTITLE);
_hwndQueryTitle = CreateWindow( L"static",
strQuery.Get(),
styleStatic,
0,0,0,0,
_hwndSearch,
(HMENU) idQueryTitle,
_hInst,
0 );
_hwndHeader = CreateWindowEx( 0,
WC_HEADER,
0,
WS_CHILD | WS_BORDER |
HDS_HORZ | HDS_BUTTONS,
0,0,0,0,
_hwndSearch,
(HMENU) idHeader,
_hInst,
0 );
_view.InitPanes ( _hwndQueryTitle,
_hwndQuery,
_hwndList,
_hwndHeader );
WCHAR awcDisplayProps[cwcBufSize];
ULONG cb = sizeof awcDisplayProps;
if ( !GetReg( CISEARCH_REG_DISPLAYPROPS, awcDisplayProps, &cb ) )
wcscpy( awcDisplayProps, DEFAULT_DISPLAYED_PROPERTIES );
SetupDisplayProps( awcDisplayProps );
PostMessage( _hwndSearch, wmGiveFocus, 0, 0 );
} //InitPanes
CSearchControl::~CSearchControl()
{
SetWindowLongPtr( _hwndSearch, 0, 0 );
delete _pSearch;
} //~CSearchControl
LRESULT CSearchControl::wmListNotify(
HWND hwnd,
WPARAM wParam,
LPARAM lParam )
{
if (!_pSearch)
{
*(long *)lParam = -1;
return LRESULT(FALSE);
}
BOOL f = (BOOL)_pSearch->ListNotify (hwnd, wParam, (long *)lParam);
static UINT aItem[] = { IDM_BROWSE };
UpdateButtons( aItem, 1, _pSearch->IsSelected() );
return (LRESULT) f;
} //wmListNotify
//
// Edit control procedure
//
LRESULT CSearchControl::EditSubclassEvent(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
LRESULT lRet = 0;
switch (msg)
{
#if 0
case WM_KEYDOWN :
{
if ( VK_UP == wParam )
pwc = _history.Previous();
else if ( VK_DOWN == wParam )
pwc = _history.Next();
else
lRet = CallWindowProc( _lpOrgEditProc,
hwnd, msg, wParam, lParam );
if ( 0 != pwc )
{
SetWindowText( hwnd, pwc );
MySendEMSetSel( hwnd, 0, (UINT) -1 );
}
break;
}
#endif
case WM_KEYUP :
{
if ( VK_ESCAPE == wParam )
{
if ( SendMessage( _hwndQuery, CB_GETDROPPEDSTATE, 0, 0 ) )
{
SendMessage( _hwndQuery, CB_SHOWDROPDOWN, (WPARAM)FALSE, 0 );
}
}
lRet = CallWindowProc( _lpOrgEditProc, hwnd, msg, wParam, lParam );
break;
}
case WM_CHAR :
{
if ( VK_RETURN == wParam || 11 == wParam )
{
// Handle 'enter' only if combobox list is closed. If it is open,
// then we handle the selection message in wmCommand
if ( FALSE == SendMessage( _hwndQuery, CB_GETDROPPEDSTATE, 0, 0 ) )
{
SendMessage ( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
// swallow cr/lf
break;
}
}
else
{
// Match the user entered string with the strings in the combobox
// list box...
lRet = CallWindowProc( _lpOrgEditProc, hwnd, msg, wParam, lParam );
UINT uiLen = GetWindowTextLength( hwnd );
if (0 != uiLen && VK_BACK != wParam )
{
XGrowable<WCHAR> xBuf;
xBuf.SetSize( uiLen + 1 );
GetWindowText( hwnd, xBuf.Get(), uiLen + 1 );
int index = (int)SendMessage( _hwndQuery, CB_FINDSTRING, -1, (LPARAM) xBuf.Get() );
if ( CB_ERR != index)
{
unsigned uiFullLen = (unsigned)SendMessage( _hwndQuery, CB_GETLBTEXTLEN, index, 0 );
xBuf.SetSize( uiFullLen + 1 );
if ( CB_ERR != SendMessage( _hwndQuery,
CB_GETLBTEXT,
index,
(LPARAM) xBuf.Get() ) )
{
SetWindowText( hwnd, xBuf.Get() );
MySendEMSetSel( hwnd, uiLen, (UINT) -1 );
}
}
}
break;
}
// no break, fall through!
}
default :
lRet = CallWindowProc( _lpOrgEditProc, hwnd, msg, wParam, lParam );
break;
}
return lRet;
} //EditSubclassEvent
LRESULT CSearchControl::wmSize(
WPARAM wParam,
LPARAM lParam )
{
// no need to do this since User doesn't have the repaint bug with
// comboboxes that it does with edit controls
//if (_hwndQuery)
// InvalidateRect(_hwndQuery, 0, TRUE);
LRESULT lr = DefMDIChildProc(_hwndSearch, WM_SIZE, wParam, lParam);
if ( _hwndQuery )
_view.Size( LOWORD (lParam), HIWORD (lParam));
return lr;
} //wmSize
LRESULT CSearchControl::wmDisplaySubwindows(
WPARAM wParam,
LPARAM lParam )
{
ShowWindow(_hwndQuery,SW_SHOW);
ShowWindow(_hwndList,SW_SHOW);
ShowWindow(_hwndQueryTitle,SW_SHOW);
ShowWindow(_hwndHeader,SW_SHOW);
return 0;
} //wmDisplaySubwindows
LRESULT CSearchControl::wmContextMenu(
HWND hwnd,
WPARAM wParam,
LPARAM lParam )
{
POINT pt;
pt.x = LOWORD( lParam );
pt.y = HIWORD( lParam );
GetCursorPos( &pt );
RECT rc;
GetWindowRect( _hwndHeader, &rc );
WCHAR *pwcMenu = L"bogus";
// is the click over the properties header?
if ( PtInRect( &rc, pt ) )
{
pwcMenu = L"HeaderContextMenu";
}
else
{
// do hit testing on listview -- on a hit?
int iHit = (int) SendMessage( _hwndList,
wmContextMenuHitTest,
0,
MAKELPARAM( pt.x, pt.y ) );
if ( -1 != iHit )
pwcMenu = L"ResultsContextMenu";
}
HMENU hMenu = LoadMenu( App.Instance(), pwcMenu );
if ( 0 != hMenu )
{
HMENU hTrackMenu = GetSubMenu( hMenu, 0 );
if ( 0 != hTrackMenu )
{
if ( !wcscmp( pwcMenu, L"ResultsContextMenu" ) )
SetMenuDefaultItem( hTrackMenu, IDM_BROWSE, FALSE );
// yes, the function returns a BOOL that you switch on
BOOL b = TrackPopupMenuEx( hTrackMenu,
TPM_LEFTALIGN | TPM_RIGHTBUTTON |
TPM_RETURNCMD,
pt.x,
pt.y,
hwnd,
0 );
switch ( b )
{
case IDM_EDITCOPY :
case IDM_EDITCOPYALL :
case IDM_DISPLAY_PROPS :
{
wmMenuCommand( b, 0 );
break;
}
case IDM_BROWSE :
{
_DoBrowse( fileBrowse );
break;
}
case IDM_BROWSE_OPEN :
{
_DoBrowse( fileOpen );
break;
}
case IDM_BROWSE_EDIT :
{
_DoBrowse( fileEdit );
break;
}
}
}
DestroyMenu( hMenu );
}
return 0;
} //wmContextMenu
void CSearchControl::_DoBrowse(
enumViewFile eViewType )
{
if (_pSearch)
{
CWaitCursor curWait;
TRY
{
BOOL fIsZoomed = IsZoomed( _hwndSearch );
BOOL fOK = _pSearch->Browse( eViewType );
if ( !fOK && fIsZoomed )
{
App.ZoomMDI( _hwndSearch );
InvalidateRect( _hwndSearch, NULL, TRUE );
}
}
CATCH (CException, e)
{
}
END_CATCH;
}
} //_DoBrowse
LRESULT CSearchControl::wmCommand(
WPARAM wParam,
LPARAM lParam )
{
UINT uiID = MyWmCommandID( wParam, lParam );
HWND hCtl = MyWmCommandHWnd( wParam, lParam );
UINT uiCmd = MyWmCommandCmd( wParam, lParam );
switch (uiID)
{
case idQueryChild :
switch (uiCmd)
{
case CBN_SETFOCUS:
_hLastToHaveFocus = _hwndQuery;
break;
case CBN_SELENDOK :
PostMessage ( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
case CBN_DROPDOWN:
// This list is getting dropped
// Set its size
_view.ResizeQueryCB();
break;
}
break;
case idListChild :
switch (uiCmd)
{
case LBN_SETFOCUS :
_hLastToHaveFocus = _hwndList;
break;
case LBN_DBLCLK :
{
BOOL fCtrl = ( 0 != ( 0x8000 & GetAsyncKeyState( VK_CONTROL ) ) );
_DoBrowse( fCtrl ? fileOpen : fileBrowse );
break;
}
}
break;
}
return 0;
} //wmCommand
LRESULT CSearchControl::wmAccelerator(
WPARAM wParam,
LPARAM lParam)
{
switch (wParam)
{
case ACC_ALTQ :
SetFocus(_hwndQuery);
break;
case ACC_ALTR :
SetFocus(_hwndList);
break;
case ACC_TAB :
case ACC_SHIFTTAB :
if (_hLastToHaveFocus == _hwndQuery)
SetFocus(_hwndList);
else
SetFocus(_hwndQuery);
break;
}
return 0;
} //wmAccelerator
LRESULT CSearchControl::wmNewFont(
WPARAM wParam,
LPARAM lParam)
{
HFONT hfontNew = (HFONT) wParam;
_view.FontChanged (hfontNew);
WCHAR awcDisplayProps[cwcBufSize];
ULONG cb = sizeof awcDisplayProps;
if ( !GetReg( CISEARCH_REG_DISPLAYPROPS, awcDisplayProps, &cb ) )
wcscpy( awcDisplayProps, DEFAULT_DISPLAYED_PROPERTIES );
SetupDisplayProps( awcDisplayProps );
SendMessage( _hwndList, WM_SETFONT, (WPARAM) hfontNew, 1L );
SendMessage( _hwndQuery, WM_SETFONT, (WPARAM) hfontNew, 1L );
RECT rc;
GetClientRect( _hwndSearch, &rc );
_view.Size( rc.right - rc.left, rc.bottom - rc.top );
return 0;
} //wmNewFont
LRESULT CSearchControl::wmDrawItem(
WPARAM wParam,
LPARAM lParam)
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if (lpdis->hwndItem == _hwndList)
{
if (lpdis->itemID == (UINT) -1)
lpdis->itemAction = ODA_FOCUS;
if ( lpdis->itemAction & ODA_DRAWENTIRE )
{
if ( _pSearch && _pSearch->IsSelected( lpdis->itemID ) )
lpdis->itemState |= ODS_SELECTED;
RECT rc;
_view.PrimeItem( lpdis, rc );
//if ( lpdis->itemState & ( ODS_SELECTED | ODS_FOCUS ) )
// DrawFocusRect( lpdis->hDC, &rc );
if ( 0 != _pSearch )
_view.PaintItem( _pSearch,
lpdis->hDC,
rc,
lpdis->itemID );
}
}
return 1;
} //wmDrawItem
LRESULT CSearchControl::wmAppClosing(
WPARAM wParam,
LPARAM lParam )
{
SendMessage( _hwndSearch, ::wmMenuCommand, IDM_NEWSEARCH, 0 );
return 0;
} //wmAppClosing
void CSearchControl::ResetTitle()
{
SScopeCatalogMachine scm;
XGrowable<WCHAR> xTitle;
xTitle.SetSize( wcslen(_xCatList.Get()) + 50 );
xTitle[0] = 0;
unsigned ii;
for ( ii = 0; ; ii++ )
{
if ( ! GetCatListItem( _xCatList,
ii,
scm.awcMachine,
scm.awcCatalog,
scm.awcScope,
scm.fDeep ) )
{
break;
}
if ( ii > 0 )
{
wcscat( xTitle.Get(), L", " );
}
if ( scm.awcMachine[0] != L'.' )
{
wcscat( xTitle.Get(), scm.awcMachine );
wcscat( xTitle.Get(), L" " );
}
wcscat( xTitle.Get(), scm.awcCatalog );
wcscat( xTitle.Get(), L" " );
wcscat( xTitle.Get(), scm.awcScope );
}
SetWindowText( _hwndSearch, xTitle.Get() );
} //ResetTitle
//+-------------------------------------------------------------------------
//
// Function: MyForceMasterMerge
//
// Synopsis: Forces a master merge on the catalog
//
// Arguments: [pwcCatalog] - Catalog name
// [pwcMachine] - Machine on which catalog resides
//
//--------------------------------------------------------------------------
HRESULT MyForceMasterMerge(
WCHAR const * pwcCatalog,
WCHAR const * pwcMachine )
{
// Create the main Indexing Service administration object.
CLSID clsid;
HRESULT hr = CLSIDFromProgID( L"Microsoft.ISAdm", &clsid );
if ( FAILED( hr ) )
return hr;
XInterface<IAdminIndexServer> xAdmin;
hr = CoCreateInstance( clsid,
0,
CLSCTX_INPROC_SERVER,
__uuidof(IAdminIndexServer),
xAdmin.GetQIPointer() );
if ( FAILED( hr ) )
return hr;
// Set the machine name.
BSTR bstrMachine = SysAllocString( pwcMachine );
if ( 0 == bstrMachine )
return E_OUTOFMEMORY;
XBStr xbstr( bstrMachine );
hr = xAdmin->put_MachineName( bstrMachine );
if ( FAILED( hr ) )
return hr;
// Get a catalog administration object.
BSTR bstrCatalog = SysAllocString( pwcCatalog );
if ( 0 == bstrCatalog )
return E_OUTOFMEMORY;
xbstr.Free();
xbstr.Set( bstrCatalog );
XInterface<ICatAdm> xCatAdmin;
hr = xAdmin->GetCatalogByName( bstrCatalog,
(IDispatch **) xCatAdmin.GetQIPointer() );
if ( FAILED( hr ) )
return hr;
// Force the merge.
return xCatAdmin->ForceMasterMerge();
} //MyForceMasterMerge
LRESULT CSearchControl::wmMenuCommand(
WPARAM wParam,
LPARAM lParam )
{
switch (wParam)
{
case IDM_EDITCOPY :
if ( ( 0 != _hwndList ) &&
( _hwndList == GetFocus() ) &&
( 0 != _pSearch ) &&
( _pSearch->IsSelected() ) )
{
WCHAR *pwcPath;
HROW hrow;
if ( _pSearch->GetSelectedRowData( pwcPath, hrow ) )
{
PutInClipboard( pwcPath );
_pSearch->FreeSelectedRowData( hrow );
}
}
break;
case IDM_SCOPE_AND_DEPTH:
{
if ( DoModalDialog( ScopeDlgProc,
_hwndSearch,
L"ScopeBox",
(LPARAM) &_xCatList ) )
{
// Get the first cat list item
GetCatListItem( _xCatList, 0, _awcMachine, _awcCatalog, _awcScope, _fDeep );
SendMessage(_hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM (1,0));
}
break;
}
case IDM_DISPLAY_PROPS:
if ( DoModalDialog( DisplayPropsDlgProc,
_hwndSearch,
L"DisplayPropsBox",
(LPARAM) this ) )
{
SendMessage(_hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM (1,0));
}
break;
case IDM_EDITCOPYALL :
if (0 != _pSearch)
{
CWaitCursor curWait;
_pSearch->WriteResults();
}
break;
case IDM_BROWSE:
MyPostWmCommand(_hwndSearch, idListChild, _hwndSearch, LBN_DBLCLK);
break;
case IDM_LIMIT_10:
App.Limit() = 10;
SendMessage( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
case IDM_LIMIT_300:
App.Limit() = 300;
SendMessage( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
case IDM_LIMIT_NONE:
App.Limit() = 0;
SendMessage( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
case IDM_FIRSTROWS_5:
App.FirstRows() = 5;
SendMessage( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
case IDM_FIRSTROWS_15:
App.FirstRows() = 15;
SendMessage( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
case IDM_FIRSTROWS_NONE:
App.FirstRows() = 0;
SendMessage( _hwndSearch,
::wmMenuCommand,
IDM_SEARCH,
MAKELPARAM( 1, 0 ) );
break;
case IDM_DIALECT_1:
case IDM_DIALECT_2:
if ( wParam == IDM_DIALECT_1 )
App.Dialect() = ISQLANG_V1;
else
App.Dialect() = ISQLANG_V2;
break;
case IDM_DIALECT_3:
App.Dialect() = SQLTEXT;
break;
case IDM_LOCALE_NEUTRAL:
case IDM_LOCALE_CHINESE_TRADITIONAL:
case IDM_LOCALE_CHINESE_SIMPLIFIED:
case IDM_LOCALE_CHINESE_HONGKONG:
case IDM_LOCALE_CHINESE_SINGAPORE:
case IDM_LOCALE_CHINESE_MACAU:
case IDM_LOCALE_DUTCH_DUTCH:
case IDM_LOCALE_ENGLISH_CAN:
case IDM_LOCALE_ENGLISH_US:
case IDM_LOCALE_ENGLISH_UK:
case IDM_LOCALE_FINNISH_DEFAULT:
case IDM_LOCALE_FARSI_DEFAULT:
case IDM_LOCALE_FRENCH_FRENCH:
case IDM_LOCALE_FRENCH_CANADIAN:
case IDM_LOCALE_GERMAN_GERMAN:
case IDM_LOCALE_GREEK_DEFAULT:
case IDM_LOCALE_HEBREW_DEFAULT:
case IDM_LOCALE_HINDI_DEFAULT:
case IDM_LOCALE_ITALIAN_ITALIAN:
case IDM_LOCALE_JAPANESE_DEFAULT:
case IDM_LOCALE_KOREAN_KOREAN:
// case IDM_LOCALE_KOREAN_JOHAB:
case IDM_LOCALE_POLISH_DEFAULT:
case IDM_LOCALE_ROMANIAN_DEFAULT:
case IDM_LOCALE_RUSSIAN_DEFAULT:
case IDM_LOCALE_SPANISH_CASTILIAN:
case IDM_LOCALE_SPANISH_MEXICAN:
case IDM_LOCALE_SPANISH_MODERN:
case IDM_LOCALE_SWAHILI_DEFAULT:
case IDM_LOCALE_SWEDISH_DEFAULT:
case IDM_LOCALE_THAI_DEFAULT:
case IDM_LOCALE_TURKISH_DEFAULT:
case IDM_LOCALE_UKRAINIAN_DEFAULT:
case IDM_LOCALE_VIETNAMESE_DEFAULT:
{
for ( ULONG i = 0; i < cLocaleEntries; i++ )
{
if ( wParam == aLocaleEntries[ i ].iMenuOption )
{
_lcid = aLocaleEntries[ i ].lcid;
App.SetLocale( _lcid );
break;
}
}
break;
}
case IDM_FORCE_USE_CI :
{
BOOL fTmp = App.ForceUseCI();
App.ForceUseCI() = !fTmp;
break;
}
case IDM_CATALOG_STATUS:
// what about distributed queries? They aren't supported
CreateDialogParam( _hInst,
L"CatalogStatusBox",
App.AppWindow(),
StatusDlgProc,
(LPARAM) this );
break;
case IDM_MASTER_MERGE:
{
// what about distributed queries?
SCODE sc = MyForceMasterMerge( CatalogOrNull(),
Machine() );
if ( FAILED( sc ) )
{
WCHAR awcError[MAX_PATH];
FormatSrchError( sc, awcError, _lcid );
MessageBox( _hwndSearch,
awcError,
_awcScope,
MB_OK|MB_ICONEXCLAMATION );
}
break;
}
case IDM_SEARCH :
case IDM_SEARCHCLASSDEF :
case IDM_SEARCHFUNCDEF :
{
CWaitCursor curWait;
// Scope change invokes a new query, so make sure title bar is ok
ResetTitle();
CSearchQuery *ptmp = _pSearch;
_pSearch = 0;
// Let the user know we're doing something
{
CResString strHitCount(IDS_COUNTEND);
_UpdateStatusWindow( strHitCount.Get(), L"" );
UpdateWindow( App.StatusBarWindow() );
}
SendMessage( _hwndList, wmResetContents, 0, 0 );
delete ptmp;
static UINT aItem[] = { IDM_BROWSE };
UpdateButtons( aItem, 1, FALSE );
// Let the user know we're doing something
{
CResString strHitCount(IDS_COUNTSTART);
_UpdateStatusWindow( strHitCount.Get(), L"" );
UpdateWindow( App.StatusBarWindow() );
}
HWND hEdit = FindWindowEx( _hwndQuery, 0, L"EDIT", 0 );
UINT uiLen = GetWindowTextLength(hEdit);
if (0 == uiLen)
{
CResString strCount (IDS_COUNTTITLE);
SendMessage( App.StatusBarWindow(), SB_SETTEXT, idStatusMsg, (LPARAM) strCount.Get() );
}
else
{
WCHAR * pwcBuf = new WCHAR [uiLen + 1];
TRY
{
GetWindowText (hEdit, pwcBuf, uiLen + 1);
ESearchType st = srchNormal;
if (IDM_SEARCHCLASSDEF == wParam)
st = srchClass;
else if (IDM_SEARCHFUNCDEF == wParam)
st = srchFunction;
//----------
// NEW QUERY
//----------
_pSearch = new CSearchQuery( _xCatList,
pwcBuf,
_hwndSearch,
_view.Lines(),
_lcid,
st,
_xColumnMapper.GetReference(),
_columns,
_sort,
App.Dialect(),
App.Limit(),
App.FirstRows() );
_pSearch->InitNotifications(_hwndList);
// Scope may have changed if server was down
ResetTitle();
// Let the user know we're doing something
{
WCHAR awcCount[100];
CResString strHitCount(IDS_HITCOUNT);
swprintf( awcCount, strHitCount.Get(), 0, 0.0f );
SendMessage( App.StatusBarWindow(), SB_SETTEXT, SBT_OWNERDRAW | idStatusRatio, 0 );
SendMessage( App.StatusBarWindow(), SB_SETTEXT, idStatusMsg, (LPARAM) awcCount );
UpdateWindow( App.StatusBarWindow() );
}
MySendEMSetSel( hEdit, 0, (UINT) -1 );
if ( CB_ERR == SendMessage( _hwndQuery, CB_FINDSTRINGEXACT, -1, (LPARAM) pwcBuf ) )
{
SendMessage( _hwndQuery, CB_INSERTSTRING, 0, (LPARAM) pwcBuf );
}
//_history.Add( pwcBuf );
delete [] pwcBuf;
pwcBuf = 0;
}
CATCH (CException, e )
{
SCODE sc = e.GetErrorCode();
if ( 0 == _pSearch )
{
// check for version mismatch, otherwise just report
// the error
if ( STATUS_INVALID_PARAMETER_MIX == sc )
{
SearchError( _hwndSearch,
IDS_ERR_BAD_VERSION,
_awcScope );
}
else // if ( QUERY_E_ALLNOISE != sc )
{
WCHAR awcError[MAX_PATH];
FormatSrchError( sc, awcError, _lcid );
CResString strErr( IDS_ERR_QUERY_ERROR );
WCHAR awcMsg[MAX_PATH];
swprintf( awcMsg, strErr.Get(), awcError );
MessageBox( _hwndSearch,
awcMsg,
_awcScope,
MB_OK|MB_ICONEXCLAMATION );
}
}
else
{
delete _pSearch;
_pSearch = 0;
}
delete [] pwcBuf;
CResString strCount (IDS_COUNTTITLE);
SendMessage( App.StatusBarWindow(), SB_SETTEXT,
idStatusMsg, (LPARAM) strCount.Get() );
}
END_CATCH;
}
}
break;
case IDM_NEWSEARCH :
{
CWaitCursor curWait;
CSearchQuery *ptmp = _pSearch;
_pSearch = 0;
// Let the user know we're doing something
{
CResString strHitCount(IDS_COUNTEND);
_UpdateStatusWindow( strHitCount.Get(), L"" );
UpdateWindow( App.StatusBarWindow() );
}
delete ptmp;
static UINT aItem[] = { IDM_BROWSE };
UpdateButtons( aItem, 1, FALSE );
ResetTitle();
CResString strCount (IDS_COUNTTITLE);
_UpdateStatusWindow( strCount.Get(), L"" );
SetWindowText( _hwndQuery, L"") ;
SendMessage( _hwndList, wmResetContents, 0, 0 );
SetFocus( _hwndQuery );
}
break;
}
return 0;
} //wmMenuCommand
LRESULT CSearchControl::wmSetFocus(
WPARAM wParam,
LPARAM lParam )
{
if (0 != _hLastToHaveFocus)
SetFocus(_hLastToHaveFocus);
return 0;
} //wmSetFocus
LRESULT CSearchControl::wmClose(
WPARAM wParam,
LPARAM lParam )
{
SendMessage( _hwndSearch, ::wmMenuCommand, IDM_NEWSEARCH, 0 );
return 0;
} //wmClose
void _CheckReliability(
DWORD dwStatus,
DWORD bit,
UINT msg,
WCHAR * pwcMsg )
{
if ( QUERY_RELIABILITY_STATUS( dwStatus ) & bit )
{
CResString str( msg );
if ( 0 != pwcMsg[ 0 ] )
wcscat( pwcMsg, L" / " );
wcscat( pwcMsg, str.Get() );
}
} //_CheckReliability
void CSearchControl::_UpdateCount()
{
if ( _hwndSearch == App.GetActiveMDI() )
{
WCHAR awcCount[200];
CResString strHitCount;
WCHAR awcReliability[MAX_PATH];
awcReliability[ 0 ] = 0;
DWORD dwStatus = 0;
if ( _pSearch )
{
strHitCount.Load( IDS_HITCOUNT );
swprintf( awcCount,
strHitCount.Get(),
_pSearch->RowCount(),
(float) _pSearch->QueryTime() );
dwStatus = _pSearch->QueryStatus();
if ( 0 != _pSearch->LastError() )
{
FormatSrchError( _pSearch->LastError(), awcReliability, _lcid );
}
else
{
_CheckReliability( dwStatus,
STAT_CONTENT_OUT_OF_DATE,
IDS_RELIABILITY_OUTOFDATE,
awcReliability );
_CheckReliability( dwStatus,
STAT_NOISE_WORDS,
IDS_RELIABILITY_NOISE,
awcReliability );
_CheckReliability( dwStatus,
STAT_PARTIAL_SCOPE,
IDS_RELIABILITY_PARTIAL,
awcReliability );
_CheckReliability( dwStatus,
STAT_REFRESH_INCOMPLETE,
IDS_RELIABILITY_REFRESH_INCOMPLETE,
awcReliability );
_CheckReliability( dwStatus,
STAT_CONTENT_QUERY_INCOMPLETE,
IDS_RELIABILITY_CONTENT_QUERY_INCOMPLETE,
awcReliability );
_CheckReliability( dwStatus,
STAT_TIME_LIMIT_EXCEEDED,
IDS_RELIABILITY_TIME_LIMIT_EXCEEDED,
awcReliability );
}
}
else
{
CResString strCount( IDS_COUNTTITLE );
wcscpy( awcCount, strCount.Get() );
}
_UpdateStatusWindow( awcCount, awcReliability );
UpdateWindow( App.StatusBarWindow() );
}
} //_UpdateCount
LRESULT CSearchControl::wmNotification(
WPARAM wParam,
LPARAM lParam)
{
if (0 != _pSearch)
{
_pSearch->ProcessNotification( _hwndList,
DBWATCHNOTIFY(wParam),
(IRowset*)lParam);
BOOL fMore;
_pSearch->UpdateProgress( fMore );
PostMessage( _hwndList, wmSetCountBefore, 0,
(LPARAM)_pSearch->RowCurrent() );
PostMessage( _hwndList, wmSetCount, 0,
(LPARAM)_pSearch->RowCount() );
_UpdateCount();
_pSearch->ProcessNotificationComplete();
}
return 0;
} //wmNotification
LRESULT CSearchControl::wmInitMenu(
WPARAM wParam,
LPARAM lParam)
{
HMENU hmenu = (HMENU) wParam;
for ( ULONG i = 0; i < cLocaleEntries; i++ )
{
DWORD option = aLocaleEntries[ i ].iMenuOption;
EnableMenuItem( hmenu, option, MF_ENABLED );
LCID lcid = aLocaleEntries[ i ].lcid;
CheckMenuItem( hmenu,
option,
_lcid == lcid ? MF_CHECKED : MF_UNCHECKED );
}
EnableMenuItem(hmenu,IDM_SEARCH,MF_ENABLED);
if ( SQLTEXT == App.Dialect() )
{
EnableMenuItem( hmenu, IDM_SEARCHCLASSDEF, MF_GRAYED );
EnableMenuItem( hmenu, IDM_SEARCHFUNCDEF, MF_GRAYED );
}
else
{
EnableMenuItem( hmenu, IDM_SEARCHCLASSDEF, MF_ENABLED );
EnableMenuItem( hmenu, IDM_SEARCHFUNCDEF, MF_ENABLED);
}
EnableMenuItem(hmenu,IDM_NEWSEARCH,MF_ENABLED);
EnableMenuItem(hmenu,IDM_SCOPE_AND_DEPTH,MF_ENABLED);
EnableMenuItem(hmenu,IDM_FILTER_SCOPE,MF_ENABLED);
EnableMenuItem(hmenu,IDM_DISPLAY_PROPS,MF_ENABLED);
EnableMenuItem(hmenu, IDM_FORCE_USE_CI, MF_ENABLED);
CheckMenuItem(hmenu, IDM_FORCE_USE_CI, App.ForceUseCI() ? MF_CHECKED : MF_UNCHECKED );
EnableMenuItem( hmenu, IDM_DIALECT_1, MF_ENABLED );
EnableMenuItem( hmenu, IDM_DIALECT_2, MF_ENABLED );
EnableMenuItem( hmenu, IDM_DIALECT_3, MF_ENABLED );
CheckMenuItem( hmenu, IDM_DIALECT_1, ISQLANG_V1 == App.Dialect() ? MF_CHECKED : MF_UNCHECKED );
CheckMenuItem( hmenu, IDM_DIALECT_2, ISQLANG_V2 == App.Dialect() ? MF_CHECKED : MF_UNCHECKED );
CheckMenuItem( hmenu, IDM_DIALECT_3, SQLTEXT == App.Dialect() ? MF_CHECKED : MF_UNCHECKED );
EnableMenuItem( hmenu, IDM_LIMIT_10, MF_ENABLED );
EnableMenuItem( hmenu, IDM_LIMIT_300, MF_ENABLED );
EnableMenuItem( hmenu, IDM_LIMIT_NONE, MF_ENABLED );
CheckMenuItem( hmenu, IDM_LIMIT_10, 10 == App.Limit() ? MF_CHECKED : MF_UNCHECKED );
CheckMenuItem( hmenu, IDM_LIMIT_300, 300 == App.Limit() ? MF_CHECKED : MF_UNCHECKED );
CheckMenuItem( hmenu, IDM_LIMIT_NONE, 0 == App.Limit() ? MF_CHECKED : MF_UNCHECKED );
EnableMenuItem( hmenu, IDM_FIRSTROWS_5, MF_ENABLED );
EnableMenuItem( hmenu, IDM_FIRSTROWS_15, MF_ENABLED );
EnableMenuItem( hmenu, IDM_FIRSTROWS_NONE, MF_ENABLED );
CheckMenuItem( hmenu, IDM_FIRSTROWS_5, 5 == App.FirstRows() ? MF_CHECKED : MF_UNCHECKED );
CheckMenuItem( hmenu, IDM_FIRSTROWS_15, 15 == App.FirstRows() ? MF_CHECKED : MF_UNCHECKED );
CheckMenuItem( hmenu, IDM_FIRSTROWS_NONE, 0 == App.FirstRows() ? MF_CHECKED : MF_UNCHECKED );
EnableMenuItem(hmenu,IDM_CATALOG_STATUS,MF_ENABLED);
EnableMenuItem(hmenu,IDM_MASTER_MERGE,MF_ENABLED);
if ( 0 != _hwndList && _hwndList == GetFocus() )
{
if (0 != _pSearch && _pSearch->IsSelected())
{
EnableMenuItem( hmenu, IDM_BROWSE, MF_ENABLED );
EnableMenuItem( hmenu, IDM_EDITCOPY, MF_ENABLED );
}
}
if ( 0 != _pSearch && 0 != _pSearch->RowCount() )
EnableMenuItem( hmenu, IDM_EDITCOPYALL, MF_ENABLED );
return 0;
} //wmInitMenu
LRESULT CSearchControl::wmMeasureItem(
WPARAM wParam,
LPARAM lParam)
{
MEASUREITEMSTRUCT* lpmis = (MEASUREITEMSTRUCT*) lParam;
if (lpmis->CtlType == odtListView)
lpmis->itemHeight = _view.GetLineHeight();
return 0;
} //wmMeasureItem
void SStatusDlg::SetCaption()
{
CResString str( IDS_STATUS_CAPTION );
WCHAR awc[ MAX_PATH + 100 ];
WCHAR *pwcCat = _CatalogOrNull();
WCHAR *pwcScope = _Scope();
WCHAR *pwcMachine = _Machine();
WCHAR awcM[ SRCH_COMPUTERNAME_LENGTH + 2 ];
if ( L'.' == *pwcMachine )
awcM[0] = 0;
else
{
awcM[0] = ' ';
wcscpy( awcM+1, pwcMachine );
}
wsprintf( awc, str.Get(), awcM, pwcCat ? pwcCat : pwcScope );
SetWindowText( _hdlg, awc );
} //SetCaption
const DWORD ALL_CI_MERGE = ( CI_STATE_SHADOW_MERGE |
CI_STATE_ANNEALING_MERGE |
CI_STATE_MASTER_MERGE |
CI_STATE_MASTER_MERGE_PAUSED );
void SStatusDlg::Update()
{
CI_STATE state;
RtlZeroMemory( &state, sizeof state );
state.cbStruct = sizeof state;
SCODE sc = CIState( _CatalogOrNull(),
_Machine(),
& state );
if ( SUCCEEDED( sc ) )
{
SetDlgItemInt( _hdlg, ID_STAT_FTF, state.cDocuments, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_SECQ, state.cSecQDocuments, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_FF, state.cFilteredDocuments, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_FTE, state.cFreshTest, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_WL, state.cWordList, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_PI, state.cPersistentIndex, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_KEYS, state.cUniqueKeys, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_FILES, state.cTotalDocuments, FALSE );
SetDlgItemInt( _hdlg, ID_STAT_Q, state.cQueries, FALSE );
if ( 0 != ( state.eState & CI_STATE_SCANNING ) )
{
WCHAR awcTmp[50];
swprintf( awcTmp, L"%ws: %d", App.GetYes(), state.cPendingScans );
SetDlgItemText( _hdlg, ID_STAT_SCANNING, awcTmp );
}
else
{
SetDlgItemText( _hdlg, ID_STAT_SCANNING, App.GetNo() );
}
unsigned idStatus = IDS_CI_STATE_OK;
if ( 0 != ( state.eState & CI_STATE_RECOVERING ) )
idStatus = IDS_CI_STATE_RECOVER;
else if ( 0 != ( state.eState & CI_STATE_HIGH_IO ) )
idStatus = IDS_CI_STATE_HIIO;
else if ( 0 != ( state.eState & CI_STATE_LOW_MEMORY ) )
idStatus = IDS_CI_STATE_LOMEM;
else if ( 0 != ( state.eState & CI_STATE_BATTERY_POWER ) )
idStatus = IDS_CI_STATE_BATTERY;
else if ( 0 != ( state.eState & CI_STATE_READ_ONLY ) )
idStatus = IDS_CI_STATE_READ_ONLY;
else if ( 0 != ( state.eState & CI_STATE_USER_ACTIVE ) )
idStatus = IDS_CI_STATE_USER_ACTIVE;
else if ( 0 != ( state.eState & CI_STATE_STARTING ) )
idStatus = IDS_CI_STATE_STARTING;
else if ( 0 != ( state.eState & CI_STATE_READING_USNS ) )
idStatus = IDS_CI_STATE_READING_USNS;
{
CResString str( idStatus );
SetDlgItemText( _hdlg, ID_STAT_STATUS, str.Get() );
}
if ( 0 != ( state.eState & ALL_CI_MERGE ) )
{
unsigned idStr;
if ( state.eState & CI_STATE_SHADOW_MERGE )
idStr = IDS_MERGE_SHADOW;
else if ( state.eState & CI_STATE_ANNEALING_MERGE )
idStr = IDS_MERGE_ANNEALING;
else if ( state.eState & CI_STATE_MASTER_MERGE )
idStr = IDS_MERGE_MASTER;
else
idStr = IDS_MERGE_MASTER_PAUSED;
CResString str( idStr );
WCHAR awc[ cwcBufSize ];
swprintf( awc,
L"%ws %d%%",
str.Get(),
state.dwMergeProgress );
SetDlgItemText( _hdlg, ID_STAT_MT, awc );
}
else
{
SetDlgItemText( _hdlg, ID_STAT_MT, App.GetNo() );
}
}
else
{
WCHAR awcTmp[80];
swprintf( awcTmp, L"0x%x", sc );
//FormatSrchError( sc, awcTmp, App.GetLocale() );
SetDlgItemText( _hdlg, ID_STAT_STATUS, awcTmp );
SetDlgItemText( _hdlg, ID_STAT_FTF, L"" );
SetDlgItemText( _hdlg, ID_STAT_SECQ, L"" );
SetDlgItemText( _hdlg, ID_STAT_FF, L"" );
SetDlgItemText( _hdlg, ID_STAT_FTE, L"" );
SetDlgItemText( _hdlg, ID_STAT_WL, L"" );
SetDlgItemText( _hdlg, ID_STAT_PI, L"" );
SetDlgItemText( _hdlg, ID_STAT_KEYS, L"" );
SetDlgItemText( _hdlg, ID_STAT_FILES, L"" );
SetDlgItemText( _hdlg, ID_STAT_Q, L"" );
SetDlgItemText( _hdlg, ID_STAT_SCANNING, L"" );
SetDlgItemText( _hdlg, ID_STAT_MT, L"" );
}
} //Update
INT_PTR WINAPI StatusDlgProc(
HWND hdlg,
UINT msg,
WPARAM wParam,
LPARAM lParam )
{
BOOL fRet = FALSE;
SStatusDlg * pstat = (SStatusDlg *) GetWindowLongPtr( hdlg, DWLP_USER );
switch( msg )
{
case WM_INITDIALOG :
{
CSearchControl &ctrl = * (CSearchControl *) lParam;
pstat = new SStatusDlg( ctrl, hdlg );
SetWindowLongPtr( hdlg, DWLP_USER, (LONG_PTR) pstat );
fRet = TRUE;
SetTimer( hdlg, 2, 1000, 0);
int left,top,right,bottom;
if ( LoadWindowRect( &left,
&top,
&right,
&bottom,
CISEARCH_REG_STATUSPOSITION ) )
{
RECT rc;
GetWindowRect( hdlg,(LPRECT) &rc );
MoveWindow( hdlg,
left,
top,
rc.right - rc.left,
rc.bottom - rc.top,
FALSE );
}
pstat->SetCaption();
pstat->Update();
break;
}
case WM_ACTIVATE :
{
if ( 0 == wParam )
App.GetCurrentDialog() = 0;
else
App.GetCurrentDialog() = hdlg;
break;
}
case WM_TIMER :
{
if ( ! IsIconic( App.AppWindow() ) )
pstat->Update();
break;
}
case WM_DESTROY :
{
KillTimer( hdlg, 2 );
App.GetCurrentDialog() = 0;
SaveWindowRect( hdlg, CISEARCH_REG_STATUSPOSITION );
SetWindowLongPtr( hdlg, DWLP_USER, 0 );
delete pstat;
break;
}
case WM_COMMAND :
{
UINT uiID = MyWmCommandID( wParam, lParam );
switch( uiID )
{
case IDCANCEL :
{
DestroyWindow( hdlg );
fRet = TRUE;
break;
}
}
break;
}
}
return fRet;
} //StatusDlgProc