1069 lines
24 KiB
C++
1069 lines
24 KiB
C++
|
//Copyright (c) 1998 - 1999 Microsoft Corporation
|
||
|
#include "stdafx.h"
|
||
|
#include <prsht.h>
|
||
|
#include "todlg.h"
|
||
|
#include "resource.h"
|
||
|
|
||
|
TOKTABLE tokday[ 4 ] = {
|
||
|
{ NULL , IDS_D },
|
||
|
{ NULL , IDS_DAY },
|
||
|
{ NULL , IDS_DAYS },
|
||
|
{ NULL , ( DWORD )-1 }
|
||
|
};
|
||
|
|
||
|
TOKTABLE tokhour[ 6 ] = {
|
||
|
{ NULL , IDS_H },
|
||
|
{ NULL , IDS_HR },
|
||
|
{ NULL , IDS_HRS },
|
||
|
{ NULL , IDS_HOUR },
|
||
|
{ NULL , IDS_HOURS },
|
||
|
{ NULL , ( DWORD )-1 }
|
||
|
};
|
||
|
|
||
|
TOKTABLE tokmin[ 5 ] = {
|
||
|
{ NULL , IDS_M },
|
||
|
{ NULL , IDS_MIN },
|
||
|
{ NULL , IDS_MINUTE },
|
||
|
{ NULL , IDS_MINUTES },
|
||
|
{ NULL , ( DWORD )-1 }
|
||
|
};
|
||
|
|
||
|
|
||
|
TCHAR * GetNextToken( TCHAR *pszString , TCHAR *tchToken );
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// CTimeOutDlg::ctor
|
||
|
//-------------------------------------------------------------------------------
|
||
|
CTimeOutDlg::CTimeOutDlg( )
|
||
|
{
|
||
|
ZeroMemory( &m_cbxst , sizeof( CBXSTATE ) * 3 );
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::InitControl( HWND hCtrl )
|
||
|
{
|
||
|
int i = GetCBXSTATEindex( hCtrl );
|
||
|
|
||
|
m_cbxst[ i ].icbxSel = ( int )SendMessage( hCtrl , CB_GETCURSEL , 0 , 0 );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// release the parent reference
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::ReleaseAbbreviates( )
|
||
|
{
|
||
|
xxxUnLoadAbbreviate( &tokday[0] );
|
||
|
|
||
|
xxxUnLoadAbbreviate( &tokhour[0] );
|
||
|
|
||
|
xxxUnLoadAbbreviate( &tokmin[0] );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// OnCommand
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::OnCommand( WORD wNotifyCode , WORD wID , HWND hwndCtl , PBOOL pfPersisted )
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER( wID );
|
||
|
|
||
|
switch( wNotifyCode )
|
||
|
{
|
||
|
|
||
|
case CBN_EDITCHANGE:
|
||
|
|
||
|
if( OnCBEditChange( hwndCtl ) )
|
||
|
{
|
||
|
*pfPersisted = FALSE;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case CBN_SELCHANGE:
|
||
|
|
||
|
if( OnCBNSELCHANGE( hwndCtl ) )
|
||
|
{
|
||
|
*pfPersisted = FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//case BN_CLICKED:
|
||
|
|
||
|
break;
|
||
|
|
||
|
case CBN_DROPDOWN: // FALLTHROUGH
|
||
|
|
||
|
case CBN_KILLFOCUS:
|
||
|
|
||
|
OnCBDropDown( hwndCtl );
|
||
|
|
||
|
break;
|
||
|
|
||
|
//return FALSE;
|
||
|
/*
|
||
|
case ALN_APPLY:
|
||
|
|
||
|
SendMessage( GetParent( hwndCtl ) , PSM_CANCELTOCLOSE , 0 , 0 );
|
||
|
|
||
|
return FALSE;
|
||
|
*/
|
||
|
|
||
|
}
|
||
|
|
||
|
// m_bPersisted = FALSE;
|
||
|
/*
|
||
|
if( bChange )
|
||
|
{
|
||
|
SendMessage( GetParent( GetParent( hwndCtl ) ) , PSM_CHANGED , ( WPARAM )GetParent( hwndCtl ) , 0 );
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Update the entry if it has been modified by user
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::OnCBDropDown( HWND hCombo )
|
||
|
{
|
||
|
TCHAR tchBuffer[ 80 ];
|
||
|
|
||
|
ULONG ulTime;
|
||
|
|
||
|
int i = GetCBXSTATEindex( hCombo );
|
||
|
|
||
|
if( i < 0 )
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if( m_cbxst[ i ].bEdit )
|
||
|
{
|
||
|
GetWindowText( hCombo , tchBuffer , SIZE_OF_BUFFER( tchBuffer ) );
|
||
|
|
||
|
if( ParseDurationEntry( tchBuffer , &ulTime ) == E_SUCCESS )
|
||
|
{
|
||
|
InsertSortedAndSetCurSel( hCombo , ulTime );
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Use this flag to distinguish between hand entry or listbox selection
|
||
|
// setting it to true implies that the use has edit the cbx via typing
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::OnCBEditChange( HWND hCombo )
|
||
|
{
|
||
|
int i = GetCBXSTATEindex( hCombo );
|
||
|
|
||
|
if( i > -1 )
|
||
|
{
|
||
|
m_cbxst[ i ].bEdit = TRUE;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Determine if user wants to enter a custom time
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::OnCBNSELCHANGE( HWND hwnd )
|
||
|
{
|
||
|
return SaveChangedSelection( hwnd );
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Saves selected item.
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::SaveChangedSelection( HWND hCombo )
|
||
|
{
|
||
|
INT_PTR idx = SendMessage( hCombo , CB_GETCURSEL , 0 , 0 );
|
||
|
|
||
|
int i = GetCBXSTATEindex( hCombo );
|
||
|
|
||
|
if( i > -1 )
|
||
|
{
|
||
|
if( m_cbxst[ i ].icbxSel != idx )
|
||
|
{
|
||
|
m_cbxst[ i ].icbxSel = ( int )idx;
|
||
|
|
||
|
m_cbxst[ i ].bEdit = FALSE;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Restore previous setting
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::RestorePreviousValue( HWND hwnd )
|
||
|
{
|
||
|
int iSel;
|
||
|
|
||
|
if( ( iSel = GetCBXSTATEindex( hwnd ) ) > -1 )
|
||
|
{
|
||
|
SendMessage( hwnd , CB_SETCURSEL , m_cbxst[ iSel ].icbxSel , 0 );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// ConvertToMinutes -- helper for CTimeOutDlg::OnNotify
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::ConvertToMinutes( HWND hwndCtl , PULONG pulMinutes )
|
||
|
{
|
||
|
TCHAR tchBuffer[ 80 ];
|
||
|
|
||
|
TCHAR tchErrTitle[ 80 ];
|
||
|
|
||
|
TCHAR tchErrMsg[ 256 ];
|
||
|
|
||
|
TCHAR tchSetting[ 80 ];
|
||
|
|
||
|
int idx = GetCBXSTATEindex( hwndCtl );
|
||
|
|
||
|
if( idx < 0 )
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
ASSERT( idx <= 2 );
|
||
|
|
||
|
int resID = -1;
|
||
|
|
||
|
if( idx == 0 )
|
||
|
{
|
||
|
resID = IDS_COMBO_CONNECTION;
|
||
|
}
|
||
|
else if( idx == 1 )
|
||
|
{
|
||
|
resID = IDS_COMBO_DISCONNECTION;
|
||
|
}
|
||
|
else if( idx == 2 )
|
||
|
{
|
||
|
resID = IDS_COMBO_IDLECONNECTION;
|
||
|
}
|
||
|
|
||
|
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , resID , tchSetting , SIZE_OF_BUFFER( tchSetting ) ) );
|
||
|
|
||
|
ULONG_PTR dw = ( ULONG_PTR )&tchSetting[ 0 ];
|
||
|
|
||
|
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_TITLE , tchErrTitle , SIZE_OF_BUFFER( tchErrTitle ) ) );
|
||
|
|
||
|
if( m_cbxst[ idx ].bEdit )
|
||
|
{
|
||
|
DBGMSG( L"Automatic %s parsing\n" , tchSetting );
|
||
|
|
||
|
if( GetWindowText( hwndCtl , tchBuffer , SIZE_OF_BUFFER( tchBuffer ) ) < 1 )
|
||
|
{
|
||
|
*pulMinutes = 0;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
LRESULT lr = ParseDurationEntry( tchBuffer , pulMinutes );
|
||
|
|
||
|
if( lr != E_SUCCESS )
|
||
|
{
|
||
|
if( lr == E_PARSE_VALUEOVERFLOW )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_TOOMANYDIGITS , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) );
|
||
|
|
||
|
FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchErrMsg , 0 , 0 , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) , ( va_list * )&dw );
|
||
|
|
||
|
MessageBox( hwndCtl , tchErrMsg , tchErrTitle , MB_OK | MB_ICONERROR );
|
||
|
|
||
|
SetFocus( hwndCtl );
|
||
|
}
|
||
|
else if( lr == E_PARSE_MISSING_DIGITS || lr == E_PARSE_INVALID )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_PARSEINVALID , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) );
|
||
|
|
||
|
FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchErrMsg , 0 , 0 , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) , ( va_list * )&dw );
|
||
|
|
||
|
MessageBox( hwndCtl , tchErrMsg , tchErrTitle , MB_OK | MB_ICONERROR );
|
||
|
|
||
|
SetFocus( hwndCtl );
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ODS( L"Getting current selection\n" );
|
||
|
|
||
|
INT_PTR iCurSel = SendMessage( hwndCtl , CB_GETCURSEL , 0 , 0 );
|
||
|
|
||
|
// See if user wants "No Timeout"
|
||
|
|
||
|
if( iCurSel == 0 )
|
||
|
{
|
||
|
*pulMinutes = 0;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
if( ( *pulMinutes = ( ULONG )SendMessage( hwndCtl , CB_GETITEMDATA , iCurSel , 0 ) ) == CB_ERR )
|
||
|
{
|
||
|
*pulMinutes = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( *pulMinutes > kMaxTimeoutMinute )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_MAXVALEXCEEDED , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) );
|
||
|
|
||
|
FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchErrMsg , 0 , 0 , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) , ( va_list * )&dw );
|
||
|
|
||
|
MessageBox( hwndCtl , tchErrMsg , tchErrTitle , MB_OK | MB_ICONERROR );
|
||
|
|
||
|
SetFocus( hwndCtl );
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
*pulMinutes *= kMilliMinute;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Lets cut to the chase and find out if this is even worth parsing
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::DoesContainDigits( LPTSTR pszString )
|
||
|
{
|
||
|
while( *pszString )
|
||
|
{
|
||
|
if( iswdigit( *pszString ) )
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
pszString++;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
LRESULT CTimeOutDlg::ParseDurationEntry( LPTSTR pszTime , PULONG pTime )
|
||
|
{
|
||
|
TCHAR tchNoTimeout[ 80 ];
|
||
|
|
||
|
LPTSTR pszTemp = pszTime;
|
||
|
|
||
|
UINT uDec = 0;
|
||
|
|
||
|
float fFrac = 0.0f;
|
||
|
|
||
|
float fT;
|
||
|
|
||
|
UINT uPos = 1;
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_NOTIMEOUT , tchNoTimeout , SIZE_OF_BUFFER( tchNoTimeout ) );
|
||
|
|
||
|
if( lstrcmpi( pszTime , tchNoTimeout ) == 0 )
|
||
|
{
|
||
|
*pTime = 0;
|
||
|
|
||
|
return E_SUCCESS;
|
||
|
}
|
||
|
|
||
|
if( !DoesContainDigits( pszTime ) )
|
||
|
{
|
||
|
return E_PARSE_MISSING_DIGITS;
|
||
|
}
|
||
|
|
||
|
while( *pszTemp )
|
||
|
{
|
||
|
if( !iswdigit( *pszTemp ) )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// check for overflow
|
||
|
|
||
|
if( uDec >= 1000000000 )
|
||
|
{
|
||
|
return E_PARSE_VALUEOVERFLOW ;
|
||
|
}
|
||
|
|
||
|
uDec *= 10;
|
||
|
|
||
|
uDec += ( *pszTemp - '0' );
|
||
|
|
||
|
pszTemp++;
|
||
|
|
||
|
}
|
||
|
|
||
|
TCHAR tchSDecimal[ 5 ];
|
||
|
|
||
|
GetLocaleInfo( LOCALE_USER_DEFAULT , LOCALE_SDECIMAL , tchSDecimal , SIZE_OF_BUFFER( tchSDecimal ) );
|
||
|
|
||
|
if( *pszTemp == *tchSDecimal )
|
||
|
{
|
||
|
pszTemp++;
|
||
|
|
||
|
while( *pszTemp )
|
||
|
{
|
||
|
if( !iswdigit( *pszTemp ) )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// check for overflow
|
||
|
|
||
|
if( uDec >= 1000000000 )
|
||
|
{
|
||
|
return E_PARSE_VALUEOVERFLOW;
|
||
|
}
|
||
|
|
||
|
uPos *= 10;
|
||
|
|
||
|
fFrac += ( float )( *pszTemp - '0' ) / ( float )uPos;
|
||
|
|
||
|
pszTemp++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// remove white space
|
||
|
|
||
|
while( *pszTemp == L' ' )
|
||
|
{
|
||
|
pszTemp++;
|
||
|
}
|
||
|
|
||
|
|
||
|
if( *pszTemp != NULL )
|
||
|
{
|
||
|
if( IsToken( pszTemp , TOKEN_DAY ) )
|
||
|
{
|
||
|
*pTime = uDec * 24 * 60;
|
||
|
|
||
|
fT = ( fFrac * 24.0f * 60.0f + 0.5f );
|
||
|
|
||
|
*pTime += ( ULONG )fT;
|
||
|
|
||
|
return E_SUCCESS;
|
||
|
}
|
||
|
else if( IsToken( pszTemp , TOKEN_HOUR ) )
|
||
|
{
|
||
|
*pTime = uDec * 60;
|
||
|
|
||
|
fT = ( fFrac * 60.0f + 0.5f );
|
||
|
|
||
|
*pTime += ( ULONG )fT;
|
||
|
|
||
|
return E_SUCCESS;
|
||
|
}
|
||
|
else if( IsToken( pszTemp , TOKEN_MINUTE ) )
|
||
|
{
|
||
|
// minutes are rounded up in the 1/10 place
|
||
|
|
||
|
fT = fFrac + 0.5f;
|
||
|
|
||
|
*pTime = uDec;
|
||
|
|
||
|
*pTime += ( ULONG )( fT );
|
||
|
|
||
|
return E_SUCCESS;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if( *pszTemp == NULL )
|
||
|
{
|
||
|
|
||
|
// if no text is defined considered the entry in hours
|
||
|
|
||
|
*pTime = uDec * 60;
|
||
|
|
||
|
fT = ( fFrac * 60.0f + 0.5f );
|
||
|
|
||
|
*pTime += ( ULONG )fT ;
|
||
|
|
||
|
return E_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
return E_PARSE_INVALID;
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Adds strings to table from resource
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::LoadAbbreviates( )
|
||
|
{
|
||
|
xxxLoadAbbreviate( &tokday[0] );
|
||
|
|
||
|
xxxLoadAbbreviate( &tokhour[0] );
|
||
|
|
||
|
xxxLoadAbbreviate( &tokmin[0] );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Take cares some repetitive work for us
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::xxxLoadAbbreviate( PTOKTABLE ptoktbl )
|
||
|
{
|
||
|
int idx;
|
||
|
|
||
|
int nSize;
|
||
|
|
||
|
TCHAR tchbuffer[ 80 ];
|
||
|
|
||
|
if( ptoktbl == NULL )
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
for( idx = 0; ptoktbl[ idx ].dwresourceid != ( DWORD )-1 ; ++idx )
|
||
|
{
|
||
|
nSize = LoadString( _Module.GetResourceInstance( ) , ptoktbl[ idx ].dwresourceid , tchbuffer , SIZE_OF_BUFFER( tchbuffer ) );
|
||
|
|
||
|
if( nSize > 0 )
|
||
|
{
|
||
|
ptoktbl[ idx ].pszAbbrv = ( TCHAR *)new TCHAR[ nSize + 1 ];
|
||
|
|
||
|
if( ptoktbl[ idx ].pszAbbrv != NULL )
|
||
|
{
|
||
|
lstrcpy( ptoktbl[ idx ].pszAbbrv , tchbuffer );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Frees up allocated resources
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::xxxUnLoadAbbreviate( PTOKTABLE ptoktbl )
|
||
|
{
|
||
|
if( ptoktbl == NULL )
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
for( int idx = 0; ptoktbl[ idx ].dwresourceid != ( DWORD )-1 ; ++idx )
|
||
|
{
|
||
|
if( ptoktbl[ idx ].pszAbbrv != NULL )
|
||
|
{
|
||
|
delete[] ptoktbl[ idx ].pszAbbrv;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// tear-off token tables
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::IsToken( LPTSTR pszString , TOKEN tok )
|
||
|
{
|
||
|
TOKTABLE *ptoktable;
|
||
|
|
||
|
if( tok == TOKEN_DAY )
|
||
|
{
|
||
|
ptoktable = &tokday[0];
|
||
|
}
|
||
|
else if( tok == TOKEN_HOUR )
|
||
|
{
|
||
|
ptoktable = &tokhour[0];
|
||
|
}
|
||
|
else if( tok == TOKEN_MINUTE )
|
||
|
{
|
||
|
ptoktable = &tokmin[0];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
for( int idx = 0 ; ptoktable[ idx ].dwresourceid != -1 ; ++idx )
|
||
|
{
|
||
|
if( lstrcmpi( pszString , ptoktable[ idx ].pszAbbrv ) == 0 )
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Converts the number minutes into a formated string
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::ConvertToDuration( ULONG ulTime , LPTSTR pszDuration )
|
||
|
{
|
||
|
ULONG_PTR dw[3];
|
||
|
|
||
|
TCHAR tchTimeUnit[ 40 ];
|
||
|
|
||
|
TCHAR tchTimeFormat[ 40 ];
|
||
|
|
||
|
TCHAR tchOutput[ 80 ];
|
||
|
|
||
|
// ASSERT( ulTime != 0 );
|
||
|
|
||
|
int iHour= ulTime / 60;
|
||
|
|
||
|
int iDays = iHour / 24;
|
||
|
|
||
|
dw[ 2 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ];
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_DOT_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) );
|
||
|
|
||
|
if( iDays != 0 )
|
||
|
{
|
||
|
int iRemainingHours = iHour % 24;
|
||
|
|
||
|
float fx = ( float )iRemainingHours / 24.0f;
|
||
|
|
||
|
iRemainingHours = ( int )( fx * 10 );
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DAYS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
|
||
|
dw[ 0 ] = iDays;
|
||
|
|
||
|
dw[ 1 ] = iRemainingHours;
|
||
|
|
||
|
if( iRemainingHours == 0 )
|
||
|
{
|
||
|
// formatted string requires two arguments
|
||
|
|
||
|
dw[ 1 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ];
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) );
|
||
|
|
||
|
if( iDays == 1 )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DAY , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
else if( iHour != 0 )
|
||
|
{
|
||
|
int iRemainingMinutes = ulTime % 60;
|
||
|
|
||
|
float fx = ( float )iRemainingMinutes / 60.0f;
|
||
|
|
||
|
iRemainingMinutes = ( int ) ( fx * 10 );
|
||
|
|
||
|
dw[ 0 ] = iHour;
|
||
|
|
||
|
dw[ 1 ] = iRemainingMinutes;
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_HOURS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
|
||
|
if( iRemainingMinutes == 0 )
|
||
|
{
|
||
|
dw[ 1 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ];
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) );
|
||
|
|
||
|
if( iHour == 1 )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_HOUR , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_MINUTES , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) );
|
||
|
|
||
|
dw[ 0 ] = ulTime ;
|
||
|
|
||
|
dw[ 1 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ];
|
||
|
|
||
|
if( ulTime > 1 )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_MINUTES , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_MINUTE , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchTimeFormat , 0 , 0 , tchOutput , SIZE_OF_BUFFER( tchOutput ) , ( va_list * )&dw );
|
||
|
|
||
|
lstrcpy( pszDuration , tchOutput );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Place entry in listbox and set as current selection
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::InsertSortedAndSetCurSel( HWND hCombo , DWORD dwMinutes )
|
||
|
{
|
||
|
// ASSERT( dwMinutes != ( DWORD )-1 );
|
||
|
|
||
|
TCHAR tchBuffer[ 80 ];
|
||
|
|
||
|
INT_PTR iCount = SendMessage( hCombo , CB_GETCOUNT , 0 , 0 );
|
||
|
|
||
|
for( INT_PTR idx = 0 ; idx < iCount ; ++idx )
|
||
|
{
|
||
|
// Don't insert an item that's already in the list
|
||
|
|
||
|
if( dwMinutes == ( DWORD )SendMessage( hCombo , CB_GETITEMDATA , idx , 0 ) )
|
||
|
{
|
||
|
SendMessage( hCombo , CB_SETCURSEL , idx , 0 ) ;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
if( dwMinutes < ( DWORD )SendMessage( hCombo , CB_GETITEMDATA , idx , 0 ) )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// hey if the value has exceeded the max timeout don't bother entering it in our list
|
||
|
|
||
|
if( dwMinutes > kMaxTimeoutMinute )
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if( ConvertToDuration ( dwMinutes , tchBuffer ) )
|
||
|
{
|
||
|
idx = SendMessage( hCombo , CB_INSERTSTRING , idx , ( LPARAM )&tchBuffer[ 0 ] );
|
||
|
|
||
|
if( idx != CB_ERR )
|
||
|
{
|
||
|
SendMessage( hCombo , CB_SETITEMDATA , idx , dwMinutes );
|
||
|
|
||
|
}
|
||
|
|
||
|
SendMessage( hCombo , CB_SETCURSEL , idx , 0 ) ;
|
||
|
}
|
||
|
|
||
|
// must call this here because CB_SETCURSEL does not send CBN_SELCHANGE
|
||
|
|
||
|
SaveChangedSelection( hCombo );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* Modified settings for a more readable time out settings
|
||
|
* added 1/25/99
|
||
|
* alhen
|
||
|
*/
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// Removing decimal entries
|
||
|
//-------------------------------------------------------------------------------
|
||
|
LRESULT CTimeOutDlg::ParseDurationEntry( LPTSTR pszTime , PULONG pTime )
|
||
|
{
|
||
|
TCHAR tchNoTimeout[ 80 ];
|
||
|
|
||
|
LPTSTR pszTemp = pszTime;
|
||
|
|
||
|
UINT uDec = 0;
|
||
|
|
||
|
BOOL bSetDay = FALSE;
|
||
|
BOOL bSetHour = FALSE;
|
||
|
BOOL bSetMin = FALSE;
|
||
|
BOOL bEOL = FALSE;
|
||
|
BOOL bHasDigit= FALSE;
|
||
|
|
||
|
*pTime = 0;
|
||
|
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_NOTIMEOUT , tchNoTimeout , SIZE_OF_BUFFER( tchNoTimeout ) );
|
||
|
|
||
|
if( lstrcmpi( pszTime , tchNoTimeout ) == 0 )
|
||
|
{
|
||
|
// *pTime = 0;
|
||
|
|
||
|
return E_SUCCESS;
|
||
|
}
|
||
|
|
||
|
while( !bEOL )
|
||
|
{
|
||
|
// remove leading white spaces
|
||
|
|
||
|
while( *pszTemp == L' ' )
|
||
|
{
|
||
|
pszTemp++;
|
||
|
}
|
||
|
|
||
|
while( *pszTemp )
|
||
|
{
|
||
|
if( !iswdigit( *pszTemp ) )
|
||
|
{
|
||
|
if( !bHasDigit )
|
||
|
{
|
||
|
return E_PARSE_MISSING_DIGITS;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// check for overflow
|
||
|
|
||
|
if( uDec >= 1000000000 )
|
||
|
{
|
||
|
return E_PARSE_VALUEOVERFLOW ;
|
||
|
}
|
||
|
|
||
|
uDec *= 10;
|
||
|
|
||
|
uDec += ( *pszTemp - '0' );
|
||
|
|
||
|
if( !bHasDigit )
|
||
|
{
|
||
|
bHasDigit = TRUE;
|
||
|
}
|
||
|
|
||
|
pszTemp++;
|
||
|
}
|
||
|
|
||
|
// remove intermediate white spaces
|
||
|
|
||
|
while( *pszTemp == L' ' )
|
||
|
{
|
||
|
pszTemp++;
|
||
|
}
|
||
|
|
||
|
if( *pszTemp != NULL )
|
||
|
{
|
||
|
// Get next token
|
||
|
|
||
|
TCHAR tchToken[ 80 ];
|
||
|
|
||
|
pszTemp = GetNextToken( pszTemp , tchToken );
|
||
|
|
||
|
|
||
|
if( IsToken( tchToken , TOKEN_DAY ) )
|
||
|
{
|
||
|
if( !bSetDay )
|
||
|
{
|
||
|
*pTime += uDec * 1440;
|
||
|
|
||
|
bSetDay = TRUE;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if( IsToken( tchToken , TOKEN_HOUR ) )
|
||
|
{
|
||
|
if( !bSetHour )
|
||
|
{
|
||
|
*pTime += uDec * 60;
|
||
|
|
||
|
bSetHour = TRUE;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if( IsToken( tchToken , TOKEN_MINUTE ) )
|
||
|
{
|
||
|
if( !bSetMin )
|
||
|
{
|
||
|
*pTime += uDec;
|
||
|
|
||
|
bSetMin = TRUE;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return E_PARSE_INVALID;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if( !bSetHour )
|
||
|
{
|
||
|
*pTime += uDec * 60;
|
||
|
}
|
||
|
|
||
|
bEOL = TRUE;
|
||
|
}
|
||
|
|
||
|
uDec = 0;
|
||
|
|
||
|
bHasDigit = FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
return E_SUCCESS;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
// replacing older api
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::ConvertToDuration( ULONG ulTime , LPTSTR pszDuration )
|
||
|
{
|
||
|
// TCHAR dw[] = L"dhm";
|
||
|
|
||
|
TCHAR tchTimeUnit[ 40 ];
|
||
|
|
||
|
TCHAR tchTimeFormat[ 40 ];
|
||
|
|
||
|
TCHAR tchOutput[ 80 ];
|
||
|
|
||
|
ASSERT( ulTime != 0 );
|
||
|
|
||
|
int iHour = ( ulTime / 60 );
|
||
|
|
||
|
int iDays = iHour / 24;
|
||
|
|
||
|
int iMinute = ulTime % 60;
|
||
|
|
||
|
// Resolve format
|
||
|
|
||
|
tchOutput[0] = 0;
|
||
|
|
||
|
|
||
|
if( iDays > 0 )
|
||
|
{
|
||
|
if( iDays == 1 )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DAY , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_DAYS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
|
||
|
iHour = iHour % 24;
|
||
|
|
||
|
wsprintf( tchTimeFormat , L"%d %s", iDays , tchTimeUnit );
|
||
|
|
||
|
lstrcat( tchOutput , tchTimeFormat );
|
||
|
|
||
|
lstrcat( tchOutput , L" " );
|
||
|
}
|
||
|
|
||
|
if( iHour > 0 )
|
||
|
{
|
||
|
if( iHour == 1 )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_HOUR , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_HOURS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
|
||
|
wsprintf( tchTimeFormat , L"%d %s", iHour , tchTimeUnit );
|
||
|
|
||
|
lstrcat( tchOutput , tchTimeFormat );
|
||
|
|
||
|
lstrcat( tchOutput , L" " );
|
||
|
}
|
||
|
|
||
|
if( iMinute > 0 )
|
||
|
{
|
||
|
if( iMinute == 1 )
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_MINUTE , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LoadString( _Module.GetResourceInstance( ) , IDS_MINUTES , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) );
|
||
|
}
|
||
|
|
||
|
wsprintf( tchTimeFormat , L"%d %s", iMinute , tchTimeUnit );
|
||
|
|
||
|
lstrcat( tchOutput , tchTimeFormat );
|
||
|
|
||
|
lstrcat( tchOutput , L" " );
|
||
|
}
|
||
|
|
||
|
lstrcpy( pszDuration , tchOutput );
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
BOOL CTimeOutDlg::DoesContainDigits( LPTSTR pszString )
|
||
|
{
|
||
|
while( *pszString )
|
||
|
{
|
||
|
if( *pszString != L' ')
|
||
|
{
|
||
|
if( iswdigit( *pszString ) )
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
pszString++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------
|
||
|
TCHAR * GetNextToken( TCHAR *pszString , TCHAR *tchToken )
|
||
|
{
|
||
|
while( *pszString )
|
||
|
{
|
||
|
if( IsCharAlpha( *pszString ) )
|
||
|
{
|
||
|
*tchToken = *pszString;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
tchToken++;
|
||
|
|
||
|
pszString++;
|
||
|
}
|
||
|
|
||
|
*tchToken = '\0';
|
||
|
|
||
|
return pszString;
|
||
|
}
|