//---------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // All rights reserved. // // File Name: // lang.c // // Description: // This file contains the dialog procedure for language settings page. // (IDD_LANGUAGE_SETTINGS) // //---------------------------------------------------------------------------- #include "pch.h" #include "resource.h" #define MAX_SELECTIONS 20 // // This variable determines whether the user just moved here from another // page or has remained on this page // static bHasMovedOffThisPage = TRUE; //---------------------------------------------------------------------------- // // Function: GetLangGroupFromLocale // // Purpose: Takes a locale string Id and finds the language group node that // corresponds to that locale. // // Arguments: IN LPTSTR lpLocaleId- the locale Id to find the language // group of // // Returns: LANGUAGEGROUP_NODE* - language group node the locale corresponds to // //---------------------------------------------------------------------------- LANGUAGEGROUP_NODE* GetLangGroupFromLocale( IN LPTSTR lpLocaleId ) { LANGUAGELOCALE_NODE *CurrentLocale; // // Sweep through the local list until the locale is found and return // the language group // for( CurrentLocale = FixedGlobals.LanguageLocaleList; CurrentLocale != NULL; CurrentLocale = CurrentLocale->next ) { if( lstrcmp( lpLocaleId, CurrentLocale->szLanguageLocaleId ) == 0 ) { return( CurrentLocale->pLanguageGroup ); } } // // If we get to here, then the locale was not found // AssertMsg( FALSE, "The locale was not found." ); // // return the first language group so there is at least something to return // return( FixedGlobals.LanguageLocaleList->pLanguageGroup ); } //---------------------------------------------------------------------------- // // Function: GetLangGroupFromKeyboardLayout // // Purpose: Takes a keyboard layout string Id and finds the language group // node that corresponds to that keyboard layout. // // Arguments: IN LPTSTR lpKeyboardLayoutId- the keyboard layout Id to find // the language group of // // Returns: LANGUAGEGROUP_NODE* - language group node the keyboard layout // corresponds to // //---------------------------------------------------------------------------- LANGUAGEGROUP_NODE* GetLangGroupFromKeyboardLayout( IN LPTSTR lpKeyboardLayoutId ) { return( GetLangGroupFromLocale( lpKeyboardLayoutId ) ); } //---------------------------------------------------------------------------- // // Function: AddLocalesLangGroup // // Purpose: Takes the a locale and finds its corresponding language group // and adds it to the language group list. // // Arguments: IN LPTSTR pLocale - the locale to find and add the language // group of // // Returns: VOID // //---------------------------------------------------------------------------- VOID AddLocalesLangGroup( IN LPTSTR pLocale ) { LANGUAGEGROUP_NODE *pLangGroup; pLangGroup = GetLangGroupFromLocale( pLocale ); AddNameToNameListNoDuplicates( &GenSettings.LanguageGroups, pLangGroup->szLanguageGroupId ); AddNameToNameListNoDuplicates( &GenSettings.LanguageFilePaths, pLangGroup->szLangFilePath ); } //---------------------------------------------------------------------------- // // Function: AddKeyboardLocaleLangGroup // // Purpose: Takes the a keyboard layoutand finds its corresponding language // group and adds it to the language group list. // // Arguments: IN LPTSTR pLocale - the locale to find and add the language // group of // // Returns: VOID // //---------------------------------------------------------------------------- VOID AddKeyboardLocaleLangGroup( IN LPTSTR pKeyboardLocale ) { LANGUAGEGROUP_NODE *pLangGroup; pLangGroup = GetLangGroupFromKeyboardLayout( pKeyboardLocale ); AddNameToNameListNoDuplicates( &GenSettings.LanguageGroups, pLangGroup->szLanguageGroupId ); AddNameToNameListNoDuplicates( &GenSettings.LanguageFilePaths, pLangGroup->szLangFilePath ); } //---------------------------------------------------------------------------- // // Function: OnLanguageSettingsInitDialog // // Purpose: Fills the Language Group box with the languages. // // Arguments: IN HWND hwnd - handle to the dialog box // // Returns: VOID // //---------------------------------------------------------------------------- VOID OnLanguageSettingsInitDialog( IN HWND hwnd ) { INT_PTR iListBoxIndex; LANGUAGEGROUP_NODE *pLangEntry; // // Fill the list box with the data from the Language Group list // for( pLangEntry = FixedGlobals.LanguageGroupList; pLangEntry != NULL; pLangEntry = pLangEntry->next ) { // // Add language group to the list box // iListBoxIndex = SendDlgItemMessage( hwnd, IDC_LANGUAGES, LB_ADDSTRING, 0, (LPARAM) pLangEntry->szLanguageGroupName ); // // Associate the Language Group struct with its entry in the list box // SendDlgItemMessage( hwnd, IDC_LANGUAGES, LB_SETITEMDATA, iListBoxIndex, (LPARAM) pLangEntry ); } } //---------------------------------------------------------------------------- // // Function: OnLanguageSettingsSetActive // // Purpose: If they just moved here from another page, it makes sure for the // locales they have selected that there corresponding language // groups are selected. // // Arguments: IN HWND hwnd - handle to the dialog box // // Returns: VOID // //---------------------------------------------------------------------------- VOID OnLanguageSettingsSetActive( IN HWND hwnd ) { INT i; INT_PTR iListBoxCount; BOOL bIsAnAdditionLangGroup; BOOL bIsAnUserChosenLangGroup; LANGUAGEGROUP_NODE *pLangEntry; // // The variable AdditionalLangGroups holds those language groups that need // to be installed because the user has already picked a locale that needs // it. We need to force those Language groups to automatically be // installed so we auto-select them. // NAMELIST AdditionalLangGroups = { 0 }; // // Make sure language groups are selected for the locals they chose on the // regional settings page but only do this if they moved from another page // onto this page. If this is just another SetActive message but they // haven't left the page then do nothing. // if( bHasMovedOffThisPage ) { bHasMovedOffThisPage = FALSE; // // Find out what language groups we have to install // if( GenSettings.iRegionalSettings == REGIONAL_SETTINGS_SPECIFY ) { if( GenSettings.bUseCustomLocales ) { pLangEntry = GetLangGroupFromLocale( GenSettings.szMenuLanguage ); AddNameToNameListNoDuplicates( &AdditionalLangGroups, pLangEntry->szLanguageGroupId ); pLangEntry = GetLangGroupFromLocale( GenSettings.szNumberLanguage ); AddNameToNameListNoDuplicates( &AdditionalLangGroups, pLangEntry->szLanguageGroupId ); pLangEntry = GetLangGroupFromKeyboardLayout( GenSettings.szLanguageLocaleId ); AddNameToNameListNoDuplicates( &AdditionalLangGroups, pLangEntry->szLanguageGroupId ); } else { pLangEntry = GetLangGroupFromLocale( GenSettings.szLanguage ); AddNameToNameListNoDuplicates( &AdditionalLangGroups, pLangEntry->szLanguageGroupId ); } } // // Select the language groups in the AdditionalLangGroups list // iListBoxCount = SendDlgItemMessage( hwnd, IDC_LANGUAGES, LB_GETCOUNT, 0, 0 ); for( i = 0; i < iListBoxCount; i++ ) { pLangEntry = (LANGUAGEGROUP_NODE *) SendDlgItemMessage( hwnd, IDC_LANGUAGES, LB_GETITEMDATA, i, 0 ); if( FindNameInNameList( &GenSettings.LanguageGroups, pLangEntry->szLanguageGroupId ) != -1 ) { bIsAnUserChosenLangGroup = TRUE; } else { bIsAnUserChosenLangGroup = FALSE; } if( FindNameInNameList( &AdditionalLangGroups, pLangEntry->szLanguageGroupId ) != -1 ) { bIsAnAdditionLangGroup = TRUE; } else { bIsAnAdditionLangGroup = FALSE; } if( bIsAnUserChosenLangGroup || bIsAnAdditionLangGroup ) { SendDlgItemMessage( hwnd, IDC_LANGUAGES, LB_SETSEL, TRUE, i ); } } } WIZ_BUTTONS(hwnd, PSWIZB_BACK | PSWIZB_NEXT); } //---------------------------------------------------------------------------- // // Function: OnWizNextLanguageSettings // // Purpose: Stores the language groups that are selected. Also, stores the // the language groups that are not selected but are needed by one // of the locales they chose. // // Arguments: IN HWND hwnd - handle to the dialog box // // Returns: VOID // //---------------------------------------------------------------------------- VOID OnWizNextLanguageSettings( IN HWND hwnd ) { INT_PTR i; INT_PTR iNumberSelected; UINT rgiCurrentSelections[MAX_SELECTIONS]; LANGUAGEGROUP_NODE *pLangGroupEntry; // ISSUE-2002/02/28-stelo- going to have to force whatever locale choices they made on the // previous page for the those language groups to automatically get // installed iNumberSelected = SendDlgItemMessage( hwnd, IDC_LANGUAGES, LB_GETSELITEMS, MAX_SELECTIONS, (LPARAM) rgiCurrentSelections ); ResetNameList( &GenSettings.LanguageGroups ); ResetNameList( &GenSettings.LanguageFilePaths ); if( WizGlobals.iProductInstall == PRODUCT_SYSPREP ) { // // Set this to true so we know to write out the key to specify the path // to the language files // GenSettings.bSysprepLangFilesCopied = TRUE; } for( i = 0; i < iNumberSelected; i++ ) { pLangGroupEntry = (LANGUAGEGROUP_NODE *) SendDlgItemMessage( hwnd, IDC_LANGUAGES, LB_GETITEMDATA, rgiCurrentSelections[i], 0 ); // // store the language group ID in the namelist // AddNameToNameList( &GenSettings.LanguageGroups, pLangGroupEntry->szLanguageGroupId ); // // store the path to the language files // AddNameToNameList( &GenSettings.LanguageFilePaths, pLangGroupEntry->szLangFilePath ); } // // Force whatever language groups to be installed that are needed for the // locales they chose // if( GenSettings.iRegionalSettings == REGIONAL_SETTINGS_SPECIFY ) { if( GenSettings.bUseCustomLocales ) { AddLocalesLangGroup( GenSettings.szMenuLanguage ); AddLocalesLangGroup( GenSettings.szNumberLanguage ); AddKeyboardLocaleLangGroup( GenSettings.szLanguageLocaleId ); } else { AddLocalesLangGroup( GenSettings.szLanguage ); } } } //---------------------------------------------------------------------------- // // Function: DlgLangSettingsPage // // Purpose: Dialog procedure for the Language 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 DlgLangSettingsPage( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { BOOL bStatus = TRUE; switch( uMsg ) { case WM_INITDIALOG: { OnLanguageSettingsInitDialog( hwnd ); 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_LANGS; OnLanguageSettingsSetActive( hwnd ); break; } case PSN_WIZBACK: bHasMovedOffThisPage = TRUE; bStatus = FALSE; break; case PSN_WIZNEXT: { OnWizNextLanguageSettings( hwnd ); bStatus = FALSE; break; } case PSN_HELP: WIZ_HELP(); break; default: break; } break; } default: bStatus = FALSE; break; } return( bStatus ); }