--- /dev/null
+/*
+ * ReactOS
+ * Copyright (C) 2004 ReactOS Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+/*
+ * PROJECT: ReactOS International Control Panel
+ * FILE: dll/cpl/intl/currency.c
+ * PURPOSE: Currency property page
+ * PROGRAMMERS: Eric Kohl
+ * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
+ */
+
+#include "intl.h"
+
+#define POSITIVE_EXAMPLE L"123456789.00"
+#define NEGATIVE_EXAMPLE L"-123456789.00"
+
+
+static VOID
+UpdateExamples(HWND hwndDlg, PGLOBALDATA pGlobalData)
+{
+ 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 */
+ GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+ POSITIVE_EXAMPLE,
+ &CurrencyFormat, szBuffer, MAX_FMT_SIZE);
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYPOSSAMPLE, WM_SETTEXT, 0, (LPARAM)szBuffer);
+
+ /* Negative example */
+ GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+ NEGATIVE_EXAMPLE,
+ &CurrencyFormat, szBuffer, MAX_FMT_SIZE);
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYNEGSAMPLE, WM_SETTEXT, 0, (LPARAM)szBuffer);
+}
+
+
+static VOID
+InitCurrencySymbols(HWND hwndDlg, PGLOBALDATA pGlobalData)
+{
+ /* Limit text length */
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYSYMBOL,
+ CB_LIMITTEXT,
+ MAX_CURRSYMBOL - 1,
+ 0);
+
+ /* Set currency symbols */
+ 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)
+{
+ WCHAR szBuffer[MAX_FMT_SIZE];
+ CURRENCYFMTW cyFmt;
+ INT i;
+
+ /* positive currency values */
+ cyFmt.NumDigits = pGlobalData->nCurrDigits;
+ cyFmt.LeadingZero = 0;
+ cyFmt.Grouping = 3;
+ cyFmt.lpDecimalSep = pGlobalData->szCurrDecimalSep;
+ cyFmt.lpThousandSep = pGlobalData->szCurrThousandSep;
+ cyFmt.lpCurrencySymbol = pGlobalData->szCurrSymbol;
+ cyFmt.NegativeOrder = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ cyFmt.PositiveOrder = i;
+ GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+ L"1.1",
+ &cyFmt, szBuffer, MAX_FMT_SIZE);
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYPOSVALUE,
+ CB_INSERTSTRING,
+ -1,
+ (LPARAM)szBuffer);
+ }
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYPOSVALUE,
+ CB_SETCURSEL,
+ pGlobalData->nCurrPosFormat,
+ 0);
+}
+
+
+static VOID
+InitCurrencyNegativeFormats(HWND hwndDlg, PGLOBALDATA pGlobalData)
+{
+ WCHAR szBuffer[MAX_FMT_SIZE];
+ CURRENCYFMTW cyFmt;
+ int i;
+
+ /* negative currency values */
+ cyFmt.NumDigits = pGlobalData->nCurrDigits;
+ cyFmt.LeadingZero = 0;
+ cyFmt.Grouping = 3;
+ cyFmt.lpDecimalSep = pGlobalData->szCurrDecimalSep;
+ cyFmt.lpThousandSep = pGlobalData->szCurrThousandSep;
+ cyFmt.lpCurrencySymbol = pGlobalData->szCurrSymbol;
+ cyFmt.PositiveOrder = 0;
+
+ for (i = 0; i < 16; i++)
+ {
+ cyFmt.NegativeOrder = i;
+ GetCurrencyFormatW(pGlobalData->UserLCID, 0,
+ L"-1.1",
+ &cyFmt, szBuffer, MAX_FMT_SIZE);
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYNEGVALUE,
+ CB_INSERTSTRING,
+ -1,
+ (LPARAM)szBuffer);
+ }
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYNEGVALUE,
+ CB_SETCURSEL,
+ pGlobalData->nCurrNegFormat,
+ 0);
+}
+
+
+static VOID
+InitCurrencyDecimalSeparators(HWND hwndDlg, PGLOBALDATA pGlobalData)
+{
+ /* Limit text length */
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECSEP,
+ CB_LIMITTEXT,
+ MAX_CURRDECIMALSEP - 1,
+ 0);
+
+ /* Decimal separator */
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECSEP,
+ CB_ADDSTRING,
+ 0,
+ (LPARAM)pGlobalData->szCurrDecimalSep);
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECSEP,
+ CB_SETCURSEL,
+ 0, /* Index */
+ 0);
+}
+
+
+/* Initialize the number of fractional digits */
+static VOID
+InitCurrencyNumFracDigits(HWND hwndDlg, PGLOBALDATA pGlobalData)
+{
+ WCHAR szBuffer[MAX_FMT_SIZE];
+ int i;
+
+ /* Create standard list of fractional symbols */
+ for (i = 0; i < 10; i++)
+ {
+ szBuffer[0] = L'0' + i;
+ szBuffer[1] = 0;
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECNUM,
+ CB_ADDSTRING,
+ 0,
+ (LPARAM)szBuffer);
+ }
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYDECNUM,
+ CB_SETCURSEL,
+ pGlobalData->nCurrDigits,
+ 0);
+}
+
+
+/* Initialize the list of group separators */
+static VOID
+InitCurrencyGroupSeparators(HWND hwndDlg, PGLOBALDATA pGlobalData)
+{
+ /* Limit text length */
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYGRPSEP,
+ CB_LIMITTEXT,
+ MAX_CURRTHOUSANDSEP - 1,
+ 0);
+
+ /* Digit group separator */
+ 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)
+{
+ WCHAR szBuffer[MAX_FMT_SIZE];
+ CURRENCYFMTW cyFmt;
+ INT i;
+
+ /* Digit grouping */
+ cyFmt.NumDigits = 0;
+ cyFmt.LeadingZero = 0;
+ cyFmt.lpDecimalSep = L"";
+ cyFmt.lpThousandSep = pGlobalData->szCurrThousandSep;
+ cyFmt.PositiveOrder = 0;
+ cyFmt.NegativeOrder = 0;
+ cyFmt.lpCurrencySymbol = L"";
+
+ for (i = 0 ; i < MAX_GROUPINGFORMATS ; i++)
+ {
+ 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);
+ }
+
+ SendDlgItemMessageW(hwndDlg, IDC_CURRENCYGRPNUM,
+ CB_SETCURSEL,
+ pGlobalData->nCurrGrouping,
+ 0);
+}
+
+
+static
+BOOL
+GetCurrencySetting(
+ HWND hwndDlg,
+ PGLOBALDATA pGlobalData)
+{
+ 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')
+ {
+ /* TODO: Show error message */
+
+ return FALSE;
+ }
+
+ /* Positive Amount */
+ GetSelectedComboBoxIndex(hwndDlg,
+ IDC_CURRENCYPOSVALUE,
+ &nCurrPosFormat);
+
+ /* Negative Amount */
+ GetSelectedComboBoxIndex(hwndDlg,
+ IDC_CURRENCYNEGVALUE,
+ &nCurrNegFormat);
+
+ /* Decimal separator */
+ GetSelectedComboBoxText(hwndDlg,
+ IDC_CURRENCYDECSEP,
+ szCurrDecimalSep,
+ MAX_CURRDECIMALSEP);
+
+ if (szCurrDecimalSep[0] == L'\0')
+ {
+ /* TODO: Show error message */
+
+ return FALSE;
+ }
+
+ /* Number of fractional digits */
+ GetSelectedComboBoxIndex(hwndDlg,
+ IDC_CURRENCYDECNUM,
+ &nCurrDigits);
+
+ /* Grouping symbol */
+ GetSelectedComboBoxText(hwndDlg,
+ IDC_CURRENCYGRPSEP,
+ szCurrThousandSep,
+ MAX_CURRTHOUSANDSEP);
+
+ if (szCurrThousandSep[0] == L'\0')
+ {
+ /* TODO: Show error message */
+
+ return FALSE;
+ }
+
+ /* 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;
+}
+
+/* Property page dialog callback */
+INT_PTR CALLBACK
+CurrencyPageProc(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);
+
+ InitCurrencySymbols(hwndDlg, pGlobalData);
+ InitCurrencyPositiveFormats(hwndDlg, pGlobalData);
+ InitCurrencyNegativeFormats(hwndDlg, pGlobalData);
+ InitCurrencyDecimalSeparators(hwndDlg, pGlobalData);
+ InitCurrencyNumFracDigits(hwndDlg, pGlobalData);
+ InitCurrencyGroupSeparators(hwndDlg, pGlobalData);
+ InitDigitGroupCB(hwndDlg, pGlobalData);
+ UpdateExamples(hwndDlg, pGlobalData);
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_CURRENCYSYMBOL:
+ case IDC_CURRENCYPOSVALUE:
+ case IDC_CURRENCYNEGVALUE:
+ case IDC_CURRENCYDECSEP:
+ case IDC_CURRENCYDECNUM:
+ case IDC_CURRENCYGRPSEP:
+ case IDC_CURRENCYGRPNUM:
+ if (HIWORD(wParam) == CBN_SELCHANGE ||
+ HIWORD(wParam) == CBN_EDITCHANGE)
+ {
+ /* Enable the Apply button */
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ }
+ }
+ break;
+
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
+ {
+ if (GetCurrencySetting(hwndDlg, pGlobalData))
+ {
+ pGlobalData->bUserLocaleChanged = TRUE;
+ UpdateExamples(hwndDlg, pGlobalData);
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
+
+/* EOF */