193 lines
5 KiB
C++
193 lines
5 KiB
C++
/****************************************************************************\
|
|
*
|
|
* hint.cpp
|
|
*
|
|
* Created: William Taylor (wtaylor) 01/22/01
|
|
*
|
|
* MS Ratings Hint Handling Class
|
|
*
|
|
\****************************************************************************/
|
|
|
|
#include "msrating.h"
|
|
#include "mslubase.h"
|
|
#include "hint.h" // CHint
|
|
#include "basedlg.h" // CCommonDialogRoutines
|
|
#include "debug.h" // TraceMsg()
|
|
|
|
const int cchHintLength_c = 127;
|
|
const TCHAR tchAmpersand_c[] = "&";
|
|
const TCHAR tchAmpersandReplacement_c[] = "&&";
|
|
|
|
// Default CHint Constructor
|
|
CHint::CHint()
|
|
{
|
|
CHint( NULL, 0 );
|
|
}
|
|
|
|
// CHint Constructor with Dialog Window Handle and Hint Control Id.
|
|
CHint::CHint( HWND p_hWnd, int p_iId )
|
|
{
|
|
m_hWnd = p_hWnd;
|
|
m_iId = p_iId;
|
|
}
|
|
|
|
// Display the Hint Text on the Dialog Control.
|
|
void CHint::DisplayHint( void )
|
|
{
|
|
HWND hwndControl = ::GetDlgItem( m_hWnd, m_iId );
|
|
|
|
if ( hwndControl != NULL )
|
|
{
|
|
CString strHint;
|
|
|
|
RetrieveHint( strHint );
|
|
|
|
// Avoid display of "_" (accelerator) by replacing single "&" with "&&".
|
|
strHint.Replace( tchAmpersand_c, tchAmpersandReplacement_c );
|
|
|
|
::SetWindowText( hwndControl, strHint );
|
|
}
|
|
}
|
|
|
|
// Initialize the Hint Dialog Control by limiting the Number of Hint Characters.
|
|
void CHint::InitHint( void )
|
|
{
|
|
HWND hwndControl = ::GetDlgItem( m_hWnd, m_iId );
|
|
|
|
if ( hwndControl != NULL )
|
|
{
|
|
::SendMessage( hwndControl, EM_SETLIMITTEXT, (WPARAM) cchHintLength_c, (LPARAM) 0);
|
|
}
|
|
}
|
|
|
|
// Check for a Blank Hint entered on the Dialog Control.
|
|
// Also, give the user the option to enter a non-blank hint.
|
|
bool CHint::VerifyHint( void )
|
|
{
|
|
bool fVerified = true; // Default to true so we don't halt user if hint save fails.
|
|
CString strHint;
|
|
|
|
GetHint( strHint );
|
|
|
|
if ( strHint.IsEmpty() )
|
|
{
|
|
CString strHintRecommended;
|
|
CString strCaption;
|
|
|
|
strHintRecommended.LoadString( IDS_HINT_RECOMMENDED );
|
|
strCaption.LoadString( IDS_GENERIC );
|
|
|
|
if ( ::MessageBox( m_hWnd, strHintRecommended, strCaption, MB_YESNO | MB_DEFBUTTON1 ) == IDYES )
|
|
{
|
|
CCommonDialogRoutines cdr;
|
|
|
|
cdr.SetErrorFocus( m_hWnd, m_iId );
|
|
|
|
fVerified = false;
|
|
}
|
|
}
|
|
|
|
return fVerified;
|
|
}
|
|
|
|
// Save the Dialog Hint Text to the Registry (or Remove the Hint from the Registry if blank).
|
|
void CHint::SaveHint( void )
|
|
{
|
|
CString strHint;
|
|
|
|
GetHint( strHint );
|
|
|
|
if ( strHint.IsEmpty() )
|
|
{
|
|
RemoveHint();
|
|
}
|
|
else
|
|
{
|
|
StoreHint( strHint );
|
|
}
|
|
}
|
|
|
|
// Remove the Hint from the Registry.
|
|
void CHint::RemoveHint( void )
|
|
{
|
|
CRegKey regKey;
|
|
|
|
if ( regKey.Open( HKEY_LOCAL_MACHINE, ::szRATINGS ) == ERROR_SUCCESS )
|
|
{
|
|
if ( regKey.DeleteValue( szHINTVALUENAME ) != ERROR_SUCCESS )
|
|
{
|
|
TraceMsg( TF_WARNING, "CHint::RemoveHint() - Failed to delete the hint registry value." );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TraceMsg( TF_WARNING, "CHint::RemoveHint() - Failed to open the ratings registry key." );
|
|
}
|
|
}
|
|
|
|
// Get the Hint Text from the Dialog's Control (remove leading and trailing blanks).
|
|
void CHint::GetHint( CString & p_rstrHint )
|
|
{
|
|
p_rstrHint.Empty();
|
|
|
|
HWND hwndControl = ::GetDlgItem( m_hWnd, m_iId );
|
|
|
|
// We shouldn't be attempting to save a hint if the edit control does not exist.
|
|
ASSERT( hwndControl );
|
|
|
|
if ( hwndControl != NULL )
|
|
{
|
|
::GetWindowText( hwndControl, (LPTSTR) (LPCTSTR) p_rstrHint.GetBufferSetLength( cchHintLength_c + 1 ), cchHintLength_c );
|
|
p_rstrHint.ReleaseBuffer();
|
|
}
|
|
}
|
|
|
|
// Retrieve a previous Hint from the Registry.
|
|
void CHint::RetrieveHint( CString & p_rstrHint )
|
|
{
|
|
CRegKey regKey;
|
|
DWORD dwCount;
|
|
|
|
p_rstrHint.Empty();
|
|
|
|
if ( regKey.Open( HKEY_LOCAL_MACHINE, ::szRATINGS, KEY_READ ) == ERROR_SUCCESS )
|
|
{
|
|
dwCount = cchHintLength_c;
|
|
|
|
if ( regKey.QueryValue( (LPTSTR) (LPCTSTR) p_rstrHint.GetBufferSetLength( cchHintLength_c + 1 ),
|
|
szHINTVALUENAME, &dwCount ) != ERROR_SUCCESS )
|
|
{
|
|
TraceMsg( TF_WARNING, "CHint::RetrieveHint() - Failed to query the hint registry value." );
|
|
}
|
|
|
|
p_rstrHint.ReleaseBuffer();
|
|
}
|
|
else
|
|
{
|
|
TraceMsg( TF_WARNING, "CHint::RetrieveHint() - Failed to open the ratings registry key." );
|
|
}
|
|
|
|
if ( p_rstrHint.IsEmpty() )
|
|
{
|
|
p_rstrHint.LoadString( IDS_NO_HINT );
|
|
}
|
|
}
|
|
|
|
// Store Hint Text into the Registry.
|
|
void CHint::StoreHint( CString & p_rstrHint )
|
|
{
|
|
CRegKey regKey;
|
|
|
|
if ( regKey.Open( HKEY_LOCAL_MACHINE, ::szRATINGS ) == ERROR_SUCCESS )
|
|
{
|
|
if ( regKey.SetValue( (LPTSTR) (LPCTSTR) p_rstrHint, szHINTVALUENAME ) != ERROR_SUCCESS )
|
|
{
|
|
TraceMsg( TF_WARNING, "CHint::StoreHint() - Failed to save the hint registry value." );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TraceMsg( TF_WARNING, "CHint::StoreHint() - Failed to create the ratings registry key." );
|
|
}
|
|
}
|