+++ /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 */