mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 20:32:36 +00:00
410 lines
12 KiB
C
410 lines
12 KiB
C
/*
|
|
* 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 */
|