//---------------------------------------------------------------------------- // // 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 ); }