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 * PROGRAMMERS: Eric Kohl
24 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
29 #define POSITIVE_EXAMPLE L"123456789.00"
30 #define NEGATIVE_EXAMPLE L"-123456789.00"
34 UpdateExamples(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
36 WCHAR szBuffer
[MAX_FMT_SIZE
];
37 CURRENCYFMTW CurrencyFormat
;
39 CurrencyFormat
.NumDigits
= pGlobalData
->nCurrDigits
;
40 CurrencyFormat
.LeadingZero
= pGlobalData
->nNumLeadingZero
;
41 CurrencyFormat
.Grouping
= GroupingFormats
[pGlobalData
->nCurrGrouping
].nInteger
;
42 CurrencyFormat
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
43 CurrencyFormat
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
44 CurrencyFormat
.NegativeOrder
= pGlobalData
->nCurrNegFormat
;
45 CurrencyFormat
.PositiveOrder
= pGlobalData
->nCurrPosFormat
;
46 CurrencyFormat
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
48 /* Positive example */
49 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
51 &CurrencyFormat
, szBuffer
, MAX_FMT_SIZE
);
53 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSSAMPLE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
55 /* Negative example */
56 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
58 &CurrencyFormat
, szBuffer
, MAX_FMT_SIZE
);
60 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGSAMPLE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
65 InitCurrencySymbols(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
67 /* Limit text length */
68 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
73 /* Set currency symbols */
74 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
77 (LPARAM
)pGlobalData
->szCurrSymbol
);
79 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYSYMBOL
,
87 InitCurrencyPositiveFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
89 WCHAR szBuffer
[MAX_FMT_SIZE
];
93 /* positive currency values */
94 cyFmt
.NumDigits
= pGlobalData
->nCurrDigits
;
95 cyFmt
.LeadingZero
= 0;
97 cyFmt
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
98 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
99 cyFmt
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
100 cyFmt
.NegativeOrder
= 0;
102 for (i
= 0; i
< 4; i
++)
104 cyFmt
.PositiveOrder
= i
;
105 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
107 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
109 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
115 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYPOSVALUE
,
117 pGlobalData
->nCurrPosFormat
,
123 InitCurrencyNegativeFormats(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
125 WCHAR szBuffer
[MAX_FMT_SIZE
];
129 /* negative currency values */
130 cyFmt
.NumDigits
= pGlobalData
->nCurrDigits
;
131 cyFmt
.LeadingZero
= 0;
133 cyFmt
.lpDecimalSep
= pGlobalData
->szCurrDecimalSep
;
134 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
135 cyFmt
.lpCurrencySymbol
= pGlobalData
->szCurrSymbol
;
136 cyFmt
.PositiveOrder
= 0;
138 for (i
= 0; i
< 16; i
++)
140 cyFmt
.NegativeOrder
= i
;
141 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
143 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
145 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
151 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYNEGVALUE
,
153 pGlobalData
->nCurrNegFormat
,
159 InitCurrencyDecimalSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
161 /* Limit text length */
162 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
164 MAX_CURRDECIMALSEP
- 1,
167 /* Decimal separator */
168 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
171 (LPARAM
)pGlobalData
->szCurrDecimalSep
);
173 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECSEP
,
180 /* Initialize the number of fractional digits */
182 InitCurrencyNumFracDigits(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
184 WCHAR szBuffer
[MAX_FMT_SIZE
];
187 /* Create standard list of fractional symbols */
188 for (i
= 0; i
< 10; i
++)
190 szBuffer
[0] = L
'0' + i
;
192 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
198 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYDECNUM
,
200 pGlobalData
->nCurrDigits
,
205 /* Initialize the list of group separators */
207 InitCurrencyGroupSeparators(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
209 /* Limit text length */
210 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
212 MAX_CURRTHOUSANDSEP
- 1,
215 /* Digit group separator */
216 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
219 (LPARAM
)pGlobalData
->szCurrThousandSep
);
221 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPSEP
,
229 InitDigitGroupCB(HWND hwndDlg
, PGLOBALDATA pGlobalData
)
231 WCHAR szBuffer
[MAX_FMT_SIZE
];
237 cyFmt
.LeadingZero
= 0;
238 cyFmt
.lpDecimalSep
= L
"";
239 cyFmt
.lpThousandSep
= pGlobalData
->szCurrThousandSep
;
240 cyFmt
.PositiveOrder
= 0;
241 cyFmt
.NegativeOrder
= 0;
242 cyFmt
.lpCurrencySymbol
= L
"";
244 for (i
= 0 ; i
< MAX_GROUPINGFORMATS
; i
++)
246 cyFmt
.Grouping
= GroupingFormats
[i
].nInteger
;
248 GetCurrencyFormatW(pGlobalData
->UserLCID
, 0,
250 &cyFmt
, szBuffer
, MAX_FMT_SIZE
);
251 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
257 SendDlgItemMessageW(hwndDlg
, IDC_CURRENCYGRPNUM
,
259 pGlobalData
->nCurrGrouping
,
268 PGLOBALDATA pGlobalData
)
270 WCHAR szCurrSymbol
[MAX_CURRSYMBOL
];
271 WCHAR szCurrDecimalSep
[MAX_CURRDECIMALSEP
];
272 WCHAR szCurrThousandSep
[MAX_CURRTHOUSANDSEP
];
278 /* Currency symbol */
279 GetSelectedComboBoxText(hwndDlg
,
284 if (szCurrSymbol
[0] == L
'\0')
286 /* TODO: Show error message */
291 /* Positive Amount */
292 GetSelectedComboBoxIndex(hwndDlg
,
293 IDC_CURRENCYPOSVALUE
,
296 /* Negative Amount */
297 GetSelectedComboBoxIndex(hwndDlg
,
298 IDC_CURRENCYNEGVALUE
,
301 /* Decimal separator */
302 GetSelectedComboBoxText(hwndDlg
,
307 if (szCurrDecimalSep
[0] == L
'\0')
309 /* TODO: Show error message */
314 /* Number of fractional digits */
315 GetSelectedComboBoxIndex(hwndDlg
,
319 /* Grouping symbol */
320 GetSelectedComboBoxText(hwndDlg
,
323 MAX_CURRTHOUSANDSEP
);
325 if (szCurrThousandSep
[0] == L
'\0')
327 /* TODO: Show error message */
333 GetSelectedComboBoxIndex(hwndDlg
,
337 /* Store settings in global data */
338 wcscpy(pGlobalData
->szCurrSymbol
, szCurrSymbol
);
339 pGlobalData
->nCurrGrouping
= nCurrGrouping
;
340 wcscpy(pGlobalData
->szCurrDecimalSep
, szCurrDecimalSep
);
341 wcscpy(pGlobalData
->szCurrThousandSep
, szCurrThousandSep
);
342 pGlobalData
->nCurrPosFormat
= nCurrPosFormat
;
343 pGlobalData
->nCurrNegFormat
= nCurrNegFormat
;
344 pGlobalData
->nCurrDigits
= nCurrDigits
;
349 /* Property page dialog callback */
351 CurrencyPageProc(HWND hwndDlg
,
356 PGLOBALDATA pGlobalData
;
358 pGlobalData
= (PGLOBALDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
363 pGlobalData
= (PGLOBALDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
364 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGlobalData
);
366 InitCurrencySymbols(hwndDlg
, pGlobalData
);
367 InitCurrencyPositiveFormats(hwndDlg
, pGlobalData
);
368 InitCurrencyNegativeFormats(hwndDlg
, pGlobalData
);
369 InitCurrencyDecimalSeparators(hwndDlg
, pGlobalData
);
370 InitCurrencyNumFracDigits(hwndDlg
, pGlobalData
);
371 InitCurrencyGroupSeparators(hwndDlg
, pGlobalData
);
372 InitDigitGroupCB(hwndDlg
, pGlobalData
);
373 UpdateExamples(hwndDlg
, pGlobalData
);
377 switch (LOWORD(wParam
))
379 case IDC_CURRENCYSYMBOL
:
380 case IDC_CURRENCYPOSVALUE
:
381 case IDC_CURRENCYNEGVALUE
:
382 case IDC_CURRENCYDECSEP
:
383 case IDC_CURRENCYDECNUM
:
384 case IDC_CURRENCYGRPSEP
:
385 case IDC_CURRENCYGRPNUM
:
386 if (HIWORD(wParam
) == CBN_SELCHANGE
||
387 HIWORD(wParam
) == CBN_EDITCHANGE
)
389 /* Enable the Apply button */
390 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
396 if (((LPNMHDR
)lParam
)->code
== (UINT
)PSN_APPLY
)
398 if (GetCurrencySetting(hwndDlg
, pGlobalData
))
400 pGlobalData
->bUserLocaleChanged
= TRUE
;
401 UpdateExamples(hwndDlg
, pGlobalData
);