3 * Copyright (C) 2004 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * PROJECT: ReactOS International Control Panel
22 * FILE: dll/cpl/intl/currency.c
23 * PURPOSE: Currency property page
24 * PROGRAMMER: Eric Kohl
29 #define POSITIVE_EXAMPLE _T("123456789.00")
30 #define NEGATIVE_EXAMPLE _T("-123456789.00")
31 #define MAX_FIELD_DIG_SAMPLES 3
35 UpdateExamples(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
37 TCHAR szBuffer
[MAX_FMT_SIZE
];
39 /* Positive example */
40 GetCurrencyFormat(pGlobalData
->lcid
, 0,
42 NULL
, szBuffer
, MAX_FMT_SIZE
);
44 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSSAMPLE
), WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
46 /* Negative example */
47 GetCurrencyFormat(pGlobalData
->lcid
, 0,
49 NULL
, szBuffer
, MAX_FMT_SIZE
);
51 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGSAMPLE
), WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
56 InitCurrencySymbols(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
58 TCHAR szBuffer
[MAX_FMT_SIZE
];
60 /* Limit text length */
61 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
66 /* Set currency symbols */
67 GetLocaleInfo(pGlobalData
->lcid
,
69 szBuffer
, MAX_FMT_SIZE
);
71 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
76 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
84 InitCurrencyPositiveFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
86 TCHAR szDecimalSep
[MAX_FMT_SIZE
];
87 TCHAR szThousandSep
[MAX_FMT_SIZE
];
88 TCHAR szCurrencySymbol
[MAX_FMT_SIZE
];
89 TCHAR szBuffer
[MAX_FMT_SIZE
];
91 INT nPositiveOrder
= 0;
96 /* Get positive format */
97 ret
= GetLocaleInfo(pGlobalData
->lcid
,
99 szBuffer
, MAX_FMT_SIZE
);
102 nPositiveOrder
= _ttoi(szBuffer
);
105 /* Get number of fractional digits */
106 ret
= GetLocaleInfo(pGlobalData
->lcid
,
108 szBuffer
, MAX_FMT_SIZE
);
111 cyFmt
.NumDigits
= _ttoi(szBuffer
);
118 /* Get decimal separator */
119 ret
= GetLocaleInfo(pGlobalData
->lcid
,
120 LOCALE_SMONDECIMALSEP
,
121 szDecimalSep
, MAX_FMT_SIZE
);
123 /* Get group separator */
124 ret
= GetLocaleInfo(pGlobalData
->lcid
,
125 LOCALE_SMONTHOUSANDSEP
,
126 szThousandSep
, MAX_FMT_SIZE
);
128 /* Get currency symbol */
129 ret
= GetLocaleInfo(pGlobalData
->lcid
,
131 szCurrencySymbol
, MAX_FMT_SIZE
);
133 /* positive currency values */
134 cyFmt
.LeadingZero
= 0;
136 cyFmt
.lpDecimalSep
= szDecimalSep
;
137 cyFmt
.lpThousandSep
= szThousandSep
;
138 cyFmt
.lpCurrencySymbol
= szCurrencySymbol
;
139 cyFmt
.NegativeOrder
= 0;
141 for (i
= 0; i
< 4; i
++)
143 cyFmt
.PositiveOrder
= i
;
144 GetCurrencyFormat(pGlobalData
->lcid
, 0,
146 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
148 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSVALUE
),
154 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSVALUE
),
162 InitCurrencyNegativeFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
164 TCHAR szDecimalSep
[MAX_FMT_SIZE
];
165 TCHAR szThousandSep
[MAX_FMT_SIZE
];
166 TCHAR szCurrencySymbol
[MAX_FMT_SIZE
];
167 TCHAR szBuffer
[MAX_FMT_SIZE
];
169 INT nNegativeOrder
= 0;
173 /* Get negative format */
174 ret
= GetLocaleInfo(pGlobalData
->lcid
,
176 szBuffer
, MAX_FMT_SIZE
);
179 nNegativeOrder
= _ttoi(szBuffer
);
182 /* Get number of fractional digits */
183 ret
= GetLocaleInfo(pGlobalData
->lcid
,
185 szBuffer
, MAX_FMT_SIZE
);
188 cyFmt
.NumDigits
= _ttoi(szBuffer
);
195 /* Get decimal separator */
196 ret
= GetLocaleInfo(pGlobalData
->lcid
,
197 LOCALE_SMONDECIMALSEP
,
198 szDecimalSep
, MAX_FMT_SIZE
);
200 /* Get group separator */
201 ret
= GetLocaleInfo(pGlobalData
->lcid
,
202 LOCALE_SMONTHOUSANDSEP
,
203 szThousandSep
, MAX_FMT_SIZE
);
205 /* Get currency symbol */
206 ret
= GetLocaleInfo(pGlobalData
->lcid
,
208 szCurrencySymbol
, MAX_FMT_SIZE
);
210 /* negative currency values */
211 cyFmt
.LeadingZero
= 0;
213 cyFmt
.lpDecimalSep
= szDecimalSep
;
214 cyFmt
.lpThousandSep
= szThousandSep
;
215 cyFmt
.lpCurrencySymbol
= szCurrencySymbol
;
216 cyFmt
.PositiveOrder
= 0;
218 for (i
= 0; i
< 16; i
++)
220 cyFmt
.NegativeOrder
= i
;
221 GetCurrencyFormat(pGlobalData
->lcid
, 0,
223 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
225 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGVALUE
),
231 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGVALUE
),
239 InitCurrencyDecimalSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
241 TCHAR szBuffer
[MAX_FMT_SIZE
];
243 /* Limit text length */
244 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
249 /* Get decimal separator */
250 GetLocaleInfo(pGlobalData
->lcid
,
251 LOCALE_SMONDECIMALSEP
,
252 szBuffer
, MAX_FMT_SIZE
);
254 /* Decimal separator */
255 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
260 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
267 /* Initialize the number of fractional digits */
269 InitCurrencyNumFracDigits(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
271 TCHAR szBuffer
[MAX_FMT_SIZE
];
275 /* Create standard list of fractional symbols */
276 for (i
= 0; i
< 10; i
++)
278 szBuffer
[0] = _T('0') + i
;
280 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
286 /* Get number of fractional digits */
287 ret
= GetLocaleInfo(pGlobalData
->lcid
,
289 szBuffer
, MAX_FMT_SIZE
);
292 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
299 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
307 /* Initialize the list of group separators */
309 InitCurrencyGroupSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
311 TCHAR szBuffer
[MAX_FMT_SIZE
];
313 /* Limit text length */
314 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
319 /* Get group separator */
320 GetLocaleInfo(pGlobalData
->lcid
,
321 LOCALE_SMONTHOUSANDSEP
,
322 szBuffer
, MAX_FMT_SIZE
);
324 /* Digit group separator */
325 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
330 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
338 InitDigitGroupCB(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
340 TCHAR szThousandSep
[MAX_FMT_SIZE
];
341 TCHAR szGrouping
[MAX_FMT_SIZE
];
342 TCHAR szBuffer
[MAX_FMT_SIZE
];
346 /* Get group separator */
347 GetLocaleInfo(pGlobalData
->lcid
,
348 LOCALE_SMONTHOUSANDSEP
,
349 szThousandSep
, MAX_FMT_SIZE
);
352 GetLocaleInfo(pGlobalData
->lcid
,
354 szGrouping
, MAX_FMT_SIZE
);
358 cyFmt
.LeadingZero
= 0;
359 cyFmt
.lpDecimalSep
= _T("");
360 cyFmt
.lpThousandSep
= szThousandSep
;
361 cyFmt
.PositiveOrder
= 0;
362 cyFmt
.NegativeOrder
= 0;
363 cyFmt
.lpCurrencySymbol
= _T("");
365 GetCurrencyFormat(pGlobalData
->lcid
, 0,
367 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
368 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
374 GetCurrencyFormat(pGlobalData
->lcid
, 0,
376 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
377 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
383 GetCurrencyFormat(pGlobalData
->lcid
, 0,
385 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
386 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
392 if (szGrouping
[0] == _T('3'))
394 if ((szGrouping
[1] == _T(';')) &&
395 (szGrouping
[2] == _T('2')))
401 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
408 /* Set number of digits in field */
410 SetCurrencyDigNum(HWND hwndDlg
, LCID lcid
)
412 LPTSTR szFieldDigNumSamples
[MAX_FIELD_DIG_SAMPLES
]=
421 /* Get setted number of digits in field */
422 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
427 /* Save number of digits in field */
428 if (nCurrSel
!= CB_ERR
)
429 SetLocaleInfo(lcid
, LOCALE_SMONGROUPING
, szFieldDigNumSamples
[nCurrSel
]);
434 /* Set currency field separator */
436 SetCurrencyFieldSep(HWND hwndDlg
, LCID lcid
)
438 TCHAR szCurrencyFieldSep
[MAX_SAMPLES_STR_SIZE
];
440 /* Get setted currency field separator */
441 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
443 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
444 (LPARAM
)szCurrencyFieldSep
);
446 /* Save currency field separator */
447 SetLocaleInfo(lcid
, LOCALE_SMONTHOUSANDSEP
, szCurrencyFieldSep
);
452 /* Set number of fractional symbols */
454 SetCurrencyFracSymNum(HWND hwndDlg
, LCID lcid
)
456 TCHAR szCurrencyFracSymNum
[MAX_SAMPLES_STR_SIZE
];
459 /* Get setted number of fractional symbols */
460 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
465 /* Convert to wide char */
466 _itot(nCurrSel
, szCurrencyFracSymNum
, DECIMAL_RADIX
);
468 /* Save number of fractional symbols */
469 SetLocaleInfo(lcid
, LOCALE_ICURRDIGITS
, szCurrencyFracSymNum
);
474 /* Set currency separator */
476 SetCurrencySep(HWND hwndDlg
, LCID lcid
)
478 TCHAR szCurrencySep
[MAX_SAMPLES_STR_SIZE
];
480 /* Get setted currency decimal separator */
481 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
483 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
484 (LPARAM
)szCurrencySep
);
486 /* TODO: Add check for correctly input */
488 /* Save currency separator */
489 SetLocaleInfo(lcid
, LOCALE_SMONDECIMALSEP
, szCurrencySep
);
494 /* Set negative currency sum format */
496 SetNegCurrencySumFmt(HWND hwndDlg
, LCID lcid
)
498 TCHAR szNegCurrencySumFmt
[MAX_SAMPLES_STR_SIZE
];
501 /* Get setted currency unit */
502 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGVALUE
),
507 /* Convert to wide char */
508 _itot(nCurrSel
, szNegCurrencySumFmt
, DECIMAL_RADIX
);
510 /* Save currency sum format */
511 SetLocaleInfo(lcid
, LOCALE_INEGCURR
, szNegCurrencySumFmt
);
516 /* Set positive currency sum format */
518 SetPosCurrencySumFmt(HWND hwndDlg
, LCID lcid
)
520 TCHAR szPosCurrencySumFmt
[MAX_SAMPLES_STR_SIZE
];
523 /* Get setted currency unit */
524 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSVALUE
),
529 /* Convert to wide char */
530 _itot(nCurrSel
, szPosCurrencySumFmt
, DECIMAL_RADIX
);
532 /* Save currency sum format */
533 SetLocaleInfo(lcid
, LOCALE_ICURRENCY
, szPosCurrencySumFmt
);
538 /* Set currency unit */
540 SetCurrencyUnit(HWND hwndDlg
, LCID lcid
)
542 TCHAR szCurrencyUnit
[MAX_SAMPLES_STR_SIZE
];
544 /* Get setted currency unit */
545 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
547 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
548 (LPARAM
)(LPCSTR
)szCurrencyUnit
);
550 /* Save currency unit */
551 SetLocaleInfo(lcid
, LOCALE_SCURRENCY
, szCurrencyUnit
);
556 /* Property page dialog callback */
558 CurrencyPageProc(HWND hwndDlg
,
563 PGLOBALDATA pGlobalData
;
565 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
570 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
571 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
573 InitCurrencySymbols(hwndDlg
, pGlobalData
);
574 InitCurrencyPositiveFormats(hwndDlg
, pGlobalData
);
575 InitCurrencyNegativeFormats(hwndDlg
, pGlobalData
);
576 InitCurrencyDecimalSeparators(hwndDlg
, pGlobalData
);
577 InitCurrencyNumFracDigits(hwndDlg
, pGlobalData
);
578 InitCurrencyGroupSeparators(hwndDlg
, pGlobalData
);
579 InitDigitGroupCB(hwndDlg
, pGlobalData
);
580 UpdateExamples(hwndDlg
, pGlobalData
);
584 switch (LOWORD(wParam
))
586 case IDC_CURRENCYSYMBOL
:
587 case IDC_CURRENCYPOSVALUE
:
588 case IDC_CURRENCYNEGVALUE
:
589 case IDC_CURRENCYDECSEP
:
590 case IDC_CURRENCYDECNUM
:
591 case IDC_CURRENCYGRPSEP
:
592 case IDC_CURRENCYGRPNUM
:
593 if (HIWORD(wParam
) == CBN_SELCHANGE
|| HIWORD(wParam
) == CBN_EDITCHANGE
)
595 /* Set "Apply" button enabled */
596 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
603 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
604 /* If push apply button */
605 if (lpnm
->code
== (UINT
)PSN_APPLY
)
607 if (!SetCurrencyDigNum(hwndDlg
, pGlobalData
->lcid
))
610 if (!SetCurrencyUnit(hwndDlg
, pGlobalData
->lcid
))
613 if (!SetPosCurrencySumFmt(hwndDlg
, pGlobalData
->lcid
))
616 if (!SetNegCurrencySumFmt(hwndDlg
, pGlobalData
->lcid
))
619 if (!SetCurrencySep(hwndDlg
, pGlobalData
->lcid
))
622 if (!SetCurrencyFracSymNum(hwndDlg
, pGlobalData
->lcid
))
625 if (!SetCurrencyFieldSep(hwndDlg
, pGlobalData
->lcid
))
628 UpdateExamples(hwndDlg
, pGlobalData
);