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
,
256 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
258 pGlobalData
->nCurrGrouping
,
263 /* Set number of digits in field */
265 SetCurrencyDigNum(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
269 /* Get setted number of digits in field */
270 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
275 /* Save number of digits in field */
276 if (nCurrSel
!= CB_ERR
)
277 pGlobalData
->nCurrGrouping
= nCurrSel
;
282 /* Set currency field separator */
284 SetCurrencyFieldSep(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
286 /* Get setted currency field separator */
287 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
289 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
290 (LPARAM
)pGlobalData
->szCurrThousandSep
);
295 /* Set number of fractional symbols */
297 SetCurrencyFracSymNum(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
301 /* Get setted number of fractional symbols */
302 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
306 if (nCurrSel
== CB_ERR
)
309 pGlobalData
->nCurrDigits
= nCurrSel
;
314 /* Set currency separator */
316 SetCurrencySep(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
318 /* Get setted currency decimal separator */
319 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
321 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
322 (LPARAM
)pGlobalData
->szCurrDecimalSep
);
327 /* Set negative currency sum format */
329 SetNegCurrencySumFmt(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
333 /* Get setted currency unit */
334 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
338 if (nCurrSel
== CB_ERR
)
341 pGlobalData
->nCurrNegFormat
= nCurrSel
;
346 /* Set positive currency sum format */
348 SetPosCurrencySumFmt(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
352 /* Get setted currency unit */
353 nCurrSel
= SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
357 if (nCurrSel
== CB_ERR
)
360 pGlobalData
->nCurrPosFormat
= nCurrSel
;
365 /* Set currency symbol */
367 SetCurrencySymbol(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
369 /* Get setted currency unit */
370 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
372 (WPARAM
)MAX_SAMPLES_STR_SIZE
,
373 (LPARAM
)(PCWSTR
)pGlobalData
->szCurrSymbol
);
378 /* Property page dialog callback */
380 CurrencyPageProc(HWND hwndDlg
,
385 PGLOBALDATA pGlobalData
;
387 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
392 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
393 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
395 InitCurrencySymbols(hwndDlg
, pGlobalData
);
396 InitCurrencyPositiveFormats(hwndDlg
, pGlobalData
);
397 InitCurrencyNegativeFormats(hwndDlg
, pGlobalData
);
398 InitCurrencyDecimalSeparators(hwndDlg
, pGlobalData
);
399 InitCurrencyNumFracDigits(hwndDlg
, pGlobalData
);
400 InitCurrencyGroupSeparators(hwndDlg
, pGlobalData
);
401 InitDigitGroupCB(hwndDlg
, pGlobalData
);
402 UpdateExamples(hwndDlg
, pGlobalData
);
406 switch (LOWORD(wParam
))
408 case IDC_CURRENCYSYMBOL
:
409 case IDC_CURRENCYPOSVALUE
:
410 case IDC_CURRENCYNEGVALUE
:
411 case IDC_CURRENCYDECSEP
:
412 case IDC_CURRENCYDECNUM
:
413 case IDC_CURRENCYGRPSEP
:
414 case IDC_CURRENCYGRPNUM
:
415 if (HIWORD(wParam
) == CBN_SELCHANGE
|| HIWORD(wParam
) == CBN_EDITCHANGE
)
417 /* Set "Apply" button enabled */
418 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
424 if (((LPNMHDR
)lParam
)->code
== (UINT
)PSN_APPLY
)
426 if (!SetCurrencySymbol(hwndDlg
, pGlobalData
))
429 if (!SetCurrencyDigNum(hwndDlg
, pGlobalData
))
432 if (!SetPosCurrencySumFmt(hwndDlg
, pGlobalData
))
435 if (!SetNegCurrencySumFmt(hwndDlg
, pGlobalData
))
438 if (!SetCurrencySep(hwndDlg
, pGlobalData
))
441 if (!SetCurrencyFracSymNum(hwndDlg
, pGlobalData
))
444 if (!SetCurrencyFieldSep(hwndDlg
, pGlobalData
))
447 pGlobalData
->bUserLocaleChanged
= TRUE
;
449 UpdateExamples(hwndDlg
, pGlobalData
);