reactos/dll/cpl/intl/currency.c

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