Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1519 lines
45 KiB

/*++
Copyright (c) 1994-2000, Microsoft Corporation All rights reserved.
Module Name:
advdlg.c
Abstract:
This module implements the advanced property sheet for the Regional
Options applet.
Revision History:
--*/
//
// Include Files.
//
#include "intl.h"
#include <windowsx.h>
#include <setupapi.h>
#include <syssetup.h>
#include "intlhlp.h"
#include "maxvals.h"
#define STRSAFE_LIB
#include <strsafe.h>
//
// Context Help Ids.
//
static int aAdvancedHelpIds[] =
{
IDC_GROUPBOX1, IDH_COMM_GROUPBOX,
IDC_GROUPBOX2, IDH_COMM_GROUPBOX,
IDC_GROUPBOX3, IDH_COMM_GROUPBOX,
IDC_CODEPAGES, IDH_INTL_ADV_CODEPAGES,
IDC_SYSTEM_LOCALE, IDH_INTL_ADV_SYSTEM_LOCALE,
IDC_SYSTEM_LOCALE_TEXT1, IDH_INTL_ADV_SYSTEM_LOCALE,
IDC_SYSTEM_LOCALE_TEXT2, IDH_INTL_ADV_SYSTEM_LOCALE,
IDC_DEFAULT_USER, IDH_INTL_ADV_CHANGE,
0, 0
};
////////////////////////////////////////////////////////////////////////////
//
// Advanced_ListViewCustomDraw
//
// Processing for a list view NM_CUSTOMDRAW notification message.
//
////////////////////////////////////////////////////////////////////////////
void Advanced_ListViewCustomDraw(
HWND hDlg,
LPNMLVCUSTOMDRAW pDraw)
{
LPCODEPAGE pNode;
//
// Tell the list view to notify me of item draws.
//
if (pDraw->nmcd.dwDrawStage == CDDS_PREPAINT)
{
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW);
return;
}
//
// Handle the Item Prepaint.
//
pNode = (LPCODEPAGE)(pDraw->nmcd.lItemlParam);
if ((pDraw->nmcd.dwDrawStage & CDDS_ITEMPREPAINT) &&
(pNode) && (pNode != (LPCODEPAGE)(LB_ERR)))
{
if (pNode->wStatus & (ML_PERMANENT | ML_DISABLE))
{
pDraw->clrText = (pDraw->nmcd.uItemState & CDIS_SELECTED)
? ((GetSysColor(COLOR_HIGHLIGHT) ==
GetSysColor(COLOR_GRAYTEXT))
? GetSysColor(COLOR_HIGHLIGHTTEXT)
: GetSysColor(COLOR_GRAYTEXT))
: GetSysColor(COLOR_GRAYTEXT);
}
}
//
// Do the default action.
//
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_DODEFAULT);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_ListViewChanging
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_ListViewChanging(
HWND hDlg,
NM_LISTVIEW *pLV)
{
LPCODEPAGE pNode;
//
// Make sure it's a state change message.
//
if ((((*pLV).hdr).idFrom != IDC_CODEPAGES) ||
(!(pLV->uChanged & LVIF_STATE)) ||
((pLV->uNewState & 0x3000) == 0))
{
return (FALSE);
}
//
// Get the item data for the currently selected item.
//
pNode = (LPCODEPAGE)(pLV->lParam);
//
// Make sure we're not trying to change a permanent or disabled
// code page. If so, return TRUE to prevent the change.
//
if ((pNode) && (pNode->wStatus & (ML_PERMANENT | ML_DISABLE)))
{
return (TRUE);
}
//
// Return FALSE to allow the change.
//
return (FALSE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_ListViewChanged
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_ListViewChanged(
HWND hDlg,
int iID,
NM_LISTVIEW *pLV)
{
HWND hwndLV = GetDlgItem(hDlg, iID);
LPCODEPAGE pNode;
BOOL bChecked;
int iCount;
//
// Make sure it's a state change message.
//
if ((((*pLV).hdr).idFrom != IDC_CODEPAGES) ||
(!(pLV->uChanged & LVIF_STATE)) ||
((pLV->uNewState & 0x3000) == 0))
{
return (FALSE);
}
//
// Get the state of the check box for the currently selected item.
//
bChecked = ListView_GetCheckState(hwndLV, pLV->iItem) ? TRUE : FALSE;
//
// Get the item data for the currently selected item.
//
pNode = (LPCODEPAGE)(pLV->lParam);
//
// Make sure we're not trying to change a permanent or disabled
// code page. If so, set the check box to its appropriate state.
//
if (pNode->wStatus & (ML_PERMANENT | ML_DISABLE))
{
if (pNode->wStatus & ML_PERMANENT)
{
if (bChecked == FALSE)
{
ListView_SetCheckState(hwndLV, pLV->iItem, TRUE);
}
}
else // ML_DISABLE only
{
if ((bChecked == FALSE) && (pNode->wStatus & ML_ORIG_INSTALLED))
{
ListView_SetCheckState(hwndLV, pLV->iItem, TRUE);
}
else if ((bChecked == TRUE) && (!(pNode->wStatus & ML_ORIG_INSTALLED)))
{
ListView_SetCheckState(hwndLV, pLV->iItem, FALSE);
}
}
return (FALSE);
}
//
// Store the proper info in the code page structure.
//
pNode->wStatus &= (ML_ORIG_INSTALLED | ML_STATIC);
pNode->wStatus |= ((bChecked) ? ML_INSTALL : ML_REMOVE);
//
// Deselect all items.
//
iCount = ListView_GetItemCount(hwndLV);
while (iCount > 0)
{
ListView_SetItemState( hwndLV,
iCount - 1,
0,
LVIS_FOCUSED | LVIS_SELECTED );
iCount--;
}
//
// Make sure this item is selected.
//
ListView_SetItemState( hwndLV,
pLV->iItem,
LVIS_FOCUSED | LVIS_SELECTED,
LVIS_FOCUSED | LVIS_SELECTED );
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_ListViewClick
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_ListViewClick(
HWND hDlg,
LPNMHDR lpNmHdr)
{
LV_HITTESTINFO ht;
HWND hwndList = GetDlgItem(hDlg, IDC_CODEPAGES);
//
// Remove unnecessary processing.
//
if (lpNmHdr->idFrom != IDC_CODEPAGES)
{
return (FALSE);
}
//
// Get where we were hit and then translate it to our
// window.
//
GetCursorPos(&ht.pt);
ScreenToClient(hwndList, &ht.pt);
ListView_HitTest(hwndList, &ht);
if ((ht.iItem >= 0) && ((ht.flags & LVHT_ONITEM) == LVHT_ONITEMLABEL))
{
UINT state;
//
// The user clicked on the item label. Simulate a
// state change so we can process it.
//
state = ListView_GetItemState( hwndList,
ht.iItem,
LVIS_STATEIMAGEMASK );
state ^= INDEXTOSTATEIMAGEMASK(LVIS_SELECTED | LVIS_FOCUSED);
//
// The state is either selected or focused. Flip the
// bits. The SetItemState causes the system to bounce
// back a notification for LVN_ITEMCHANGED and the
// code then does the right thing. Note -- we MUST
// check for LVHT_ONITEMLABEL. If we do this code for
// LVHT_ONITEMSTATEICON, the code will get 2
// ITEMCHANGED notifications, and the state will stay
// where it is, which is not good. If we want this
// to also fire if the guy clicks in the empty space
// right of the label text, we need to look for
// LVHT_ONITEM as well as LVHT_ONITEMLABEL.
//
ListView_SetItemState( hwndList,
ht.iItem,
state,
LVIS_STATEIMAGEMASK );
}
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_GetSupportedCodePages
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_GetSupportedCodePages()
{
UINT CodePage;
HANDLE hCodePage;
LPCODEPAGE pCP;
INFCONTEXT Context;
TCHAR szSection[MAX_PATH];
int LineCount, LineNum;
CPINFOEX Info;
//
// Get the number of supported code pages from the inf file.
//
LineCount = (UINT)SetupGetLineCount(g_hIntlInf, TEXT("CodePages"));
if (LineCount <= 0)
{
return (FALSE);
}
//
// Go through all supported code pages in the inf file.
//
for (LineNum = 0; LineNum < LineCount; LineNum++)
{
if (SetupGetLineByIndex(g_hIntlInf, TEXT("CodePages"), LineNum, &Context) &&
SetupGetIntField(&Context, 0, &CodePage))
{
//
// Create the new node.
//
if (!(hCodePage = GlobalAlloc(GHND, sizeof(CODEPAGE))))
{
return (FALSE);
}
pCP = GlobalLock(hCodePage);
//
// Fill in the new node with the appropriate info.
//
pCP->wStatus = 0;
pCP->CodePage = CodePage;
pCP->hCodePage = hCodePage;
(pCP->pszName)[0] = 0;
//
// Get the appropriate display string.
//
if (GetCPInfoEx(CodePage, 0, &Info))
{
//lstrcpy(pCP->pszName, Info.CodePageName);
if(FAILED(StringCchCopy(pCP->pszName, MAX_PATH, Info.CodePageName)))
{
return(FALSE);
}
}
else if (!SetupGetStringField(&Context, 1, pCP->pszName, MAX_PATH, NULL))
{
GlobalUnlock(hCodePage);
GlobalFree(hCodePage);
continue;
}
//
// See if this code page can be removed.
//
//wsprintf(szSection, TEXT("%ws%d"), szCPRemovePrefix, CodePage);
if(FAILED(StringCchPrintf(szSection, MAX_PATH, TEXT("%ws%d"), szCPRemovePrefix, CodePage)))
{
return(FALSE);
}
if ((CodePage == GetACP()) ||
(CodePage == GetOEMCP()) ||
(!SetupFindFirstLine( g_hIntlInf,
szSection,
TEXT("AddReg"),
&Context )))
{
//
// Mark it as permanent.
// Also mark it as originally installed to avoid problems.
//
pCP->wStatus |= (ML_ORIG_INSTALLED | ML_PERMANENT);
}
//
// Add the code page to the front of the linked list.
//
pCP->pNext = pCodePages;
pCodePages = pCP;
}
}
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_InitSystemLocales
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_InitSystemLocales(
HWND hDlg)
{
TCHAR szSystemBuf[SIZE_128];
TCHAR szDefaultSystemBuf[SIZE_128];
TCHAR szBuf[SIZE_128];
DWORD dwIndex;
HWND hSystemLocale = GetDlgItem(hDlg, IDC_SYSTEM_LOCALE);
//
// Get the list of locales and fill in the system locale
// combo box.
//
Intl_EnumLocales(hDlg, hSystemLocale, TRUE);
//
// Get the string for the system default setting.
// Special case Spanish.
//
if ((SysLocaleID == LCID_SPANISH_TRADITIONAL) ||
(SysLocaleID == LCID_SPANISH_INTL))
{
LoadString(hInstance, IDS_SPANISH_NAME, szSystemBuf, SIZE_128);
}
else
{
GetLocaleInfo(SysLocaleID, LOCALE_SLANGUAGE, szSystemBuf, SIZE_128);
}
//
// Select the current system default locale id in the list.
//
dwIndex = ComboBox_FindStringExact(hSystemLocale, -1, szSystemBuf);
if (dwIndex == CB_ERR)
{
dwIndex = ComboBox_FindStringExact(hSystemLocale, -1, szDefaultSystemBuf);
if (dwIndex == CB_ERR)
{
GetLocaleInfo(US_LOCALE, LOCALE_SLANGUAGE, szBuf, SIZE_128);
dwIndex = ComboBox_FindStringExact(hSystemLocale, -1, szBuf);
if (dwIndex == CB_ERR)
{
dwIndex = 0;
}
}
}
ComboBox_SetCurSel(hSystemLocale, dwIndex);
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_SetSystemLocale
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_SetSystemLocale(
HWND hDlg)
{
HWND hSystemLocale = GetDlgItem(hDlg, IDC_SYSTEM_LOCALE);
DWORD dwLocale;
LCID NewLocale;
HCURSOR hcurSave;
//
// Put up the hour glass.
//
hcurSave = SetCursor(LoadCursor(NULL, IDC_WAIT));
//
// Get the current selection.
//
dwLocale = ComboBox_GetCurSel(hSystemLocale);
//
// Get the locale id for the current selection and save it.
//
NewLocale = (LCID)ComboBox_GetItemData(hSystemLocale, dwLocale);
if (IsValidLocale(NewLocale, LCID_SUPPORTED))
{
SysLocaleID = NewLocale;
}
else
{
//
// This shouldn't happen, since the values in the combo box
// should already be installed via the language groups.
// Put up an error message just in case.
//
SetCursor(hcurSave);
ShowMsg( NULL,
IDS_SETUP_STRING,
IDS_TITLE_STRING,
MB_OK_OOPS,
NULL );
return (FALSE);
}
//
// Turn off the hour glass.
//
SetCursor(hcurSave);
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_InitCodePages
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_InitCodePages(
HWND hDlg,
BOOL bInitTime)
{
HWND hwndCP = GetDlgItem(hDlg, IDC_CODEPAGES);
LPCODEPAGE pCP;
DWORD dwExStyle;
RECT Rect;
LV_COLUMN Column;
LV_ITEM Item;
int iIndex;
int RegionalChgStateTemp = RegionalChgState;
//
// Open the Inf file.
//
g_hIntlInf = SetupOpenInfFile(szIntlInf, NULL, INF_STYLE_WIN4, NULL);
if (g_hIntlInf == INVALID_HANDLE_VALUE)
{
return (FALSE);
}
if (!SetupOpenAppendInfFile(NULL, g_hIntlInf, NULL))
{
SetupCloseInfFile(g_hIntlInf);
g_hIntlInf = NULL;
return (FALSE);
}
//
// Get all supported code pages from the inf file.
//
if (Advanced_GetSupportedCodePages() == FALSE)
{
return (FALSE);
}
//
// Close the inf file.
//
SetupCloseInfFile(g_hIntlInf);
g_hIntlInf = NULL;
//
// Enumerate all installed code pages.
//
if (EnumSystemCodePages(Intl_EnumInstalledCPProc, CP_INSTALLED) == FALSE)
{
return (FALSE);
}
//
// We only want to do this the first time we setup the list view.
// Otherwise, we get multiple columns created.
//
if (bInitTime)
{
//
// Create a column for the list view.
//
GetClientRect(hwndCP, &Rect);
Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
Column.fmt = LVCFMT_LEFT;
Column.cx = Rect.right - GetSystemMetrics(SM_CYHSCROLL);
Column.pszText = NULL;
Column.cchTextMax = 0;
Column.iSubItem = 0;
ListView_InsertColumn(hwndCP, 0, &Column);
//
// Set extended list view style to use the check boxes.
//
dwExStyle = ListView_GetExtendedListViewStyle(hwndCP);
ListView_SetExtendedListViewStyle( hwndCP,
dwExStyle |
LVS_EX_CHECKBOXES |
LVS_EX_FULLROWSELECT );
}
//
// Go through the list of code pages and add each one to the
// list view and set the appropriate state.
//
pCP = pCodePages;
while (pCP)
{
//
// Insert the item into the list view.
//
Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
Item.iItem = 0;
Item.iSubItem = 0;
Item.state = 0;
Item.stateMask = LVIS_STATEIMAGEMASK;
Item.pszText = pCP->pszName;
Item.cchTextMax = 0;
Item.iImage = 0;
Item.lParam = (LPARAM)pCP;
iIndex = ListView_InsertItem(hwndCP, &Item);
//
// Set the checked state.
//
// There's a bug in the list view code such that the check mark
// isn't displayed when you set the state through InsertItem, so
// we have to set it explicitly using SetItemState.
//
if (iIndex >= 0)
{
ListView_SetItemState( hwndCP,
iIndex,
(pCP->wStatus & ML_ORIG_INSTALLED)
? INDEXTOSTATEIMAGEMASK(LVIS_SELECTED)
: INDEXTOSTATEIMAGEMASK(LVIS_FOCUSED),
LVIS_STATEIMAGEMASK );
}
//
// Advance to the next code page.
//
pCP = pCP->pNext;
}
//
// Deselect all items.
//
iIndex = ListView_GetItemCount(hwndCP);
while (iIndex > 0)
{
ListView_SetItemState( hwndCP,
iIndex - 1,
0,
LVIS_FOCUSED | LVIS_SELECTED );
iIndex--;
}
//
// Select the first one in the list.
//
ListView_SetItemState( hwndCP,
0,
LVIS_FOCUSED | LVIS_SELECTED,
LVIS_FOCUSED | LVIS_SELECTED );
//
// Restore the change state value for the whole dialog. Thia is required since
// some of the ListView_SetItemState calls above are actually treated as changes
// to the list made by users.
//
RegionalChgState = RegionalChgStateTemp;
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Region_FreeGlobalInfo
//
// Processing for a WM_DESTROY message.
//
////////////////////////////////////////////////////////////////////////////
void Advanced_FreeGlobalInfo()
{
LPCODEPAGE pPreCP, pCurCP;
HANDLE hAlloc;
//
// Remove Code Page info.
//
pCurCP = pCodePages;
pCodePages = NULL;
while (pCurCP)
{
pPreCP = pCurCP;
pCurCP = pPreCP->pNext;
hAlloc = pPreCP->hCodePage;
GlobalUnlock(hAlloc);
GlobalFree(hAlloc);
}
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_ClearValues
//
// Reset each of the list boxes in the advanced property sheet page.
//
////////////////////////////////////////////////////////////////////////////
void Advanced_ClearValues(
HWND hDlg)
{
//
// Clear the system locale
//
ComboBox_ResetContent(GetDlgItem(hDlg, IDC_SYSTEM_LOCALE));
//
// Clear the Code Page list
//
ListView_DeleteAllItems(GetDlgItem(hDlg, IDC_CODEPAGES));
Advanced_FreeGlobalInfo();
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_SetValues
//
// Initialize all of the controls in the advanced property sheet page.
//
////////////////////////////////////////////////////////////////////////////
void Advanced_SetValues(
HWND hDlg,
BOOL bInitTime)
{
//
// Init system locale list.
//
Advanced_InitSystemLocales(hDlg);
//
// Init code page list view.
//
Advanced_InitCodePages(hDlg, bInitTime);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_ApplySettings
//
// For every control that has changed (that affects the Locale settings),
// call Set_Locale_Values to update the user locale information. Notify
// the parent of changes and reset the change flag stored in the property
// sheet page structure appropriately. Redisplay the time sample if
// bRedisplay is TRUE.
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_ApplySettings(
HWND hDlg)
{
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE)(GetWindowLongPtr(hDlg, DWLP_USER));
LPARAM Changes = lpPropSheet->lParam;
HWND hSystemLocale = GetDlgItem(hDlg, IDC_SYSTEM_LOCALE);
DWORD dwLocale;
LCID NewLocale;
HCURSOR hcurSave;
BOOL InvokeSysocmgr = FALSE;
BOOL bReboot = FALSE;
//
// Put up the hour glass.
//
hcurSave = SetCursor(LoadCursor(NULL, IDC_WAIT));
//
// See if there are any changes to the codepage conversions.
//
if (Changes & AD_CodePages)
{
LPCODEPAGE pCP;
HINF hIntlInf;
HSPFILEQ FileQueue;
PVOID QueueContext;
BOOL bInitInf = FALSE;
BOOL fAdd;
BOOL bRet = TRUE;
TCHAR szSection[MAX_PATH];
//
// Go through each code page node to see if anything needs to
// be done.
//
pCP = pCodePages;
while (pCP)
{
//
// See if any changes are necessary for this code page.
//
if ((pCP->wStatus == ML_INSTALL) ||
(pCP->wStatus == (ML_ORIG_INSTALLED | ML_REMOVE)))
{
//
// See if we're installing or removing.
//
fAdd = (pCP->wStatus == ML_INSTALL);
//
// Initialize Inf stuff.
//
if ((!bInitInf) &&
(!Intl_InitInf(hDlg, &hIntlInf, szIntlInf, &FileQueue, &QueueContext)))
{
SetCursor(hcurSave);
return (FALSE);
}
bInitInf = TRUE;
//
// Get the inf section name.
//
//wsprintf( szSection,
// TEXT("%ws%d"),
// fAdd ? szCPInstallPrefix : szCPRemovePrefix,
// pCP->CodePage );
if(FAILED(StringCchPrintf( szSection,
MAX_PATH,
TEXT("%ws%d"),
fAdd ? szCPInstallPrefix : szCPRemovePrefix,
pCP->CodePage )))
{
//
// Our wsprintf call failed.
//
ShowMsg( hDlg,
IDS_ML_COPY_FAILED,
0,
MB_OK_OOPS,
pCP->pszName );
pCP->wStatus = 0;
}
//
// Enqueue the code page files so that they may be
// copied. This only handles the CopyFiles entries in the
// inf file.
//
if (!SetupInstallFilesFromInfSection( hIntlInf,
NULL,
FileQueue,
szSection,
pSetupSourcePath,
SP_COPY_NEWER ))
{
//
// Setup failed to find the code page.
// This shouldn't happen - the inf file is messed up.
//
ShowMsg( hDlg,
IDS_ML_COPY_FAILED,
0,
MB_OK_OOPS,
pCP->pszName );
pCP->wStatus = 0;
}
}
//
// Go to the next code page node.
//
pCP = pCP->pNext;
}
if (bInitInf)
{
DWORD d;
//
// See if we need to install any files.
//
// d = 0: User wants new files or some files were missing;
// Must commit queue.
//
// d = 1: User wants to use existing files and queue is empty;
// Can skip committing queue.
//
// d = 2: User wants to use existing files, but del/ren queues
// not empty. Must commit queue. The copy queue will
// have been emptied, so only del/ren functions will be
// performed.
//
if ((SetupScanFileQueue( FileQueue,
SPQ_SCAN_PRUNE_COPY_QUEUE |
SPQ_SCAN_FILE_VALIDITY,
GetParent(hDlg),
NULL,
NULL,
&d )) && (d != 1))
{
//
// Copy the files in the queue.
//
if (!SetupCommitFileQueue( GetParent(hDlg),
FileQueue,
Intl_MyQueueCallback,
QueueContext ))
{
//
// This can happen if the user hits Cancel from within
// the setup dialog.
//
ShowMsg( hDlg,
IDS_ML_SETUP_FAILED,
0,
MB_OK_OOPS,
NULL );
bRet = FALSE;
goto Advanced_CodepageConverionsSetupError;
}
}
//
// Execute all of the other code page entries in the inf file.
//
pCP = pCodePages;
while (pCP)
{
//
// See if any changes are necessary for this code page.
//
if ((pCP->wStatus == ML_INSTALL) ||
(pCP->wStatus == (ML_ORIG_INSTALLED | ML_REMOVE)))
{
fAdd = (pCP->wStatus == ML_INSTALL);
//
// Get the inf section name.
//
//wsprintf( szSection,
// TEXT("%ws%d"),
// fAdd ? szCPInstallPrefix : szCPRemovePrefix,
// pCP->CodePage );
if(FAILED(StringCchPrintf( szSection,
MAX_PATH,
TEXT("%ws%d"),
fAdd ? szCPInstallPrefix : szCPRemovePrefix,
pCP->CodePage )))
{
//
// This should be impossible but PREfast complains if we
// don't do something.
//
ShowMsg( hDlg,
IDS_ML_INSTALL_FAILED,
0,
MB_OK_OOPS,
pCP->pszName );
bRet = FALSE;
goto Advanced_CodepageConverionsSetupError;
}
//
// Call setup to install other inf info for this
// code page.
//
if (!SetupInstallFromInfSection( GetParent(hDlg),
hIntlInf,
szSection,
SPINST_ALL & ~SPINST_FILES,
NULL,
pSetupSourcePath,
0,
NULL,
NULL,
NULL,
NULL ))
{
//
// Setup failed.
//
// Already copied the code page file, so no need to
// change the status of the code page info here.
//
// This shouldn't happen - the inf file is messed up.
//
ShowMsg( hDlg,
IDS_ML_INSTALL_FAILED,
0,
MB_OK_OOPS,
pCP->pszName );
}
//
// Reset the status to show the new state of this
// code page.
//
pCP->wStatus &= (ML_STATIC);
if (fAdd)
{
pCP->wStatus |= ML_ORIG_INSTALLED;
}
}
//
// Clear out wStatus and go to the next code page node.
//
pCP->wStatus &= (ML_ORIG_INSTALLED | ML_STATIC);
pCP = pCP->pNext;
}
Advanced_CodepageConverionsSetupError:
//
// Close Inf stuff.
//
Intl_CloseInf(hIntlInf, FileQueue, QueueContext);
}
//
// Check if we need a reboot
//
if (RegionalChgState & AD_SystemLocale)
{
bReboot = TRUE;
}
}
//
// See if there are any changes to the system locale.
//
if (Changes & AD_SystemLocale)
{
//
// Get the current selection.
//
dwLocale = ComboBox_GetCurSel(hSystemLocale);
//
// Get the locale id for the current selection and save it.
//
NewLocale = (LCID)ComboBox_GetItemData(hSystemLocale, dwLocale);
if (IsValidLocale(NewLocale, LCID_SUPPORTED))
{
SysLocaleID = NewLocale;
}
else
{
//
// This shouldn't happen, since the values in the combo box
// should already be installed via the language groups.
// Put up an error message just in case.
//
SetCursor(hcurSave);
ShowMsg( NULL,
IDS_SETUP_STRING,
IDS_TITLE_STRING,
MB_OK_OOPS,
NULL );
return (FALSE);
}
//
// See if the current selection is different from the original
// selection.
//
if (RegSysLocaleID != SysLocaleID)
{
//
// Call setup to install the option.
//
if (SetupChangeLocaleEx( hDlg,
SysLocaleID,
pSetupSourcePath,
(g_bSetupCase)
? SP_INSTALL_FILES_QUIETLY
: 0,
NULL,
0 ))
{
//
// If Setup fails, put up a message.
//
SetCursor(hcurSave);
ShowMsg( NULL,
IDS_SETUP_STRING,
IDS_TITLE_STRING,
MB_OK_OOPS,
NULL );
SysLocaleID = GetSystemDefaultLCID();
return (FALSE);
}
//
// Check if we need to proceed with the Font Substitution
//
if (Intl_IsUIFontSubstitute() &&
((LANGID)LANGIDFROMLCID(SysLocaleID) == Intl_GetDotDefaultUILanguage()))
{
Intl_ApplyFontSubstitute(SysLocaleID);
}
//
// Reset the registry system locale value.
//
RegSysLocaleID = SysLocaleID;
//
// Need to make sure the proper keyboard layout is installed.
//
Intl_InstallKeyboardLayout(hDlg, SysLocaleID, 0, FALSE, FALSE, TRUE);
//
// See if we need to reboot.
//
if (SysLocaleID != GetSystemDefaultLCID())
{
bReboot = TRUE;
}
InvokeSysocmgr = TRUE;
}
}
//
// If the system locale changed and we're not running
// in gui setup, then let's invoke sysocmgr.exe.
//
if (!g_bSetupCase && InvokeSysocmgr)
{
//
// Run any necessary apps (for FSVGA/FSNEC installation).
//
Intl_RunRegApps(c_szSysocmgr);
}
//
// Reset the property page settings.
//
PropSheet_UnChanged(GetParent(hDlg), hDlg);
Changes = AD_EverChg;
//
// Turn off the hour glass.
//
SetCursor(hcurSave);
//
// See if we need to display the reboot message.
//
if ((!g_bSetupCase) && (bReboot))
{
if(RegionalChgState & Process_Languages )
{
RegionalChgState &= ~(AD_CodePages | AD_SystemLocale);
}
else
{
if (ShowMsg( hDlg,
IDS_REBOOT_STRING,
IDS_TITLE_STRING,
MB_YESNO | MB_ICONQUESTION,
NULL ) == IDYES)
{
Intl_RebootTheSystem(TRUE);
}
}
}
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_ValidatePPS
//
// Validate each of the combo boxes whose values are constrained.
// If any of the input fails, notify the user and then return FALSE
// to indicate validation failure.
//
////////////////////////////////////////////////////////////////////////////
BOOL Advanced_ValidatePPS(
HWND hDlg,
LPARAM Changes)
{
//
// If nothing has changed, return TRUE immediately.
//
if (Changes <= AD_EverChg)
{
return (TRUE);
}
//
// See if the system locale has changed.
//
if (Changes & AD_SystemLocale)
{
HWND hSystemLocale = GetDlgItem(hDlg, IDC_SYSTEM_LOCALE);
DWORD dwLocale = ComboBox_GetCurSel(hSystemLocale);
LCID NewLocale;
//
// Get the locale id for the current selection and save it.
//
NewLocale = (LCID)ComboBox_GetItemData(hSystemLocale, dwLocale);
if (IsValidLocale(NewLocale, LCID_SUPPORTED))
{
SysLocaleID = NewLocale;
}
else
{
//
// This shouldn't happen, since the values in the combo box
// should already be installed via the language groups.
// Put up an error message just in case.
//
ShowMsg( NULL,
IDS_SETUP_STRING,
IDS_TITLE_STRING,
MB_OK_OOPS,
NULL );
return (FALSE);
}
}
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// Advanced_InitPropSheet
//
// The extra long value for the property sheet page is used as a set of
// state or change flags for each of the list boxes in the property sheet.
// Initialize this value to 0. Call Advanced_SetValues with the property
// sheet handle to initialize all of the property sheet controls. Limit
// the length of the text in some of the ComboBoxes.
//
////////////////////////////////////////////////////////////////////////////
void Advanced_InitPropSheet(
HWND hDlg,
LPARAM lParam)
{
//
// The lParam holds a pointer to the property sheet page. Save it
// for later reference.
//
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
//
// Set values.
//
if (pLanguageGroups == NULL)
{
Intl_LoadLanguageGroups(hDlg);
}
Advanced_SetValues(hDlg, TRUE);
//
// If we are in setup mode, we need to disable the Default User
// Account UI.
//
if (g_bSetupCase)
{
HWND hUIDefUserBox = GetDlgItem(hDlg, IDC_GROUPBOX3);
HWND hUIDefUser = GetDlgItem(hDlg, IDC_DEFAULT_USER);
EnableWindow(hUIDefUserBox, FALSE);
EnableWindow(hUIDefUser, FALSE);
ShowWindow(hUIDefUserBox, SW_HIDE);
ShowWindow(hUIDefUser, SW_HIDE);
}
}
////////////////////////////////////////////////////////////////////////////
//
// AdvancedDlgProc
//
////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK AdvancedDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE)(GetWindowLongPtr(hDlg, DWLP_USER));
switch (message)
{
case ( WM_NOTIFY ) :
{
LPNMHDR lpnm = (NMHDR *)lParam;
switch (lpnm->code)
{
case ( PSN_SETACTIVE ) :
{
//
// If there has been a change in the regional Locale
// setting, clear all of the current info in the
// property sheet, get the new values, and update the
// appropriate registry values.
//
if (Verified_Regional_Chg & Process_Advanced)
{
Verified_Regional_Chg &= ~Process_Advanced;
Advanced_ClearValues(hDlg);
Advanced_SetValues(hDlg, FALSE);
lpPropSheet->lParam = 0;
}
break;
}
case ( PSN_KILLACTIVE ) :
{
//
// Validate the entries on the property page.
//
SetWindowLongPtr( hDlg,
DWLP_MSGRESULT,
!Advanced_ValidatePPS(hDlg, lpPropSheet->lParam) );
break;
}
case ( PSN_APPLY ) :
{
//
// Apply the settings.
//
if (Advanced_ApplySettings(hDlg))
{
SetWindowLongPtr( hDlg,
DWLP_MSGRESULT,
PSNRET_NOERROR );
//
// Zero out the AD_EverChg bit.
//
lpPropSheet->lParam = 0;
}
else
{
SetWindowLongPtr( hDlg,
DWLP_MSGRESULT,
PSNRET_INVALID_NOCHANGEPAGE );
}
break;
}
case ( NM_CUSTOMDRAW ) :
{
Advanced_ListViewCustomDraw(hDlg, (LPNMLVCUSTOMDRAW)lParam);
return (TRUE);
}
case ( LVN_ITEMCHANGING ) :
{
Advanced_ListViewChanging(hDlg, (NM_LISTVIEW *)lParam);
break;
}
case ( LVN_ITEMCHANGED ) :
{
//
// Save the change to the code pages.
//
if (Advanced_ListViewChanged( hDlg,
IDC_CODEPAGES,
(NM_LISTVIEW *)lParam ))
{
//
// Note that the code pages have changed and
// enable the apply button.
//
lpPropSheet->lParam |= AD_CodePages;
PropSheet_Changed(GetParent(hDlg), hDlg);
RegionalChgState |= AD_CodePages;
}
break;
}
case ( NM_CLICK ) :
case ( NM_DBLCLK ) :
{
Advanced_ListViewClick(hDlg, (NMHDR*)lParam);
}
default :
{
return (FALSE);
}
}
break;
}
case ( WM_INITDIALOG ) :
{
Advanced_InitPropSheet(hDlg, lParam);
break;
}
case ( WM_DESTROY ) :
{
Advanced_FreeGlobalInfo();
break;
}
case ( WM_HELP ) :
{
WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle,
szHelpFile,
HELP_WM_HELP,
(DWORD_PTR)(LPTSTR)aAdvancedHelpIds );
break;
}
case ( WM_CONTEXTMENU ) : // right mouse click
{
WinHelp( (HWND)wParam,
szHelpFile,
HELP_CONTEXTMENU,
(DWORD_PTR)(LPTSTR)aAdvancedHelpIds );
break;
}
case ( WM_COMMAND ) :
{
switch (LOWORD(wParam))
{
case ( IDC_SYSTEM_LOCALE ) :
{
if (HIWORD(wParam) == CBN_SELCHANGE)
{
//
// Set the AD_SystemLocale change flag.
//
lpPropSheet->lParam |= AD_SystemLocale;
PropSheet_Changed(GetParent(hDlg), hDlg);
RegionalChgState |= AD_SystemLocale;
}
break;
}
case ( IDC_DEFAULT_USER ) :
{
BOOL curState;
//
// Verify the check box state.
//
if (IsDlgButtonChecked(hDlg, IDC_DEFAULT_USER))
{
ShowMsg( hDlg,
IDS_DEF_USER_CONF,
IDS_DEF_USER_CONF_TITLE,
MB_OK_OOPS,
NULL);
g_bDefaultUser = TRUE;
}
else
{
g_bDefaultUser = FALSE;
}
//
// Set the AD_DefaultUser change flag.
//
if (g_bDefaultUser)
{
lpPropSheet->lParam |= AD_DefaultUser;
PropSheet_Changed(GetParent(hDlg), hDlg);
}
else
{
lpPropSheet->lParam &= ~AD_DefaultUser;
}
break;
}
}
break;
}
default :
{
return (FALSE);
}
}
return (TRUE);
}