[WINHTTP] Sync with Wine Staging 3.9. CORE-14656
[reactos.git] / 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 * PROGRAMMERS: Eric Kohl
24 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
25 */
26
27 #include "intl.h"
28
29 #define SAMPLE_NUMBER L"123456789"
30 #define SAMPLE_NEG_NUMBER L"-123456789"
31 #define MAX_NUM_SEP_SAMPLES 2
32 #define MAX_FRAC_NUM_SAMPLES 10
33 #define MAX_FIELD_SEP_SAMPLES 1
34 #define MAX_FIELD_DIG_SAMPLES 3
35 #define MAX_NEG_SIGN_SAMPLES 1
36 #define MAX_NEG_NUMBERS_SAMPLES 5
37 #define MAX_LEAD_ZEROES_SAMPLES 2
38 #define MAX_LIST_SEP_SAMPLES 1
39 #define MAX_UNITS_SYS_SAMPLES 2
40
41 static PWSTR lpNumSepSamples[MAX_NUM_SEP_SAMPLES] =
42 {L",", L"."};
43 static PWSTR lpFieldSepSamples[MAX_FIELD_SEP_SAMPLES] =
44 {L" "};
45 static PWSTR lpFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES] =
46 {L"0;0", L"3;0", L"3;2;0"};
47 static PWSTR lpNegSignSamples[MAX_NEG_SIGN_SAMPLES] =
48 {L"-"};
49 static PWSTR lpNegNumFmtSamples[MAX_NEG_NUMBERS_SAMPLES] =
50 {L"(1,1)", L"-1,1", L"- 1,1", L"1,1-", L"1,1 -"};
51 static PWSTR lpLeadNumFmtSamples[MAX_LEAD_ZEROES_SAMPLES] =
52 {L",7", L"0,7"};
53 static PWSTR lpListSepSamples[MAX_LIST_SEP_SAMPLES] =
54 {L";"};
55
56
57 /* Init num decimal separator control box */
58 static VOID
59 InitNumDecimalSepCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
60 {
61 INT nCBIndex;
62 INT nRetCode;
63
64 /* Limit text length */
65 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
66 CB_LIMITTEXT,
67 MAX_NUMDECIMALSEP - 1,
68 0);
69
70 /* Clear all box content */
71 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
72 CB_RESETCONTENT,
73 (WPARAM)0,
74 (LPARAM)0);
75
76 /* Create standard list of decimal separators */
77 for (nCBIndex = 0; nCBIndex < MAX_NUM_SEP_SAMPLES; nCBIndex++)
78 {
79 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
80 CB_ADDSTRING,
81 0,
82 (LPARAM)lpNumSepSamples[nCBIndex]);
83 }
84
85 /* Set current item to value from registry */
86 nRetCode = SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
87 CB_SELECTSTRING,
88 -1,
89 (LPARAM)pGlobalData->szNumDecimalSep);
90
91 /* If it is not successful, add new values to list and select them */
92 if (nRetCode == CB_ERR)
93 {
94 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
95 CB_ADDSTRING,
96 MAX_NUM_SEP_SAMPLES,
97 (LPARAM)pGlobalData->szNumDecimalSep);
98 SendDlgItemMessageW(hwndDlg, IDC_NUMBERDSYMBOL,
99 CB_SELECTSTRING,
100 -1,
101 (LPARAM)pGlobalData->szNumDecimalSep);
102 }
103 }
104
105 /* Init number of fractional symbols control box */
106 static VOID
107 InitNumOfFracSymbCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
108 {
109 WCHAR szFracCount[MAX_SAMPLES_STR_SIZE];
110 INT nCBIndex;
111
112 /* Clear all box content */
113 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNDIGDEC,
114 CB_RESETCONTENT,
115 (WPARAM)0,
116 (LPARAM)0);
117
118 /* Create standard list of fractional symbols */
119 for (nCBIndex = 0; nCBIndex < MAX_FRAC_NUM_SAMPLES; nCBIndex++)
120 {
121 /* Convert to wide char */
122 _itow(nCBIndex, szFracCount, DECIMAL_RADIX);
123
124 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNDIGDEC,
125 CB_ADDSTRING,
126 0,
127 (LPARAM)szFracCount);
128 }
129
130 /* Set current item to value from registry */
131 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNDIGDEC,
132 CB_SETCURSEL,
133 (WPARAM)pGlobalData->nNumDigits,
134 (LPARAM)0);
135 }
136
137 /* Init field separator control box */
138 static VOID
139 InitNumFieldSepCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
140 {
141 INT nCBIndex;
142 INT nRetCode;
143
144 /* Limit text length */
145 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
146 CB_LIMITTEXT,
147 MAX_NUMTHOUSANDSEP - 1,
148 0);
149
150 /* Clear all box content */
151 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
152 CB_RESETCONTENT,
153 (WPARAM)0,
154 (LPARAM)0);
155
156 /* Create standard list of field separators */
157 for (nCBIndex = 0; nCBIndex < MAX_FIELD_SEP_SAMPLES; nCBIndex++)
158 {
159 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
160 CB_ADDSTRING,
161 0,
162 (LPARAM)lpFieldSepSamples[nCBIndex]);
163 }
164
165 /* Set current item to value from registry */
166 nRetCode = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
167 CB_SELECTSTRING,
168 -1,
169 (LPARAM)pGlobalData->szNumThousandSep);
170
171 /* If it is not success, add new values to list and select them */
172 if (nRetCode == CB_ERR)
173 {
174 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
175 CB_ADDSTRING,
176 0,
177 (LPARAM)pGlobalData->szNumThousandSep);
178 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDIGITGRSYM,
179 CB_SELECTSTRING,
180 -1,
181 (LPARAM)pGlobalData->szNumThousandSep);
182 }
183 }
184
185 /* Init number of digits in field control box */
186 static VOID
187 InitFieldDigNumCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
188 {
189 PWSTR pszFieldDigNumSmpl;
190 INT nCBIndex;
191
192 /* Clear all box content */
193 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDGROUPING,
194 CB_RESETCONTENT,
195 (WPARAM)0,
196 (LPARAM)0);
197
198 /* Create standard list of field digits num */
199 for (nCBIndex = 0; nCBIndex < MAX_FIELD_DIG_SAMPLES; nCBIndex++)
200 {
201 pszFieldDigNumSmpl = InsSpacesFmt(SAMPLE_NUMBER, lpFieldDigNumSamples[nCBIndex]);
202 if (pszFieldDigNumSmpl != NULL)
203 {
204 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDGROUPING,
205 CB_ADDSTRING,
206 0,
207 (LPARAM)pszFieldDigNumSmpl);
208 HeapFree(GetProcessHeap(), 0, pszFieldDigNumSmpl);
209 }
210 }
211
212 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSDGROUPING,
213 CB_SETCURSEL,
214 (WPARAM)pGlobalData->nNumGrouping,
215 (LPARAM)0);
216 }
217
218 /* Init negative sign control box */
219 static VOID
220 InitNegSignCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
221 {
222 INT nCBIndex;
223 INT nRetCode;
224
225 /* Limit text length */
226 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
227 CB_LIMITTEXT,
228 MAX_NUMNEGATIVESIGN - 1,
229 0);
230
231 /* Clear all box content */
232 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
233 CB_RESETCONTENT,
234 (WPARAM)0,
235 (LPARAM)0);
236
237 /* Create standard list of signs */
238 for (nCBIndex = 0; nCBIndex < MAX_NEG_SIGN_SAMPLES; nCBIndex++)
239 {
240 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
241 CB_ADDSTRING,
242 0,
243 (LPARAM)lpNegSignSamples[nCBIndex]);
244 }
245
246 /* Set current item to value from registry */
247 nRetCode = SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
248 CB_SELECTSTRING,
249 -1,
250 (LPARAM)pGlobalData->szNumNegativeSign);
251
252 /* If it is not successful, add new values to list and select them */
253 if (nRetCode == CB_ERR)
254 {
255 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
256 CB_ADDSTRING,
257 0,
258 (LPARAM)pGlobalData->szNumNegativeSign);
259 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNSIGNSYM,
260 CB_SELECTSTRING,
261 -1,
262 (LPARAM)pGlobalData->szNumNegativeSign);
263 }
264 }
265
266 /* Init negative numbers format control box */
267 static VOID
268 InitNegNumFmtCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
269 {
270 PWSTR pszString1, pszString2;
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 pszString1 = ReplaceSubStr(lpNegNumFmtSamples[nCBIndex],
284 pGlobalData->szNumDecimalSep,
285 L",");
286 if (pszString1 != NULL)
287 {
288 /* Replace standard negative sign to setted */
289 pszString2 = ReplaceSubStr(pszString1,
290 pGlobalData->szNumNegativeSign,
291 L"-");
292 if (pszString2 != NULL)
293 {
294 SendDlgItemMessageW(hwndDlg, IDC_NUMBERSNNUMFORMAT,
295 CB_ADDSTRING,
296 0,
297 (LPARAM)pszString2);
298
299 HeapFree(GetProcessHeap(), 0, pszString2);
300 }
301
302 HeapFree(GetProcessHeap(), 0, pszString1);
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
472 static
473 BOOL
474 GetNumberSetting(
475 HWND hwndDlg,
476 PGLOBALDATA pGlobalData)
477 {
478 WCHAR szNumDecimalSep[MAX_NUMDECIMALSEP];
479 WCHAR szNumThousandSep[MAX_NUMTHOUSANDSEP];
480 WCHAR szNumNegativeSign[MAX_NUMNEGATIVESIGN];
481 WCHAR szNumListSep[MAX_NUMLISTSEP];
482 INT nNumDigits;
483 INT nNumGrouping;
484 INT nNumNegFormat;
485 INT nNumLeadingZero;
486 INT nNumMeasure;
487
488 /* Decimal symbol */
489 GetSelectedComboBoxText(hwndDlg,
490 IDC_NUMBERDSYMBOL,
491 szNumDecimalSep,
492 MAX_NUMDECIMALSEP);
493
494 if (szNumDecimalSep[0] == L'\0')
495 {
496 /* TODO: Show error message */
497
498 return FALSE;
499 }
500
501 /* Number of digits after decimal */
502 GetSelectedComboBoxIndex(hwndDlg,
503 IDC_NUMBERSNDIGDEC,
504 &nNumDigits);
505
506 /* Digit grouping symbol */
507 GetSelectedComboBoxText(hwndDlg,
508 IDC_NUMBERSDIGITGRSYM,
509 szNumThousandSep,
510 MAX_NUMTHOUSANDSEP);
511
512 if (szNumThousandSep[0] == L'\0')
513 {
514 /* TODO: Show error message */
515
516 return FALSE;
517 }
518
519 /* Digit grouping */
520 GetSelectedComboBoxIndex(hwndDlg,
521 IDC_NUMBERSDGROUPING,
522 &nNumGrouping);
523
524 /* Negative sign symbol */
525 GetSelectedComboBoxText(hwndDlg,
526 IDC_NUMBERSNSIGNSYM,
527 szNumNegativeSign,
528 MAX_NUMNEGATIVESIGN);
529
530 if (szNumNegativeSign[0] == L'\0')
531 {
532 /* TODO: Show error message */
533
534 return FALSE;
535 }
536
537 /* Negative number format */
538 GetSelectedComboBoxIndex(hwndDlg,
539 IDC_NUMBERSNNUMFORMAT,
540 &nNumNegFormat);
541
542 /* Display leading zeros */
543 GetSelectedComboBoxIndex(hwndDlg,
544 IDC_NUMBERSDISPLEADZER,
545 &nNumLeadingZero);
546
547 /* List separator */
548 GetSelectedComboBoxText(hwndDlg,
549 IDC_NUMBERSLSEP,
550 szNumListSep,
551 MAX_NUMLISTSEP);
552
553 if (szNumListSep[0] == L'\0')
554 {
555 /* TODO: Show error message */
556
557 return FALSE;
558 }
559
560 /* Measurement system */
561 GetSelectedComboBoxIndex(hwndDlg,
562 IDC_NUMBERSMEASSYS,
563 &nNumMeasure);
564
565 /* Store settings in global data */
566 wcscpy(pGlobalData->szNumDecimalSep, szNumDecimalSep);
567 wcscpy(pGlobalData->szNumThousandSep, szNumThousandSep);
568 wcscpy(pGlobalData->szNumNegativeSign, szNumNegativeSign);
569 wcscpy(pGlobalData->szNumListSep, szNumListSep);
570 pGlobalData->nNumGrouping = nNumGrouping;
571 pGlobalData->nNumDigits = nNumDigits;
572 pGlobalData->nNumNegFormat = nNumNegFormat;
573 pGlobalData->nNumLeadingZero = nNumLeadingZero;
574 pGlobalData->nNumMeasure = nNumMeasure;
575
576 return TRUE;
577 }
578
579 /* Property page dialog callback */
580 INT_PTR CALLBACK
581 NumbersPageProc(HWND hwndDlg,
582 UINT uMsg,
583 WPARAM wParam,
584 LPARAM lParam)
585 {
586 PGLOBALDATA pGlobalData;
587
588 pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
589
590 switch (uMsg)
591 {
592 case WM_INITDIALOG:
593 pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
594 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
595
596 InitNumDecimalSepCB(hwndDlg, pGlobalData);
597 InitNumOfFracSymbCB(hwndDlg, pGlobalData);
598 InitNumFieldSepCB(hwndDlg, pGlobalData);
599 InitFieldDigNumCB(hwndDlg, pGlobalData);
600 InitNegSignCB(hwndDlg, pGlobalData);
601 InitNegNumFmtCB(hwndDlg, pGlobalData);
602 InitLeadingZeroesCB(hwndDlg, pGlobalData);
603 InitListSepCB(hwndDlg, pGlobalData);
604 InitUnitsSysCB(hwndDlg, pGlobalData);
605 UpdateNumSamples(hwndDlg, pGlobalData);
606 break;
607
608 case WM_COMMAND:
609 switch (LOWORD(wParam))
610 {
611 case IDC_NUMBERDSYMBOL:
612 case IDC_NUMBERSNDIGDEC:
613 case IDC_NUMBERSDIGITGRSYM:
614 case IDC_NUMBERSDGROUPING:
615 case IDC_NUMBERSNSIGNSYM:
616 case IDC_NUMBERSNNUMFORMAT:
617 case IDC_NUMBERSDISPLEADZER:
618 case IDC_NUMBERSLSEP:
619 case IDC_NUMBERSMEASSYS:
620 if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
621 {
622 /* Enable the Apply button */
623 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
624 }
625 }
626 break;
627
628 case WM_NOTIFY:
629 if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
630 {
631 if (GetNumberSetting(hwndDlg, pGlobalData))
632 {
633 pGlobalData->bUserLocaleChanged = TRUE;
634 UpdateNumSamples(hwndDlg, pGlobalData);
635 }
636 }
637 break;
638 }
639 return FALSE;
640 }
641
642 /* EOF */