+/*\r
+ * PROJECT: ReactOS International Control Panel\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: dll/cpl/intl/nums.c\r
+ * PURPOSE: ReactOS International Control Panel\r
+ * PROGRAMMERS: Alexey Zavyalov (gen_x@mail.ru)\r
+*/\r
+\r
+/* INCLUDES *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <commctrl.h>\r
+#include <cpl.h>\r
+\r
+#include "intl.h"\r
+#include "resource.h"\r
+\r
+/* GLOBALS ******************************************************************/\r
+\r
+#define SAMPLE_NUMBER L"123456789"\r
+#define SAMPLE_NEG_NUMBER L"-123456789"\r
+#define MAX_NUM_SEP_SAMPLES 2\r
+#define MAX_FRAC_NUM_SAMPLES 9\r
+#define MAX_FIELD_SEP_SAMPLES 1\r
+#define MAX_FIELD_DIG_SAMPLES 3\r
+#define MAX_NEG_SIGN_SAMPLES 1\r
+#define MAX_NEG_NUMBERS_SAMPLES 5\r
+#define MAX_LEAD_ZEROES_SAMPLES 2\r
+#define MAX_LIST_SEP_SAMPLES 1\r
+#define MAX_UNITS_SYS_SAMPLES 2\r
+#define EOLN_SIZE sizeof(WCHAR)\r
+\r
+/* FUNCTIONS ****************************************************************/\r
+\r
+/* Init system of units control box */\r
+VOID\r
+InitUnitsSysCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszUnitsSysSamples[MAX_UNITS_SYS_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L"Metrics",\r
+ L"Americans"\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+ WCHAR wszUnitsSys[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get current system of units */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_IMEASURE,\r
+ wszUnitsSys,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Create list of standart system of units */\r
+ for(nCBIndex=0;nCBIndex<MAX_UNITS_SYS_SAMPLES;nCBIndex++)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)wszUnitsSysSamples[nCBIndex]);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
+ CB_SETCURSEL,\r
+ (WPARAM)_wtoi(wszUnitsSys),\r
+ (LPARAM)0);\r
+}\r
+\r
+/* Init elements list separator control box */\r
+VOID\r
+InitListSepCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszListSepSamples[MAX_LIST_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L";"\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+ WCHAR wszListSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get current list separator */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_SLIST,\r
+ wszListSep,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Create standart list of signs */\r
+ for(nCBIndex=0;nCBIndex<MAX_LIST_SEP_SAMPLES;nCBIndex++)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)wszListSepSamples[nCBIndex]);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszListSep);\r
+\r
+ /* if is not success, add new value to list and select them */\r
+ if(nRetCode == CB_ERR)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
+ CB_ADDSTRING,\r
+ MAX_LIST_SEP_SAMPLES+1,\r
+ (LPARAM)wszListSep);\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszListSep);\r
+ }\r
+}\r
+\r
+/* Init leading zeroes control box */\r
+VOID\r
+InitLeadingZeroesCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszLeadNumFmtSamples[MAX_LEAD_ZEROES_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L",7",\r
+ L"0,7"\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ WCHAR wszLeadNumFmt[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR* pwszResultStr;\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+\r
+ /* Get current leading zeroes format */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_ILZERO,\r
+ wszLeadNumFmt,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Get current decimal separator */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_SDECIMAL,\r
+ wszNumSep,\r
+ dwValueSize);\r
+\r
+ /* Create list of standart leading zeroes formats */\r
+ for(nCBIndex=0;nCBIndex<MAX_LEAD_ZEROES_SAMPLES;nCBIndex++)\r
+ {\r
+ pwszResultStr = ReplaceSubStr(wszLeadNumFmtSamples[nCBIndex],\r
+ wszNumSep,\r
+ L",");\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)pwszResultStr);\r
+ free(pwszResultStr);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
+ CB_SETCURSEL,\r
+ (WPARAM)_wtoi(wszLeadNumFmt),\r
+ (LPARAM)0);\r
+}\r
+\r
+/* Init negative numbers format control box */\r
+VOID\r
+InitNegNumFmtCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszNegNumFmtSamples[MAX_NEG_NUMBERS_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L"(1,1)",\r
+ L"-1,1",\r
+ L"- 1,1",\r
+ L"1,1-",\r
+ L"1,1 -"\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ WCHAR wszNegNumFmt[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR wszNewSample[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR* pwszResultStr;\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+\r
+ /* Get current negative numbers format */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_INEGNUMBER,\r
+ wszNegNumFmt,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Get current decimal separator */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_SDECIMAL,\r
+ wszNumSep,\r
+ dwValueSize);\r
+\r
+ /* Get current negative sign */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_SNEGATIVESIGN,\r
+ wszNegSign,\r
+ dwValueSize);\r
+\r
+ /* Create standart list of negative numbers formats */\r
+ for(nCBIndex=0;nCBIndex<MAX_NEG_NUMBERS_SAMPLES;nCBIndex++)\r
+ {\r
+ /* Replace standart separator to setted */\r
+ pwszResultStr = ReplaceSubStr(wszNegNumFmtSamples[nCBIndex],\r
+ wszNumSep,\r
+ L",");\r
+ wcscpy(wszNewSample,pwszResultStr);\r
+ free(pwszResultStr);\r
+ /* Replace standart negative sign to setted */\r
+ pwszResultStr = ReplaceSubStr(wszNewSample,\r
+ wszNegSign,\r
+ L"-");\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)pwszResultStr);\r
+ free(pwszResultStr);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
+ CB_SETCURSEL,\r
+ (WPARAM)_wtoi(wszNegNumFmt),\r
+ (LPARAM)0);\r
+}\r
+\r
+/* Init negative sign control box */\r
+VOID\r
+InitNegSignCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszNegSignSamples[MAX_NEG_SIGN_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L"-"\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+ WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get current negative sign */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_SNEGATIVESIGN,\r
+ wszNegSign,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Create standart list of signs */\r
+ for(nCBIndex=0;nCBIndex<MAX_NEG_SIGN_SAMPLES;nCBIndex++)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)wszNegSignSamples[nCBIndex]);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszNegSign);\r
+\r
+ /* if is not success, add new value to list and select them */\r
+ if(nRetCode == CB_ERR)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
+ CB_ADDSTRING,\r
+ MAX_NUM_SEP_SAMPLES+1,\r
+ (LPARAM)wszNegSign);\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszNegSign);\r
+ }\r
+}\r
+\r
+/* Init number of digidts in field control box */\r
+VOID\r
+InitFieldDigNumCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L"0;0",\r
+ L"3;0",\r
+ L"3;2;0"\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+ WCHAR wszFieldDigNum[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR* pwszFieldDigNumSmpl;\r
+\r
+ /* Get current field digits num */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_SGROUPING,\r
+ wszFieldDigNum,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Create standart list of field digits num */\r
+ for(nCBIndex=0;nCBIndex<MAX_FIELD_DIG_SAMPLES;nCBIndex++)\r
+ {\r
+\r
+ pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNumSamples[nCBIndex]);\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)pwszFieldDigNumSmpl);\r
+ free(pwszFieldDigNumSmpl);\r
+ }\r
+\r
+ pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNum);\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)pwszFieldDigNumSmpl);\r
+\r
+ /* if is not success, add new value to list and select them */\r
+ if(nRetCode == CB_ERR)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
+ CB_ADDSTRING,\r
+ MAX_FIELD_DIG_SAMPLES+1,\r
+ (LPARAM)pwszFieldDigNumSmpl);\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)pwszFieldDigNumSmpl);\r
+ }\r
+\r
+ free(pwszFieldDigNumSmpl);\r
+}\r
+\r
+/* Init field separator control box */\r
+VOID\r
+InitNumFieldSepCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszFieldSepSamples[MAX_FIELD_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L" "\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+ WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get current field separator */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_STHOUSAND,\r
+ wszFieldSep,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Create standart list of field separators */\r
+ for(nCBIndex=0;nCBIndex<MAX_FIELD_SEP_SAMPLES;nCBIndex++)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)wszFieldSepSamples[nCBIndex]);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszFieldSep);\r
+\r
+ /* if is not success, add new value to list and select them */\r
+ if(nRetCode == CB_ERR)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
+ CB_ADDSTRING,\r
+ MAX_FIELD_SEP_SAMPLES+1,\r
+ (LPARAM)wszFieldSep);\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszFieldSep);\r
+ }\r
+}\r
+\r
+/* Init number of fractional symbols control box */\r
+VOID\r
+InitNumOfFracSymbCB(HWND hwndDlg)\r
+{\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+ WCHAR wszFracNum[MAX_SAMPLES_STR_SIZE];\r
+ WCHAR wszFracCount[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get current number of fractional symbols */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_IDIGITS,\r
+ wszFracNum,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Create standart list of fractional symbols */\r
+ for(nCBIndex=0;nCBIndex<MAX_FRAC_NUM_SAMPLES;nCBIndex++)\r
+ {\r
+ /* convert to wide char */\r
+ _itow(nCBIndex,wszFracCount,DECIMAL_RADIX);\r
+\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)wszFracCount);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
+ CB_SETCURSEL,\r
+ (WPARAM)_wtoi(wszFracNum),\r
+ (LPARAM)0);\r
+}\r
+\r
+/* Init num decimal separator control box */\r
+VOID\r
+InitNumDecimalSepCB(HWND hwndDlg)\r
+{\r
+ WCHAR wszNumSepSamples[MAX_NUM_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L",",\r
+ L"."\r
+ };\r
+\r
+ int nCBIndex;\r
+ int nRetCode;\r
+\r
+ DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+ WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get current decimal separator */\r
+ GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+ LOCALE_SDECIMAL,\r
+ wszNumSep,\r
+ dwValueSize);\r
+\r
+ /* Clear all box content */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
+ CB_RESETCONTENT,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Create standart list of decimal separators */\r
+ for(nCBIndex=0;nCBIndex<MAX_NUM_SEP_SAMPLES;nCBIndex++)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
+ CB_ADDSTRING,\r
+ nCBIndex,\r
+ (LPARAM)wszNumSepSamples[nCBIndex]);\r
+ }\r
+\r
+ /* Set current item to value from registry */\r
+ nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszNumSep);\r
+\r
+ /* if is not success, add new value to list and select them */\r
+ if(nRetCode == CB_ERR)\r
+ {\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
+ CB_ADDSTRING,\r
+ MAX_NUM_SEP_SAMPLES+1,\r
+ (LPARAM)wszNumSep);\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
+ CB_SELECTSTRING,\r
+ -1,\r
+ (LPARAM)(LPCSTR)wszNumSep);\r
+ }\r
+}\r
+\r
+/* Set units system */\r
+BOOL\r
+SetNumUnitsSys(HWND hwndDlg)\r
+{\r
+ WCHAR wszUnitsSys[MAX_SAMPLES_STR_SIZE];\r
+ INT nCurrSel;\r
+\r
+ /* Get setted units system */\r
+ nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),\r
+ CB_GETCURSEL,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* convert to wide char */\r
+ _itow(nCurrSel,wszUnitsSys,DECIMAL_RADIX);\r
+\r
+ /* Save units system */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IMEASURE, wszUnitsSys);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set elements list separator */\r
+BOOL\r
+SetNumListSep(HWND hwndDlg)\r
+{\r
+ WCHAR wszListSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get setted list separator */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),\r
+ WM_GETTEXT,\r
+ (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+ (LPARAM)(LPCSTR)wszListSep);\r
+\r
+ /* Save list separator */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SLIST, wszListSep);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set leading zero */\r
+BOOL\r
+SetNumLeadZero(HWND hwndDlg)\r
+{\r
+ WCHAR wszLeadZero[MAX_SAMPLES_STR_SIZE];\r
+ INT nCurrSel;\r
+\r
+ /* Get setted leading zero format */\r
+ nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),\r
+ CB_GETCURSEL,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* convert to wide char */\r
+ _itow(nCurrSel,wszLeadZero,DECIMAL_RADIX);\r
+\r
+ /* Save leading zero format */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILZERO, wszLeadZero);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set negative sum format */\r
+BOOL\r
+SetNegSumFmt(HWND hwndDlg)\r
+{\r
+ WCHAR wszNegSumFmt[MAX_SAMPLES_STR_SIZE];\r
+ INT nCurrSel;\r
+\r
+ /* Get setted negative sum format */\r
+ nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),\r
+ CB_GETCURSEL,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* convert to wide char */\r
+ _itow(nCurrSel,wszNegSumFmt,DECIMAL_RADIX);\r
+\r
+ /* Save negative sum format */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, wszNegSumFmt);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set negative sign */\r
+BOOL\r
+SetNumNegSign(HWND hwndDlg)\r
+{\r
+ WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get setted negative sign */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),\r
+ WM_GETTEXT,\r
+ (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+ (LPARAM)(LPCSTR)wszNegSign);\r
+\r
+ /* Save negative sign */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SNEGATIVESIGN, wszNegSign);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set number of digidts in field */\r
+BOOL\r
+SetFieldDigNum(HWND hwndDlg)\r
+{\r
+ WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+ {\r
+ L"0;0",\r
+ L"3;0",\r
+ L"3;2;0"\r
+ };\r
+\r
+ int nCurrSel;\r
+\r
+ /* Get setted number of digidts in field */\r
+ nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),\r
+ CB_GETCURSEL,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* Save number of digidts in field */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, wszFieldDigNumSamples[nCurrSel]);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set field separator */\r
+BOOL\r
+SetNumFieldSep(HWND hwndDlg)\r
+{\r
+ WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get setted field separator */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),\r
+ WM_GETTEXT,\r
+ (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+ (LPARAM)(LPCSTR)wszFieldSep);\r
+\r
+ /* Save field separator */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, wszFieldSep);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set number of fractional symbols */\r
+BOOL\r
+SetFracSymNum(HWND hwndDlg)\r
+{\r
+ WCHAR wszFracSymNum[MAX_SAMPLES_STR_SIZE];\r
+ INT nCurrSel;\r
+\r
+ /* Get setted number of fractional symbols */\r
+ nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),\r
+ CB_GETCURSEL,\r
+ (WPARAM)0,\r
+ (LPARAM)0);\r
+\r
+ /* convert to wide char */\r
+ _itow(nCurrSel,wszFracSymNum,DECIMAL_RADIX);\r
+\r
+ /* Save number of fractional symbols */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, wszFracSymNum);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Set num decimal separator */\r
+BOOL\r
+SetNumDecimalSep(HWND hwndDlg)\r
+{\r
+ WCHAR wszDecimalSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+ /* Get setted decimal separator */\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),\r
+ WM_GETTEXT,\r
+ (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+ (LPARAM)(LPCSTR)wszDecimalSep);\r
+\r
+ /* Save decimal separator */\r
+ SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, wszDecimalSep);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/* Update all numbers locale samples */\r
+static\r
+VOID\r
+UpdateNumSamples(HWND hwndDlg,\r
+ LCID lcidLocale)\r
+{\r
+ WCHAR OutBuffer[MAX_FMT_SIZE];\r
+\r
+ /* Get positive number format sample */\r
+ GetNumberFormatW(lcidLocale,\r
+ 0,\r
+ SAMPLE_NUMBER,\r
+ NULL,\r
+ OutBuffer,\r
+ MAX_FMT_SIZE);\r
+\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NUM_EDIT),\r
+ WM_SETTEXT,\r
+ 0,\r
+ (LPARAM)OutBuffer);\r
+\r
+ /* Get positive number format sample */\r
+ GetNumberFormatW(lcidLocale,\r
+ 0,\r
+ SAMPLE_NEG_NUMBER,\r
+ NULL,\r
+ OutBuffer,\r
+ MAX_FMT_SIZE);\r
+\r
+ SendMessageW(GetDlgItem(hwndDlg, IDC_NEGNUM_EDIT),\r
+ WM_SETTEXT,\r
+ 0,\r
+ (LPARAM)OutBuffer);\r
+}\r
+\r
+/* Numbers options setup page dialog callback */\r
+INT_PTR\r
+CALLBACK\r
+NumsOptsSetProc(HWND hwndDlg,\r
+ UINT uMsg,\r
+ WPARAM wParam,\r
+ LPARAM lParam)\r
+{\r
+ UNREFERENCED_PARAMETER(lParam);\r
+ UNREFERENCED_PARAMETER(wParam);\r
+ UNREFERENCED_PARAMETER(hwndDlg);\r
+ switch(uMsg)\r
+ {\r
+ case WM_INITDIALOG:\r
+ {\r
+ /* Init combo boxes */\r
+ InitNumDecimalSepCB(hwndDlg);\r
+ InitNumOfFracSymbCB(hwndDlg);\r
+ InitNumFieldSepCB(hwndDlg);\r
+ InitFieldDigNumCB(hwndDlg);\r
+ InitNegSignCB(hwndDlg);\r
+ InitNegNumFmtCB(hwndDlg);\r
+ InitLeadingZeroesCB(hwndDlg);\r
+ InitListSepCB(hwndDlg);\r
+ InitUnitsSysCB(hwndDlg);\r
+\r
+ UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+ }\r
+ break;\r
+\r
+ case WM_COMMAND:\r
+ {\r
+ switch (LOWORD(wParam))\r
+ {\r
+ case IDC_NUMDECIMALSEP_COMBO:\r
+ case IDC_NUMFRACSYBMS_COMBO:\r
+ case IDC_NUMFIELDSEP_COMBO:\r
+ case IDC_NUMDIGFIELD_COMBO:\r
+ case IDC_NUMNEGSIGN_COMBO:\r
+ case IDC_NUMNEGFMT_COMBO:\r
+ case IDC_NUMLEADZERO_COMBO:\r
+ case IDC_NUMELEMLISTSEP_COMBO:\r
+ case IDC_NUMUNITSSYS_COMBO:\r
+ case IDC_NUMREGDIG_COMBO:\r
+ case IDC_NUMDIGREPL_COMBO:\r
+ {\r
+ if (HIWORD(wParam) == CBN_SELCHANGE ||\r
+ HIWORD(wParam) == CBN_EDITCHANGE)\r
+ {\r
+ /* Set "Apply" button enabled */\r
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case WM_NOTIFY:\r
+ {\r
+ LPNMHDR lpnm = (LPNMHDR)lParam;\r
+ /* If push apply button */\r
+ if (lpnm->code == (UINT)PSN_APPLY)\r
+ {\r
+ if(!SetNumDecimalSep(hwndDlg)) break;\r
+ if(!SetFracSymNum(hwndDlg)) break;\r
+ if(!SetNumFieldSep(hwndDlg)) break;\r
+ if(!SetFieldDigNum(hwndDlg)) break;\r
+ if(!SetNumNegSign(hwndDlg)) break;\r
+ if(!SetNegSumFmt(hwndDlg)) break;\r
+ if(!SetNumLeadZero(hwndDlg)) break;\r
+ if(!SetNumListSep(hwndDlg)) break;\r
+ if(!SetNumUnitsSys(hwndDlg)) break;\r
+\r
+ /* Update sum format combo boxes */\r
+ InitLeadingZeroesCB(hwndDlg);\r
+ InitNegNumFmtCB(hwndDlg);\r
+\r
+ /* FIXME: */\r
+ _sleep(15);\r
+ /* Update sum format samples */\r
+ UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ return FALSE;\r
+}\r
+\r
+\r
+/* EOF */\r