windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/setupmgr/oc/rgseting.c
2020-09-26 16:20:57 +08:00

929 lines
26 KiB
C

//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// rgseting.c
//
// Description:
// This file contains the dialog procedure for the regional settings
// page (IDD_REGIONALSETTINGS).
//
//----------------------------------------------------------------------------
#include "pch.h"
#include "resource.h"
//
// Explanation of the var GenSettings.szLanguageLocaleId
//
// This var is to keep track of the locale id for the keyboard layout selected.
// If the user ever leaves the custom dialog and comes back to it, this var
// determines what locale to select for the keyboard layout. I can't just use
// they keyboard layout they selected because many locales have the same
// keyboard layout so I wouldn't know which one to select.
//
// static TCHAR g_szLanguageLocaleId[MAX_LANGUAGE_LEN] = _T("");
INT_PTR CALLBACK RegionalCustomDisplayDlg( IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam);
// *************************************************************************
//
// Dialog proc and helper functions for the regional settings Pop-Up
//
// *************************************************************************
//----------------------------------------------------------------------------
//
// Function: OnRegionalCustomButton
//
// Purpose: Pop-up the custom regional settings window
//
// Arguments: IN HWND hwnd - handle to the dialog box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
OnRegionalCustomButton( IN HWND hwnd ) {
DialogBox( FixedGlobals.hInstance,
MAKEINTRESOURCE( IDD_REGIONALSETTINGS_POPUP ),
hwnd,
RegionalCustomDisplayDlg );
}
//----------------------------------------------------------------------------
//
// Function: FindAndSelectInComboBox
//
// Purpose: Searches a combo box for a particular string and selects. If the
// string is not found than the first item is selected.
//
// Arguments: IN TCHAR *pString - the string to select
// IN HWND hwnd - handle to the dialog box
// IN INT iControlId - the resource Id of the combo box to search in
// IN BOOL bKeyboardLayout - TRUE if this is the keyboard layout
// combo box, FALSE if it is not
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
FindAndSelectInComboBox( IN TCHAR *pString,
IN HWND hwnd,
IN INT iControlId )
{
INT_PTR i;
INT_PTR iComboBoxCount;
LANGUAGELOCALE_NODE *pLocaleEntry;
iComboBoxCount = SendDlgItemMessage( hwnd,
iControlId,
CB_GETCOUNT,
0,
(LPARAM) pString );
for( i = 0; i < iComboBoxCount; i++ ) {
pLocaleEntry = (LANGUAGELOCALE_NODE *) SendDlgItemMessage( hwnd,
iControlId,
CB_GETITEMDATA,
i,
0 );
if( lstrcmp( pString, pLocaleEntry->szLanguageLocaleId ) == 0 )
{
SendDlgItemMessage( hwnd,
iControlId,
CB_SETCURSEL,
i,
0 );
return;
}
}
//
// If we get to this point, then no match was found so just pick the
// first one
//
AssertMsg( FALSE, "No matching string found." );
SendDlgItemMessage( hwnd,
iControlId,
CB_SETCURSEL,
0,
0 );
}
//----------------------------------------------------------------------------
//
// Function: SelectDefaultLocale
//
// Purpose: Selects the default locale in a combo box.
//
// Arguments: IN HWND hwnd - handle to the dialog box
// IN INT ControlId - the resource Id of the combo box to select
// the default locale in
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
SelectDefaultLocale( IN HWND hwnd, IN INT ControlId ) {
INT_PTR i;
INT_PTR iComboBoxCount;
LANGUAGELOCALE_NODE *pLocale;
iComboBoxCount = SendDlgItemMessage( hwnd,
ControlId,
CB_GETCOUNT,
0,
0 );
for( i = 0; i < iComboBoxCount; i++ ) {
pLocale = (LANGUAGELOCALE_NODE *) SendDlgItemMessage( hwnd,
ControlId,
CB_GETITEMDATA,
i,
0 );
//
// Check and see if we found it
//
if( lstrcmp( g_szDefaultLocale, pLocale->szLanguageLocaleId ) == 0 ) {
SendDlgItemMessage( hwnd,
ControlId,
CB_SETCURSEL,
i,
0 );
break;
}
}
//
// If for some reason we couldn't find the default just select the first one
//
if( i >= iComboBoxCount ) {
AssertMsg( FALSE, "The default language locale was not found." );
SendDlgItemMessage( hwnd,
ControlId,
CB_SETCURSEL,
0,
0 );
}
}
//----------------------------------------------------------------------------
//
// Function: StoreLanguageLocales
//
// Purpose: Stores the locales the user specified in to their global
// variables.
//
// Arguments: IN HWND hwnd - handle to the dialog box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
StoreLanguageLocales( IN HWND hwnd ) {
INT_PTR iComboBoxIndex;
LANGUAGELOCALE_NODE *pLocaleEntry;
//
// Grab the language locale id from the Menus combo box and store
// it in the proper global
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_MENUS,
CB_GETCURSEL,
0,
0 );
pLocaleEntry = (LANGUAGELOCALE_NODE *) SendDlgItemMessage( hwnd,
IDC_CB_MENUS,
CB_GETITEMDATA,
iComboBoxIndex,
0 );
lstrcpyn( GenSettings.szMenuLanguage, pLocaleEntry->szLanguageLocaleId, AS(GenSettings.szMenuLanguage) );
//
// Grab the language locale id from the Units combo box and store
// it in the proper global
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_UNITS,
CB_GETCURSEL,
0,
0 );
pLocaleEntry = (LANGUAGELOCALE_NODE *) SendDlgItemMessage( hwnd,
IDC_CB_UNITS,
CB_GETITEMDATA,
iComboBoxIndex,
0 );
lstrcpyn( GenSettings.szNumberLanguage, pLocaleEntry->szLanguageLocaleId, AS(GenSettings.szNumberLanguage) );
//
// Grab the language locale id from the Keyboard layout combo box and
// store it in the proper global
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_KEYBOARD_LAYOUT,
CB_GETCURSEL,
0,
0 );
pLocaleEntry = (LANGUAGELOCALE_NODE *) SendDlgItemMessage( hwnd,
IDC_CB_KEYBOARD_LAYOUT,
CB_GETITEMDATA,
iComboBoxIndex,
0 );
lstrcpyn( GenSettings.szKeyboardLayout, pLocaleEntry->szKeyboardLayout, AS(GenSettings.szKeyboardLayout) );
lstrcpyn( GenSettings.szLanguageLocaleId, pLocaleEntry->szLanguageLocaleId, AS(GenSettings.szLanguageLocaleId) );
}
//----------------------------------------------------------------------------
//
// Function: LoadRegionalSettingsComboBoxes
//
// Purpose: Loads the menu, units and keybaord layout locale combo boxes
// with the locale strings.
//
// Arguments: IN HWND hwnd - handle to the dialog box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
LoadRegionalSettingsComboBoxes( IN HWND hwnd ) {
INT_PTR iComboBoxIndex;
LANGUAGELOCALE_NODE *CurrentLocale = NULL;
//
// Add the valid locals to the combo boxes
//
for( CurrentLocale = FixedGlobals.LanguageLocaleList;
CurrentLocale != NULL;
CurrentLocale = CurrentLocale->next ) {
//
// Add it to the System combo box
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_MENUS,
CB_ADDSTRING,
0,
(LPARAM) CurrentLocale->szLanguageLocaleName );
//
// Associate the Language Locale ID with its entry in the System combo box
//
SendDlgItemMessage( hwnd,
IDC_CB_MENUS,
CB_SETITEMDATA,
iComboBoxIndex,
(LPARAM) CurrentLocale );
//
// Add it to the User combo box
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_UNITS,
CB_ADDSTRING,
0,
(LPARAM) CurrentLocale->szLanguageLocaleName );
//
// Associate the Language Locale ID with its entry in the User combo box
//
SendDlgItemMessage( hwnd,
IDC_CB_UNITS,
CB_SETITEMDATA,
iComboBoxIndex,
(LPARAM) CurrentLocale );
//
// Add it to the Keyboard combo box
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_KEYBOARD_LAYOUT,
CB_ADDSTRING,
0,
(LPARAM) CurrentLocale->szLanguageLocaleName );
//
// Associate the Language Locale ID with its entry in the Keyboard combo box
//
SendDlgItemMessage( hwnd,
IDC_CB_KEYBOARD_LAYOUT,
CB_SETITEMDATA,
iComboBoxIndex,
(LPARAM) CurrentLocale );
}
}
//----------------------------------------------------------------------------
//
// Function: OnRegionalCustomInitDialog
//
// Purpose: Populates the locale combo boxes and selects the proper entry.
//
// Arguments: HWND hwnd - handle to the dialog box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
OnRegionalCustomInitDialog( IN HWND hwnd ) {
LoadRegionalSettingsComboBoxes( hwnd );
//
// Set the initial selections for each combo box
//
if( GenSettings.szMenuLanguage[0] != '\0' ) {
FindAndSelectInComboBox( GenSettings.szMenuLanguage,
hwnd,
IDC_CB_MENUS );
}
else {
//
// Select the default locale
//
SelectDefaultLocale( hwnd, IDC_CB_MENUS );
}
if( GenSettings.szNumberLanguage[0] != '\0' ) {
FindAndSelectInComboBox( GenSettings.szNumberLanguage,
hwnd,
IDC_CB_UNITS );
}
else {
//
// Select the default locale
//
SelectDefaultLocale( hwnd, IDC_CB_UNITS );
}
if( GenSettings.szLanguageLocaleId[0] != '\0' ) {
FindAndSelectInComboBox( GenSettings.szLanguageLocaleId,
hwnd,
IDC_CB_KEYBOARD_LAYOUT );
}
else {
//
// Select the default locale
//
SelectDefaultLocale( hwnd, IDC_CB_KEYBOARD_LAYOUT );
}
}
//----------------------------------------------------------------------------
//
// Function: RegionalCustomDisplayDlg
//
// Purpose: Dialog procedure for specify individual regional settings
//
// Arguments: standard Win32 dialog proc arguments
//
// Returns: standard Win32 dialog proc return value -- whether the message
// was handled or not
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK
RegionalCustomDisplayDlg( IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam) {
BOOL bStatus = TRUE;
switch (uMsg) {
case WM_INITDIALOG:
OnRegionalCustomInitDialog( hwnd );
break;
case WM_COMMAND: {
int nButtonId;
switch ( nButtonId = LOWORD (wParam ) ) {
case IDOK:
StoreLanguageLocales( hwnd );
EndDialog( hwnd, TRUE );
break;
case IDCANCEL:
EndDialog( hwnd, FALSE );
break;
}
}
default:
bStatus = FALSE;
break;
}
return( bStatus );
}
// *************************************************************************
//
// Dialog proc and helper functions for the Regional Settings Wizard page
//
// *************************************************************************
//----------------------------------------------------------------------------
//
// Function: OnCustomizeCheckBox
//
// Purpose: Greys and ungreys controls appropriately depending on if the
// customize check box is checked or not.
//
// Arguments: IN HWND hwnd - handle to the dialog box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
OnCustomizeCheckBox( IN HWND hwnd ) {
if( IsDlgButtonChecked( hwnd, IDC_CHB_CUSTOMIZE ) ) {
EnableWindow( GetDlgItem( hwnd, IDC_LANG_TEXT ), FALSE );
EnableWindow( GetDlgItem( hwnd, IDC_CB_LANGUAGE_LOCALE ), FALSE );
EnableWindow( GetDlgItem( hwnd, IDC_BUT_CUSTOM ), TRUE );
}
else {
EnableWindow( GetDlgItem( hwnd, IDC_LANG_TEXT ), TRUE );
EnableWindow( GetDlgItem( hwnd, IDC_CB_LANGUAGE_LOCALE ), TRUE );
EnableWindow( GetDlgItem( hwnd, IDC_BUT_CUSTOM ), FALSE );
}
}
//----------------------------------------------------------------------------
//
// Function: OnRadioButtonRegionalSettings
//
// Purpose: Greys and ungreys controls appropriately depending on what radio
// button is selected
//
// Arguments: IN HWND hwnd - handle to the dialog box
// IN INT nButtonId - resource Id of the button that was clicked
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
OnRadioButtonRegionalSettings( IN HWND hwnd,
IN INT nButtonId ) {
if( nButtonId == IDC_RB_SPECIFY ) {
EnableWindow( GetDlgItem( hwnd, IDC_CHB_CUSTOMIZE ), TRUE );
OnCustomizeCheckBox( hwnd );
}
else {
EnableWindow( GetDlgItem( hwnd, IDC_LANG_TEXT ), FALSE );
EnableWindow( GetDlgItem( hwnd, IDC_CB_LANGUAGE_LOCALE ), FALSE );
EnableWindow( GetDlgItem( hwnd, IDC_CHB_CUSTOMIZE ), FALSE );
EnableWindow( GetDlgItem( hwnd, IDC_BUT_CUSTOM ), FALSE );
}
}
//----------------------------------------------------------------------------
//
// Function: OnRegionalSettingsInitDialog
//
// Purpose: Loads the locale combo box with the locale strings and selects
// the default entry.
//
// Arguments: IN HWND hwnd - handle to the dialog box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
OnRegionalSettingsInitDialog( IN HWND hwnd ) {
INT_PTR iComboBoxIndex;
LANGUAGELOCALE_NODE *CurrentLocale;
CheckRadioButton( hwnd,
IDC_RB_SKIP,
IDC_RB_SPECIFY,
IDC_RB_SKIP );
//
// Set the initial controls that are greyed/ungreyed
//
OnRadioButtonRegionalSettings( hwnd, IDC_RB_USE_DEFAULT );
//
// Add the language locals to the combo box
//
for( CurrentLocale = FixedGlobals.LanguageLocaleList;
CurrentLocale != NULL;
CurrentLocale = CurrentLocale->next ) {
//
// Add the locale to the combo box
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_LANGUAGE_LOCALE,
CB_ADDSTRING,
0,
(LPARAM) CurrentLocale->szLanguageLocaleName );
//
// Associate the Language Locale ID with its entry in the combo box
//
SendDlgItemMessage( hwnd,
IDC_CB_LANGUAGE_LOCALE,
CB_SETITEMDATA,
iComboBoxIndex,
(LPARAM) CurrentLocale );
}
//
// Select the default locale
//
SelectDefaultLocale( hwnd, IDC_CB_LANGUAGE_LOCALE );
}
//----------------------------------------------------------------------------
//
// Function: OnRegionalSettingsSetActive
//
// Purpose:
//
// Arguments: IN HWND hwnd - handle to the dialog box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
OnRegionalSettingsSetActive( IN HWND hwnd )
{
if( GenSettings.iUnattendMode == UMODE_FULL_UNATTENDED )
{
EnableWindow( GetDlgItem( hwnd, IDC_RB_SKIP ), FALSE );
}
else
{
EnableWindow( GetDlgItem( hwnd, IDC_RB_SKIP ), TRUE );
}
switch( GenSettings.iRegionalSettings ) {
case REGIONAL_SETTINGS_SKIP:
if( GenSettings.iUnattendMode == UMODE_FULL_UNATTENDED )
{
CheckRadioButton( hwnd,
IDC_RB_SKIP,
IDC_RB_SPECIFY,
IDC_RB_USE_DEFAULT );
}
else
{
CheckRadioButton( hwnd,
IDC_RB_SKIP,
IDC_RB_SPECIFY,
IDC_RB_SKIP );
}
OnRadioButtonRegionalSettings( hwnd, IDC_RB_SKIP );
break;
case REGIONAL_SETTINGS_NOT_SPECIFIED:
case REGIONAL_SETTINGS_DEFAULT:
CheckRadioButton( hwnd,
IDC_RB_SKIP,
IDC_RB_SPECIFY,
IDC_RB_USE_DEFAULT );
OnRadioButtonRegionalSettings( hwnd, IDC_RB_USE_DEFAULT );
break;
case REGIONAL_SETTINGS_SPECIFY:
CheckRadioButton( hwnd,
IDC_RB_SKIP,
IDC_RB_SPECIFY,
IDC_RB_SPECIFY );
OnRadioButtonRegionalSettings( hwnd, IDC_RB_SPECIFY );
if( GenSettings.bUseCustomLocales ) {
CheckDlgButton( hwnd, IDC_CHB_CUSTOMIZE, BST_CHECKED );
OnCustomizeCheckBox( hwnd );
}
else {
FindAndSelectInComboBox( GenSettings.szLanguage,
hwnd,
IDC_CB_LANGUAGE_LOCALE );
CheckDlgButton( hwnd, IDC_CHB_CUSTOMIZE, BST_UNCHECKED );
OnCustomizeCheckBox( hwnd );
}
break;
default:
AssertMsg(FALSE, "Bad case for Regional Settings");
break;
}
}
//----------------------------------------------------------------------------
//
// Function: OnWizNextRegionalSettings
//
// Purpose: Store the radio button choice that was made and the language
// locale, if necessary.
//
// Arguments: IN HWND hwnd - handle to the dialog box
//
// Returns: BOOL
//
//----------------------------------------------------------------------------
BOOL
OnWizNextRegionalSettings( IN HWND hwnd ) {
BOOL bResult = TRUE;
if( IsDlgButtonChecked( hwnd, IDC_RB_SKIP ) ) {
if( GenSettings.iUnattendMode == UMODE_FULL_UNATTENDED ) {
ReportErrorId( hwnd,
MSGTYPE_ERR,
IDS_ERR_FULL_UNATTEND_REGION_SET );
bResult = FALSE;
}
else {
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SKIP;
}
}
else if( IsDlgButtonChecked( hwnd, IDC_RB_USE_DEFAULT ) ) {
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_DEFAULT;
}
else {
GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SPECIFY;
if( IsDlgButtonChecked( hwnd, IDC_CHB_CUSTOMIZE ) ) {
GenSettings.bUseCustomLocales = TRUE;
}
else {
INT_PTR iComboBoxIndex;
LANGUAGELOCALE_NODE *pLocaleEntry;
GenSettings.bUseCustomLocales = FALSE;
//
// Grab the language locale
//
iComboBoxIndex = SendDlgItemMessage( hwnd,
IDC_CB_LANGUAGE_LOCALE,
CB_GETCURSEL,
0,
0 );
pLocaleEntry = (LANGUAGELOCALE_NODE *) SendDlgItemMessage( hwnd,
IDC_CB_LANGUAGE_LOCALE,
CB_GETITEMDATA,
iComboBoxIndex,
0 );
lstrcpyn( GenSettings.szLanguage,
pLocaleEntry->szLanguageLocaleId, AS(GenSettings.szLanguage) );
}
}
return ( bResult );
}
//----------------------------------------------------------------------------
//
// Function: DlgRegionalSettingsPage
//
// Purpose: Dialog procedure for the Regional Settings page
//
// Arguments: standard Win32 dialog proc arguments
//
// Returns: standard Win32 dialog proc return value -- whether the message
// was handled or not
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK
DlgRegionalSettingsPage( IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam ) {
BOOL bStatus = TRUE;
switch( uMsg ) {
case WM_INITDIALOG: {
OnRegionalSettingsInitDialog( hwnd );
break;
}
case WM_COMMAND: {
int nButtonId;
switch ( nButtonId = LOWORD(wParam) ) {
case IDC_BUT_CUSTOM:
if( HIWORD( wParam ) == BN_CLICKED ) {
OnRegionalCustomButton( hwnd );
}
break;
case IDC_CHB_CUSTOMIZE:
if( HIWORD( wParam ) == BN_CLICKED ) {
OnCustomizeCheckBox( hwnd );
}
break;
case IDC_RB_SKIP:
case IDC_RB_USE_DEFAULT:
case IDC_RB_SPECIFY:
if( HIWORD( wParam ) == BN_CLICKED )
OnRadioButtonRegionalSettings( hwnd, nButtonId );
break;
default:
bStatus = FALSE;
break;
}
break;
}
case WM_NOTIFY: {
LPNMHDR pnmh = (LPNMHDR)lParam;
switch( pnmh->code ) {
case PSN_QUERYCANCEL:
WIZ_CANCEL(hwnd);
break;
case PSN_SETACTIVE: {
g_App.dwCurrentHelp = IDH_REGN_STGS;
OnRegionalSettingsSetActive( hwnd );
WIZ_BUTTONS(hwnd, PSWIZB_BACK | PSWIZB_NEXT);
break;
}
case PSN_WIZBACK:
bStatus = FALSE;
break;
case PSN_WIZNEXT: {
if ( !OnWizNextRegionalSettings( hwnd ) )
WIZ_FAIL(hwnd);
else
bStatus = FALSE;
}
break;
case PSN_HELP:
WIZ_HELP();
break;
default:
break;
}
break;
}
default:
bStatus = FALSE;
break;
}
return( bStatus );
}