From 6388bdc46c3f94e6780c43c6acdc8ef4a7f6dc73 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 5 Nov 2004 11:48:45 +0000 Subject: [PATCH] - Time zone combobox must have CBS_DROPDOWNLIST style. - Select and install time zone information. svn path=/trunk/; revision=11540 --- reactos/lib/syssetup/globals.h | 26 +++ reactos/lib/syssetup/syssetup_Cz.rc | 4 +- reactos/lib/syssetup/syssetup_De.rc | 4 +- reactos/lib/syssetup/syssetup_En.rc | 4 +- reactos/lib/syssetup/syssetup_Fr.rc | 4 +- reactos/lib/syssetup/wizard.c | 273 ++++++++++++++++++++++------ 6 files changed, 254 insertions(+), 61 deletions(-) diff --git a/reactos/lib/syssetup/globals.h b/reactos/lib/syssetup/globals.h index b4a47d0c880..c3312fecac0 100644 --- a/reactos/lib/syssetup/globals.h +++ b/reactos/lib/syssetup/globals.h @@ -16,6 +16,29 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +typedef struct _TZ_INFO +{ + LONG Bias; + LONG StandardBias; + LONG DaylightBias; + SYSTEMTIME StandardDate; + SYSTEMTIME DaylightDate; +} TZ_INFO, *PTZ_INFO; + +typedef struct _TIMEZONE_ENTRY +{ + struct _TIMEZONE_ENTRY *Prev; + struct _TIMEZONE_ENTRY *Next; + WCHAR Description[64]; /* 'Display' */ + WCHAR StandardName[32]; /* 'Std' */ + WCHAR DaylightName[32]; /* 'Dlt' */ + TZ_INFO TimezoneInfo; /* 'TZI' */ + ULONG Index; +} TIMEZONE_ENTRY, *PTIMEZONE_ENTRY; + + + typedef struct _SETUPDATA { HFONT hTitleFont; @@ -25,6 +48,9 @@ typedef struct _SETUPDATA TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; /* max. 63 characters */ TCHAR AdminPassword[15]; /* max. 14 characters */ + SYSTEMTIME SystemTime; + PTIMEZONE_ENTRY TimeZoneListHead; + PTIMEZONE_ENTRY TimeZoneListTail; } SETUPDATA, *PSETUPDATA; diff --git a/reactos/lib/syssetup/syssetup_Cz.rc b/reactos/lib/syssetup/syssetup_Cz.rc index 22b1b746fc4..777ff0c28a4 100644 --- a/reactos/lib/syssetup/syssetup_Cz.rc +++ b/reactos/lib/syssetup/syssetup_Cz.rc @@ -100,8 +100,8 @@ BEGIN DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 29, 54, 14 LTEXT "Timezone", IDC_STATIC, 53, 80, 253, 8 COMBOBOX IDC_TIMEZONELIST, 53, 96, 201, 42, - CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTOCHECKBOX "Daylight savings", + CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTOCHECKBOX "Automatically adjust clock for &daylight saving changes", IDC_DAYLIGHTSAVINGS, 53, 124, 201, 10 END diff --git a/reactos/lib/syssetup/syssetup_De.rc b/reactos/lib/syssetup/syssetup_De.rc index 9e9d73f3866..826df9a3474 100644 --- a/reactos/lib/syssetup/syssetup_De.rc +++ b/reactos/lib/syssetup/syssetup_De.rc @@ -102,8 +102,8 @@ BEGIN DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 29, 54, 14 LTEXT "Zeitzone", IDC_STATIC, 53, 80, 253, 8 COMBOBOX IDC_TIMEZONELIST, 53, 96, 201, 42, - CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTOCHECKBOX "Automatiche Umstellung auf Sommer-/Winterzeit", + CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTOCHECKBOX "&Uhr automatisch auf Sommer-/Winterzeit umstellen", IDC_DAYLIGHTSAVINGS, 53, 124, 201, 10 END diff --git a/reactos/lib/syssetup/syssetup_En.rc b/reactos/lib/syssetup/syssetup_En.rc index c556ce9c2cf..ef3074b2d9d 100644 --- a/reactos/lib/syssetup/syssetup_En.rc +++ b/reactos/lib/syssetup/syssetup_En.rc @@ -102,8 +102,8 @@ BEGIN DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 29, 54, 14 LTEXT "Timezone", IDC_STATIC, 53, 80, 253, 8 COMBOBOX IDC_TIMEZONELIST, 53, 96, 201, 42, - CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTOCHECKBOX "Daylight savings", + CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTOCHECKBOX "Automatically adjust clock for &daylight saving changes", IDC_DAYLIGHTSAVINGS, 53, 124, 201, 10 END diff --git a/reactos/lib/syssetup/syssetup_Fr.rc b/reactos/lib/syssetup/syssetup_Fr.rc index 03763d9869a..c660afc08ea 100644 --- a/reactos/lib/syssetup/syssetup_Fr.rc +++ b/reactos/lib/syssetup/syssetup_Fr.rc @@ -103,8 +103,8 @@ BEGIN DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 29, 54, 14 LTEXT "Timezone", IDC_STATIC, 53, 80, 253, 8 COMBOBOX IDC_TIMEZONELIST, 53, 96, 201, 42, - CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTOCHECKBOX "Daylight savings", + CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTOCHECKBOX "Automatically adjust clock for &daylight saving changes", IDC_DAYLIGHTSAVINGS, 53, 124, 201, 10 END diff --git a/reactos/lib/syssetup/wizard.c b/reactos/lib/syssetup/wizard.c index cba8746f05e..8cfd7e575fa 100644 --- a/reactos/lib/syssetup/wizard.c +++ b/reactos/lib/syssetup/wizard.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: wizard.c,v 1.10 2004/11/02 15:42:09 ekohl Exp $ +/* $Id: wizard.c,v 1.11 2004/11/05 11:48:45 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -515,11 +515,29 @@ LocalePageDlgProc(HWND hwndDlg, } +static PTIMEZONE_ENTRY +GetLargerTimeZoneEntry(PSETUPDATA SetupData, DWORD Index) +{ + PTIMEZONE_ENTRY Entry; + + Entry = SetupData->TimeZoneListHead; + while (Entry != NULL) + { + if (Entry->Index >= Index) + return Entry; + + Entry = Entry->Next; + } + + return NULL; +} + + static VOID -InitTimeZoneList(HWND hwnd) +CreateTimeZoneList(PSETUPDATA SetupData) { WCHAR szKeyName[256]; - WCHAR szValue[256]; +// WCHAR szValue[256]; DWORD dwIndex; DWORD dwNameSize; DWORD dwValueSize; @@ -527,6 +545,9 @@ InitTimeZoneList(HWND hwnd) HKEY hZonesKey; HKEY hZoneKey; + PTIMEZONE_ENTRY Entry; + PTIMEZONE_ENTRY Current; + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones", 0, @@ -556,84 +577,226 @@ InitTimeZoneList(HWND hwnd) &hZoneKey)) break; - dwValueSize = 256 * sizeof(WCHAR); + Entry = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TIMEZONE_ENTRY)); + if (Entry == NULL) + { + RegCloseKey(hZoneKey); + break; + } + + dwValueSize = 64 * sizeof(WCHAR); if (RegQueryValueExW(hZoneKey, L"Display", NULL, NULL, - (LPBYTE)szValue, + (LPBYTE)&Entry->Description, &dwValueSize)) { RegCloseKey(hZoneKey); break; } - SendMessageW(hwnd, - CB_ADDSTRING, - 0, - (LPARAM)szValue); + dwValueSize = 32 * sizeof(WCHAR); + if (RegQueryValueExW(hZoneKey, + L"Std", + NULL, + NULL, + (LPBYTE)&Entry->StandardName, + &dwValueSize)) + { + RegCloseKey(hZoneKey); + break; + } + + dwValueSize = 32 * sizeof(WCHAR); + if (RegQueryValueExW(hZoneKey, + L"Dlt", + NULL, + NULL, + (LPBYTE)&Entry->DaylightName, + &dwValueSize)) + { + RegCloseKey(hZoneKey); + break; + } + + dwValueSize = sizeof(DWORD); + if (RegQueryValueExW(hZoneKey, + L"Index", + NULL, + NULL, + (LPBYTE)&Entry->Index, + &dwValueSize)) + { + RegCloseKey(hZoneKey); + break; + } + + dwValueSize = sizeof(TZ_INFO); + if (RegQueryValueExW(hZoneKey, + L"TZI", + NULL, + NULL, + (LPBYTE)&Entry->TimezoneInfo, + &dwValueSize)) + { + RegCloseKey(hZoneKey); + break; + } RegCloseKey(hZoneKey); + if (SetupData->TimeZoneListHead == NULL && + SetupData->TimeZoneListTail == NULL) + { + Entry->Prev = NULL; + Entry->Next = NULL; + SetupData->TimeZoneListHead = Entry; + SetupData->TimeZoneListTail = Entry; + } + else + { + Current = GetLargerTimeZoneEntry(SetupData, Entry->Index); + if (Current != NULL) + { + if (Current == SetupData->TimeZoneListHead) + { + /* Prepend to head */ + Entry->Prev = NULL; + Entry->Next = SetupData->TimeZoneListHead; + SetupData->TimeZoneListHead->Prev = Entry; + SetupData->TimeZoneListHead = Entry; + } + else + { + /* Insert before current */ + Entry->Prev = Current->Prev; + Entry->Next = Current; + Current->Prev->Next = Entry; + Current->Prev = Entry; + } + } + else + { + /* Append to tail */ + Entry->Prev = SetupData->TimeZoneListTail; + Entry->Next = NULL; + SetupData->TimeZoneListTail->Next = Entry; + SetupData->TimeZoneListTail = Entry; + } + } + dwIndex++; } RegCloseKey(hZonesKey); +} + + +#if 0 +static VOID +DestroyTimeZoneList(PSETUPDATA SetupData) +{ + +} +#endif + + +static VOID +ShowTimeZoneList(HWND hwnd, PSETUPDATA SetupData) +{ + PTIMEZONE_ENTRY Entry; + + Entry = SetupData->TimeZoneListHead; + while (Entry != NULL) + { + SendMessageW(hwnd, + CB_ADDSTRING, + 0, + (LPARAM)Entry->Description); + + + Entry = Entry->Next; + } SendMessageW(hwnd, CB_SETCURSEL, (WPARAM)0, // index 0); - -#if 0 - SendMessage(hwnd, - CB_ADDSTRING, - 0, - (LPARAM)"Test0"); - SendMessage(hwnd, - CB_ADDSTRING, - 0, - (LPARAM)"Test1"); - SendMessage(hwnd, - CB_ADDSTRING, - 0, - (LPARAM)"Test2"); - SendMessage(hwnd, - CB_ADDSTRING, - 0, - (LPARAM)"Test3"); - - SendMessage(hwnd, - CB_SETCURSEL, - (WPARAM)0, // index - 0); -#endif } static VOID -SetLocalDateTime(HWND hwnd) +SetLocalTimeZone(HWND hwnd, PSETUPDATA SetupData) +{ + TIME_ZONE_INFORMATION TimeZoneInformation; + PTIMEZONE_ENTRY Entry; + DWORD dwIndex; + DWORD i; + + dwIndex = SendMessage(hwnd, + CB_GETCURSEL, + 0, + 0); + + i = 0; + Entry = SetupData->TimeZoneListHead; + while (i < dwIndex) + { + if (Entry == NULL) + return; + + i++; + Entry = Entry->Next; + } + + wcscpy(TimeZoneInformation.StandardName, + Entry->StandardName); + wcscpy(TimeZoneInformation.DaylightName, + Entry->DaylightName); + + TimeZoneInformation.Bias = Entry->TimezoneInfo.Bias; + TimeZoneInformation.StandardBias = Entry->TimezoneInfo.StandardBias; + TimeZoneInformation.DaylightBias = Entry->TimezoneInfo.DaylightBias; + + memcpy(&TimeZoneInformation.StandardDate, + &Entry->TimezoneInfo.StandardDate, + sizeof(SYSTEMTIME)); + memcpy(&TimeZoneInformation.DaylightDate, + &Entry->TimezoneInfo.DaylightDate, + sizeof(SYSTEMTIME)); + + /* Set time zone information */ + SetTimeZoneInformation(&TimeZoneInformation); +} + + +static BOOL +GetLocalSystemTime(HWND hwnd, PSETUPDATA SetupData) { SYSTEMTIME Date; SYSTEMTIME Time; - SYSTEMTIME SystemTime; - if (DateTime_GetSystemTime(GetDlgItem(hwnd, IDC_DATEPICKER), &Date) == GDT_VALID) + if (DateTime_GetSystemTime(GetDlgItem(hwnd, IDC_DATEPICKER), &Date) != GDT_VALID) { - if (DateTime_GetSystemTime(GetDlgItem(hwnd, IDC_TIMEPICKER), &Time) == GDT_VALID) - { - SystemTime.wYear = Date.wYear; - SystemTime.wMonth = Date.wMonth; - SystemTime.wDayOfWeek = Date.wDayOfWeek; - SystemTime.wDay = Date.wDay; - SystemTime.wHour = Time.wHour; - SystemTime.wMinute = Time.wMinute; - SystemTime.wSecond = Time.wSecond; - SystemTime.wMilliseconds = Time.wMilliseconds; - - SetLocalTime(&SystemTime); - } + return FALSE; } + + if (DateTime_GetSystemTime(GetDlgItem(hwnd, IDC_TIMEPICKER), &Time) != GDT_VALID) + { + return FALSE; + } + + SetupData->SystemTime.wYear = Date.wYear; + SetupData->SystemTime.wMonth = Date.wMonth; + SetupData->SystemTime.wDayOfWeek = Date.wDayOfWeek; + SetupData->SystemTime.wDay = Date.wDay; + SetupData->SystemTime.wHour = Time.wHour; + SetupData->SystemTime.wMinute = Time.wMinute; + SetupData->SystemTime.wSecond = Time.wSecond; + SetupData->SystemTime.wMilliseconds = Time.wMilliseconds; + + return TRUE; } @@ -656,7 +819,10 @@ DateTimePageDlgProc(HWND hwndDlg, SetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)SetupData); - InitTimeZoneList(GetDlgItem(hwndDlg, IDC_TIMEZONELIST)); + CreateTimeZoneList(SetupData); + + ShowTimeZoneList(GetDlgItem(hwndDlg, IDC_TIMEZONELIST), + SetupData); } break; @@ -674,9 +840,10 @@ DateTimePageDlgProc(HWND hwndDlg, case PSN_WIZNEXT: { -// SetTimeZoneInformation(); - - SetLocalDateTime(hwndDlg); + GetLocalSystemTime(hwndDlg, SetupData); + SetLocalTimeZone(GetDlgItem(hwndDlg, IDC_TIMEZONELIST), + SetupData); + SetLocalTime(&SetupData->SystemTime); } break;