[INTL]
[reactos.git] / reactos / dll / cpl / intl / numbers.c
1 /*
2 * ReactOS
3 * Copyright (C) 2004 ReactOS Team
4 *
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.
9 *
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.
14 *
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.
18 */
19 /*
20 * PROJECT: ReactOS International Control Panel
21 * FILE: dll/cpl/intl/numbers.c
22 * PURPOSE: Numbers property page
23 * PROGRAMMER: Eric Kohl
24 */
25
26 #include "intl.h"
27
28 #define SAMPLE_NUMBER L"123456789"
29 #define SAMPLE_NEG_NUMBER L"-123456789"
30 #define MAX_NUM_SEP_SAMPLES 2
31 #define MAX_FRAC_NUM_SAMPLES 10
32 #define MAX_FIELD_SEP_SAMPLES 1
33 #define MAX_FIELD_DIG_SAMPLES 3
34 #define MAX_NEG_SIGN_SAMPLES 1
35 #define MAX_NEG_NUMBERS_SAMPLES 5
36 #define MAX_LEAD_ZEROES_SAMPLES 2
37 #define MAX_LIST_SEP_SAMPLES 1
38 #define MAX_UNITS_SYS_SAMPLES 2
39
40 static PWSTR lpNumSepSamples[MAX_NUM_SEP_SAMPLES] =
41 {L",", L"."};
42 static PWSTR lpFieldSepSamples[MAX_FIELD_SEP_SAMPLES] =
43 {L" "};
44 static PWSTR lpFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES] =
45 {L"0;0", L"3;0", L"3;2;0"};
46 static PWSTR lpNegSignSamples[MAX_NEG_SIGN_SAMPLES] =
47 {L"-"};
48 static PWSTR lpNegNumFmtSamples[MAX_NEG_NUMBERS_SAMPLES] =
49 {L"(1,1)", L"-1,1", L"- 1,1", L"1,1-", L"1,1 -"};
50 static PWSTR lpLeadNumFmtSamples[MAX_LEAD_ZEROES_SAMPLES] =
51 {L",7", L"0,7"};
52 static PWSTR lpListSepSamples[MAX_LIST_SEP_SAMPLES] =
53 {L";"};
54
55
56 /* Init num decimal separator control box */
57 static VOID
58 InitNumDecimalSepCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
59 {
60 INT nCBIndex;
61 INT nRetCode;
62
63 /* Limit text length */
64 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
65 CB_LIMITTEXT,
66 MAX_NUMDECIMALSEP - 1,
67 0);
68
69 /* Clear all box content */
70 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
71 CB_RESETCONTENT,
72 (WPARAM)0,
73 (LPARAM)0);
74
75 /* Create standard list of decimal separators */
76 for (nCBIndex = 0; nCBIndex < MAX_NUM_SEP_SAMPLES; nCBIndex++)
77 {
78 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
79 CB_ADDSTRING,
80 0,
81 (LPARAM)lpNumSepSamples[nCBIndex]);
82 }
83
84 /* Set current item to value from registry */
85 nRetCode = SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
86 CB_SELECTSTRING,
87 -1,
88 (LPARAM)pGlobalData->szNumDecimalSep);
89
90 /* If it is not successful, add new values to list and select them */
91 if (nRetCode == CB_ERR)
92 {
93 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
94 CB_ADDSTRING,
95 MAX_NUM_SEP_SAMPLES,
96 (LPARAM)pGlobalData->szNumDecimalSep);
97 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
98 CB_SELECTSTRING,
99 -1,
100 (LPARAM)pGlobalData->szNumDecimalSep);
101 }
102 }
103
104 /* Init number of fractional symbols control box */
105 static VOID
106 InitNumOfFracSymbCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
107 {
108 WCHAR szFracCount[MAX_SAMPLES_STR_SIZE];
109 INT nCBIndex;
110
111 /* Clear all box content */
112 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNDIGDEC,
113 CB_RESETCONTENT,
114 (WPARAM)0,
115 (LPARAM)0);
116
117 /* Create standard list of fractional symbols */
118 for (nCBIndex = 0; nCBIndex < MAX_FRAC_NUM_SAMPLES; nCBIndex++)
119 {
120 /* Convert to wide char */
121 _itow(nCBIndex, szFracCount, DECIMAL_RADIX);
122
123 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNDIGDEC,
124 CB_ADDSTRING,
125 0,
126 (LPARAM)szFracCount);
127 }
128
129 /* Set current item to value from registry */
130 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNDIGDEC,
131 CB_SETCURSEL,
132 (WPARAM)pGlobalData->nNumDigits,
133 (LPARAM)0);
134 }
135
136 /* Init field separator control box */
137 static VOID
138 InitNumFieldSepCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
139 {
140 INT nCBIndex;
141 INT nRetCode;
142
143 /* Limit text length */
144 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
145 CB_LIMITTEXT,
146 MAX_NUMTHOUSANDSEP - 1,
147 0);
148
149 /* Clear all box content */
150 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
151 CB_RESETCONTENT,
152 (WPARAM)0,
153 (LPARAM)0);
154
155 /* Create standard list of field separators */
156 for (nCBIndex = 0; nCBIndex < MAX_FIELD_SEP_SAMPLES; nCBIndex++)
157 {
158 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
159 CB_ADDSTRING,
160 0,
161 (LPARAM)lpFieldSepSamples[nCBIndex]);
162 }
163
164 /* Set current item to value from registry */
165 nRetCode = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
166 CB_SELECTSTRING,
167 -1,
168 (LPARAM)pGlobalData->szNumThousandSep);
169
170 /* If it is not success, add new values to list and select them */
171 if (nRetCode == CB_ERR)
172 {
173 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
174 CB_ADDSTRING,
175 0,
176 (LPARAM)pGlobalData->szNumThousandSep);
177 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
178 CB_SELECTSTRING,
179 -1,
180 (LPARAM)pGlobalData->szNumThousandSep);
181 }
182 }
183
184 /* Init number of digits in field control box */
185 static VOID
186 InitFieldDigNumCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
187 {
188 PWSTR pszFieldDigNumSmpl;
189 INT nCBIndex;
190
191 /* Clear all box content */
192 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDGROUPING,
193 CB_RESETCONTENT,
194 (WPARAM)0,
195 (LPARAM)0);
196
197 /* Create standard list of field digits num */
198 for (nCBIndex = 0; nCBIndex < MAX_FIELD_DIG_SAMPLES; nCBIndex++)
199 {
200 pszFieldDigNumSmpl = InsSpacesFmt(SAMPLE_NUMBER, lpFieldDigNumSamples[nCBIndex]);
201 if (pszFieldDigNumSmpl != NULL)
202 {
203 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDGROUPING,
204 CB_ADDSTRING,
205 0,
206 (LPARAM)pszFieldDigNumSmpl);
207 HeapFree(GetProcessHeap(), 0, pszFieldDigNumSmpl);
208 }
209 }
210
211 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDGROUPING,
212 CB_SETCURSEL,
213 (WPARAM)pGlobalData->nNumGrouping,
214 (LPARAM)0);
215 }
216
217 /* Init negative sign control box */
218 static VOID
219 InitNegSignCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
220 {
221 INT nCBIndex;
222 INT nRetCode;
223
224 /* Limit text length */
225 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
226 CB_LIMITTEXT,
227 MAX_NUMNEGATIVESIGN - 1,
228 0);
229
230 /* Clear all box content */
231 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
232 CB_RESETCONTENT,
233 (WPARAM)0,
234 (LPARAM)0);
235
236 /* Create standard list of signs */
237 for (nCBIndex = 0; nCBIndex < MAX_NEG_SIGN_SAMPLES; nCBIndex++)
238 {
239 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
240 CB_ADDSTRING,
241 0,
242 (LPARAM)lpNegSignSamples[nCBIndex]);
243 }
244
245 /* Set current item to value from registry */
246 nRetCode = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
247 CB_SELECTSTRING,
248 -1,
249 (LPARAM)pGlobalData->szNumNegativeSign);
250
251 /* If it is not successful, add new values to list and select them */
252 if (nRetCode == CB_ERR)
253 {
254 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
255 CB_ADDSTRING,
256 0,
257 (LPARAM)pGlobalData->szNumNegativeSign);
258 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
259 CB_SELECTSTRING,
260 -1,
261 (LPARAM)pGlobalData->szNumNegativeSign);
262 }
263 }
264
265 /* Init negative numbers format control box */
266 static VOID
267 InitNegNumFmtCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
268 {
269 WCHAR szNewSample[MAX_SAMPLES_STR_SIZE];
270 PWSTR pszResultStr;
271 INT nCBIndex;
272
273 /* Clear all box content */
274 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNNUMFORMAT,
275 CB_RESETCONTENT,
276 (WPARAM)0,
277 (LPARAM)0);
278
279 /* Create standard list of negative numbers formats */
280 for (nCBIndex = 0; nCBIndex < MAX_NEG_NUMBERS_SAMPLES; nCBIndex++)
281 {
282 /* Replace standard separator to setted */
283 pszResultStr = ReplaceSubStr(lpNegNumFmtSamples[nCBIndex],
284 pGlobalData->szNumDecimalSep,
285 L",");
286 if (pszResultStr != NULL)
287 {
288 wcscpy(szNewSample, pszResultStr);
289 HeapFree(GetProcessHeap(), 0, pszResultStr);
290 }
291
292 /* Replace standard negative sign to setted */
293 pszResultStr = ReplaceSubStr(szNewSample,
294 pGlobalData->szNumNegativeSign,
295 L"-");
296 if (pszResultStr != NULL)
297 {
298 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNNUMFORMAT,
299 CB_ADDSTRING,
300 0,
301 (LPARAM)pszResultStr);
302 HeapFree(GetProcessHeap(), 0, pszResultStr);
303 }
304 }
305
306 /* Set current item to value from registry */
307 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNNUMFORMAT,
308 CB_SETCURSEL,
309 (WPARAM)pGlobalData->nNumNegFormat,
310 (LPARAM)0);
311 }
312
313 /* Init leading zeroes control box */
314 static VOID
315 InitLeadingZeroesCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
316 {
317 PWSTR pszResultStr;
318 INT nCBIndex;
319
320 /* Clear all box content */
321 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDISPLEADZER,
322 CB_RESETCONTENT,
323 (WPARAM)0,
324 (LPARAM)0);
325
326 /* Create list of standard leading zeroes formats */
327 for (nCBIndex = 0; nCBIndex < MAX_LEAD_ZEROES_SAMPLES; nCBIndex++)
328 {
329 pszResultStr = ReplaceSubStr(lpLeadNumFmtSamples[nCBIndex],
330 pGlobalData->szNumDecimalSep,
331 L",");
332 if (pszResultStr != NULL)
333 {
334 SendDlgItemMessage(hwndDlg, IDC_NUMBERSDISPLEADZER,
335 CB_ADDSTRING,
336 0,
337 (LPARAM)pszResultStr);
338 HeapFree(GetProcessHeap(), 0, pszResultStr);
339 }
340 }
341
342 /* Set current item to value from registry */
343 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDISPLEADZER,
344 CB_SETCURSEL,
345 (WPARAM)pGlobalData->nNumLeadingZero,
346 (LPARAM)0);
347 }
348
349 static VOID
350 InitListSepCB(HWND hwndDlg,
351 PGLOBALDATA pGlobalData)
352 {
353 INT nCBIndex;
354 INT nRetCode;
355
356 /* Limit text length */
357 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSLSEP,
358 CB_LIMITTEXT,
359 MAX_NUMLISTSEP - 1,
360 0);
361
362 /* Clear all box content */
363 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSLSEP,
364 CB_RESETCONTENT,
365 (WPARAM)0,
366 (LPARAM)0);
367
368 /* Create standard list of signs */
369 for (nCBIndex = 0; nCBIndex < MAX_LIST_SEP_SAMPLES; nCBIndex++)
370 {
371 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSLSEP,
372 CB_ADDSTRING,
373 0,
374 (LPARAM)lpListSepSamples[nCBIndex]);
375 }
376
377 /* Set current item to value from registry */
378 nRetCode = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSLSEP,
379 CB_SELECTSTRING,
380 -1,
381 (LPARAM)pGlobalData->szNumListSep);
382
383 /* If it is not successful, add new values to list and select them */
384 if (nRetCode == CB_ERR)
385 {
386 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSLSEP,
387 CB_ADDSTRING,
388 0,
389 (LPARAM)pGlobalData->szNumListSep);
390 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSLSEP,
391 CB_SELECTSTRING,
392 -1,
393 (LPARAM)pGlobalData->szNumListSep);
394 }
395 }
396
397 /* Init system of units control box */
398 static VOID
399 InitUnitsSysCB(HWND hwndDlg,
400 PGLOBALDATA pGlobalData)
401 {
402 WCHAR szUnitName[128];
403 INT nCBIndex;
404
405 /* Clear all box content */
406 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSMEASSYS,
407 CB_RESETCONTENT,
408 (WPARAM)0,
409 (LPARAM)0);
410
411 /* Create list of standard system of units */
412 for (nCBIndex = 0; nCBIndex < MAX_UNITS_SYS_SAMPLES; nCBIndex++)
413 {
414 LoadStringW(hApplet, IDS_METRIC + nCBIndex, szUnitName, 128);
415
416 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSMEASSYS,
417 CB_ADDSTRING,
418 0,
419 (LPARAM)szUnitName);
420 }
421
422 /* Set current item to value from registry */
423 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSMEASSYS,
424 CB_SETCURSEL,
425 (WPARAM)pGlobalData->nNumMeasure,
426 (LPARAM)0);
427 }
428
429 /* Update all numbers locale samples */
430 static VOID
431 UpdateNumSamples(HWND hwndDlg,
432 PGLOBALDATA pGlobalData)
433 {
434 WCHAR OutBuffer[MAX_FMT_SIZE];
435 NUMBERFMT NumberFormat;
436
437 NumberFormat.NumDigits = pGlobalData->nNumDigits;
438 NumberFormat.LeadingZero = pGlobalData->nNumLeadingZero;
439 NumberFormat.Grouping = GroupingFormats[pGlobalData->nNumGrouping].nInteger;
440 NumberFormat.lpDecimalSep = pGlobalData->szNumDecimalSep;
441 NumberFormat.lpThousandSep = pGlobalData->szNumThousandSep;
442 NumberFormat.NegativeOrder = pGlobalData->nNumNegFormat;
443
444 /* Get positive number format sample */
445 GetNumberFormatW(pGlobalData->UserLCID,
446 0,
447 SAMPLE_NUMBER,
448 &NumberFormat,
449 OutBuffer,
450 MAX_FMT_SIZE);
451
452 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSPOSSAMPLE,
453 WM_SETTEXT,
454 0,
455 (LPARAM)OutBuffer);
456
457 /* Get positive number format sample */
458 GetNumberFormatW(pGlobalData->UserLCID,
459 0,
460 SAMPLE_NEG_NUMBER,
461 &NumberFormat,
462 OutBuffer,
463 MAX_FMT_SIZE);
464
465 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNEGSAMPLE,
466 WM_SETTEXT,
467 0,
468 (LPARAM)OutBuffer);
469 }
470
471 /* Set num decimal separator */
472 static BOOL
473 SetNumDecimalSep(HWND hwndDlg,
474 PGLOBALDATA pGlobalData)
475 {
476 /* Get setted decimal separator */
477 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
478 WM_GETTEXT,
479 (WPARAM)MAX_NUMDECIMALSEP,
480 (LPARAM)pGlobalData->szNumDecimalSep);
481
482 return TRUE;
483 }
484
485 /* Set number of fractional symbols */
486 static BOOL
487 SetFracSymNum(HWND hwndDlg,
488 PGLOBALDATA pGlobalData)
489 {
490 INT nCurrSel;
491
492 /* Get setted number of fractional symbols */
493 nCurrSel = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNDIGDEC,
494 CB_GETCURSEL,
495 (WPARAM)0,
496 (LPARAM)0);
497 if (nCurrSel == CB_ERR)
498 return FALSE;
499
500 pGlobalData->nNumDigits = nCurrSel;
501
502 return TRUE;
503 }
504
505 /* Set field separator */
506 static BOOL
507 SetNumFieldSep(HWND hwndDlg,
508 PGLOBALDATA pGlobalData)
509 {
510 /* Get thousand separator */
511 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
512 WM_GETTEXT,
513 (WPARAM)MAX_NUMTHOUSANDSEP,
514 (LPARAM)pGlobalData->szNumThousandSep);
515
516 return TRUE;
517 }
518
519 /* Set number of digits in field */
520 static BOOL
521 SetFieldDigNum(HWND hwndDlg,
522 PGLOBALDATA pGlobalData)
523 {
524 INT nCurrSel;
525
526 /* Get setted negative sum format */
527 nCurrSel = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDGROUPING,
528 CB_GETCURSEL,
529 (WPARAM)0,
530 (LPARAM)0);
531 if (nCurrSel == CB_ERR)
532 return FALSE;
533
534 pGlobalData->nNumGrouping = nCurrSel;
535
536 return TRUE;
537 }
538
539 /* Set negative sign */
540 static BOOL
541 SetNumNegSign(HWND hwndDlg,
542 PGLOBALDATA pGlobalData)
543 {
544 /* Get setted negative sign */
545 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
546 WM_GETTEXT,
547 (WPARAM)MAX_NUMNEGATIVESIGN,
548 (LPARAM)pGlobalData->szNumNegativeSign);
549
550 return TRUE;
551 }
552
553 /* Set negative sum format */
554 static BOOL
555 SetNegSumFmt(HWND hwndDlg,
556 PGLOBALDATA pGlobalData)
557 {
558 INT nCurrSel;
559
560 /* Get setted negative sum format */
561 nCurrSel = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNNUMFORMAT,
562 CB_GETCURSEL,
563 (WPARAM)0,
564 (LPARAM)0);
565 if (nCurrSel == CB_ERR)
566 return FALSE;
567
568 pGlobalData->nNumNegFormat = nCurrSel;
569
570 return TRUE;
571 }
572
573 /* Set leading zero */
574 static BOOL
575 SetNumLeadZero(HWND hwndDlg,
576 PGLOBALDATA pGlobalData)
577 {
578 INT nCurrSel;
579
580 /* Get setted leading zero format */
581 nCurrSel = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDISPLEADZER,
582 CB_GETCURSEL,
583 (WPARAM)0,
584 (LPARAM)0);
585 if (nCurrSel == CB_ERR)
586 return FALSE;
587
588 pGlobalData->nNumLeadingZero = nCurrSel;
589
590 return TRUE;
591 }
592
593 /* Set elements list separator */
594 static BOOL
595 SetNumListSep(HWND hwndDlg,
596 PGLOBALDATA pGlobalData)
597 {
598 /* Get setted list separator */
599 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSLSEP,
600 WM_GETTEXT,
601 (WPARAM)MAX_NUMLISTSEP,
602 (LPARAM)pGlobalData->szNumListSep);
603
604 return TRUE;
605 }
606
607 /* Set units system */
608 static BOOL
609 SetNumUnitsSys(HWND hwndDlg,
610 PGLOBALDATA pGlobalData)
611 {
612 INT nCurrSel;
613
614 /* Get setted units system */
615 nCurrSel = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSMEASSYS,
616 CB_GETCURSEL,
617 (WPARAM)0,
618 (LPARAM)0);
619 if (nCurrSel == CB_ERR)
620 return FALSE;
621
622 pGlobalData->nNumMeasure = nCurrSel;
623
624 return TRUE;
625 }
626
627 /* Property page dialog callback */
628 INT_PTR CALLBACK
629 NumbersPageProc(HWND hwndDlg,
630 UINT uMsg,
631 WPARAM wParam,
632 LPARAM lParam)
633 {
634 PGLOBALDATA pGlobalData;
635
636 pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
637
638 switch (uMsg)
639 {
640 case WM_INITDIALOG:
641 pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
642 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
643
644 InitNumDecimalSepCB(hwndDlg, pGlobalData);
645 InitNumOfFracSymbCB(hwndDlg, pGlobalData);
646 InitNumFieldSepCB(hwndDlg, pGlobalData);
647 InitFieldDigNumCB(hwndDlg, pGlobalData);
648 InitNegSignCB(hwndDlg, pGlobalData);
649 InitNegNumFmtCB(hwndDlg, pGlobalData);
650 InitLeadingZeroesCB(hwndDlg, pGlobalData);
651 InitListSepCB(hwndDlg, pGlobalData);
652 InitUnitsSysCB(hwndDlg, pGlobalData);
653 UpdateNumSamples(hwndDlg, pGlobalData);
654 break;
655
656 case WM_COMMAND:
657 switch (LOWORD(wParam))
658 {
659 case IDC_NUMBERDSYMBOL:
660 case IDC_NUMBERSNDIGDEC:
661 case IDC_NUMBERSDIGITGRSYM:
662 case IDC_NUMBERSDGROUPING:
663 case IDC_NUMBERSNSIGNSYM:
664 case IDC_NUMBERSNNUMFORMAT:
665 case IDC_NUMBERSDISPLEADZER:
666 case IDC_NUMBERSLSEP:
667 case IDC_NUMBERSMEASSYS:
668 if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
669 {
670 /* Set "Apply" button enabled */
671 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
672 }
673 }
674 break;
675
676 case WM_NOTIFY:
677 /* If push apply button */
678 if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
679 {
680 if (!SetNumDecimalSep(hwndDlg, pGlobalData))
681 break;
682
683 if (!SetFracSymNum(hwndDlg, pGlobalData))
684 break;
685
686 if (!SetNumFieldSep(hwndDlg, pGlobalData))
687 break;
688
689 if (!SetFieldDigNum(hwndDlg, pGlobalData))
690 break;
691
692 if (!SetNumNegSign(hwndDlg, pGlobalData))
693 break;
694
695 if (!SetNegSumFmt(hwndDlg, pGlobalData))
696 break;
697
698 if (!SetNumLeadZero(hwndDlg, pGlobalData))
699 break;
700
701 if (!SetNumListSep(hwndDlg, pGlobalData))
702 break;
703
704 if (!SetNumUnitsSys(hwndDlg, pGlobalData))
705 break;
706
707 pGlobalData->bUserLocaleChanged = TRUE;
708
709 UpdateNumSamples(hwndDlg, pGlobalData);
710 }
711 break;
712 }
713 return FALSE;
714 }
715
716 /* EOF */