* PROJECT: ReactOS International Control Panel
* FILE: dll/cpl/intl/time.c
* PURPOSE: Time property page
- * PROGRAMMER: Eric Kohl
+ * PROGRAMMERS: Eric Kohl
+ * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "intl.h"
-static HWND hwndEnum = NULL;
+static HWND hwndTimeEnum = NULL;
static BOOL CALLBACK
-TimeFormatEnumProc(LPTSTR lpTimeFormatString)
+TimeFormatEnumProc(PWSTR lpTimeFormatString)
{
- SendMessage(hwndEnum,
+ SendMessageW(hwndTimeEnum,
CB_ADDSTRING,
0,
(LPARAM)lpTimeFormatString);
}
static VOID
-UpdateTimeSample(HWND hWnd, LCID lcid)
+UpdateTimeSample(HWND hWnd, PGLOBALDATA pGlobalData)
{
- TCHAR szBuffer[80];
+ WCHAR szBuffer[MAX_SAMPLES_STR_SIZE];
- GetTimeFormat(lcid, 0, NULL, NULL, szBuffer, 80);
- SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)szBuffer);
+ GetTimeFormatW(pGlobalData->UserLCID, 0, NULL,
+ pGlobalData->szTimeFormat, szBuffer,
+ MAX_SAMPLES_STR_SIZE);
+ SendDlgItemMessageW(hWnd, IDC_TIMESAMPLE, WM_SETTEXT, 0, (LPARAM)szBuffer);
}
-static VOID
-GetSelectedComboEntry(HWND hwndDlg, DWORD dwIdc, TCHAR *Buffer, UINT uSize)
-{
- int nIndex;
- HWND hChildWnd;
-
- /* Get handle to time format control */
- hChildWnd = GetDlgItem(hwndDlg, dwIdc);
- /* Get index to selected time format */
- nIndex = SendMessage(hChildWnd, CB_GETCURSEL, 0, 0);
- if (nIndex == CB_ERR)
- /* No selection? Get content of the edit control */
- SendMessage(hChildWnd, WM_GETTEXT, uSize, (LPARAM)Buffer);
- else {
- LPTSTR tmp;
- UINT uReqSize;
-
- /* Get requested size, including the null terminator;
- * it shouldn't be required because the previous CB_LIMITTEXT,
- * but it would be better to check it anyways */
- uReqSize = SendMessage(hChildWnd, CB_GETLBTEXTLEN, (WPARAM)nIndex, 0) + 1;
- /* Allocate enough space to be more safe */
- tmp = (LPTSTR)_alloca(uReqSize*sizeof(TCHAR));
- /* Get selected time format text */
- SendMessage(hChildWnd, CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)tmp);
- /* Finally, copy the result into the output */
- _tcsncpy(Buffer, tmp, uSize);
- }
-}
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-TimePageProc(HWND hwndDlg,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam)
+static
+VOID
+InitTimeFormatCB(
+ HWND hwndDlg,
+ PGLOBALDATA pGlobalData)
{
- PGLOBALDATA pGlobalData;
-
- pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
-
- switch (uMsg)
- {
- case WM_INITDIALOG:
- {
- TCHAR Buffer[80];
- int nLen;
-
- pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
- SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
-
- /* Update the time format sample */
- UpdateTimeSample(GetDlgItem(hwndDlg, IDC_TIMESAMPLE), pGlobalData->lcid);
-
- /* Get the time format */
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
+ /* Get the time format */
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEFORMAT,
CB_LIMITTEXT, MAX_TIMEFORMAT, 0);
- /* Add available time formats to the list */
- hwndEnum = GetDlgItem(hwndDlg, IDC_TIMEFORMAT);
- EnumTimeFormats(TimeFormatEnumProc, pGlobalData->lcid, 0);
+ /* Add available time formats to the list */
+ hwndTimeEnum = GetDlgItem(hwndDlg, IDC_TIMEFORMAT);
+ EnumTimeFormatsW(TimeFormatEnumProc, pGlobalData->UserLCID, 0);
- GetLocaleInfo(pGlobalData->lcid, LOCALE_STIMEFORMAT, Buffer, sizeof(Buffer)/sizeof(TCHAR));
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEFORMAT,
CB_SELECTSTRING,
-1,
- (LPARAM)Buffer);
+ (LPARAM)pGlobalData->szTimeFormat);
+}
- /* Get the time separator */
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
+static
+VOID
+InitTimeSeparatorCB(
+ HWND hwndDlg,
+ PGLOBALDATA pGlobalData)
+{
+ SendDlgItemMessageW(hwndDlg, IDC_TIMESEPARATOR,
CB_LIMITTEXT, MAX_TIMESEPARATOR, 0);
- GetLocaleInfo(pGlobalData->lcid, LOCALE_STIME, Buffer, sizeof(Buffer)/sizeof(TCHAR));
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
+
+ SendDlgItemMessageW(hwndDlg, IDC_TIMESEPARATOR,
CB_ADDSTRING,
0,
- (LPARAM)Buffer);
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
+ (LPARAM)pGlobalData->szTimeSep);
+
+ SendDlgItemMessageW(hwndDlg, IDC_TIMESEPARATOR,
CB_SETCURSEL,
0, /* Index */
0);
+}
- /* Get the AM symbol */
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
+
+static
+VOID
+InitAmSymbol(
+ HWND hwndDlg,
+ PGLOBALDATA pGlobalData)
+{
+ int nLen;
+
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
CB_LIMITTEXT, MAX_TIMEAMSYMBOL, 0);
- nLen = GetLocaleInfo(pGlobalData->lcid, LOCALE_S1159, Buffer, sizeof(Buffer)/sizeof(TCHAR));
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
+
+ nLen = wcslen(pGlobalData->szTimeAM);
+
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
CB_ADDSTRING,
0,
- (LPARAM)Buffer);
- if (nLen != 0)
- {
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
+ (LPARAM)pGlobalData->szTimeAM);
+ if (nLen != 0)
+ {
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
CB_ADDSTRING,
0,
- (LPARAM)_T(""));
- }
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
+ (LPARAM)L"");
+ }
+
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
CB_SETCURSEL,
0, /* Index */
0);
+}
- /* Get the PM symbol */
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
+
+static
+VOID
+InitPmSymbol(
+ HWND hwndDlg,
+ PGLOBALDATA pGlobalData)
+{
+ int nLen;
+
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
CB_LIMITTEXT, MAX_TIMEPMSYMBOL, 0);
- nLen = GetLocaleInfo(pGlobalData->lcid, LOCALE_S2359, Buffer, sizeof(Buffer)/sizeof(TCHAR));
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
+
+ nLen = wcslen(pGlobalData->szTimeAM);
+
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
CB_ADDSTRING,
0,
- (LPARAM)Buffer);
- if (nLen != 0)
- {
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
- CB_ADDSTRING,
- 0,
- (LPARAM)_T(""));
- }
- SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
+ (LPARAM)pGlobalData->szTimePM);
+ if (nLen != 0)
+ {
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
+ CB_ADDSTRING,
+ 0,
+ (LPARAM)L"");
+ }
+ SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
CB_SETCURSEL,
0, /* Index */
0);
- }
- break;
+}
+
+
+static
+BOOL
+GetTimeSetting(
+ HWND hwndDlg,
+ PGLOBALDATA pGlobalData)
+{
+ WCHAR szTimeFormat[MAX_TIMEFORMAT];
+ WCHAR szTimeSep[MAX_TIMESEPARATOR];
+ WCHAR szTimeAM[MAX_TIMEAMSYMBOL];
+ WCHAR szTimePM[MAX_TIMEPMSYMBOL];
+
+ /* Time format */
+ GetSelectedComboBoxText(hwndDlg,
+ IDC_TIMEFORMAT,
+ szTimeFormat,
+ MAX_TIMEFORMAT);
+
+ /* Check the time format */
+ if (szTimeFormat[0] == L'\0')
+ {
+ /* TODO: Show error message */
+
+ return FALSE;
+ }
+
+ /* Time separator */
+ GetSelectedComboBoxText(hwndDlg,
+ IDC_TIMESEPARATOR,
+ szTimeSep,
+ MAX_TIMESEPARATOR);
+
+ /* Check the time separator */
+ if (szTimeSep[0] == L'\0')
+ {
+ /* TODO: Show error message */
+
+ return FALSE;
+ }
+
+ /* AM symbol */
+ GetSelectedComboBoxText(hwndDlg,
+ IDC_TIMEAMSYMBOL,
+ szTimeAM,
+ MAX_TIMEAMSYMBOL);
+
+ /* PM symbol */
+ GetSelectedComboBoxText(hwndDlg,
+ IDC_TIMEPMSYMBOL,
+ szTimePM,
+ MAX_TIMEPMSYMBOL);
+
+ /* Store settings in global data */
+ wcscpy(pGlobalData->szTimeFormat, szTimeFormat);
+ wcscpy(pGlobalData->szTimeSep, szTimeSep);
+ wcscpy(pGlobalData->szTimeAM, szTimeAM);
+ wcscpy(pGlobalData->szTimePM, szTimePM);
+
+ return TRUE;
+}
+
+/* Property page dialog callback */
+INT_PTR CALLBACK
+TimePageProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ PGLOBALDATA pGlobalData;
+
+ pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
+ SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
+
+ /* Get the time format */
+ InitTimeFormatCB(hwndDlg, pGlobalData);
+
+ /* Get the time separator */
+ InitTimeSeparatorCB(hwndDlg, pGlobalData);
+
+ /* Get the AM symbol */
+ InitAmSymbol(hwndDlg, pGlobalData);
+
+ /* Get the PM symbol */
+ InitPmSymbol(hwndDlg, pGlobalData);
+
+ /* Update the time format sample */
+ UpdateTimeSample(hwndDlg, pGlobalData);
+ break;
case WM_COMMAND:
switch (LOWORD(wParam))
if (HIWORD(wParam) == CBN_SELCHANGE ||
HIWORD(wParam) == CBN_EDITCHANGE)
{
+ /* Enable the Apply button */
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
- break;
+ break;
}
break;
case WM_NOTIFY:
- {
- LPNMHDR lpnm = (LPNMHDR)lParam;
-
- if (lpnm->code == (UINT)PSN_APPLY)
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
{
- TCHAR Buffer[80];
-
- /* Get selected/typed time format text */
- GetSelectedComboEntry(hwndDlg, IDC_TIMEFORMAT, Buffer, sizeof(Buffer)/sizeof(TCHAR));
-
- /* Set time format */
- SetLocaleInfo(pGlobalData->lcid, LOCALE_STIMEFORMAT, Buffer);
-
- /* Get selected/typed time separator text */
- GetSelectedComboEntry(hwndDlg, IDC_TIMESEPARATOR, Buffer, sizeof(Buffer)/sizeof(TCHAR));
-
- /* Set time separator */
- SetLocaleInfo(pGlobalData->lcid, LOCALE_STIME, Buffer);
-
- /* Get selected/typed AM symbol text */
- GetSelectedComboEntry(hwndDlg, IDC_TIMEAMSYMBOL, Buffer, sizeof(Buffer)/sizeof(TCHAR));
-
- /* Set the AM symbol */
- SetLocaleInfo(pGlobalData->lcid, LOCALE_S1159, Buffer);
-
- /* Get selected/typed PM symbol text */
- GetSelectedComboEntry(hwndDlg, IDC_TIMEPMSYMBOL, Buffer, sizeof(Buffer)/sizeof(TCHAR));
-
- /* Set the PM symbol */
- SetLocaleInfo(pGlobalData->lcid, LOCALE_S2359, Buffer);
-
- /* Update the time format sample */
- UpdateTimeSample(GetDlgItem(hwndDlg, IDC_TIMESAMPLE), pGlobalData->lcid);
+ if (GetTimeSetting(hwndDlg, pGlobalData))
+ {
+ pGlobalData->bUserLocaleChanged = TRUE;
+ UpdateTimeSample(hwndDlg, pGlobalData);
+ }
}
- }
- break;
+ break;
}
return FALSE;