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 L"123456789.00"
29 #define NEGATIVE_EXAMPLE L"-123456789.00"
33 UpdateExamples(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
35 WCHAR szBuffer
[MAX_FMT_SIZE
];
37 /* Positive example */
38 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
40 NULL
, szBuffer
, MAX_FMT_SIZE
);
42 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSSAMPLE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
44 /* Negative example */
45 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
47 NULL
, szBuffer
, MAX_FMT_SIZE
);
49 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGSAMPLE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
54 InitCurrencySymbols(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
56 /* Limit text length */
57 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
62 /* Set currency symbols */
63 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
66 (LPARAM
)pGlobalData
->szCurrSymbol
);
68 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
76 InitCurrencyPositiveFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
78 WCHAR szBuffer
[MAX_FMT_SIZE
];
82 /* positive currency values */
83 cyFmt
.NumDigits
= pGlobalData
->nCurrDigits
;
84 cyFmt
.LeadingZero
= 0;
86 cyFmt
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
87 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
88 cyFmt
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
89 cyFmt
.NegativeOrder
= 0;
91 for (i
= 0; i
< 4; i
++)
93 cyFmt
.PositiveOrder
= i
;
94 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
96 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
98 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
104 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
106 pGlobalData
->nCurrPosFormat
,
112 InitCurrencyNegativeFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
114 WCHAR szBuffer
[MAX_FMT_SIZE
];
118 /* negative currency values */
119 cyFmt
.NumDigits
= pGlobalData
->nCurrDigits
;
120 cyFmt
.LeadingZero
= 0;
122 cyFmt
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
123 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
124 cyFmt
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
125 cyFmt
.PositiveOrder
= 0;
127 for (i
= 0; i
< 16; i
++)
129 cyFmt
.NegativeOrder
= i
;
130 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
132 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
134 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
140 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
142 pGlobalData
->nCurrNegFormat
,
148 InitCurrencyDecimalSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
150 /* Limit text length */
151 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
153 MAX_CURRDECIMALSEP
- 1,
156 /* Decimal separator */
157 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
160 (LPARAM
)pGlobalData
->szCurrDecimalSep
);
162 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
169 /* Initialize the number of fractional digits */
171 InitCurrencyNumFracDigits(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
173 WCHAR szBuffer
[MAX_FMT_SIZE
];
176 /* Create standard list of fractional symbols */
177 for (i
= 0; i
< 10; i
++)
179 szBuffer
[0] = L
'0' + i
;
181 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
187 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
189 pGlobalData
->nCurrDigits
,
194 /* Initialize the list of group separators */
196 InitCurrencyGroupSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
198 /* Limit text length */
199 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
201 MAX_CURRTHOUSANDSEP
- 1,
204 /* Digit group separator */
205 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
208 (LPARAM
)pGlobalData
->szCurrThousandSep
);
210 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
218 InitDigitGroupCB(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
220 WCHAR szBuffer
[MAX_FMT_SIZE
];
225 cyFmt
.LeadingZero
= 0;
226 cyFmt
.lpDecimalSep
= L
"";
227 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
228 cyFmt
.PositiveOrder
= 0;
229 cyFmt
.NegativeOrder
= 0;
230 cyFmt
.lpCurrencySymbol
= L
"";
232 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
234 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
235 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
241 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
243 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
244 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
250 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
252 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
253 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
258 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
260 pGlobalData
->nCurrGrouping
, /* Index */
265 /* Set number of digits in field */
267 SetCurrencyDigNum(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
271 /* Get setted number of digits in field */
272 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
277 /* Save number of digits in field */
278 if (nCurrSel
!= CB_ERR
)
279 pGlobalData
->nCurrGrouping
= nCurrSel
;
284 /* Set currency field separator */
286 SetCurrencyFieldSep(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
288 /* Get setted currency field separator */
289 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
291 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
292 (LPARAM
)pGlobalData
->szCurrThousandSep
);
297 /* Set number of fractional symbols */
299 SetCurrencyFracSymNum(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
303 /* Get setted number of fractional symbols */
304 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
308 if (nCurrSel
== CB_ERR
)
311 pGlobalData
->nCurrDigits
= nCurrSel
;
316 /* Set currency separator */
318 SetCurrencySep(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
320 /* Get setted currency decimal separator */
321 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
323 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
324 (LPARAM
)pGlobalData
->szCurrDecimalSep
);
329 /* Set negative currency sum format */
331 SetNegCurrencySumFmt(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
335 /* Get setted currency unit */
336 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
340 if (nCurrSel
== CB_ERR
)
343 pGlobalData
->nCurrNegFormat
= nCurrSel
;
348 /* Set positive currency sum format */
350 SetPosCurrencySumFmt(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
354 /* Get setted currency unit */
355 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
359 if (nCurrSel
== CB_ERR
)
362 pGlobalData
->nCurrPosFormat
= nCurrSel
;
367 /* Set currency symbol */
369 SetCurrencySymbol(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
371 /* Get setted currency unit */
372 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
374 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
375 (LPARAM
)(PCWSTR
)pGlobalData
->szCurrSymbol
);
380 /* Property page dialog callback */
382 CurrencyPageProc(HWND hwndDlg
,
387 PGLOBALDATA pGlobalData
;
389 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
394 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
395 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
397 InitCurrencySymbols(hwndDlg
, pGlobalData
);
398 InitCurrencyPositiveFormats(hwndDlg
, pGlobalData
);
399 InitCurrencyNegativeFormats(hwndDlg
, pGlobalData
);
400 InitCurrencyDecimalSeparators(hwndDlg
, pGlobalData
);
401 InitCurrencyNumFracDigits(hwndDlg
, pGlobalData
);
402 InitCurrencyGroupSeparators(hwndDlg
, pGlobalData
);
403 InitDigitGroupCB(hwndDlg
, pGlobalData
);
404 UpdateExamples(hwndDlg
, pGlobalData
);
408 switch (LOWORD(wParam
))
410 case IDC_CURRENCYSYMBOL
:
411 case IDC_CURRENCYPOSVALUE
:
412 case IDC_CURRENCYNEGVALUE
:
413 case IDC_CURRENCYDECSEP
:
414 case IDC_CURRENCYDECNUM
:
415 case IDC_CURRENCYGRPSEP
:
416 case IDC_CURRENCYGRPNUM
:
417 if (HIWORD(wParam
) == CBN_SELCHANGE
|| HIWORD(wParam
) == CBN_EDITCHANGE
)
419 /* Set "Apply" button enabled */
420 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
426 if (((LPNMHDR
)lParam
)->code
== (UINT
)PSN_APPLY
)
428 if (!SetCurrencySymbol(hwndDlg
, pGlobalData
))
431 if (!SetCurrencyDigNum(hwndDlg
, pGlobalData
))
434 if (!SetPosCurrencySumFmt(hwndDlg
, pGlobalData
))
437 if (!SetNegCurrencySumFmt(hwndDlg
, pGlobalData
))
440 if (!SetCurrencySep(hwndDlg
, pGlobalData
))
443 if (!SetCurrencyFracSymNum(hwndDlg
, pGlobalData
))
446 if (!SetCurrencyFieldSep(hwndDlg
, pGlobalData
))
449 pGlobalData
->fUserLocaleChanged
= TRUE
;
451 UpdateExamples(hwndDlg
, pGlobalData
);