|
|
/*++
Copyright (c) 1994-2000, Microsoft Corporation All rights reserved.
Module Name:
timedlg.c
Abstract:
This module implements the time property sheet for the Regional Options applet.
Revision History:
--*/
//
// Include Files.
//
#include "intl.h"
#include <windowsx.h>
#include <tchar.h>
#include "intlhlp.h"
#include "maxvals.h"
#define STRSAFE_LIB
#include <strsafe.h>
//
// Global Variables.
//
static TCHAR sz_s1159[MAX_S1159 + 1]; static TCHAR sz_s2359[MAX_S2359 + 1]; static TCHAR sz_sTime[MAX_STIME + 1]; static TCHAR sz_sTimeFormat[MAX_FORMAT + 1];
TCHAR szNLS_TimeStyle[SIZE_128];
//
// Context Help Ids.
//
static int aTimeHelpIds[] = { IDC_GROUPBOX1, IDH_COMM_GROUPBOX, IDC_SAMPLELBL1, IDH_INTL_TIME_SAMPLE, IDC_SAMPLE1, IDH_INTL_TIME_SAMPLE, IDC_SAMPLE1A, IDH_INTL_TIME_SAMPLE_ARABIC, IDC_TIME_STYLE, IDH_INTL_TIME_FORMAT, IDC_SEPARATOR, IDH_INTL_TIME_SEPARATOR, IDC_AM_SYMBOL, IDH_INTL_TIME_AMSYMBOL, IDC_PM_SYMBOL, IDH_INTL_TIME_PMSYMBOL, IDC_GROUPBOX2, IDH_INTL_TIME_FORMAT_NOTATION, IDC_SAMPLE2, IDH_INTL_TIME_FORMAT_NOTATION,
0, 0 };
////////////////////////////////////////////////////////////////////////////
//
// Time_DisplaySample
//
// Update the Time sample. Format the time based on the user's
// current locale settings.
//
////////////////////////////////////////////////////////////////////////////
void Time_DisplaySample( HWND hDlg) { TCHAR szBuf[MAX_SAMPLE_SIZE];
//
// Show or hide the Arabic info based on the current user locale id.
//
ShowWindow(GetDlgItem(hDlg, IDC_SAMPLE1A), bShowArabic ? SW_SHOW : SW_HIDE);
//
// Get the string representing the time format for the current system
// time and display it. If the sample in the buffer is valid, display
// it. Otherwise, display a message box indicating that there is a
// problem retrieving the locale information.
//
if (GetTimeFormat(UserLocaleID, 0, NULL, NULL, szBuf, MAX_SAMPLE_SIZE)) { SetDlgItemText(hDlg, IDC_SAMPLE1, szBuf); if (bShowArabic) { SetDlgItemText(hDlg, IDC_SAMPLE1A, szBuf); SetDlgItemRTL(hDlg, IDC_SAMPLE1A); } } else { MessageBox(hDlg, szLocaleGetError, NULL, MB_OK | MB_ICONINFORMATION); } }
////////////////////////////////////////////////////////////////////////////
//
// Time_SaveValues
//
// Save values in the case that we need to restore them.
//
////////////////////////////////////////////////////////////////////////////
void Time_SaveValues() { //
// Save registry values.
//
if (!GetLocaleInfo( UserLocaleID, LOCALE_S1159, sz_s1159, MAX_S1159 + 1 )) { //_tcscpy(sz_s1159, TEXT("AM"));
if(FAILED(StringCchCopy(sz_s1159, MAX_S1159+1, TEXT("AM")))) { // This should be impossible, but we need to avoid PREfast complaints.
} } if (!GetLocaleInfo( UserLocaleID, LOCALE_S2359, sz_s2359, MAX_S2359 + 1 )) { //_tcscpy(sz_s2359, TEXT("PM"));
if(FAILED(StringCchCopy(sz_s2359, MAX_S2359+1, TEXT("PM")))) { // This should be impossible, but we need to avoid PREfast complaints.
} } if (!GetLocaleInfo( UserLocaleID, LOCALE_STIME, sz_sTime, MAX_STIME + 1 )) { //_tcscpy(sz_sTime, TEXT(":"));
if(FAILED(StringCchCopy(sz_sTime, MAX_STIME+1, TEXT(":")))) { // This should be impossible, but we need to avoid PREfast complaints.
} } if (!GetLocaleInfo( UserLocaleID, LOCALE_STIMEFORMAT, sz_sTimeFormat, MAX_FORMAT + 1 )) { //_tcscpy(sz_sTimeFormat, TEXT("h:mm:ss tt"));
if(FAILED(StringCchCopy(sz_sTimeFormat, MAX_FORMAT+1, TEXT("h:mm:ss tt")))) { // This should be impossible, but we need to avoid PREfast complaints.
} } }
////////////////////////////////////////////////////////////////////////////
//
// Time_RestoreValues
//
////////////////////////////////////////////////////////////////////////////
void Time_RestoreValues() { if (g_dwCustChange & Process_Time) { SetLocaleInfo(UserLocaleID, LOCALE_S1159, sz_s1159); SetLocaleInfo(UserLocaleID, LOCALE_S2359, sz_s2359); SetLocaleInfo(UserLocaleID, LOCALE_STIME, sz_sTime); SetLocaleInfo(UserLocaleID, LOCALE_STIMEFORMAT, sz_sTimeFormat); } }
////////////////////////////////////////////////////////////////////////////
//
// Time_ClearValues
//
// Reset each of the list boxes in the time property sheet page.
//
////////////////////////////////////////////////////////////////////////////
void Time_ClearValues( HWND hDlg) { ComboBox_ResetContent(GetDlgItem(hDlg, IDC_AM_SYMBOL)); ComboBox_ResetContent(GetDlgItem(hDlg, IDC_PM_SYMBOL)); ComboBox_ResetContent(GetDlgItem(hDlg, IDC_SEPARATOR)); ComboBox_ResetContent(GetDlgItem(hDlg, IDC_TIME_STYLE)); }
////////////////////////////////////////////////////////////////////////////
//
// Time_SetValues
//
// Initialize all of the controls in the time property sheet page.
//
////////////////////////////////////////////////////////////////////////////
void Time_SetValues( HWND hDlg) { TCHAR szBuf[SIZE_128]; DWORD dwIndex; HWND hCtrl = GetDlgItem(hDlg, IDC_TIME_STYLE);
//
// Initialize the dropdown box for the current locale setting for:
// AM Symbol, PM Symbol, and Time Separator.
//
DropDown_Use_Locale_Values(hDlg, LOCALE_S1159, IDC_AM_SYMBOL); DropDown_Use_Locale_Values(hDlg, LOCALE_S2359, IDC_PM_SYMBOL); DropDown_Use_Locale_Values(hDlg, LOCALE_STIME, IDC_SEPARATOR);
//
// Initialize and Lock function. If it succeeds, call enum function to
// enumerate all possible values for the list box via a call to EnumProc.
// EnumProc will call Set_List_Values for each of the string values it
// receives. When the enumeration of values is complete, call
// Set_List_Values to clear the dialog item specific data and to clear
// the lock on the function. Perform this set of operations for all of
// the Time Styles.
//
if (Set_List_Values(hDlg, IDC_TIME_STYLE, 0)) { EnumTimeFormats(EnumProc, UserLocaleID, 0); Set_List_Values(0, IDC_TIME_STYLE, 0); dwIndex = 0; if (GetLocaleInfo(UserLocaleID, LOCALE_STIMEFORMAT, szBuf, SIZE_128)) { dwIndex = ComboBox_FindString(hCtrl, -1, szBuf); } else { MessageBox(hDlg, szLocaleGetError, NULL, MB_OK | MB_ICONINFORMATION); }
Localize_Combobox_Styles(hDlg, IDC_TIME_STYLE, LOCALE_STIMEFORMAT); ComboBox_SetCurSel(hCtrl, dwIndex); }
//
// Display the current sample that represents all of the locale settings.
//
Time_DisplaySample(hDlg); }
////////////////////////////////////////////////////////////////////////////
//
// Time_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 Time_ApplySettings( HWND hDlg, BOOL bRedisplay) { TCHAR szBuf[SIZE_128]; DWORD dwIndex; HWND hCtrl; LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE)(GetWindowLongPtr(hDlg, DWLP_USER)); LPARAM Changes = lpPropSheet->lParam;
if (Changes & TC_1159) { if (!Set_Locale_Values( hDlg, LOCALE_S1159, IDC_AM_SYMBOL, TEXT("s1159"), FALSE, 0, 0, NULL )) { return (FALSE); } } if (Changes & TC_2359) { if (!Set_Locale_Values( hDlg, LOCALE_S2359, IDC_PM_SYMBOL, TEXT("s2359"), FALSE, 0, 0, NULL )) { return (FALSE); } } if (Changes & TC_TimeFmt) { //
// szNLS_TimeStyle is set in Time_ValidatePPS.
//
if (!Set_Locale_Values( hDlg, LOCALE_STIMEFORMAT, IDC_TIME_STYLE, 0, FALSE, 0, 0, szNLS_TimeStyle )) { return (FALSE); }
#ifndef WINNT
//
// The time marker gets:
// set to Null for 24 hour format and
// doesn't change for 12 hour format.
//
GetProfileString(szIntl, TEXT("iTime"), TEXT("0"), pTestBuf, 10); if (*pTestBuf == TC_FullTime) { SetLocaleInfo(UserLocaleID, LOCALE_S1159, TEXT("")); SetLocaleInfo(UserLocaleID, LOCALE_S2359, TEXT("")); } else { //
// Set time marker in the registry.
//
if (!Set_Locale_Values( 0, LOCALE_S1159, 0, TEXT("s1159"), TRUE, 0, 0, NULL )) { return (FALSE); } if (!Set_Locale_Values( 0, LOCALE_S2359, 0, TEXT("s2359"), TRUE, 0, 0, NULL )) { return (FALSE); } } #endif
//
// If the time separator has areadly been changed, then don't update
// it now as it will be updated down below.
//
if (!(Changes & TC_STime)) { //
// Since the time style changed, reset time separator list box.
//
ComboBox_ResetContent(GetDlgItem(hDlg, IDC_SEPARATOR)); DropDown_Use_Locale_Values(hDlg, LOCALE_STIME, IDC_SEPARATOR); if (!Set_Locale_Values( hDlg, LOCALE_STIME, IDC_SEPARATOR, TEXT("sTime"), FALSE, 0, 0, NULL )) { return (FALSE); } }
//
// Also need to reset the AM and PM list boxes.
//
ComboBox_ResetContent(GetDlgItem(hDlg, IDC_AM_SYMBOL)); ComboBox_ResetContent(GetDlgItem(hDlg, IDC_PM_SYMBOL)); DropDown_Use_Locale_Values(hDlg, LOCALE_S1159, IDC_AM_SYMBOL); DropDown_Use_Locale_Values(hDlg, LOCALE_S2359, IDC_PM_SYMBOL); } if (Changes & TC_STime) { if (!Set_Locale_Values( hDlg, LOCALE_STIME, IDC_SEPARATOR, TEXT("sTime"), FALSE, 0, 0, NULL )) { return (FALSE); }
//
// Since the time separator changed, update the time style
// list box.
//
hCtrl = GetDlgItem(hDlg, IDC_TIME_STYLE); ComboBox_ResetContent(hCtrl); if (Set_List_Values(hDlg, IDC_TIME_STYLE, 0)) { EnumTimeFormats(EnumProc, UserLocaleID, 0); Set_List_Values(0, IDC_TIME_STYLE, 0); dwIndex = 0; if (GetLocaleInfo(UserLocaleID, LOCALE_STIMEFORMAT, szBuf, SIZE_128)) { dwIndex = ComboBox_FindString(hCtrl, -1, szBuf); } else { MessageBox(hDlg, szLocaleGetError, NULL, MB_OK | MB_ICONINFORMATION); }
Localize_Combobox_Styles( hDlg, IDC_TIME_STYLE, LOCALE_STIMEFORMAT ); ComboBox_SetCurSel(hCtrl, dwIndex); } }
PropSheet_UnChanged(GetParent(hDlg), hDlg); lpPropSheet->lParam = TC_EverChg;
//
// Display the current sample that represents all of the locale settings.
//
if (bRedisplay) { Time_DisplaySample(hDlg); }
//
// Changes made in the second level.
//
if (Changes) { g_dwCustChange |= Process_Time; }
//
// Return success.
//
return (TRUE); }
////////////////////////////////////////////////////////////////////////////
//
// Time_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 Time_ValidatePPS( HWND hDlg, LPARAM Changes) { //
// If nothing has changed, return TRUE immediately.
//
if (Changes <= TC_EverChg) { return (TRUE); }
//
// If the AM symbol has changed, ensure that there are no digits
// contained in the new symbol.
//
if (Changes & TC_1159 && Item_Has_Digits(hDlg, IDC_AM_SYMBOL, TRUE)) { No_Numerals_Error(hDlg, IDC_AM_SYMBOL, IDS_LOCALE_AM_SYM); return (FALSE); }
//
// If the PM symbol has changed, ensure that there are no digits
// contained in the new symbol.
//
if (Changes & TC_2359 && Item_Has_Digits(hDlg, IDC_PM_SYMBOL, TRUE)) { No_Numerals_Error(hDlg, IDC_PM_SYMBOL, IDS_LOCALE_PM_SYM); return (FALSE); }
//
// If the time separator has changed, ensure that there are no digits
// and no invalid characters contained in the new separator.
//
if (Changes & TC_STime && Item_Has_Digits_Or_Invalid_Chars( hDlg, IDC_SEPARATOR, FALSE, szInvalidSTime )) { No_Numerals_Error(hDlg, IDC_SEPARATOR, IDS_LOCALE_TIME_SEP); return (FALSE); }
//
// If the time style has changed, ensure that there are only characters
// in this set " Hhmst,-./:;\" or localized equivalent, the separator
// string, and text enclosed in single quotes.
//
if (Changes & TC_TimeFmt) { if (NLSize_Style( hDlg, IDC_TIME_STYLE, szNLS_TimeStyle, LOCALE_STIMEFORMAT ) || Item_Check_Invalid_Chars( hDlg, szNLS_TimeStyle, szTimeChars, IDC_SEPARATOR, FALSE, szTCaseSwap, IDC_TIME_STYLE )) { Invalid_Chars_Error(hDlg, IDC_TIME_STYLE, IDS_LOCALE_TIME); return (FALSE); } }
//
// Return success.
//
return (TRUE); }
////////////////////////////////////////////////////////////////////////////
//
// Time_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 Time_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 Time_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);
Time_SetValues(hDlg); szNLS_TimeStyle[0] = 0;
ComboBox_LimitText(GetDlgItem(hDlg, IDC_AM_SYMBOL), MAX_S1159); ComboBox_LimitText(GetDlgItem(hDlg, IDC_PM_SYMBOL), MAX_S2359); ComboBox_LimitText(GetDlgItem(hDlg, IDC_SEPARATOR), MAX_STIME); ComboBox_LimitText(GetDlgItem(hDlg, IDC_TIME_STYLE), MAX_FORMAT); }
////////////////////////////////////////////////////////////////////////////
//
// TimeDlgProc
//
////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK TimeDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { NMHDR *lpnm; LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE)(GetWindowLongPtr(hDlg, DWLP_USER));
switch (message) { case ( WM_NOTIFY ) : { 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_Time) { Verified_Regional_Chg &= ~Process_Time; Time_ClearValues(hDlg); Time_SetValues(hDlg); lpPropSheet->lParam = 0; } break; } case ( PSN_KILLACTIVE ) : { //
// Validate the entries on the property page.
//
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, !Time_ValidatePPS( hDlg, lpPropSheet->lParam ) ); break; } case ( PSN_APPLY ) : { //
// Apply the settings.
//
if (Time_ApplySettings(hDlg, TRUE)) { SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
//
// Zero out the TC_EverChg bit.
//
lpPropSheet->lParam = 0; } else { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE ); }
break; } default : { return (FALSE); } } break; } case ( WM_INITDIALOG ) : { Time_InitPropSheet(hDlg, lParam); Time_SaveValues(); break; } case ( WM_DESTROY ) : { break; } case ( WM_HELP ) : { WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, szHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)aTimeHelpIds ); break; } case ( WM_CONTEXTMENU ) : // right mouse click
{ WinHelp( (HWND)wParam, szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPTSTR)aTimeHelpIds ); break; } case ( WM_COMMAND ) : { switch (LOWORD(wParam)) { case ( IDC_AM_SYMBOL ) : { if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE) { lpPropSheet->lParam |= TC_1159; } break; } case ( IDC_PM_SYMBOL ) : { if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE) { lpPropSheet->lParam |= TC_2359; } break; } case ( IDC_SEPARATOR ) : { if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE) { lpPropSheet->lParam |= TC_STime; } break; } case ( IDC_TIME_STYLE ) : { if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE) { lpPropSheet->lParam |= TC_TimeFmt; } break; } }
//
// Turn on ApplyNow button.
//
if (lpPropSheet->lParam > TC_EverChg) { PropSheet_Changed(GetParent(hDlg), hDlg); }
break; } default : { return (FALSE); } }
//
// Return success.
//
return (TRUE); }
|