windows-nt/Source/XPSP1/NT/shell/ext/ratings/msrating/hint.cpp
2020-09-26 16:20:57 +08:00

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." );
}
}