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.
20 * PROJECT: ReactOS International Control Panel
21 * FILE: dll/cpl/intl/currency.c
22 * PURPOSE: Currency property page
23 * PROGRAMMER: Eric Kohl
28 #define POSITIVE_EXAMPLE _T("123456789.00")
29 #define NEGATIVE_EXAMPLE _T("-123456789.00")
30 #define MAX_FIELD_DIG_SAMPLES 3
34 UpdateExamples(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
36 TCHAR szBuffer
[MAX_FMT_SIZE
];
38 /* Positive example */
39 GetCurrencyFormat(pGlobalData
->lcid
, 0,
41 NULL
, szBuffer
, MAX_FMT_SIZE
);
43 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSSAMPLE
), WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
45 /* Negative example */
46 GetCurrencyFormat(pGlobalData
->lcid
, 0,
48 NULL
, szBuffer
, MAX_FMT_SIZE
);
50 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGSAMPLE
), WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
55 InitCurrencySymbols(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
57 TCHAR szBuffer
[MAX_FMT_SIZE
];
59 /* Limit text length */
60 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
65 /* Set currency symbols */
66 GetLocaleInfo(pGlobalData
->lcid
,
68 szBuffer
, MAX_FMT_SIZE
);
70 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
75 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
83 InitCurrencyPositiveFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
85 TCHAR szDecimalSep
[MAX_FMT_SIZE
];
86 TCHAR szThousandSep
[MAX_FMT_SIZE
];
87 TCHAR szCurrencySymbol
[MAX_FMT_SIZE
];
88 TCHAR szBuffer
[MAX_FMT_SIZE
];
90 INT nPositiveOrder
= 0;
95 /* Get positive format */
96 ret
= GetLocaleInfo(pGlobalData
->lcid
,
98 szBuffer
, MAX_FMT_SIZE
);
101 nPositiveOrder
= _ttoi(szBuffer
);
104 /* Get number of fractional digits */
105 ret
= GetLocaleInfo(pGlobalData
->lcid
,
107 szBuffer
, MAX_FMT_SIZE
);
110 cyFmt
.NumDigits
= _ttoi(szBuffer
);
117 /* Get decimal separator */
118 ret
= GetLocaleInfo(pGlobalData
->lcid
,
119 LOCALE_SMONDECIMALSEP
,
120 szDecimalSep
, MAX_FMT_SIZE
);
122 /* Get group separator */
123 ret
= GetLocaleInfo(pGlobalData
->lcid
,
124 LOCALE_SMONTHOUSANDSEP
,
125 szThousandSep
, MAX_FMT_SIZE
);
127 /* Get currency symbol */
128 ret
= GetLocaleInfo(pGlobalData
->lcid
,
130 szCurrencySymbol
, MAX_FMT_SIZE
);
132 /* positive currency values */
133 cyFmt
.LeadingZero
= 0;
135 cyFmt
.lpDecimalSep
= szDecimalSep
;
136 cyFmt
.lpThousandSep
= szThousandSep
;
137 cyFmt
.lpCurrencySymbol
= szCurrencySymbol
;
138 cyFmt
.NegativeOrder
= 0;
140 for (i
= 0; i
< 4; i
++)
142 cyFmt
.PositiveOrder
= i
;
143 GetCurrencyFormat(pGlobalData
->lcid
, 0,
145 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
147 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSVALUE
),
153 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSVALUE
),
161 InitCurrencyNegativeFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
163 TCHAR szDecimalSep
[MAX_FMT_SIZE
];
164 TCHAR szThousandSep
[MAX_FMT_SIZE
];
165 TCHAR szCurrencySymbol
[MAX_FMT_SIZE
];
166 TCHAR szBuffer
[MAX_FMT_SIZE
];
168 INT nNegativeOrder
= 0;
172 /* Get negative format */
173 ret
= GetLocaleInfo(pGlobalData
->lcid
,
175 szBuffer
, MAX_FMT_SIZE
);
178 nNegativeOrder
= _ttoi(szBuffer
);
181 /* Get number of fractional digits */
182 ret
= GetLocaleInfo(pGlobalData
->lcid
,
184 szBuffer
, MAX_FMT_SIZE
);
187 cyFmt
.NumDigits
= _ttoi(szBuffer
);
194 /* Get decimal separator */
195 ret
= GetLocaleInfo(pGlobalData
->lcid
,
196 LOCALE_SMONDECIMALSEP
,
197 szDecimalSep
, MAX_FMT_SIZE
);
199 /* Get group separator */
200 ret
= GetLocaleInfo(pGlobalData
->lcid
,
201 LOCALE_SMONTHOUSANDSEP
,
202 szThousandSep
, MAX_FMT_SIZE
);
204 /* Get currency symbol */
205 ret
= GetLocaleInfo(pGlobalData
->lcid
,
207 szCurrencySymbol
, MAX_FMT_SIZE
);
209 /* negative currency values */
210 cyFmt
.LeadingZero
= 0;
212 cyFmt
.lpDecimalSep
= szDecimalSep
;
213 cyFmt
.lpThousandSep
= szThousandSep
;
214 cyFmt
.lpCurrencySymbol
= szCurrencySymbol
;
215 cyFmt
.PositiveOrder
= 0;
217 for (i
= 0; i
< 16; i
++)
219 cyFmt
.NegativeOrder
= i
;
220 GetCurrencyFormat(pGlobalData
->lcid
, 0,
222 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
224 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGVALUE
),
230 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGVALUE
),
238 InitCurrencyDecimalSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
240 TCHAR szBuffer
[MAX_FMT_SIZE
];
242 /* Limit text length */
243 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
248 /* Get decimal separator */
249 GetLocaleInfo(pGlobalData
->lcid
,
250 LOCALE_SMONDECIMALSEP
,
251 szBuffer
, MAX_FMT_SIZE
);
253 /* Decimal separator */
254 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
259 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
266 /* Initialize the number of fractional digits */
268 InitCurrencyNumFracDigits(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
270 TCHAR szBuffer
[MAX_FMT_SIZE
];
274 /* Create standard list of fractional symbols */
275 for (i
= 0; i
< 10; i
++)
277 szBuffer
[0] = _T('0') + i
;
279 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
285 /* Get number of fractional digits */
286 ret
= GetLocaleInfo(pGlobalData
->lcid
,
288 szBuffer
, MAX_FMT_SIZE
);
291 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
298 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
306 /* Initialize the list of group separators */
308 InitCurrencyGroupSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
310 TCHAR szBuffer
[MAX_FMT_SIZE
];
312 /* Limit text length */
313 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
318 /* Get group separator */
319 GetLocaleInfo(pGlobalData
->lcid
,
320 LOCALE_SMONTHOUSANDSEP
,
321 szBuffer
, MAX_FMT_SIZE
);
323 /* Digit group separator */
324 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
329 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
337 InitDigitGroupCB(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
339 TCHAR szThousandSep
[MAX_FMT_SIZE
];
340 TCHAR szGrouping
[MAX_FMT_SIZE
];
341 TCHAR szBuffer
[MAX_FMT_SIZE
];
345 /* Get group separator */
346 GetLocaleInfo(pGlobalData
->lcid
,
347 LOCALE_SMONTHOUSANDSEP
,
348 szThousandSep
, MAX_FMT_SIZE
);
351 GetLocaleInfo(pGlobalData
->lcid
,
353 szGrouping
, MAX_FMT_SIZE
);
357 cyFmt
.LeadingZero
= 0;
358 cyFmt
.lpDecimalSep
= _T("");
359 cyFmt
.lpThousandSep
= szThousandSep
;
360 cyFmt
.PositiveOrder
= 0;
361 cyFmt
.NegativeOrder
= 0;
362 cyFmt
.lpCurrencySymbol
= _T("");
364 GetCurrencyFormat(pGlobalData
->lcid
, 0,
366 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
367 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
373 GetCurrencyFormat(pGlobalData
->lcid
, 0,
375 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
376 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
382 GetCurrencyFormat(pGlobalData
->lcid
, 0,
384 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
385 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
391 if (szGrouping
[0] == _T('3'))
393 if ((szGrouping
[1] == _T(';')) &&
394 (szGrouping
[2] == _T('2')))
400 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
407 /* Set number of digits in field */
409 SetCurrencyDigNum(HWND hwndDlg
, LCID lcid
)
411 LPTSTR szFieldDigNumSamples
[MAX_FIELD_DIG_SAMPLES
]=
420 /* Get setted number of digits in field */
421 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPNUM
),
426 /* Save number of digits in field */
427 if (nCurrSel
!= CB_ERR
)
428 SetLocaleInfo(lcid
, LOCALE_SMONGROUPING
, szFieldDigNumSamples
[nCurrSel
]);
433 /* Set currency field separator */
435 SetCurrencyFieldSep(HWND hwndDlg
, LCID lcid
)
437 TCHAR szCurrencyFieldSep
[MAX_SAMPLES_STR_SIZE
];
439 /* Get setted currency field separator */
440 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYGRPSEP
),
442 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
443 (LPARAM
)szCurrencyFieldSep
);
445 /* Save currency field separator */
446 SetLocaleInfo(lcid
, LOCALE_SMONTHOUSANDSEP
, szCurrencyFieldSep
);
451 /* Set number of fractional symbols */
453 SetCurrencyFracSymNum(HWND hwndDlg
, LCID lcid
)
455 TCHAR szCurrencyFracSymNum
[MAX_SAMPLES_STR_SIZE
];
458 /* Get setted number of fractional symbols */
459 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECNUM
),
464 /* Convert to wide char */
465 _itot(nCurrSel
, szCurrencyFracSymNum
, DECIMAL_RADIX
);
467 /* Save number of fractional symbols */
468 SetLocaleInfo(lcid
, LOCALE_ICURRDIGITS
, szCurrencyFracSymNum
);
473 /* Set currency separator */
475 SetCurrencySep(HWND hwndDlg
, LCID lcid
)
477 TCHAR szCurrencySep
[MAX_SAMPLES_STR_SIZE
];
479 /* Get setted currency decimal separator */
480 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYDECSEP
),
482 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
483 (LPARAM
)szCurrencySep
);
485 /* TODO: Add check for correctly input */
487 /* Save currency separator */
488 SetLocaleInfo(lcid
, LOCALE_SMONDECIMALSEP
, szCurrencySep
);
493 /* Set negative currency sum format */
495 SetNegCurrencySumFmt(HWND hwndDlg
, LCID lcid
)
497 TCHAR szNegCurrencySumFmt
[MAX_SAMPLES_STR_SIZE
];
500 /* Get setted currency unit */
501 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYNEGVALUE
),
506 /* Convert to wide char */
507 _itot(nCurrSel
, szNegCurrencySumFmt
, DECIMAL_RADIX
);
509 /* Save currency sum format */
510 SetLocaleInfo(lcid
, LOCALE_INEGCURR
, szNegCurrencySumFmt
);
515 /* Set positive currency sum format */
517 SetPosCurrencySumFmt(HWND hwndDlg
, LCID lcid
)
519 TCHAR szPosCurrencySumFmt
[MAX_SAMPLES_STR_SIZE
];
522 /* Get setted currency unit */
523 nCurrSel
= SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYPOSVALUE
),
528 /* Convert to wide char */
529 _itot(nCurrSel
, szPosCurrencySumFmt
, DECIMAL_RADIX
);
531 /* Save currency sum format */
532 SetLocaleInfo(lcid
, LOCALE_ICURRENCY
, szPosCurrencySumFmt
);
537 /* Set currency unit */
539 SetCurrencyUnit(HWND hwndDlg
, LCID lcid
)
541 TCHAR szCurrencyUnit
[MAX_SAMPLES_STR_SIZE
];
543 /* Get setted currency unit */
544 SendMessage(GetDlgItem(hwndDlg
, IDC_CURRENCYSYMBOL
),
546 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
547 (LPARAM
)(LPCSTR
)szCurrencyUnit
);
549 /* Save currency unit */
550 SetLocaleInfo(lcid
, LOCALE_SCURRENCY
, szCurrencyUnit
);
555 /* Property page dialog callback */
557 CurrencyPageProc(HWND hwndDlg
,
562 PGLOBALDATA pGlobalData
;
564 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
569 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
570 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
572 InitCurrencySymbols(hwndDlg
, pGlobalData
);
573 InitCurrencyPositiveFormats(hwndDlg
, pGlobalData
);
574 InitCurrencyNegativeFormats(hwndDlg
, pGlobalData
);
575 InitCurrencyDecimalSeparators(hwndDlg
, pGlobalData
);
576 InitCurrencyNumFracDigits(hwndDlg
, pGlobalData
);
577 InitCurrencyGroupSeparators(hwndDlg
, pGlobalData
);
578 InitDigitGroupCB(hwndDlg
, pGlobalData
);
579 UpdateExamples(hwndDlg
, pGlobalData
);
583 switch (LOWORD(wParam
))
585 case IDC_CURRENCYSYMBOL
:
586 case IDC_CURRENCYPOSVALUE
:
587 case IDC_CURRENCYNEGVALUE
:
588 case IDC_CURRENCYDECSEP
:
589 case IDC_CURRENCYDECNUM
:
590 case IDC_CURRENCYGRPSEP
:
591 case IDC_CURRENCYGRPNUM
:
592 if (HIWORD(wParam
) == CBN_SELCHANGE
|| HIWORD(wParam
) == CBN_EDITCHANGE
)
594 /* Set "Apply" button enabled */
595 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
602 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
603 /* If push apply button */
604 if (lpnm
->code
== (UINT
)PSN_APPLY
)
606 if (!SetCurrencyDigNum(hwndDlg
, pGlobalData
->lcid
))
609 if (!SetCurrencyUnit(hwndDlg
, pGlobalData
->lcid
))
612 if (!SetPosCurrencySumFmt(hwndDlg
, pGlobalData
->lcid
))
615 if (!SetNegCurrencySumFmt(hwndDlg
, pGlobalData
->lcid
))
618 if (!SetCurrencySep(hwndDlg
, pGlobalData
->lcid
))
621 if (!SetCurrencyFracSymNum(hwndDlg
, pGlobalData
->lcid
))
624 if (!SetCurrencyFieldSep(hwndDlg
, pGlobalData
->lcid
))
627 UpdateExamples(hwndDlg
, pGlobalData
);