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
];
36 CURRENCYFMTW CurrencyFormat
;
38 CurrencyFormat
.NumDigits
= pGlobalData
->nCurrDigits
;
39 CurrencyFormat
.LeadingZero
= pGlobalData
->nNumLeadingZero
;
40 CurrencyFormat
.Grouping
= GroupingFormats
[pGlobalData
->nCurrGrouping
].nInteger
;
41 CurrencyFormat
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
42 CurrencyFormat
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
43 CurrencyFormat
.NegativeOrder
= pGlobalData
->nCurrNegFormat
;
44 CurrencyFormat
.PositiveOrder
= pGlobalData
->nCurrPosFormat
;
45 CurrencyFormat
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
47 /* Positive example */
48 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
50 &CurrencyFormat
, szBuffer
, MAX_FMT_SIZE
);
52 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSSAMPLE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
54 /* Negative example */
55 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
57 &CurrencyFormat
, szBuffer
, MAX_FMT_SIZE
);
59 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGSAMPLE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
64 InitCurrencySymbols(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
66 /* Limit text length */
67 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
72 /* Set currency symbols */
73 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
76 (LPARAM
)pGlobalData
->szCurrSymbol
);
78 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
86 InitCurrencyPositiveFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
88 WCHAR szBuffer
[MAX_FMT_SIZE
];
92 /* positive currency values */
93 cyFmt
.NumDigits
= pGlobalData
->nCurrDigits
;
94 cyFmt
.LeadingZero
= 0;
96 cyFmt
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
97 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
98 cyFmt
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
99 cyFmt
.NegativeOrder
= 0;
101 for (i
= 0; i
< 4; i
++)
103 cyFmt
.PositiveOrder
= i
;
104 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
106 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
108 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
114 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
116 pGlobalData
->nCurrPosFormat
,
122 InitCurrencyNegativeFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
124 WCHAR szBuffer
[MAX_FMT_SIZE
];
128 /* negative currency values */
129 cyFmt
.NumDigits
= pGlobalData
->nCurrDigits
;
130 cyFmt
.LeadingZero
= 0;
132 cyFmt
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
133 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
134 cyFmt
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
135 cyFmt
.PositiveOrder
= 0;
137 for (i
= 0; i
< 16; i
++)
139 cyFmt
.NegativeOrder
= i
;
140 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
142 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
144 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
150 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
152 pGlobalData
->nCurrNegFormat
,
158 InitCurrencyDecimalSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
160 /* Limit text length */
161 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
163 MAX_CURRDECIMALSEP
- 1,
166 /* Decimal separator */
167 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
170 (LPARAM
)pGlobalData
->szCurrDecimalSep
);
172 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
179 /* Initialize the number of fractional digits */
181 InitCurrencyNumFracDigits(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
183 WCHAR szBuffer
[MAX_FMT_SIZE
];
186 /* Create standard list of fractional symbols */
187 for (i
= 0; i
< 10; i
++)
189 szBuffer
[0] = L
'0' + i
;
191 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
197 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
199 pGlobalData
->nCurrDigits
,
204 /* Initialize the list of group separators */
206 InitCurrencyGroupSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
208 /* Limit text length */
209 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
211 MAX_CURRTHOUSANDSEP
- 1,
214 /* Digit group separator */
215 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
218 (LPARAM
)pGlobalData
->szCurrThousandSep
);
220 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
228 InitDigitGroupCB(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
230 WCHAR szBuffer
[MAX_FMT_SIZE
];
236 cyFmt
.LeadingZero
= 0;
237 cyFmt
.lpDecimalSep
= L
"";
238 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
239 cyFmt
.PositiveOrder
= 0;
240 cyFmt
.NegativeOrder
= 0;
241 cyFmt
.lpCurrencySymbol
= L
"";
243 for (i
= 0 ; i
< MAX_GROUPINGFORMATS
; i
++)
245 cyFmt
.Grouping
= GroupingFormats
[i
].nInteger
;
247 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
249 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
250 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
258 /* Set number of digits in field */
260 SetCurrencyDigNum(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
264 /* Get setted number of digits in field */
265 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
270 /* Save number of digits in field */
271 if (nCurrSel
!= CB_ERR
)
272 pGlobalData
->nCurrGrouping
= nCurrSel
;
277 /* Set currency field separator */
279 SetCurrencyFieldSep(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
281 /* Get setted currency field separator */
282 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
284 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
285 (LPARAM
)pGlobalData
->szCurrThousandSep
);
290 /* Set number of fractional symbols */
292 SetCurrencyFracSymNum(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
296 /* Get setted number of fractional symbols */
297 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
301 if (nCurrSel
== CB_ERR
)
304 pGlobalData
->nCurrDigits
= nCurrSel
;
309 /* Set currency separator */
311 SetCurrencySep(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
313 /* Get setted currency decimal separator */
314 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
316 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
317 (LPARAM
)pGlobalData
->szCurrDecimalSep
);
322 /* Set negative currency sum format */
324 SetNegCurrencySumFmt(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
328 /* Get setted currency unit */
329 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
333 if (nCurrSel
== CB_ERR
)
336 pGlobalData
->nCurrNegFormat
= nCurrSel
;
341 /* Set positive currency sum format */
343 SetPosCurrencySumFmt(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
347 /* Get setted currency unit */
348 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
352 if (nCurrSel
== CB_ERR
)
355 pGlobalData
->nCurrPosFormat
= nCurrSel
;
360 /* Set currency symbol */
362 SetCurrencySymbol(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
364 /* Get setted currency unit */
365 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
367 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
368 (LPARAM
)(PCWSTR
)pGlobalData
->szCurrSymbol
);
373 /* Property page dialog callback */
375 CurrencyPageProc(HWND hwndDlg
,
380 PGLOBALDATA pGlobalData
;
382 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
387 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
388 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
390 InitCurrencySymbols(hwndDlg
, pGlobalData
);
391 InitCurrencyPositiveFormats(hwndDlg
, pGlobalData
);
392 InitCurrencyNegativeFormats(hwndDlg
, pGlobalData
);
393 InitCurrencyDecimalSeparators(hwndDlg
, pGlobalData
);
394 InitCurrencyNumFracDigits(hwndDlg
, pGlobalData
);
395 InitCurrencyGroupSeparators(hwndDlg
, pGlobalData
);
396 InitDigitGroupCB(hwndDlg
, pGlobalData
);
397 UpdateExamples(hwndDlg
, pGlobalData
);
401 switch (LOWORD(wParam
))
403 case IDC_CURRENCYSYMBOL
:
404 case IDC_CURRENCYPOSVALUE
:
405 case IDC_CURRENCYNEGVALUE
:
406 case IDC_CURRENCYDECSEP
:
407 case IDC_CURRENCYDECNUM
:
408 case IDC_CURRENCYGRPSEP
:
409 case IDC_CURRENCYGRPNUM
:
410 if (HIWORD(wParam
) == CBN_SELCHANGE
|| HIWORD(wParam
) == CBN_EDITCHANGE
)
412 /* Set "Apply" button enabled */
413 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
419 if (((LPNMHDR
)lParam
)->code
== (UINT
)PSN_APPLY
)
421 if (!SetCurrencySymbol(hwndDlg
, pGlobalData
))
424 if (!SetCurrencyDigNum(hwndDlg
, pGlobalData
))
427 if (!SetPosCurrencySumFmt(hwndDlg
, pGlobalData
))
430 if (!SetNegCurrencySumFmt(hwndDlg
, pGlobalData
))
433 if (!SetCurrencySep(hwndDlg
, pGlobalData
))
436 if (!SetCurrencyFracSymNum(hwndDlg
, pGlobalData
))
439 if (!SetCurrencyFieldSep(hwndDlg
, pGlobalData
))
442 pGlobalData
->bUserLocaleChanged
= TRUE
;
444 UpdateExamples(hwndDlg
, pGlobalData
);