[INTL] Rename some variables and functions. #179
[reactos.git] / dll / cpl / intl / time.c
index 8d1043e..2ad1307 100644 (file)
  * 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);
@@ -39,137 +40,213 @@ TimeFormatEnumProc(LPTSTR 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))
@@ -181,49 +258,23 @@ TimePageProc(HWND hwndDlg,
                     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;