windows-nt/Source/XPSP1/NT/printscan/ui/printui/driverdt.cxx
2020-09-26 16:20:57 +08:00

564 lines
13 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 1997 - 1998
All rights reserved.
Module Name:
driverdt.cxx
Abstract:
Driver details dialog
Author:
Steve Kiraly (SteveKi) 23-Jan-1997
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "driverif.hxx"
#include "driverlv.hxx"
#include "driverdt.hxx"
/********************************************************************
Server Drivers Details Dialog.
********************************************************************/
TDriverDetails::
TDriverDetails(
IN HWND hwnd,
IN TDriverInfo *pDriverInfo
) : _hWnd( hwnd ),
_bValid( TRUE ),
_pDriverInfo( pDriverInfo ),
_hwndLV( NULL ),
_ColumnSortState( kMaxColumns ),
_uCurrentColumn( 0 )
{
}
TDriverDetails::
~TDriverDetails(
VOID
)
{
}
BOOL
TDriverDetails::
bValid(
VOID
)
{
return _bValid;
}
BOOL
TDriverDetails::
bDoModal(
VOID
)
{
BOOL bReturn = FALSE;
UINT iMsg = 0;
if( _pDriverInfo->vGetInfoState() == TDriverInfo::kInstalled )
{
bReturn = (BOOL)DialogBoxParam( ghInst,
MAKEINTRESOURCE( DLG_DRIVER_DETAILS ),
_hWnd,
MGenericDialog::SetupDlgProc,
(LPARAM)this );
}
else if( _pDriverInfo->vGetInfoState() == TDriverInfo::kAdd )
{
iMsg = IDS_DRIVER_ADD_NEEDS_APPLY;
}
else if( _pDriverInfo->vGetInfoState() == TDriverInfo::kUpdate )
{
iMsg = IDS_DRIVER_UPDATE_NEEDS_APPLY;
}
if( iMsg )
{
bReturn = iMessage( _hWnd,
IDS_DRIVER_DETAILS_TITLE,
iMsg,
MB_OK|MB_ICONSTOP,
kMsgNone,
NULL );
}
return bReturn;
}
BOOL
TDriverDetails::
bSetUI(
VOID
)
{
SPLASSERT( _pDriverInfo );
//
// Get handle to the driver file list view.
//
_hwndLV = GetDlgItem( _hDlg, IDC_DRIVER_FILE_LIST_VIEW );
TStatusB bStatus;
TString strString;
LPCTSTR pszFile;
LPCTSTR pszPath;
LPCTSTR pszExt;
TCHAR szScratch[MAX_PATH];
TString strTemp;
//
// Build the list view header.
//
bStatus DBGCHK = bBuildListViewHeader();
//
// Save a flag that indicates this is a win9x printer driver.
//
bStatus DBGCHK = strTemp.bLoadString( ghInst, IDS_ENVIRONMENT_WIN95 );
BOOL bIsWindows9xDriver = !_tcsicmp( _pDriverInfo->strEnv(), strTemp );
//
// Set the edit controls.
//
bStatus DBGCHK = bSetEditText( _hDlg, IDC_DRIVER_DETAIL_NAME, _pDriverInfo->strName() );
bStatus DBGCHK = bSetEditText( _hDlg, IDC_DRIVER_VERSION, _pDriverInfo->strVersion() );
bStatus DBGCHK = bSetEditText( _hDlg, IDC_DRIVER_ENVIRONMENT, _pDriverInfo->strEnvironment() );
bStatus DBGCHK = bSetEditText( _hDlg, IDC_DRIVER_LANGUAGE_MONITOR, _pDriverInfo->strMonitorName() );
bStatus DBGCHK = bSetEditText( _hDlg, IDC_DRIVER_DEFAULT_DATA_TYPE, _pDriverInfo->strDefaultDataType() );
bStatus DBGCHK = bSplitPath( szScratch, NULL, &pszPath, NULL, _pDriverInfo->strDriverPath() );
bStatus DBGCHK = bSetEditText( _hDlg, IDC_DRIVER_PATH, pszPath );
UINT uCount = 0;
bStatus DBGCHK = bSplitPath( szScratch, &pszFile, NULL, NULL, _pDriverInfo->strHelpFile() );
bStatus DBGCHK = bAddListViewItem( IDS_DRIVER_HELP_FILE, pszFile, &uCount );
bStatus DBGCHK = bSplitPath( szScratch, &pszFile, NULL, NULL, _pDriverInfo->strConfigFile() );
bStatus DBGCHK = bAddListViewItem( IDS_DRIVER_CONFIG_FILE, pszFile, &uCount );
bStatus DBGCHK = bSplitPath( szScratch, &pszFile, NULL, NULL, _pDriverInfo->strDataFile() );
bStatus DBGCHK = bAddListViewItem( IDS_DRIVER_DATA_FILE, pszFile, &uCount );
bStatus DBGCHK = bSplitPath( szScratch, &pszFile, NULL, NULL, _pDriverInfo->strDriverPath() );
bStatus DBGCHK = bAddListViewItem( IDS_DRIVER_PATH, pszFile, &uCount );
for( LPCTSTR psz = _pDriverInfo->strDependentFiles(); psz && *psz; psz += _tcslen( psz ) + 1 )
{
bStatus DBGCHK = bSplitPath( szScratch, &pszFile, NULL, &pszExt, psz );
if( bIsWindows9xDriver && pszExt && ( !_tcsicmp( pszExt, TEXT("ICM" ) ) || !_tcsicmp( pszExt, TEXT("ICC" ) ) ) )
{
bStatus DBGCHK = strTemp.bFormat( TEXT("%s\\%s"), TEXT("Color"), pszFile );
}
else
{
bStatus DBGCHK = strTemp.bUpdate( pszFile );
}
bStatus DBGCHK = bAddListViewItem( IDS_DRIVER_DEPENDENT_FILE, strTemp, &uCount );
}
//
// Default is the properties disabled, until an item is selected.
//
vEnableCtl( _hDlg, IDC_DRIVER_PROPERTIES, FALSE );
//
// Select the first item in the list view.
//
ListView_SetItemState( _hwndLV, 0, LVIS_SELECTED | LVIS_FOCUSED, 0x000F );
ListView_EnsureVisible( _hwndLV, 0, FALSE );
return TRUE;
}
BOOL
TDriverDetails::
bBuildListViewHeader(
VOID
)
{
//
// Initialize the LV_COLUMN structure.
//
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = kDefaultHeaderWidth;
//
// Calculate the header column width.
//
RECT rc;
if( GetClientRect( _hwndLV, &rc ))
{
lvc.cx = rc.right / kHeaderMax;
}
//
// Set the column header text.
//
TStatusB bStatus;
bStatus DBGNOCHK = TRUE;
TString strHeader;
for( INT iCol = 0; iCol < kHeaderMax; ++iCol )
{
bStatus DBGCHK = strHeader.bLoadString( ghInst, IDS_DRIVER_FILE_HEAD_NAME + iCol );
lvc.pszText = const_cast<LPTSTR>( static_cast<LPCTSTR>( strHeader ) );
lvc.iSubItem = iCol;
if( ListView_InsertColumn( _hwndLV, iCol, &lvc ) == -1 )
{
DBGMSG( DBG_WARN, ( "DriverFileLV.bSetUI: LV_Insert failed %d\n", GetLastError( )));
bStatus DBGCHK = FALSE;
}
}
//
// Enable full row selection.
//
if( bStatus )
{
LRESULT dwExStyle = SendMessage( _hwndLV, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0 );
SendMessage( _hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwExStyle | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP );
}
return bStatus;
}
BOOL
TDriverDetails::
bAddListViewItem(
IN UINT uDescription,
IN LPCTSTR pszFileName,
IN UINT *pcItems
)
{
//
// All aguments must be valid.
//
if( !uDescription || !pszFileName || !*pszFileName || !pcItems )
{
return TRUE;
}
TStatusB bStatus;
TString strDescription;
//
// Load the description resource string.
//
bStatus DBGCHK = strDescription.bLoadString( ghInst, uDescription );
//
// Allocate the detail data.
//
DetailData *pDetailData = new DetailData;
if( pDetailData )
{
DBGMSG( DBG_TRACE, ( "New Item %x\n", pDetailData ) );
bStatus DBGCHK = pDetailData->strDescription.bUpdate( strDescription );
bStatus DBGCHK = pDetailData->strFileName.bUpdate( pszFileName );
}
//
// Add information to the listview.
//
LV_ITEM lvi = { 0 };
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = *pcItems;
lvi.pszText = const_cast<LPTSTR>( static_cast<LPCTSTR>( strDescription ) );
lvi.lParam = (LPARAM)pDetailData;
ListView_InsertItem( _hwndLV, &lvi );
ListView_SetItemText( _hwndLV, *pcItems, 1, const_cast<LPTSTR>( pszFileName ) );
*pcItems = *pcItems + 1;
return TRUE;
}
BOOL
TDriverDetails::
bHandleProperties(
VOID
)
{
TStatusB bStatus;
bStatus DBGNOCHK = FALSE;
//
// Get the selected item.
//
INT iItem = ListView_GetNextItem( _hwndLV, -1, LVNI_SELECTED );
if( iItem != -1 )
{
TCHAR szFileName[MAX_PATH];
//
// Retrieve the selected item text.
//
ListView_GetItemText( _hwndLV, iItem, 1, szFileName, COUNTOF( szFileName ) );
//
// Build the fully qualified file path.
//
TString strFullName;
bStatus DBGCHK = bGetEditText( _hDlg, IDC_DRIVER_PATH, strFullName );
bStatus DBGCHK = strFullName.bCat( gszWack );
bStatus DBGCHK = strFullName.bCat( szFileName );
//
// Show the shell file object properties.
//
TLibrary Lib( gszShellDllName );
if( VALID_OBJ( Lib ) )
{
typedef BOOL ( WINAPI *pfSHObjectProperties)(HWND hwndOwner, DWORD dwType, LPCTSTR lpObject, LPCTSTR lpPage);
pfSHObjectProperties pSHObjectProperties = reinterpret_cast<pfSHObjectProperties>( Lib.pfnGetProc( 178 ) );
if( pSHObjectProperties )
{
pSHObjectProperties( _hDlg, 2, strFullName, 0 );
}
}
bStatus DBGNOCHK = TRUE;
}
return bStatus;
}
BOOL
TDriverDetails::
bSortListView(
IN LPARAM lParam
)
{
//
// Get the column number.
//
_uCurrentColumn = ((NM_LISTVIEW *)lParam)->iSubItem;
//
// Sort the list view items.
//
TStatusB bStatus;
bStatus DBGCHK = ListView_SortItems( _hwndLV, iCompareProc, (LPARAM)this );
//
// Toggle the specified column sort state.
//
_ColumnSortState.bToggle( _uCurrentColumn );
return bStatus;
}
VOID
TDriverDetails::
vDeleteItems(
VOID
)
{
//
// Delete all the items. This is done one at a time
// inorder to see delete item notifications.
//
for( ; ; )
{
if( !ListView_DeleteItem( _hwndLV, 0 ) )
break;
}
}
INT
CALLBACK
TDriverDetails::
iCompareProc(
IN LPARAM lParam1,
IN LPARAM lParam2,
IN LPARAM RefData
)
{
TDriverDetails *pDetails = reinterpret_cast<TDriverDetails *>( RefData );
DetailData *pDetail1 = reinterpret_cast<DetailData *>( lParam1 );
DetailData *pDetail2 = reinterpret_cast<DetailData *>( lParam2 );
LPCTSTR psz1 = NULL;
LPCTSTR psz2 = NULL;
BOOL bStatus = TRUE;
INT iResult = 0;
if( pDetails && pDetail1 && pDetail2 )
{
switch ( pDetails->_uCurrentColumn )
{
case 0:
psz1 = pDetail1->strDescription;
psz2 = pDetail2->strDescription;
break;
case 1:
psz1 = pDetail1->strFileName;
psz2 = pDetail2->strFileName;
break;
default:
bStatus = FALSE;
break;
}
if( bStatus )
{
if( pDetails->_ColumnSortState.bRead( pDetails->_uCurrentColumn ) )
iResult = _tcsicmp( psz1, psz2 );
else
iResult = _tcsicmp( psz2, psz1 );
}
}
return iResult;
}
BOOL
TDriverDetails::
bDeleteDetailData(
IN LPARAM lParam
)
{
NM_LISTVIEW *pnmv = (NM_LISTVIEW *) lParam;
LV_ITEM lvItem = { 0 };
lvItem.mask = LVIF_PARAM;
lvItem.iItem = pnmv->iItem;
BOOL bStatus;
bStatus = ListView_GetItem( _hwndLV, &lvItem );
if( bStatus )
{
DetailData *pDetailData = reinterpret_cast<DetailData *>( lvItem.lParam );
DBGMSG( DBG_TRACE, ( "Delete Item %x\n", pDetailData ) );
delete pDetailData;
}
return bStatus;
}
BOOL
TDriverDetails::
bHandleItemSelected(
VOID
) const
{
BOOL bState = ListView_GetNextItem( _hwndLV, -1, LVNI_SELECTED | LVNI_FOCUSED ) != -1 ? TRUE : FALSE;
vEnableCtl( _hDlg, IDC_DRIVER_PROPERTIES, bState );
return TRUE;
}
BOOL
TDriverDetails::
bHandleMessage(
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
BOOL bStatus = TRUE;
switch (uMsg)
{
case WM_INITDIALOG:
bSetUI();
break;
//
// Handle help and context help.
//
case WM_HELP:
case WM_CONTEXTMENU:
bStatus = PrintUIHelp( uMsg, _hDlg, wParam, lParam );
break;
case WM_COMMAND:
switch ( LOWORD( wParam ) )
{
case IDOK:
case IDCANCEL:
vDeleteItems();
EndDialog( _hDlg, LOWORD( wParam ) );
break;
case IDC_DRIVER_PROPERTIES:
bStatus = bHandleProperties();
break;
default:
bStatus = FALSE;
break;
}
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch( pnmh->code )
{
case NM_CLICK:
bStatus = bHandleItemSelected();
break;
case NM_DBLCLK:
bStatus = bHandleProperties();
break;
case LVN_COLUMNCLICK:
bStatus = bSortListView( lParam );
break;
case LVN_DELETEITEM:
bStatus = bDeleteDetailData( lParam );
break;
case LVN_ITEMCHANGED:
bStatus = bHandleItemSelected();
break;
default:
bStatus = FALSE;
break;
}
}
break;
default:
bStatus = FALSE;
break;
}
return bStatus;
}