[WINHTTP] Sync with Wine Staging 3.9. CORE-14656
[reactos.git] / dll / cpl / intl / currency.c
index 7842368..2dfcdb3 100644 (file)
  * PROJECT:         ReactOS International Control Panel
  * FILE:            dll/cpl/intl/currency.c
  * PURPOSE:         Currency property page
- * PROGRAMMER:      Eric Kohl
+ * PROGRAMMERS:     Eric Kohl
+ *                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
  */
 
 #include "intl.h"
 
-#define POSITIVE_EXAMPLE   _T("123456789.00")
-#define NEGATIVE_EXAMPLE   _T("-123456789.00")
-#define MAX_FIELD_DIG_SAMPLES       3
+#define POSITIVE_EXAMPLE   L"123456789.00"
+#define NEGATIVE_EXAMPLE   L"-123456789.00"
 
 
 static VOID
 UpdateExamples(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szBuffer[MAX_FMT_SIZE];
+    WCHAR szBuffer[MAX_FMT_SIZE];
+    CURRENCYFMTW CurrencyFormat;
+
+    CurrencyFormat.NumDigits = pGlobalData->nCurrDigits;
+    CurrencyFormat.LeadingZero = pGlobalData->nNumLeadingZero;
+    CurrencyFormat.Grouping = GroupingFormats[pGlobalData->nCurrGrouping].nInteger;
+    CurrencyFormat.lpDecimalSep = pGlobalData->szCurrDecimalSep;
+    CurrencyFormat.lpThousandSep = pGlobalData->szCurrThousandSep;
+    CurrencyFormat.NegativeOrder = pGlobalData->nCurrNegFormat;
+    CurrencyFormat.PositiveOrder = pGlobalData->nCurrPosFormat;
+    CurrencyFormat.lpCurrencySymbol = pGlobalData->szCurrSymbol;
 
     /* Positive example */
-    GetCurrencyFormat(pGlobalData->lcid, 0,
-                      POSITIVE_EXAMPLE,
-                      NULL, szBuffer, MAX_FMT_SIZE);
+    GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+                       POSITIVE_EXAMPLE,
+                       &CurrencyFormat, szBuffer, MAX_FMT_SIZE);
 
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYPOSSAMPLE), WM_SETTEXT, 0, (LPARAM)szBuffer);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYPOSSAMPLE, WM_SETTEXT, 0, (LPARAM)szBuffer);
 
     /* Negative example */
-    GetCurrencyFormat(pGlobalData->lcid, 0,
-                      NEGATIVE_EXAMPLE,
-                      NULL, szBuffer, MAX_FMT_SIZE);
+    GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+                       NEGATIVE_EXAMPLE,
+                       &CurrencyFormat, szBuffer, MAX_FMT_SIZE);
 
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYNEGSAMPLE), WM_SETTEXT, 0, (LPARAM)szBuffer);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYNEGSAMPLE, WM_SETTEXT, 0, (LPARAM)szBuffer);
 }
 
 
 static VOID
 InitCurrencySymbols(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szBuffer[MAX_FMT_SIZE];
-
     /* Limit text length */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
-                CB_LIMITTEXT,
-                MAX_CURRENCYSYMBOL,
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYSYMBOL,
+                        CB_LIMITTEXT,
+                        MAX_CURRSYMBOL - 1,
+                        0);
 
     /* Set currency symbols */
-    GetLocaleInfo(pGlobalData->lcid,
-                  LOCALE_SCURRENCY,
-                  szBuffer, MAX_FMT_SIZE);
-
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
-                CB_ADDSTRING,
-                0,
-                (LPARAM)szBuffer);
-
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
-                CB_SETCURSEL,
-                0, /* Index */
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYSYMBOL,
+                        CB_ADDSTRING,
+                        0,
+                        (LPARAM)pGlobalData->szCurrSymbol);
+
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYSYMBOL,
+                        CB_SETCURSEL,
+                        0, /* Index */
+                        0);
 }
 
 
 static VOID
 InitCurrencyPositiveFormats(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szDecimalSep[MAX_FMT_SIZE];
-    TCHAR szThousandSep[MAX_FMT_SIZE];
-    TCHAR szCurrencySymbol[MAX_FMT_SIZE];
-    TCHAR szBuffer[MAX_FMT_SIZE];
-    CURRENCYFMT cyFmt;
-    INT nPositiveOrder = 0;
-    INT ret;
+    WCHAR szBuffer[MAX_FMT_SIZE];
+    CURRENCYFMTW cyFmt;
     INT i;
 
-
-    /* Get positive format */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_ICURRENCY,
-                        szBuffer, MAX_FMT_SIZE);
-    if (ret != 0)
-    {
-        nPositiveOrder = _ttoi(szBuffer);
-    }
-
-    /* Get number of fractional digits */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_ICURRDIGITS,
-                        szBuffer, MAX_FMT_SIZE);
-    if (ret != 0)
-    {
-        cyFmt.NumDigits = _ttoi(szBuffer);
-    }
-    else
-    {
-        cyFmt.NumDigits = 0;
-    }
-
-    /* Get decimal separator */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_SMONDECIMALSEP,
-                        szDecimalSep, MAX_FMT_SIZE);
-
-    /* Get group separator */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_SMONTHOUSANDSEP,
-                        szThousandSep, MAX_FMT_SIZE);
-
-    /* Get currency symbol */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_SCURRENCY,
-                        szCurrencySymbol, MAX_FMT_SIZE);
-
     /* positive currency values */
+    cyFmt.NumDigits = pGlobalData->nCurrDigits;
     cyFmt.LeadingZero = 0;
     cyFmt.Grouping = 3;
-    cyFmt.lpDecimalSep = szDecimalSep;
-    cyFmt.lpThousandSep = szThousandSep;
-    cyFmt.lpCurrencySymbol = szCurrencySymbol;
+    cyFmt.lpDecimalSep = pGlobalData->szCurrDecimalSep;
+    cyFmt.lpThousandSep = pGlobalData->szCurrThousandSep;
+    cyFmt.lpCurrencySymbol = pGlobalData->szCurrSymbol;
     cyFmt.NegativeOrder = 0;
 
     for (i = 0; i < 4; i++)
     {
         cyFmt.PositiveOrder = i;
-        GetCurrencyFormat(pGlobalData->lcid, 0,
-                          _T("1.1"),
-                          &cyFmt, szBuffer, MAX_FMT_SIZE);
-
-        SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
-                    CB_INSERTSTRING,
-                    -1,
-                    (LPARAM)szBuffer);
+        GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+                           L"1.1",
+                           &cyFmt, szBuffer, MAX_FMT_SIZE);
+
+        SendDlgItemMessageW(hwndDlg, IDC_CURRENCYPOSVALUE,
+                            CB_INSERTSTRING,
+                            -1,
+                            (LPARAM)szBuffer);
     }
 
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
-                CB_SETCURSEL,
-                nPositiveOrder,
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYPOSVALUE,
+                        CB_SETCURSEL,
+                        pGlobalData->nCurrPosFormat,
+                        0);
 }
 
 
 static VOID
 InitCurrencyNegativeFormats(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szDecimalSep[MAX_FMT_SIZE];
-    TCHAR szThousandSep[MAX_FMT_SIZE];
-    TCHAR szCurrencySymbol[MAX_FMT_SIZE];
-    TCHAR szBuffer[MAX_FMT_SIZE];
-    CURRENCYFMT cyFmt;
-    INT nNegativeOrder = 0;
-    INT ret;
+    WCHAR szBuffer[MAX_FMT_SIZE];
+    CURRENCYFMTW cyFmt;
     int i;
 
-    /* Get negative format */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_INEGCURR,
-                        szBuffer, MAX_FMT_SIZE);
-    if (ret != 0)
-    {
-        nNegativeOrder = _ttoi(szBuffer);
-    }
-
-    /* Get number of fractional digits */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_ICURRDIGITS,
-                        szBuffer, MAX_FMT_SIZE);
-    if (ret != 0)
-    {
-        cyFmt.NumDigits = _ttoi(szBuffer);
-    }
-    else
-    {
-        cyFmt.NumDigits = 0;
-    }
-
-    /* Get decimal separator */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_SMONDECIMALSEP,
-                        szDecimalSep, MAX_FMT_SIZE);
-
-    /* Get group separator */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_SMONTHOUSANDSEP,
-                        szThousandSep, MAX_FMT_SIZE);
-
-    /* Get currency symbol */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_SCURRENCY,
-                        szCurrencySymbol, MAX_FMT_SIZE);
-
     /* negative currency values */
+    cyFmt.NumDigits = pGlobalData->nCurrDigits;
     cyFmt.LeadingZero = 0;
     cyFmt.Grouping = 3;
-    cyFmt.lpDecimalSep = szDecimalSep;
-    cyFmt.lpThousandSep = szThousandSep;
-    cyFmt.lpCurrencySymbol = szCurrencySymbol;
+    cyFmt.lpDecimalSep = pGlobalData->szCurrDecimalSep;
+    cyFmt.lpThousandSep = pGlobalData->szCurrThousandSep;
+    cyFmt.lpCurrencySymbol = pGlobalData->szCurrSymbol;
     cyFmt.PositiveOrder = 0;
 
     for (i = 0; i < 16; i++)
     {
         cyFmt.NegativeOrder = i;
-        GetCurrencyFormat(pGlobalData->lcid, 0,
-                          _T("-1.1"),
-                          &cyFmt, szBuffer, MAX_FMT_SIZE);
-
-        SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
-                    CB_INSERTSTRING,
-                    -1,
-                    (LPARAM)szBuffer);
+        GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+                           L"-1.1",
+                           &cyFmt, szBuffer, MAX_FMT_SIZE);
+
+        SendDlgItemMessageW(hwndDlg, IDC_CURRENCYNEGVALUE,
+                            CB_INSERTSTRING,
+                            -1,
+                            (LPARAM)szBuffer);
     }
 
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
-                CB_SETCURSEL,
-                nNegativeOrder,
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYNEGVALUE,
+                        CB_SETCURSEL,
+                        pGlobalData->nCurrNegFormat,
+                        0);
 }
 
 
 static VOID
 InitCurrencyDecimalSeparators(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szBuffer[MAX_FMT_SIZE];
-
     /* Limit text length */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
-                CB_LIMITTEXT,
-                MAX_CURRENCYDECSEP,
-                0);
-
-    /* Get decimal separator */
-    GetLocaleInfo(pGlobalData->lcid,
-                  LOCALE_SMONDECIMALSEP,
-                  szBuffer, MAX_FMT_SIZE);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECSEP,
+                        CB_LIMITTEXT,
+                        MAX_CURRDECIMALSEP - 1,
+                        0);
 
     /* Decimal separator */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
-                CB_ADDSTRING,
-                0,
-                (LPARAM)szBuffer);
-
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
-                CB_SETCURSEL,
-                0, /* Index */
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECSEP,
+                        CB_ADDSTRING,
+                        0,
+                        (LPARAM)pGlobalData->szCurrDecimalSep);
+
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECSEP,
+                        CB_SETCURSEL,
+                        0, /* Index */
+                        0);
 }
 
 
@@ -267,39 +181,24 @@ InitCurrencyDecimalSeparators(HWND hwndDlg, PGLOBALDATA pGlobalData)
 static VOID
 InitCurrencyNumFracDigits(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szBuffer[MAX_FMT_SIZE];
-    int ret;
+    WCHAR szBuffer[MAX_FMT_SIZE];
     int i;
 
     /* Create standard list of fractional symbols */
     for (i = 0; i < 10; i++)
     {
-        szBuffer[0] = _T('0') + i;
+        szBuffer[0] = L'0' + i;
         szBuffer[1] = 0;
-        SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
-                    CB_ADDSTRING,
-                    0,
-                    (LPARAM)szBuffer);
+        SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECNUM,
+                            CB_ADDSTRING,
+                            0,
+                            (LPARAM)szBuffer);
     }
 
-    /* Get number of fractional digits */
-    ret = GetLocaleInfo(pGlobalData->lcid,
-                        LOCALE_ICURRDIGITS,
-                        szBuffer, MAX_FMT_SIZE);
-    if (ret != 0)
-    {
-        SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
-                    CB_SETCURSEL,
-                    _ttoi(szBuffer),
-                    0);
-    }
-    else
-    {
-        SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
-                    CB_SETCURSEL,
-                    0,
-                    0);
-    }
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECNUM,
+                        CB_SETCURSEL,
+                        pGlobalData->nCurrDigits,
+                        0);
 }
 
 
@@ -307,247 +206,142 @@ InitCurrencyNumFracDigits(HWND hwndDlg, PGLOBALDATA pGlobalData)
 static VOID
 InitCurrencyGroupSeparators(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szBuffer[MAX_FMT_SIZE];
-
     /* Limit text length */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
-                CB_LIMITTEXT,
-                MAX_CURRENCYGRPSEP,
-                0);
-
-    /* Get group separator */
-    GetLocaleInfo(pGlobalData->lcid,
-                  LOCALE_SMONTHOUSANDSEP,
-                  szBuffer, MAX_FMT_SIZE);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYGRPSEP,
+                        CB_LIMITTEXT,
+                        MAX_CURRTHOUSANDSEP - 1,
+                        0);
 
     /* Digit group separator */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
-                CB_ADDSTRING,
-                0,
-                (LPARAM)szBuffer);
-
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
-                CB_SETCURSEL,
-                0, /* Index */
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYGRPSEP,
+                        CB_ADDSTRING,
+                        0,
+                        (LPARAM)pGlobalData->szCurrThousandSep);
+
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYGRPSEP,
+                        CB_SETCURSEL,
+                        0, /* Index */
+                        0);
 }
 
 
 static VOID
 InitDigitGroupCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szThousandSep[MAX_FMT_SIZE];
-    TCHAR szGrouping[MAX_FMT_SIZE];
-    TCHAR szBuffer[MAX_FMT_SIZE];
-    CURRENCYFMT cyFmt;
+    WCHAR szBuffer[MAX_FMT_SIZE];
+    CURRENCYFMTW cyFmt;
     INT i;
 
-    /* Get group separator */
-    GetLocaleInfo(pGlobalData->lcid,
-                  LOCALE_SMONTHOUSANDSEP,
-                  szThousandSep, MAX_FMT_SIZE);
-
-    /* Get grouping */
-    GetLocaleInfo(pGlobalData->lcid,
-                  LOCALE_SMONGROUPING,
-                  szGrouping, MAX_FMT_SIZE);
-
     /* Digit grouping */
     cyFmt.NumDigits = 0;
     cyFmt.LeadingZero = 0;
-    cyFmt.lpDecimalSep = _T("");
-    cyFmt.lpThousandSep = szThousandSep;
+    cyFmt.lpDecimalSep = L"";
+    cyFmt.lpThousandSep = pGlobalData->szCurrThousandSep;
     cyFmt.PositiveOrder = 0;
     cyFmt.NegativeOrder = 0;
-    cyFmt.lpCurrencySymbol = _T("");
-    cyFmt.Grouping = 0;
-    GetCurrencyFormat(pGlobalData->lcid, 0,
-                      _T("123456789"),
-                      &cyFmt, szBuffer, MAX_FMT_SIZE);
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
-                CB_INSERTSTRING,
-                -1,
-                (LPARAM)szBuffer);
+    cyFmt.lpCurrencySymbol = L"";
 
-    cyFmt.Grouping = 3;
-    GetCurrencyFormat(pGlobalData->lcid, 0,
-                      _T("123456789"),
-                      &cyFmt, szBuffer, MAX_FMT_SIZE);
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
-                CB_INSERTSTRING,
-                -1,
-                (LPARAM)szBuffer);
-
-    cyFmt.Grouping = 32;
-    GetCurrencyFormat(pGlobalData->lcid, 0,
-                      _T("123456789"),
-                      &cyFmt, szBuffer, MAX_FMT_SIZE);
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
-                CB_INSERTSTRING,
-                -1,
-                (LPARAM)szBuffer);
-
-    i = 0;
-    if (szGrouping[0] == _T('3'))
+    for (i = 0 ; i < MAX_GROUPINGFORMATS ; i++)
     {
-        if ((szGrouping[1] == _T(';')) &&
-            (szGrouping[2] == _T('2')))
-            i = 2;
-        else
-            i = 1;
+       cyFmt.Grouping = GroupingFormats[i].nInteger;
+
+       GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+                          L"123456789",
+                          &cyFmt, szBuffer, MAX_FMT_SIZE);
+       SendDlgItemMessageW(hwndDlg, IDC_CURRENCYGRPNUM,
+                           CB_INSERTSTRING,
+                           -1,
+                           (LPARAM)szBuffer);
     }
 
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
-                CB_SETCURSEL,
-                i, /* Index */
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_CURRENCYGRPNUM,
+                        CB_SETCURSEL,
+                        pGlobalData->nCurrGrouping,
+                        0);
 }
 
 
-/* Set number of digits in field  */
-static BOOL
-SetCurrencyDigNum(HWND hwndDlg, LCID lcid)
+static
+BOOL
+GetCurrencySetting(
+     HWND hwndDlg,
+     PGLOBALDATA pGlobalData)
 {
-    LPTSTR szFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES]=
+    WCHAR szCurrSymbol[MAX_CURRSYMBOL];
+    WCHAR szCurrDecimalSep[MAX_CURRDECIMALSEP];
+    WCHAR szCurrThousandSep[MAX_CURRTHOUSANDSEP];
+    INT nCurrPosFormat;
+    INT nCurrNegFormat;
+    INT nCurrDigits;
+    INT nCurrGrouping;
+
+    /* Currency symbol */
+    GetSelectedComboBoxText(hwndDlg,
+                            IDC_CURRENCYSYMBOL,
+                            szCurrSymbol,
+                            MAX_CURRSYMBOL);
+
+    if (szCurrSymbol[0] == L'\0')
     {
-        _T("0;0"),
-        _T("3;0"),
-        _T("3;2;0")
-    };
-
-    int nCurrSel;
-
-    /* Get setted number of digits in field */
-    nCurrSel = SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
-                           CB_GETCURSEL,
-                           (WPARAM)0,
-                           (LPARAM)0);
-
-    /* Save number of digits in field */
-    if (nCurrSel != CB_ERR)
-        SetLocaleInfo(lcid, LOCALE_SMONGROUPING, szFieldDigNumSamples[nCurrSel]);
-
-    return TRUE;
-}
+        /* TODO: Show error message */
 
-/* Set currency field separator */
-static BOOL
-SetCurrencyFieldSep(HWND hwndDlg, LCID lcid)
-{
-    TCHAR szCurrencyFieldSep[MAX_SAMPLES_STR_SIZE];
-
-    /* Get setted currency field separator */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
-                WM_GETTEXT,
-                (WPARAM)MAX_SAMPLES_STR_SIZE,
-                (LPARAM)szCurrencyFieldSep);
-
-    /* Save currency field separator */
-    SetLocaleInfo(lcid, LOCALE_SMONTHOUSANDSEP, szCurrencyFieldSep);
-
-    return TRUE;
-}
-
-/* Set number of fractional symbols */
-static BOOL
-SetCurrencyFracSymNum(HWND hwndDlg, LCID lcid)
-{
-    TCHAR szCurrencyFracSymNum[MAX_SAMPLES_STR_SIZE];
-    INT nCurrSel;
-
-    /* Get setted number of fractional symbols */
-    nCurrSel = SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
-                           CB_GETCURSEL,
-                           (WPARAM)0,
-                           (LPARAM)0);
-
-    /* Convert to wide char */
-    _itot(nCurrSel, szCurrencyFracSymNum, DECIMAL_RADIX);
-
-    /* Save number of fractional symbols */
-    SetLocaleInfo(lcid, LOCALE_ICURRDIGITS, szCurrencyFracSymNum);
-
-    return TRUE;
-}
-
-/* Set currency separator */
-static BOOL
-SetCurrencySep(HWND hwndDlg, LCID lcid)
-{
-    TCHAR szCurrencySep[MAX_SAMPLES_STR_SIZE];
-
-    /* Get setted currency decimal separator */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
-                WM_GETTEXT,
-                (WPARAM)MAX_SAMPLES_STR_SIZE,
-                (LPARAM)szCurrencySep);
-
-    /* TODO: Add check for correctly input */
-
-    /* Save currency separator */
-    SetLocaleInfo(lcid, LOCALE_SMONDECIMALSEP, szCurrencySep);
-
-    return TRUE;
-}
-
-/* Set negative currency sum format */
-static BOOL
-SetNegCurrencySumFmt(HWND hwndDlg, LCID lcid)
-{
-    TCHAR szNegCurrencySumFmt[MAX_SAMPLES_STR_SIZE];
-    INT nCurrSel;
-
-    /* Get setted currency unit */
-    nCurrSel = SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
-                           CB_GETCURSEL,
-                           (WPARAM)0,
-                           (LPARAM)0);
-
-    /* Convert to wide char */
-    _itot(nCurrSel, szNegCurrencySumFmt, DECIMAL_RADIX);
+        return FALSE;
+    }
 
-    /* Save currency sum format */
-    SetLocaleInfo(lcid, LOCALE_INEGCURR, szNegCurrencySumFmt);
+    /* Positive Amount */
+    GetSelectedComboBoxIndex(hwndDlg,
+                             IDC_CURRENCYPOSVALUE,
+                             &nCurrPosFormat);
 
-    return TRUE;
-}
+    /* Negative Amount */
+    GetSelectedComboBoxIndex(hwndDlg,
+                             IDC_CURRENCYNEGVALUE,
+                             &nCurrNegFormat);
 
-/* Set positive currency sum format */
-static BOOL
-SetPosCurrencySumFmt(HWND hwndDlg, LCID lcid)
-{
-    TCHAR szPosCurrencySumFmt[MAX_SAMPLES_STR_SIZE];
-    INT nCurrSel;
+    /* Decimal separator */
+    GetSelectedComboBoxText(hwndDlg,
+                            IDC_CURRENCYDECSEP,
+                            szCurrDecimalSep,
+                            MAX_CURRDECIMALSEP);
 
-    /* Get setted currency unit */
-    nCurrSel = SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
-                           CB_GETCURSEL,
-                           (WPARAM)0,
-                           (LPARAM)0);
+    if (szCurrDecimalSep[0] == L'\0')
+    {
+        /* TODO: Show error message */
 
-    /* Convert to wide char */
-    _itot(nCurrSel, szPosCurrencySumFmt, DECIMAL_RADIX);
+        return FALSE;
+    }
 
-    /* Save currency sum format */
-    SetLocaleInfo(lcid, LOCALE_ICURRENCY, szPosCurrencySumFmt);
+    /* Number of fractional digits */
+    GetSelectedComboBoxIndex(hwndDlg,
+                             IDC_CURRENCYDECNUM,
+                             &nCurrDigits);
 
-    return TRUE;
-}
+    /* Grouping symbol */
+    GetSelectedComboBoxText(hwndDlg,
+                            IDC_CURRENCYGRPSEP,
+                            szCurrThousandSep,
+                            MAX_CURRTHOUSANDSEP);
 
-/* Set currency unit */
-static BOOL
-SetCurrencyUnit(HWND hwndDlg, LCID lcid)
-{
-    TCHAR szCurrencyUnit[MAX_SAMPLES_STR_SIZE];
+    if (szCurrThousandSep[0] == L'\0')
+    {
+        /* TODO: Show error message */
 
-    /* Get setted currency unit */
-    SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
-                WM_GETTEXT,
-                (WPARAM)MAX_SAMPLES_STR_SIZE,
-                (LPARAM)(LPCSTR)szCurrencyUnit);
+        return FALSE;
+    }
 
-    /* Save currency unit */
-    SetLocaleInfo(lcid, LOCALE_SCURRENCY, szCurrencyUnit);
+    /* Digit grouping */
+    GetSelectedComboBoxIndex(hwndDlg,
+                             IDC_CURRENCYGRPNUM,
+                             &nCurrGrouping);
+
+    /* Store settings in global data */
+    wcscpy(pGlobalData->szCurrSymbol, szCurrSymbol);
+    pGlobalData->nCurrGrouping = nCurrGrouping;
+    wcscpy(pGlobalData->szCurrDecimalSep, szCurrDecimalSep);
+    wcscpy(pGlobalData->szCurrThousandSep, szCurrThousandSep);
+    pGlobalData->nCurrPosFormat = nCurrPosFormat;
+    pGlobalData->nCurrNegFormat = nCurrNegFormat;
+    pGlobalData->nCurrDigits = nCurrDigits;
 
     return TRUE;
 }
@@ -589,41 +383,21 @@ CurrencyPageProc(HWND hwndDlg,
                 case IDC_CURRENCYDECNUM:
                 case IDC_CURRENCYGRPSEP:
                 case IDC_CURRENCYGRPNUM:
-                    if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
+                    if (HIWORD(wParam) == CBN_SELCHANGE ||
+                        HIWORD(wParam) == CBN_EDITCHANGE)
                     {
-                        /* Set "Apply" button enabled */
+                        /* Enable the Apply button */
                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                     }
             }
             break;
 
         case WM_NOTIFY:
+            if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
             {
-                LPNMHDR lpnm = (LPNMHDR)lParam;
-                /* If push apply button */
-                if (lpnm->code == (UINT)PSN_APPLY)
+                if (GetCurrencySetting(hwndDlg, pGlobalData))
                 {
-                    if (!SetCurrencyDigNum(hwndDlg, pGlobalData->lcid))
-                        break;
-
-                    if (!SetCurrencyUnit(hwndDlg, pGlobalData->lcid))
-                        break;
-
-                    if (!SetPosCurrencySumFmt(hwndDlg, pGlobalData->lcid))
-                        break;
-
-                    if (!SetNegCurrencySumFmt(hwndDlg, pGlobalData->lcid))
-                        break;
-
-                    if (!SetCurrencySep(hwndDlg, pGlobalData->lcid))
-                        break;
-
-                    if (!SetCurrencyFracSymNum(hwndDlg, pGlobalData->lcid))
-                        break;
-
-                    if (!SetCurrencyFieldSep(hwndDlg, pGlobalData->lcid))
-                        break;
-
+                    pGlobalData->bUserLocaleChanged = TRUE;
                     UpdateExamples(hwndDlg, pGlobalData);
                 }
             }