Alexey Zavyalov: Add functionally Numbers, Currency, Time, Date tabs. Fix some bugs.
authorAleksey Bragin <aleksey@reactos.org>
Tue, 23 Jan 2007 17:59:36 +0000 (17:59 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Tue, 23 Jan 2007 17:59:36 +0000 (17:59 +0000)
See issue #1988 for more details.

svn path=/trunk/; revision=25603

13 files changed:
reactos/dll/cpl/intl_new/En.rc
reactos/dll/cpl/intl_new/currency.c [new file with mode: 0644]
reactos/dll/cpl/intl_new/date.c [new file with mode: 0644]
reactos/dll/cpl/intl_new/extra.c
reactos/dll/cpl/intl_new/intl.c
reactos/dll/cpl/intl_new/intl.h
reactos/dll/cpl/intl_new/intl.rbuild
reactos/dll/cpl/intl_new/langs.c [new file with mode: 0644]
reactos/dll/cpl/intl_new/locale.c
reactos/dll/cpl/intl_new/nums.c [new file with mode: 0644]
reactos/dll/cpl/intl_new/resource.h
reactos/dll/cpl/intl_new/setupreg.c [new file with mode: 0644]
reactos/dll/cpl/intl_new/time.c [new file with mode: 0644]

index bbde0bb..f423c13 100644 (file)
@@ -39,6 +39,139 @@ BEGIN
     LTEXT "This option...", -1, 14, 18, 223, 33
     LTEXT "Select language...", -1, 14, 55, 223, 18
     GROUPBOX "Transformation tables codepages", -1, 5, 101, 242, 88
     LTEXT "This option...", -1, 14, 18, 223, 33
     LTEXT "Select language...", -1, 14, 55, 223, 18
     GROUPBOX "Transformation tables codepages", -1, 5, 101, 242, 88
+    /* TODO: add other components*/
+END
+
+IDD_LANGSOPTSPAGE DIALOGEX 0, 0, 252, 236
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Languages"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Text input languages and services", IDC_GROUPBOX, 5, 3, 242, 52
+    LTEXT "To view or change language or text input methods press ""Detail...""", -1, 12, 13, 230, 18
+    PUSHBUTTON "De&tail...", IDC_DETAIL_BUTTON, 186, 34, 54, 14
+    GROUPBOX "Additionary language support", IDC_GROUPBOX, 5, 60, 242, 82
+    /* TODO: add other components*/
+END
+
+IDD_NUMSOPTSSETUP DIALOGEX 0, 0, 252, 236
+STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Numbers"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Samples", IDC_GROUPBOX, 5, 7, 242, 48
+    LTEXT "Positive:", -1, 11, 20, 28, 10
+    EDITTEXT IDC_NUM_EDIT, 42, 18, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Negative:", -1, 128, 20, 31, 10
+    EDITTEXT IDC_NEGNUM_EDIT, 162, 18, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Positive:", -1, 11, 38, 28, 10
+    EDITTEXT IDC_NUM1_EDIT, 42, 36, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Negative:", -1, 128, 38, 31, 10
+    EDITTEXT IDC_NEGNUM1_EDIT, 162, 36, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Whole and fractional part separator:", -1, 18, 61, 126, 9
+    COMBOBOX IDC_NUMDECIMALSEP_COMBO, 147, 59, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Number of fractional symbols:", -1, 18, 77, 126, 9
+    COMBOBOX IDC_NUMFRACSYBMS_COMBO, 147, 75, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Field separator:", -1, 18, 93, 126, 9
+    COMBOBOX IDC_NUMFIELDSEP_COMBO, 147, 91, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Number of digidts in field:", -1, 18, 109, 126, 9
+    COMBOBOX IDC_NUMDIGFIELD_COMBO, 147, 107, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Negative number sign:", -1, 18, 125, 126, 9
+    COMBOBOX IDC_NUMNEGSIGN_COMBO, 147, 123, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Negative numbers format:", -1, 18, 141, 126, 9
+    COMBOBOX IDC_NUMNEGFMT_COMBO, 147, 139, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Leading zeroes:", -1, 18, 157, 126, 9
+    COMBOBOX IDC_NUMLEADZERO_COMBO, 147, 155, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Elements list separator:", -1, 18, 173, 126, 9
+    COMBOBOX IDC_NUMELEMLISTSEP_COMBO, 147, 171, 100, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "System of units:", -1, 18, 189, 126, 9
+    COMBOBOX IDC_NUMUNITSSYS_COMBO, 147, 187, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Region corresponding digits:", -1, 18, 205, 126, 9
+    COMBOBOX IDC_NUMREGDIG_COMBO, 147, 203, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Digit replacement:", -1, 18, 221, 126, 9
+    COMBOBOX IDC_NUMDIGREPL_COMBO, 147, 219, 100, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+END
+
+IDD_CURRENCYOPTSSETUP DIALOGEX 0, 0, 252, 236
+STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Currency"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Samples", IDC_GROUPBOX, 5, 7, 242, 40
+    LTEXT "Positive:", -1, 10, 25, 30, 10
+    EDITTEXT IDC_CURRENCY_EDIT, 42, 23, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Negative:", -1, 128, 25, 31, 10
+    EDITTEXT IDC_NEGCURRENCY_EDIT, 162, 23, 80, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Monetary unit:", -1, 20, 61, 126, 9
+    COMBOBOX IDC_CURRENCYUNIT_COMBO, 148, 59, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
+    LTEXT "Positive sum of money format:", -1, 20, 78, 126, 9
+    COMBOBOX IDC_POSCURRENCYSUM_COMBO, 148, 76, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Negative sum of money format:", -1, 20, 95, 126, 9
+    COMBOBOX IDC_NEGCURRENCYSUM_COMBO, 148, 93, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+    LTEXT "Whole and fractional part separator:", -1, 20, 121, 126, 9
+    COMBOBOX IDC_WHOLEFRACTSEP_COMBO, 148, 119, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
+    LTEXT "Number of fractional symbols:", -1, 20, 137, 126, 9
+    COMBOBOX IDC_FRACSYMBSNUM_COMBO, 148, 136, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
+    LTEXT "Field separator:", -1, 20, 166, 126, 9
+    COMBOBOX IDC_FIELDSEP_COMBO, 148, 164, 90, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | CBS_SORT
+    LTEXT "Number of digidts in field:", -1, 20, 183, 126, 9
+    COMBOBOX IDC_DIGINFIELDNUM_COMBO, 148, 181, 90, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
+END
+
+IDD_TIMEOPTSSETUP DIALOGEX 0, 0, 252, 236
+STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Time"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Samples", IDC_GROUPBOX, 5, 7, 242, 33
+    LTEXT "Sample:", -1, 13, 21, 52, 10
+    EDITTEXT IDC_TIME_EDIT, 68, 19, 84, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    EDITTEXT IDC_UNKNOWN_EDIT, 156, 19, 84, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Time format:", -1, 10, 52, 147, 10
+    COMBOBOX IDC_TIMEFMT_COMBO, 161, 50, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
+    LTEXT "Time components separator:", -1, 10, 69, 147, 10
+    COMBOBOX IDC_TIMESEP_COMBO, 161, 67, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
+    LTEXT "Time about midday notation (AM):", -1, 10, 86, 147, 10
+    COMBOBOX IDC_TIMEAM_COMBO, 161, 84, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
+    LTEXT "Time afternoon notation (PM):", -1, 10, 104, 147, 10
+    COMBOBOX IDC_TIMEPM_COMBO, 161, 102, 84, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
+    GROUPBOX "", IDC_GROUPBOX, 7, 132, 238, 80
+    LTEXT "The designation of the time format\nh = hour     m = minute     s = second    t = \80\8c or \90\8c\n\nh = 12-hour day format\nH = 24-hour day format\n\nhh, mm, ss = with zeroes in beginning\nh, m, s = without zeroes", -1, 13, 141, 226, 65
+END
+
+IDD_DATEOPTSSETUP DIALOGEX 0, 0, 252, 236
+STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Date"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Calendar", IDC_GROUPBOX, 5, 7, 242, 74
+    LTEXT "If year typed as two digits, then show it as year between:", -1, 13, 18, 225, 8
+    EDITTEXT IDC_FIRSTYEAR_EDIT, 13, 30, 36, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "and", -1, 55, 32, 17, 8
+    EDITTEXT IDC_SECONDYEAR_EDIT, 77, 30, 36, 12, ES_LEFT | ES_NUMBER | WS_GROUP
+    CONTROL "",IDC_SCR_MAX_YEAR, "msctls_updown32", UDS_NOTHOUSANDS | UDS_WRAP | UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_CHILD | WS_VISIBLE, 113, 30, 10, 12
+    LTEXT "Calendar type:", -1, 13, 48, 56, 10
+    COMBOBOX IDC_CALTYPE_COMBO, 77, 46, 161, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
+             WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
+    LTEXT "Chronology by Hijra:", -1, 13, 59, 60, 16
+    COMBOBOX IDC_HIJCHRON_COMBO, 77, 64, 161, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | 
+             WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
+    GROUPBOX "Short date format", IDC_GROUPBOX, 7, 83, 238, 81
+    LTEXT "Sample:", -1, 13, 95, 63, 10
+    EDITTEXT IDC_SHRTDATESAMPLE_EDIT, 77, 93, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Sample - right to left read:", -1, 13, 109, 60, 16
+    EDITTEXT IDC_SHRTDATERTOL_EDIT, 77, 111, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
+    LTEXT "Short format:", -1, 13, 131, 60, 10
+    COMBOBOX IDC_SHRTDATEFMT_COMBO, 77, 129, 161, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
+    LTEXT "Date components separator:", -1, 13, 148, 113, 10
+    COMBOBOX IDC_SHRTDATESEP_COMBO, 187, 146, 51, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
+    GROUPBOX "Long date format", IDC_GROUPBOX, 7, 167, 238, 64
+    LTEXT "Sample:", -1, 13, 179, 61, 10
+    EDITTEXT IDC_LONGDATESAMPLE_EDIT, 77, 177, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
+    LTEXT "Sample - right to left read:", -1, 13, 193, 61, 16
+    EDITTEXT IDC_LONGDATERTOL_EDIT, 77, 195, 161, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
+    LTEXT "Long format:", -1, 13, 215, 60, 10
+    COMBOBOX IDC_LONGDATEFMT_COMBO, 77, 213, 161, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE 
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
diff --git a/reactos/dll/cpl/intl_new/currency.c b/reactos/dll/cpl/intl_new/currency.c
new file mode 100644 (file)
index 0000000..ab3e680
--- /dev/null
@@ -0,0 +1,727 @@
+/*\r
+ * PROJECT:         ReactOS International Control Panel\r
+ * LICENSE:         GPL - See COPYING in the top level directory\r
+ * FILE:            dll/cpl/intl/monetary.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_CURRENCY_UNIT_SAMPLES   2\r
+#define MAX_POS_CURRENCY_SAMPLES    4\r
+#define MAX_NEG_CURRENCY_SAMPLES    16\r
+#define MAX_CURRENCY_SEP_SAMPLES    2\r
+#define MAX_CURRENCY_FRAC_SAMPLES   10\r
+#define MAX_FIELD_SEP_SAMPLES       1\r
+#define MAX_FIELD_DIG_SAMPLES       3\r
+#define EOLN_SIZE                   sizeof(WCHAR)\r
+\r
+/* FUNCTIONS ****************************************************************/\r
+\r
+/* Init number of digidts in field control box */\r
+VOID\r
+InitCurrencyDigNumCB(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_SMONGROUPING,\r
+                   wszFieldDigNum,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_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_DIGINFIELDNUM_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_DIGINFIELDNUM_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_DIGINFIELDNUM_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_FIELD_DIG_SAMPLES+1,\r
+                     (LPARAM)pwszFieldDigNumSmpl);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_DIGINFIELDNUM_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)pwszFieldDigNumSmpl);\r
+    }\r
+\r
+    free(pwszFieldDigNumSmpl);\r
+}\r
+\r
+\r
+/* Init currency field separator control box */\r
+VOID\r
+InitCurrencyFieldSepCB(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_SMONTHOUSANDSEP,\r
+                   wszFieldSep,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_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_FIELDSEP_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_FIELDSEP_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_FIELDSEP_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_FIELD_SEP_SAMPLES+1,\r
+                     (LPARAM)wszFieldSep);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszFieldSep);\r
+    }\r
+}\r
+\r
+/* Init number of fractional symbols control box */\r
+VOID\r
+InitCurrencyFracNumCB(HWND hwndDlg)\r
+{\r
+    int nCBIndex;\r
+    int nRetCode;\r
+\r
+    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+    WCHAR wszCurrencyFracNum[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_ICURRDIGITS,\r
+                   wszCurrencyFracNum,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_FRACSYMBSNUM_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of fractional symbols */\r
+    for(nCBIndex=0;nCBIndex<MAX_CURRENCY_FRAC_SAMPLES;nCBIndex++)\r
+    {\r
+        /* convert to wide char */\r
+        _itow(nCBIndex,wszFracCount,DECIMAL_RADIX);\r
+\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_FRACSYMBSNUM_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_FRACSYMBSNUM_COMBO),\r
+                           CB_SETCURSEL,\r
+                           (WPARAM)_wtoi(wszCurrencyFracNum),\r
+                           (LPARAM)0);\r
+}\r
+\r
+\r
+/* Init positive currency sum format control box */\r
+VOID\r
+InitPosCurrencySumCB(HWND hwndDlg)\r
+{\r
+    WCHAR wszPosCurrencySumSamples[MAX_POS_CURRENCY_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+    {\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 wszCurrPosFmt[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszNewSample[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszCurrencySep[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR* pwszResultStr;\r
+    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+\r
+    /* Get current currency sum format */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_ICURRENCY,\r
+                   wszCurrPosFmt,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_POSCURRENCYSUM_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Get current currency separator */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SMONDECIMALSEP,\r
+                   wszCurrencySep,\r
+                   dwValueSize);\r
+\r
+    /* Get current currency unit */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SCURRENCY,\r
+                   wszCurrencyUnit,\r
+                   dwValueSize);\r
+\r
+    /* Create standart list of currency sum formats */\r
+    for(nCBIndex=0;nCBIndex<MAX_POS_CURRENCY_SAMPLES;nCBIndex++)\r
+    {\r
+        pwszResultStr = ReplaceSubStr(wszPosCurrencySumSamples[nCBIndex],\r
+                                      wszCurrencyUnit,\r
+                                      L"$");\r
+        wcscpy(wszNewSample,pwszResultStr);\r
+        free(pwszResultStr);\r
+        pwszResultStr = ReplaceSubStr(wszNewSample,\r
+                                      wszCurrencySep,\r
+                                      L",");\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_POSCURRENCYSUM_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_POSCURRENCYSUM_COMBO),\r
+                           CB_SETCURSEL,\r
+                           (WPARAM)_wtoi(wszCurrPosFmt),\r
+                           (LPARAM)0);\r
+}\r
+\r
+/* Init negative currency sum format control box */\r
+VOID\r
+InitNegCurrencySumCB(HWND hwndDlg)\r
+{\r
+    WCHAR wszNegCurrencySumSamples[MAX_NEG_CURRENCY_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
+        L"-1,1?",\r
+        L"1,1-?",\r
+        L"1,1?-",\r
+        L"-1,1 ?",\r
+        L"-? 1,1",\r
+        L"1,1 ?-",\r
+        L"? 1,1-",\r
+        L"? -1,1",\r
+        L"1,1- ?",\r
+        L"(? 1,1)",\r
+        L"(1,1 ?)" /* 16 */\r
+    };\r
+\r
+    int nCBIndex;\r
+    int nRetCode;\r
+\r
+    WCHAR wszCurrNegFmt[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszCurrencySep[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 currency sum format */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_INEGCURR,\r
+                   wszCurrNegFmt,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCYSUM_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Get current currency unit */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SCURRENCY,\r
+                   wszCurrencyUnit,\r
+                   dwValueSize);\r
+\r
+    /* Get current currency separator */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SMONDECIMALSEP,\r
+                   wszCurrencySep,\r
+                   dwValueSize);\r
+\r
+    /* Create standart list of currency sum formats */\r
+    for(nCBIndex=0;nCBIndex<MAX_NEG_CURRENCY_SAMPLES;nCBIndex++)\r
+    {\r
+        pwszResultStr = ReplaceSubStr(wszNegCurrencySumSamples[nCBIndex],\r
+                                      wszCurrencyUnit,\r
+                                      L"?");\r
+        wcscpy(wszNewSample,pwszResultStr);\r
+        free(pwszResultStr);\r
+        pwszResultStr = ReplaceSubStr(wszNewSample,\r
+                                      wszCurrencySep,\r
+                                      L",");\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCYSUM_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_NEGCURRENCYSUM_COMBO),\r
+                           CB_SETCURSEL,\r
+                           (WPARAM)_wtoi(wszCurrNegFmt),\r
+                           (LPARAM)0);\r
+}\r
+\r
+/* Init currency separator control box */\r
+VOID\r
+InitCurrencySepCB(HWND hwndDlg)\r
+{\r
+    WCHAR wszCurrencySepSamples[MAX_CURRENCY_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 wszCurrencySep[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current currency separator */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SMONDECIMALSEP,\r
+                   wszCurrencySep,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of currency separators */\r
+    for(nCBIndex=0;nCBIndex<MAX_CURRENCY_SEP_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)wszCurrencySepSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszCurrencySep);\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_WHOLEFRACTSEP_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_CURRENCY_SEP_SAMPLES+1,\r
+                     (LPARAM)wszCurrencySep);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszCurrencySep);\r
+    }\r
+}\r
+\r
+/* Init currency unit control box */\r
+VOID\r
+InitCurrencyUnitCB(HWND hwndDlg)\r
+{\r
+    WCHAR wszCurrencyUnitSamples[MAX_CURRENCY_UNIT_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 wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current currency unit */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SCURRENCY,\r
+                   wszCurrencyUnit,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of currency units */\r
+    for(nCBIndex=0;nCBIndex<MAX_CURRENCY_UNIT_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)wszCurrencyUnitSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszCurrencyUnit);\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_CURRENCYUNIT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_CURRENCY_UNIT_SAMPLES+1,\r
+                     (LPARAM)wszCurrencyUnit);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszCurrencyUnit);\r
+    }\r
+}\r
+\r
+/* Set number of digidts in field  */\r
+BOOL\r
+SetCurrencyDigNum(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_DIGINFIELDNUM_COMBO),\r
+                          CB_GETCURSEL,\r
+                          (WPARAM)0,\r
+                          (LPARAM)0);\r
+\r
+    /* Save number of digidts in field */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONGROUPING, wszFieldDigNumSamples[nCurrSel]);\r
+\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Set currency field separator */\r
+BOOL\r
+SetCurrencyFieldSep(HWND hwndDlg)\r
+{\r
+    WCHAR wszCurrencyFieldSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get setted currency field separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_FIELDSEP_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszCurrencyFieldSep);\r
+\r
+    /* Save currency field separator */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHOUSANDSEP, wszCurrencyFieldSep);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Set number of fractional symbols */\r
+BOOL\r
+SetCurrencyFracSymNum(HWND hwndDlg)\r
+{\r
+    WCHAR wszCurrencyFracSymNum[MAX_SAMPLES_STR_SIZE];\r
+    INT nCurrSel;\r
+\r
+    /* Get setted number of fractional symbols */\r
+    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_FRACSYMBSNUM_COMBO),\r
+                          CB_GETCURSEL,\r
+                          (WPARAM)0,\r
+                          (LPARAM)0);\r
+\r
+    /* convert to wide char */\r
+    _itow(nCurrSel,wszCurrencyFracSymNum,DECIMAL_RADIX);\r
+\r
+    /* Save number of fractional symbols */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ICURRDIGITS, wszCurrencyFracSymNum);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Set currency separator */\r
+BOOL\r
+SetCurrencySep(HWND hwndDlg)\r
+{\r
+    WCHAR wszCurrencySep[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get setted currency decimal separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_WHOLEFRACTSEP_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszCurrencySep);\r
+\r
+    /* TODO: Add check for correctly input */\r
+\r
+    /* Save currency separator */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, wszCurrencySep);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Set negative currency sum format */\r
+BOOL\r
+SetNegCurrencySumFmt(HWND hwndDlg)\r
+{\r
+    WCHAR wszNegCurrencySumFmt[MAX_SAMPLES_STR_SIZE];\r
+    INT nCurrSel;\r
+\r
+    /* Get setted currency unit */\r
+    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCYSUM_COMBO),\r
+                          CB_GETCURSEL,\r
+                          (WPARAM)0,\r
+                          (LPARAM)0);\r
+\r
+    /* convert to wide char */\r
+    _itow(nCurrSel,wszNegCurrencySumFmt,DECIMAL_RADIX);\r
+\r
+    /* Save currency sum format */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_INEGCURR, wszNegCurrencySumFmt);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Set positive currency sum format */\r
+BOOL\r
+SetPosCurrencySumFmt(HWND hwndDlg)\r
+{\r
+    WCHAR wszPosCurrencySumFmt[MAX_SAMPLES_STR_SIZE];\r
+    INT nCurrSel;\r
+\r
+    /* Get setted currency unit */\r
+    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_POSCURRENCYSUM_COMBO),\r
+                          CB_GETCURSEL,\r
+                          (WPARAM)0,\r
+                          (LPARAM)0);\r
+\r
+    /* convert to wide char */\r
+    _itow(nCurrSel,wszPosCurrencySumFmt,DECIMAL_RADIX);\r
+\r
+    /* Save currency sum format */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ICURRENCY, wszPosCurrencySumFmt);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Set currency unit */\r
+BOOL\r
+SetCurrencyUnit(HWND hwndDlg)\r
+{\r
+    WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get setted currency unit */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYUNIT_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszCurrencyUnit);\r
+\r
+    /* Save currency unit */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY, wszCurrencyUnit);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Update all currency locale samples */\r
+static\r
+VOID\r
+UpdateCurrencyLocaleSamples(HWND hwndDlg,\r
+                        LCID lcidLocale)\r
+{\r
+    WCHAR OutBuffer[MAX_FMT_SIZE];\r
+\r
+    /* Get currency format sample */\r
+    GetCurrencyFormatW(lcidLocale,\r
+                       LOCALE_USE_CP_ACP,\r
+                       SAMPLE_NUMBER,\r
+                       NULL,\r
+                       OutBuffer,\r
+                       MAX_FMT_SIZE);\r
+\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCY_EDIT),\r
+                 WM_SETTEXT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)OutBuffer);\r
+\r
+    /* Get negative currency format sample */\r
+    GetCurrencyFormatW(lcidLocale,\r
+                       LOCALE_USE_CP_ACP,\r
+                       SAMPLE_NEG_NUMBER,\r
+                       NULL,\r
+                       OutBuffer,\r
+                       MAX_FMT_SIZE);\r
+\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_NEGCURRENCY_EDIT),\r
+                 WM_SETTEXT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)OutBuffer);\r
+}\r
+\r
+/* Currency options setup page dialog callback */\r
+INT_PTR\r
+CALLBACK\r
+CurrencyOptsSetProc(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
+            InitCurrencyUnitCB(hwndDlg);\r
+            InitCurrencySepCB(hwndDlg);\r
+            InitCurrencyFieldSepCB(hwndDlg);\r
+            InitCurrencyFracNumCB(hwndDlg);\r
+            InitPosCurrencySumCB(hwndDlg);\r
+            InitNegCurrencySumCB(hwndDlg);\r
+            InitCurrencyDigNumCB(hwndDlg);\r
+\r
+            UpdateCurrencyLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+        }\r
+        break;\r
+\r
+        case WM_COMMAND:\r
+        {\r
+            switch (LOWORD(wParam))\r
+            {\r
+                case IDC_CURRENCYUNIT_COMBO:\r
+                case IDC_POSCURRENCYSUM_COMBO:\r
+                case IDC_NEGCURRENCYSUM_COMBO:\r
+                case IDC_WHOLEFRACTSEP_COMBO:\r
+                case IDC_FRACSYMBSNUM_COMBO:\r
+                case IDC_FIELDSEP_COMBO:\r
+                case IDC_DIGINFIELDNUM_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(!SetCurrencyUnit(hwndDlg)) break;\r
+                if(!SetPosCurrencySumFmt(hwndDlg)) break;\r
+                if(!SetNegCurrencySumFmt(hwndDlg)) break;\r
+                if(!SetCurrencySep(hwndDlg)) break;\r
+                if(!SetCurrencyFracSymNum(hwndDlg)) break;\r
+                if(!SetCurrencyFieldSep(hwndDlg)) break;\r
+                if(!SetCurrencyDigNum(hwndDlg)) break;\r
+\r
+                /* Update sum format samples */\r
+                InitPosCurrencySumCB(hwndDlg);\r
+                InitNegCurrencySumCB(hwndDlg);\r
+\r
+                /* FIXME: */\r
+                _sleep(15);\r
+                UpdateCurrencyLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+            }\r
+        }\r
+        break;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+/* EOF */\r
diff --git a/reactos/dll/cpl/intl_new/date.c b/reactos/dll/cpl/intl_new/date.c
new file mode 100644 (file)
index 0000000..83e7eb5
--- /dev/null
@@ -0,0 +1,609 @@
+/*\r
+ * PROJECT:         ReactOS International Control Panel\r
+ * LICENSE:         GPL - See COPYING in the top level directory\r
+ * FILE:            dll/cpl/intl/date.c\r
+ * PURPOSE:         ReactOS International Control Panel\r
+ * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
+*/\r
+\r
+/* INCLUDES *****************************************************************/\r
+\r
+#define WINVER 0x0500\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
+const INT YEAR_STR_MAX_SIZE=4;\r
+const INT EOLN_SIZE=sizeof(WCHAR); /* size of EOLN char */\r
+#define MAX_SHORT_FMT_SAMPLES    5\r
+#define MAX_LONG_FMT_SAMPLES     2\r
+#define MAX_SHRT_DATE_SEPARATORS 3\r
+#define STD_DATE_SEP             L"."\r
+#define YEAR_DIFF                (99)\r
+#define MAX_YEAR                 (9999)\r
+\r
+/* FUNCTIONS ****************************************************************/\r
+\r
+/* if char is 'y' or 'M' or 'd' return TRUE, else FALSE */\r
+BOOL\r
+isDateCompAl(WCHAR walpha)\r
+{\r
+    \r
+    if((walpha == L'y') || (walpha == L'M') || (walpha == L'd') || (walpha == L' ')) return TRUE;\r
+    else return FALSE;\r
+}\r
+\r
+/* Find first date separator in string */\r
+WCHAR*\r
+FindDateSep(const WCHAR *wszSourceStr)\r
+{\r
+    int nDateCompCount=0;\r
+    int nDateSepCount=0;\r
+\r
+       WCHAR* wszFindedSep;\r
+       wszFindedSep=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));\r
+\r
+    wcscpy(wszFindedSep,STD_DATE_SEP);\r
+\r
+    while(nDateCompCount<wcslen(wszSourceStr))\r
+    {\r
+        if(!isDateCompAl(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
+        {\r
+            while(!isDateCompAl(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
+            {\r
+                wszFindedSep[nDateSepCount++]=wszSourceStr[nDateCompCount];\r
+                nDateCompCount++;\r
+            }\r
+            wszFindedSep[nDateSepCount]='\0';\r
+            return wszFindedSep;\r
+        }\r
+        nDateCompCount++;\r
+    }\r
+\r
+    return wszFindedSep;\r
+}\r
+\r
+/* Replace given template in source string with string to replace and return recieved string */\r
+\r
+\r
+/* Setted up short date separator to registry */\r
+BOOL\r
+SetShortDateSep(HWND hwndDlg)\r
+{\r
+    WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];\r
+    int nSepStrSize;\r
+    int nSepCount;\r
+\r
+    /* Get setted separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszShortDateSep);\r
+\r
+    /* Get setted separator string size */\r
+    nSepStrSize = wcslen(wszShortDateSep);\r
+\r
+    /* Check date components */\r
+    for(nSepCount=0;nSepCount<nSepStrSize;nSepCount++)\r
+    {\r
+        if(iswalnum(wszShortDateSep[nSepCount]) || (wszShortDateSep[nSepCount]=='\''))\r
+        {\r
+            MessageBoxW(NULL,\r
+                        L"Entered short date separator contain incorrect symbol",\r
+                        L"Error", MB_OK | MB_ICONERROR);\r
+            return FALSE;\r
+        }\r
+        \r
+    }\r
+\r
+    /* Save date separator */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDATE, wszShortDateSep);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Setted up short date format to registry */\r
+BOOL\r
+SetShortDateFormat(HWND hwndDlg)\r
+{\r
+    WCHAR wszShortDateFmt[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszFindedDateSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+    WCHAR* pwszResultStr;\r
+    BOOL OpenApostFlg = FALSE;\r
+    int nFmtStrSize;\r
+    int nDateCompCount;\r
+\r
+    /* Get setted format */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszShortDateFmt);\r
+\r
+    /* Get setted separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszShortDateSep);\r
+\r
+    /* Get setted format-string size */\r
+    nFmtStrSize = wcslen(wszShortDateFmt);\r
+\r
+    /* Check date components */\r
+    for(nDateCompCount=0;nDateCompCount<nFmtStrSize;nDateCompCount++)\r
+    {\r
+        if(wszShortDateFmt[nDateCompCount]==L'\'')\r
+        {\r
+            OpenApostFlg=!OpenApostFlg;\r
+        }\r
+        if(iswalnum(wszShortDateFmt[nDateCompCount]) &&\r
+           !isDateCompAl(wszShortDateFmt[nDateCompCount]) &&\r
+           !OpenApostFlg)\r
+        {\r
+            MessageBoxW(NULL,\r
+                        L"Entered short date format contain incorrect symbol",\r
+                        L"Error", MB_OK | MB_ICONERROR);\r
+            return FALSE;\r
+        }\r
+        \r
+    }\r
+\r
+    if(OpenApostFlg)\r
+    {\r
+        MessageBoxW(NULL,\r
+                    L"Entered short date format contain incorrect symbol",\r
+                    L"Error", MB_OK | MB_ICONERROR);\r
+        return FALSE;\r
+    }\r
+\r
+    /* substring replacement of separator */\r
+    wcscpy(wszFindedDateSep,FindDateSep(wszShortDateFmt));\r
+    pwszResultStr = ReplaceSubStr(wszShortDateFmt,wszShortDateSep,wszFindedDateSep);\r
+    wcscpy(wszShortDateFmt,pwszResultStr);\r
+    free(pwszResultStr);\r
+\r
+    /* Save short date format */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, wszShortDateFmt);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Setted up long date format to registry */\r
+BOOL\r
+SetLongDateFormat(HWND hwndDlg)\r
+{\r
+    WCHAR wszLongDateFmt[MAX_SAMPLES_STR_SIZE];\r
+    BOOL OpenApostFlg = FALSE;\r
+    int nFmtStrSize;\r
+    int nDateCompCount;\r
+\r
+    /* Get setted format */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszLongDateFmt);\r
+\r
+    /* Get setted format string size */\r
+    nFmtStrSize = wcslen(wszLongDateFmt);\r
+\r
+    /* Check date components */\r
+    for(nDateCompCount=0;nDateCompCount<nFmtStrSize;nDateCompCount++)\r
+    {\r
+        if(wszLongDateFmt[nDateCompCount]==L'\'')\r
+        {\r
+            OpenApostFlg=!OpenApostFlg;\r
+        }\r
+        if(iswalnum(wszLongDateFmt[nDateCompCount]) &&\r
+           !isDateCompAl(wszLongDateFmt[nDateCompCount]) &&\r
+           !OpenApostFlg)\r
+        {\r
+            MessageBoxW(NULL,\r
+                        L"Entered long date format contain incorrect symbol",\r
+                        L"Error", MB_OK | MB_ICONERROR);\r
+            return FALSE;\r
+        }\r
+        \r
+    }\r
+\r
+    if(OpenApostFlg)\r
+    {\r
+        MessageBoxW(NULL,\r
+                    L"Entered long date format contain incorrect symbol",\r
+                    L"Error", MB_OK | MB_ICONERROR);\r
+        return FALSE;\r
+    }\r
+\r
+    /* Save short date format */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, wszLongDateFmt);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Init short date separator control box */\r
+VOID\r
+InitShortDateSepSamples(HWND hwndDlg)\r
+{\r
+    WCHAR ShortDateSepSamples[MAX_SHRT_DATE_SEPARATORS][MAX_SAMPLES_STR_SIZE]=\r
+    {\r
+        L".",\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 wszShortDateSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current short date separator */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SDATE,\r
+                   wszShortDateSep,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of separators */\r
+    for(nCBIndex=0;nCBIndex<MAX_SHRT_DATE_SEPARATORS;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)ShortDateSepSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszShortDateSep);\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_SHRTDATESEP_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_SHRT_DATE_SEPARATORS+1,\r
+                     (LPARAM)wszShortDateSep);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszShortDateSep);\r
+    }\r
+}\r
+\r
+/* Init short date control box */\r
+VOID\r
+InitShortDateCB(HWND hwndDlg)\r
+{\r
+    WCHAR ShortDateFmtSamples[MAX_SHORT_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+    {\r
+        L"dd.MM.yyyy",\r
+        L"dd.MM.yy",\r
+        L"d.M.yy",\r
+        L"dd/MM/yy",\r
+        L"yyyy-MM-dd"\r
+    };\r
+\r
+    int nCBIndex;\r
+    int nRetCode;\r
+\r
+    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+    WCHAR wszShortDateFmt[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current short date format */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SSHORTDATE,\r
+                   wszShortDateFmt,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of date formats */\r
+    for(nCBIndex=0;nCBIndex<MAX_SHORT_FMT_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)ShortDateFmtSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszShortDateFmt);\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_SHRTDATEFMT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_SHORT_FMT_SAMPLES+1,\r
+                     (LPARAM)wszShortDateFmt);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszShortDateFmt);\r
+    }\r
+}\r
+\r
+/* Init long date control box */\r
+VOID\r
+InitLongDateCB(HWND hwndDlg)\r
+{\r
+    /* Where this data stored? */\r
+    WCHAR LongDateFmtSamples[MAX_LONG_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+    {\r
+        L"d MMMM yyyy 'y.'",\r
+        L"dd MMMM yyyy 'y.'"\r
+    };\r
+\r
+    int nCBIndex;\r
+    int nRetCode;\r
+\r
+    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+    WCHAR wszLongDateFmt[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current long date format */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_SLONGDATE,\r
+                   wszLongDateFmt,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of date formats */\r
+    for(nCBIndex=0;nCBIndex<MAX_LONG_FMT_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)LongDateFmtSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszLongDateFmt);\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_LONGDATEFMT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_LONG_FMT_SAMPLES+1,\r
+                     (LPARAM)wszLongDateFmt);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszLongDateFmt);\r
+    }\r
+}\r
+\r
+/* Set up max date value to registry */\r
+VOID\r
+SetMaxDate(HWND hwndDlg)\r
+{\r
+    const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);\r
+    WCHAR wszMaxDateVal[YEAR_STR_MAX_SIZE];\r
+    INT nSpinVal;\r
+\r
+    /* Get spin value */\r
+    nSpinVal=LOWORD(SendMessage(hWndYearSpin,\r
+                    UDM_GETPOS,\r
+                    0,\r
+                    0));\r
+\r
+    /* convert to wide char */\r
+    _itow(nSpinVal,wszMaxDateVal,DECIMAL_RADIX);\r
+\r
+    /* Save max date value */\r
+    SetCalendarInfoW(LOCALE_USER_DEFAULT,\r
+                     CAL_GREGORIAN,\r
+                     48 , /* CAL_ITWODIGITYEARMAX */\r
+                     (LPCWSTR)&wszMaxDateVal);\r
+}\r
+\r
+/* Get max date value from registry set */\r
+INT\r
+GetMaxDate()\r
+{\r
+    int nMaxDateVal;\r
+\r
+    GetCalendarInfoW(LOCALE_USER_DEFAULT,\r
+                     CAL_GREGORIAN,\r
+                     CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER,\r
+                     NULL,\r
+                     0, /* ret type - number */\r
+                     (LPDWORD)&nMaxDateVal);\r
+\r
+    return nMaxDateVal;\r
+}\r
+\r
+/* Set's MIN data edit control value to MAX-99 */\r
+static\r
+VOID\r
+SetMinData(HWND hwndDlg)\r
+{\r
+    WCHAR OutBuffer[YEAR_STR_MAX_SIZE];\r
+    const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);\r
+\r
+    /* Get spin value */\r
+    INT nSpinVal=LOWORD(SendMessage(hWndYearSpin,\r
+                        UDM_GETPOS,\r
+                        0,\r
+                        0));\r
+\r
+    /* Set min year value */\r
+    wsprintf(OutBuffer, L"%d", (DWORD)nSpinVal-YEAR_DIFF);\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),\r
+                 WM_SETTEXT,\r
+                 0,\r
+                 (LPARAM)OutBuffer);\r
+}\r
+\r
+/* Init spin control */\r
+static\r
+VOID\r
+InitMinMaxDateSpin(HWND hwndDlg)\r
+{\r
+    WCHAR OutBuffer[YEAR_STR_MAX_SIZE];\r
+    const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);\r
+\r
+    /* Init max date value */\r
+    wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate());\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_SECONDYEAR_EDIT),\r
+                 WM_SETTEXT,\r
+                 0,\r
+                 (LPARAM)OutBuffer);\r
+\r
+    /* Init min date value */\r
+    wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate()-YEAR_DIFF);\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),\r
+                 WM_SETTEXT,\r
+                 0,\r
+                 (LPARAM)OutBuffer);\r
+\r
+    /* Init updown control */\r
+    /* Set bounds */\r
+    SendMessageW(hWndYearSpin,\r
+                 UDM_SETRANGE,\r
+                 0,\r
+                 MAKELONG(MAX_YEAR,YEAR_DIFF));\r
+\r
+    /* Set current value */\r
+    SendMessageW(hWndYearSpin,\r
+                 UDM_SETPOS,\r
+                 0,\r
+                 MAKELONG(GetMaxDate(),0));\r
+\r
+}\r
+\r
+/* Update all date locale samples */\r
+static\r
+VOID\r
+UpdateDateLocaleSamples(HWND hwndDlg,\r
+                        LCID lcidLocale)\r
+{\r
+    WCHAR OutBuffer[MAX_FMT_SIZE];\r
+\r
+    /* Get short date format sample */\r
+    GetDateFormatW(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer,\r
+        MAX_FMT_SIZE);\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESAMPLE_EDIT), WM_SETTEXT,\r
+        0, (LPARAM)OutBuffer);\r
+\r
+    /* Get long date sample */\r
+    GetDateFormatW(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer,\r
+        MAX_FMT_SIZE);\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATESAMPLE_EDIT),\r
+        WM_SETTEXT, 0, (LPARAM)OutBuffer);\r
+}\r
+\r
+/* Date options setup page dialog callback */\r
+INT_PTR\r
+CALLBACK\r
+DateOptsSetProc(HWND hwndDlg,\r
+                UINT uMsg,\r
+                WPARAM wParam,\r
+                LPARAM lParam)\r
+{\r
+    //int i,j;\r
+    UNREFERENCED_PARAMETER(lParam);\r
+    UNREFERENCED_PARAMETER(wParam);\r
+    UNREFERENCED_PARAMETER(hwndDlg);\r
+\r
+    switch(uMsg)\r
+    {\r
+        case WM_INITDIALOG:\r
+        {\r
+            InitMinMaxDateSpin(hwndDlg);\r
+            UpdateDateLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+            InitShortDateCB(hwndDlg);\r
+            InitLongDateCB(hwndDlg);\r
+            InitShortDateSepSamples(hwndDlg);\r
+            /* TODO: Add other calendar types */\r
+        }\r
+        break;\r
+\r
+        case WM_COMMAND:\r
+        {\r
+            switch (LOWORD(wParam))\r
+            {\r
+                case IDC_SECONDYEAR_EDIT:\r
+                {\r
+                    if(HIWORD(wParam)==EN_CHANGE)\r
+                    {\r
+                        SetMinData(hwndDlg);\r
+                    }\r
+                }\r
+\r
+                case IDC_SCR_MAX_YEAR:\r
+                {\r
+                    /* Set "Apply" button enabled */\r
+                    PropSheet_Changed(GetParent(hwndDlg), hwndDlg);\r
+                }\r
+                break;\r
+                case IDC_CALTYPE_COMBO:\r
+                case IDC_HIJCHRON_COMBO:\r
+                case IDC_SHRTDATEFMT_COMBO:\r
+                case IDC_SHRTDATESEP_COMBO:\r
+                case IDC_LONGDATEFMT_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
+                SetMaxDate(hwndDlg);\r
+                if(!SetShortDateSep(hwndDlg)) break;\r
+                if(!SetShortDateFormat(hwndDlg)) break;\r
+                if(!SetLongDateFormat(hwndDlg)) break;\r
+                InitShortDateCB(hwndDlg);\r
+                /* FIXME: */\r
+                _sleep(15);\r
+                UpdateDateLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+            }\r
+        }\r
+        break;\r
+\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+/* EOF */\r
index 73a6031..8ba2042 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * PROJECT:         ReactOS International Control Panel
  * LICENSE:         GPL - See COPYING in the top level directory
 /*
  * PROJECT:         ReactOS International Control Panel
  * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            lib/cpl/intl/extra.c
+ * FILE:            dll/cpl/intl/extra.c
  * PURPOSE:         Extra parameters page
  * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)
 */
  * PURPOSE:         Extra parameters page
  * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)
 */
@@ -73,7 +73,10 @@ CreateLanguagesList(HWND hWnd)
 /* Extra Parameters page dialog callback */
 INT_PTR
 CALLBACK
 /* Extra Parameters page dialog callback */
 INT_PTR
 CALLBACK
-ExtraOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+ExtraOptsProc(HWND hwndDlg,
+              UINT uMsg,
+              WPARAM wParam,
+              LPARAM lParam)
 {
     UNREFERENCED_PARAMETER(wParam);
     switch(uMsg)
 {
     UNREFERENCED_PARAMETER(wParam);
     switch(uMsg)
index 2f30236..483d15a 100644 (file)
@@ -19,7 +19,7 @@
 /* GLOBALS ******************************************************************/
 
 #define NUM_APPLETS     (1)
 /* GLOBALS ******************************************************************/
 
 #define NUM_APPLETS     (1)
-#define NUM_SHEETS      2
+#define NUM_SHEETS       3
 
 LONG APIENTRY Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
 
 
 LONG APIENTRY Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
 
@@ -74,6 +74,7 @@ Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)
 
     InitPropSheetPage(&PsPage[0], IDD_REGOPTSPAGE, RegOptsProc);
     InitPropSheetPage(&PsPage[1], IDD_EXTRAOPTSPAGE, ExtraOptsProc);
 
     InitPropSheetPage(&PsPage[0], IDD_REGOPTSPAGE, RegOptsProc);
     InitPropSheetPage(&PsPage[1], IDD_EXTRAOPTSPAGE, ExtraOptsProc);
+    InitPropSheetPage(&PsPage[2], IDD_LANGSOPTSPAGE, LangsOptsProc);
 
     return (LONG)(PropertySheet(&psh) != -1);
 }
 
     return (LONG)(PropertySheet(&psh) != -1);
 }
index be9f486..efb32a6 100644 (file)
@@ -3,8 +3,10 @@
 
 /* GLOBALS ******************************************************************/
 
 
 /* GLOBALS ******************************************************************/
 
-#define MAX_STR_SIZE    128
-#define MAX_FMT_SIZE    30
+#define MAX_STR_SIZE          128
+#define MAX_FMT_SIZE          30
+#define MAX_SAMPLES_STR_SIZE  70
+#define DECIMAL_RADIX         10
 
 typedef struct
 {
 
 typedef struct
 {
@@ -26,6 +28,46 @@ INT_PTR
 CALLBACK
 ExtraOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
 CALLBACK
 ExtraOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
+/* langs.c */
+INT_PTR
+CALLBACK
+LangsOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+/* date.c */
+INT_PTR
+CALLBACK
+DateOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+/* nums.c */
+INT_PTR
+CALLBACK
+NumsOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+/* monetary.c */
+INT_PTR
+CALLBACK
+CurrencyOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+/* time.c */
+INT_PTR
+CALLBACK
+TimeOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+/* setupreg.c */
+INT_PTR
+CALLBACK
+RegOptsSetProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+WCHAR*
+ReplaceSubStr(const WCHAR *wszSourceStr, const WCHAR *wszStrToReplace, const WCHAR *wszTempl);
+
+WCHAR*
+InsSpacesFmt(const WCHAR *wszSourceStr, const WCHAR *wszFmtStr);
+
+LONG
+APIENTRY
+SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
+
 #endif /* __INTL_H */
 
 /* EOF */
 #endif /* __INTL_H */
 
 /* EOF */
index d3ee94d..65055ac 100644 (file)
        <library>user32</library>
        <library>comctl32</library>
        <library>advapi32</library>
        <library>user32</library>
        <library>comctl32</library>
        <library>advapi32</library>
+       <library>shell32</library>
        <library>msvcrt</library>
        <file>intl.c</file>
        <file>locale.c</file>
        <file>extra.c</file>
        <library>msvcrt</library>
        <file>intl.c</file>
        <file>locale.c</file>
        <file>extra.c</file>
+       <file>setupreg.c</file>
+       <file>langs.c</file>
+       <file>date.c</file>
+       <file>time.c</file>
+       <file>nums.c</file>
+       <file>currency.c</file>
        <file>intl.rc</file>
 </module>
        <file>intl.rc</file>
 </module>
diff --git a/reactos/dll/cpl/intl_new/langs.c b/reactos/dll/cpl/intl_new/langs.c
new file mode 100644 (file)
index 0000000..3c11fd1
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * PROJECT:         ReactOS International Control Panel\r
+ * LICENSE:         GPL - See COPYING in the top level directory\r
+ * FILE:            dll/cpl/intl/langs.c\r
+ * PURPOSE:         Extra parameters page\r
+ * PROGRAMMERS:     Alexey Zavyalov (gen_x@mail.ru)\r
+*/\r
+\r
+/* INCLUDES *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <commctrl.h>\r
+#include <shellapi.h>\r
+#include <cpl.h>\r
+\r
+#include "intl.h"\r
+#include "resource.h"\r
+\r
+/* FUNCTIONS ****************************************************************/\r
+\r
+/* Languages Parameters page dialog callback */\r
+INT_PTR\r
+CALLBACK\r
+LangsOptsProc(HWND hwndDlg,\r
+              UINT uMsg,\r
+              WPARAM wParam,\r
+              LPARAM lParam)\r
+{\r
+    SHELLEXECUTEINFOW shInputDll;\r
+\r
+    UNREFERENCED_PARAMETER(wParam);\r
+    switch(uMsg)\r
+    {\r
+        case WM_INITDIALOG:\r
+\r
+        break;\r
+\r
+        case WM_COMMAND:\r
+            switch (LOWORD(wParam))\r
+            {\r
+                /* If "detail" button pressed */\r
+                case IDC_DETAIL_BUTTON:\r
+                    if(HIWORD(wParam)==BN_CLICKED)\r
+                    {\r
+                        memset(&shInputDll, 0x0, sizeof(SHELLEXECUTEINFOW));\r
+                        shInputDll.cbSize = sizeof(shInputDll);\r
+                        shInputDll.hwnd = hwndDlg;\r
+                        shInputDll.lpVerb = L"open";\r
+                        shInputDll.lpFile = L"RunDll32.exe";\r
+                        shInputDll.lpParameters = L"shell32.dll,Control_RunDLL input.dll";\r
+                        if(ShellExecuteExW(&shInputDll)==0)\r
+                        {\r
+                            MessageBox(NULL, L"Can't start input.dll", L"Error",\r
+                                       MB_OK | MB_ICONERROR);\r
+                        }\r
+                    }\r
+\r
+                break;\r
+            }\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
+                // TODO: Implement\r
+            }\r
+        }\r
+        break;\r
+    }\r
+    return FALSE;\r
+}\r
+\r
+/* EOF */\r
index bbbca25..68f9d13 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * PROJECT:         ReactOS International Control Panel
  * LICENSE:         GPL - See COPYING in the top level directory
 /*
  * PROJECT:         ReactOS International Control Panel
  * LICENSE:         GPL - See COPYING in the top level directory
- * FILE:            lib/cpl/intl/locale.h
+ * FILE:            dll/cpl/intl/locale.h
  * PURPOSE:         Regional parameters page
  * PROGRAMMERS:     Eric Kohl
  *                  Alexey Zavyalov (gen_x@mail.ru)
  * PURPOSE:         Regional parameters page
  * PROGRAMMERS:     Eric Kohl
  *                  Alexey Zavyalov (gen_x@mail.ru)
@@ -235,10 +235,9 @@ RegOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
         case WM_COMMAND:
             switch (LOWORD(wParam))
             {
         case WM_COMMAND:
             switch (LOWORD(wParam))
             {
+                /* If setup button pressed */
                 case IDC_SETUP_BUTTON:
                 case IDC_SETUP_BUTTON:
-                        // setup button code...
-                        MessageBox(NULL, L"Not implemented yet", L"Info",
-                            MB_OK | MB_ICONINFORMATION);
+                    SetupApplet(hwndDlg, uMsg, wParam, lParam);
                 break;
 
                 /* If selected other locale */
                 break;
 
                 /* If selected other locale */
@@ -256,10 +255,12 @@ RegOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                     }
                 break;
 
                     }
                 break;
 
+                /* If changed location */
                 case IDC_LOCATION_COMBO:
                     if (HIWORD(wParam) == CBN_SELCHANGE ||
                         HIWORD(wParam) == CBN_EDITCHANGE)
                     {
                 case IDC_LOCATION_COMBO:
                     if (HIWORD(wParam) == CBN_SELCHANGE ||
                         HIWORD(wParam) == CBN_EDITCHANGE)
                     {
+                        /* Set "Apply" button enabled */
                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                     }
                 break;
                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                     }
                 break;
diff --git a/reactos/dll/cpl/intl_new/nums.c b/reactos/dll/cpl/intl_new/nums.c
new file mode 100644 (file)
index 0000000..9451697
--- /dev/null
@@ -0,0 +1,851 @@
+/*\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
index 699f117..5eae2bb 100644 (file)
 
 #define IDD_EXTRAOPTSPAGE        200
 
 
 #define IDD_EXTRAOPTSPAGE        200
 
-#define IDC_LANGUAGE_COMBO       103
+#define IDC_LANGUAGE_COMBO       201
+
+/* Language page options */
+
+#define IDD_LANGSOPTSPAGE        300
+
+#define IDC_DETAIL_BUTTON        301
+
+/* Date options setup page */
+
+#define IDD_DATEOPTSSETUP       400
+#define IDC_FIRSTYEAR_EDIT      401
+#define IDC_SECONDYEAR_EDIT     402
+#define IDC_SCR_MAX_YEAR        403
+#define IDC_CALTYPE_COMBO       404
+#define IDC_HIJCHRON_COMBO      405
+#define IDC_SHRTDATESAMPLE_EDIT 406
+#define IDC_SHRTDATERTOL_EDIT   407
+#define IDC_SHRTDATEFMT_COMBO   408
+#define IDC_SHRTDATESEP_COMBO   409
+#define IDC_LONGDATESAMPLE_EDIT 410
+#define IDC_LONGDATERTOL_EDIT   411
+#define IDC_LONGDATEFMT_COMBO   412
+
+/* Numbers options setup page */
+
+#define IDD_NUMSOPTSSETUP        500
+#define IDC_NUM_EDIT             501
+#define IDC_NEGNUM_EDIT          502
+#define IDC_NUM1_EDIT            503
+#define IDC_NEGNUM1_EDIT         504
+#define IDC_NUMDECIMALSEP_COMBO  505
+#define IDC_NUMFRACSYBMS_COMBO   506
+#define IDC_NUMFIELDSEP_COMBO    507
+#define IDC_NUMDIGFIELD_COMBO    508
+#define IDC_NUMNEGSIGN_COMBO     509
+#define IDC_NUMNEGFMT_COMBO      510
+#define IDC_NUMLEADZERO_COMBO    511
+#define IDC_NUMELEMLISTSEP_COMBO 512
+#define IDC_NUMUNITSSYS_COMBO    513
+#define IDC_NUMREGDIG_COMBO      514
+#define IDC_NUMDIGREPL_COMBO     515
+
+/* Monetary options setup page */
+
+#define IDD_CURRENCYOPTSSETUP    600
+#define IDC_CURRENCY_EDIT        601
+#define IDC_NEGCURRENCY_EDIT     602
+#define IDC_CURRENCYUNIT_COMBO   603
+#define IDC_POSCURRENCYSUM_COMBO 604
+#define IDC_NEGCURRENCYSUM_COMBO 605
+#define IDC_WHOLEFRACTSEP_COMBO  606
+#define IDC_FRACSYMBSNUM_COMBO   607
+#define IDC_FIELDSEP_COMBO       608
+#define IDC_DIGINFIELDNUM_COMBO  609
+
+/* Time options setup page */
+
+#define IDD_TIMEOPTSSETUP       700
+#define IDC_TIME_EDIT           701
+#define IDC_UNKNOWN_EDIT        702
+#define IDC_TIMEFMT_COMBO       703
+#define IDC_TIMESEP_COMBO       704
+#define IDC_TIMEAM_COMBO        705
+#define IDC_TIMEPM_COMBO        706
+
 
 /* Other page options */
 
 
 /* Other page options */
 
diff --git a/reactos/dll/cpl/intl_new/setupreg.c b/reactos/dll/cpl/intl_new/setupreg.c
new file mode 100644 (file)
index 0000000..fe619fd
--- /dev/null
@@ -0,0 +1,233 @@
+/*\r
+ * PROJECT:         ReactOS International Control Panel\r
+ * LICENSE:         GPL - See COPYING in the top level directory\r
+ * FILE:            dll/cpl/intl/setupreg.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 NUM_SHEETS           4\r
+\r
+/* FUNCTIONS ****************************************************************/\r
+\r
+/* Insert the space  */\r
+WCHAR*\r
+InsSpacePos(const WCHAR *wszInsStr, const int nPos)\r
+{\r
+       WCHAR* pwszDestStr;\r
+       pwszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE);\r
+    \r
+    int nDestStrCnt=0;\r
+    int nStrCnt;\r
+    int nStrSize;\r
+\r
+       wcscpy(pwszDestStr,wszInsStr);  \r
+    \r
+    nStrSize = wcslen(wszInsStr);\r
+\r
+    for(nStrCnt=0; nStrCnt<nStrSize; nStrCnt++)\r
+    {\r
+        if(nStrCnt==nStrSize-nPos)\r
+        {\r
+            pwszDestStr[nDestStrCnt]=' ';\r
+            nDestStrCnt++;\r
+        }\r
+        pwszDestStr[nDestStrCnt]=wszInsStr[nStrCnt];\r
+        nDestStrCnt++;\r
+    }\r
+    pwszDestStr[nDestStrCnt]='\0';\r
+    \r
+    return pwszDestStr;\r
+}\r
+\r
+/* Insert the spaces by format string separated by ';' */\r
+WCHAR*\r
+InsSpacesFmt(const WCHAR *wszSourceStr, const WCHAR *wszFmtStr)\r
+{\r
+       WCHAR* pwszDestStr;\r
+       pwszDestStr=(WCHAR*) malloc(255);\r
+\r
+       WCHAR* pwszTempStr;\r
+\r
+    WCHAR wszFmtVal[255];\r
+\r
+       int nFmtCount=0;\r
+       int nValCount=0;\r
+    int nLastVal=0;\r
+    int nSpaceOffset=0;\r
+    \r
+    BOOL wasNul=FALSE;\r
+\r
+       wcscpy(pwszDestStr,wszSourceStr);\r
+\r
+    /* if format is clean return source string */\r
+    if(!*wszFmtStr) return pwszDestStr;\r
+\r
+    /* Search for all format values */\r
+    for(nFmtCount=0;nFmtCount<=(int)wcslen(wszFmtStr);nFmtCount++)\r
+    {\r
+        if(wszFmtStr[nFmtCount]==';' || wszFmtStr[nFmtCount]=='\0')\r
+        {\r
+            if(_wtoi(wszFmtVal)==0 && !wasNul)\r
+            {\r
+                wasNul=TRUE;\r
+                break;\r
+            }\r
+            /* If was 0, repeat spaces */\r
+            if(wasNul)\r
+            {\r
+                nSpaceOffset+=nLastVal;\r
+            }\r
+            else\r
+            {\r
+                nSpaceOffset+=_wtoi(wszFmtVal);\r
+            }\r
+            wszFmtVal[nValCount]='\0';\r
+            nValCount=0;\r
+            /* insert space to finded position plus all pos before */\r
+            pwszTempStr=InsSpacePos(pwszDestStr,nSpaceOffset);\r
+            wcscpy(pwszDestStr,pwszTempStr);\r
+            free(pwszTempStr);\r
+            /* num of spaces total increment */\r
+\r
+            if(!wasNul)\r
+            {\r
+                nSpaceOffset++;\r
+                nLastVal=_wtoi(wszFmtVal);\r
+            }\r
+              \r
+        }\r
+        else\r
+        {\r
+            wszFmtVal[nValCount++]=wszFmtStr[nFmtCount];\r
+        }\r
+    }\r
+\r
+    /* Create spaces for rest part of string */\r
+    if(wasNul && nLastVal!=0)\r
+    {\r
+        for(nFmtCount=nSpaceOffset+nLastVal;nFmtCount<wcslen(pwszDestStr);nFmtCount+=nLastVal+1)\r
+        {\r
+            pwszTempStr=InsSpacePos(pwszDestStr,nFmtCount);\r
+            wcscpy(pwszDestStr,pwszTempStr);\r
+            free(pwszTempStr);\r
+        }\r
+    }\r
+\r
+    return pwszDestStr;\r
+}\r
+\r
+/* Replace given template in source string with string to replace and return recieved string */\r
+WCHAR*\r
+ReplaceSubStr(const WCHAR *wszSourceStr,\r
+              const WCHAR *wszStrToReplace,\r
+              const WCHAR *wszTempl)\r
+{\r
+       int nCharCnt;\r
+       int nSubStrCnt;\r
+       int nDestStrCnt;\r
+    int nFirstCharCnt;\r
+\r
+       WCHAR* wszDestStr;\r
+       wszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));\r
+\r
+       nDestStrCnt=0;\r
+    nFirstCharCnt=0;\r
+\r
+    wcscpy(wszDestStr,L"");\r
+\r
+    while(nFirstCharCnt<(int)wcslen(wszSourceStr))\r
+       {\r
+        if(wszSourceStr[nFirstCharCnt]==wszTempl[0])\r
+        {\r
+            nSubStrCnt=0;\r
+            for(nCharCnt=nFirstCharCnt;nCharCnt<nFirstCharCnt+(int)wcslen(wszTempl);nCharCnt++)\r
+            {\r
+                if(wszSourceStr[nCharCnt]==wszTempl[nSubStrCnt])\r
+                {\r
+                    nSubStrCnt++;\r
+                }\r
+                else\r
+                {\r
+                    break;\r
+                }\r
+                if((int)wcslen(wszTempl)==nSubStrCnt)\r
+                {\r
+                    wcscat(wszDestStr,wszStrToReplace);\r
+                    nDestStrCnt=(int)wcslen(wszDestStr);\r
+                    nFirstCharCnt+=(int)wcslen(wszTempl)-1;\r
+                    break;\r
+                }\r
+            }\r
+        }\r
+        else \r
+        {\r
+            wszDestStr[nDestStrCnt++]=wszSourceStr[nFirstCharCnt];\r
+            wszDestStr[nDestStrCnt]='\0';\r
+        }\r
+        nFirstCharCnt++;\r
+       }\r
+\r
+       return wszDestStr;\r
+}\r
+\r
+static\r
+VOID\r
+InitPropSheetPage(PROPSHEETPAGE *PsPage, WORD IdDlg, DLGPROC DlgProc)\r
+{\r
+    ZeroMemory(PsPage, sizeof(PROPSHEETPAGE));\r
+    PsPage->dwSize = sizeof(PROPSHEETPAGE);\r
+    PsPage->dwFlags = PSP_DEFAULT;\r
+    PsPage->hInstance = hApplet;\r
+    PsPage->pszTemplate = MAKEINTRESOURCE(IdDlg);\r
+    PsPage->pfnDlgProc = DlgProc;\r
+}\r
+\r
+/* Create applets */\r
+LONG\r
+APIENTRY\r
+SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)\r
+{\r
+\r
+    PROPSHEETPAGE PsPage[NUM_SHEETS];\r
+    PROPSHEETHEADER psh;\r
+    TCHAR Caption[MAX_STR_SIZE];\r
+\r
+    UNREFERENCED_PARAMETER(lParam);\r
+    UNREFERENCED_PARAMETER(wParam);\r
+    UNREFERENCED_PARAMETER(uMsg);\r
+    UNREFERENCED_PARAMETER(hwnd);\r
+\r
+    LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR));\r
+\r
+    ZeroMemory(&psh, sizeof(PROPSHEETHEADER));\r
+    psh.dwSize = sizeof(PROPSHEETHEADER);\r
+    psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE;\r
+    psh.hwndParent = NULL;\r
+    psh.hInstance = hApplet;\r
+    psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));\r
+    psh.pszCaption = Caption;\r
+    psh.nPages = sizeof(PsPage) / sizeof(PROPSHEETPAGE);\r
+    psh.nStartPage = 0;\r
+    psh.ppsp = PsPage;\r
+\r
+    InitPropSheetPage(&PsPage[0], IDD_NUMSOPTSSETUP, NumsOptsSetProc);\r
+    InitPropSheetPage(&PsPage[1], IDD_CURRENCYOPTSSETUP, CurrencyOptsSetProc);\r
+    InitPropSheetPage(&PsPage[2], IDD_TIMEOPTSSETUP, TimeOptsSetProc);\r
+    InitPropSheetPage(&PsPage[3], IDD_DATEOPTSSETUP, DateOptsSetProc);\r
+\r
+    return (LONG)(PropertySheet(&psh) != -1);\r
+}\r
+\r
+/* EOF */\r
diff --git a/reactos/dll/cpl/intl_new/time.c b/reactos/dll/cpl/intl_new/time.c
new file mode 100644 (file)
index 0000000..c07505d
--- /dev/null
@@ -0,0 +1,536 @@
+/*\r
+ * PROJECT:         ReactOS International Control Panel\r
+ * LICENSE:         GPL - See COPYING in the top level directory\r
+ * FILE:            dll/cpl/intl/time.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 NO_FLAG                 0\r
+#define MAX_TIME_FMT_SAMPLES    3\r
+#define MAX_TIME_SEP_SAMPLES    1\r
+#define MAX_TIME_AM_SAMPLES     2\r
+#define MAX_TIME_PM_SAMPLES     2\r
+#define EOLN_SIZE               sizeof(WCHAR)\r
+#define STD_TIME_SEP            L":"\r
+\r
+/* FUNCTIONS ****************************************************************/\r
+\r
+/* if char is 'h' or 'H' or 'm' or 's' or 't' or ' ' return TRUE, else FALSE */\r
+BOOL\r
+isTimeComp(WCHAR walpha)\r
+{\r
+    \r
+    if((walpha == L'h') ||\r
+       (walpha == L'H') ||\r
+       (walpha == L'm') ||\r
+       (walpha == L's') ||\r
+       (walpha == L't') ||\r
+       (walpha == L' ')) return TRUE;\r
+    else return FALSE;\r
+}\r
+\r
+/* Find first time separator in string */\r
+WCHAR*\r
+FindTimeSep(const WCHAR *wszSourceStr)\r
+{\r
+    int nDateCompCount=0;\r
+    int nDateSepCount=0;\r
+\r
+       WCHAR* wszFindedSep;\r
+       wszFindedSep=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));\r
+\r
+    wcscpy(wszFindedSep,STD_TIME_SEP);\r
+\r
+    while(nDateCompCount<wcslen(wszSourceStr))\r
+    {\r
+        if(!isTimeComp(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
+        {\r
+            while(!isTimeComp(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))\r
+            {\r
+                wszFindedSep[nDateSepCount++]=wszSourceStr[nDateCompCount];\r
+                nDateCompCount++;\r
+            }\r
+            wszFindedSep[nDateSepCount]='\0';\r
+            return wszFindedSep;\r
+        }\r
+        nDateCompCount++;\r
+    }\r
+\r
+    return wszFindedSep;\r
+}\r
+\r
+/* Init time PM control box */\r
+VOID\r
+InitPM(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimePMSamples[MAX_TIME_PM_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+    {\r
+        L"PM",\r
+        L""\r
+    };\r
+\r
+    int nCBIndex;\r
+    int nRetCode;\r
+\r
+    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+    WCHAR wszTimePM[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current time PM */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_S2359,\r
+                   wszTimePM,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of time PM */\r
+    for(nCBIndex=0;nCBIndex<MAX_TIME_PM_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)wszTimePMSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszTimePM);\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_TIMEPM_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_TIME_PM_SAMPLES+1,\r
+                     (LPARAM)wszTimePM);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszTimePM);\r
+    }\r
+\r
+}\r
+\r
+/* Init time AM control box */\r
+VOID\r
+InitAM(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimeAMSamples[MAX_TIME_AM_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+    {\r
+        L"AM",\r
+        L""\r
+    };\r
+\r
+    int nCBIndex;\r
+    int nRetCode;\r
+\r
+    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+    WCHAR wszTimeAM[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current time AM */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_S1159,\r
+                   wszTimeAM,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of time AM */\r
+    for(nCBIndex=0;nCBIndex<MAX_TIME_AM_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)wszTimeAMSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszTimeAM);\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_TIMEAM_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_TIME_AM_SAMPLES+1,\r
+                     (LPARAM)wszTimeAM);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszTimeAM);\r
+    }\r
+\r
+}\r
+\r
+/* Init time separator control box */\r
+VOID\r
+InitTimeSeparatorCB(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimeSepSamples[MAX_TIME_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 wszTimeSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current time separator*/\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_STIME,\r
+                   wszTimeSep,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of time separators */\r
+    for(nCBIndex=0;nCBIndex<MAX_TIME_SEP_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)wszTimeSepSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszTimeSep);\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_TIMESEP_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_TIME_SEP_SAMPLES+1,\r
+                     (LPARAM)wszTimeSep);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszTimeSep);\r
+    }\r
+\r
+}\r
+\r
+/* Init time format control box */\r
+VOID\r
+InitTimeFormatCB(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimeFmtSamples[MAX_TIME_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=\r
+    {\r
+        L"H:mm:ss",\r
+        L"HH:mm:ss",\r
+        L"h:mm:ss tt"\r
+    };\r
+\r
+    int nCBIndex;\r
+    int nRetCode;\r
+\r
+    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;\r
+    WCHAR wszTimeFmt[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get current time format */\r
+    GetLocaleInfoW(LOCALE_USER_DEFAULT,\r
+                   LOCALE_STIMEFORMAT,\r
+                   wszTimeFmt,\r
+                   dwValueSize);\r
+\r
+    /* Clear all box content */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
+                 CB_RESETCONTENT,\r
+                 (WPARAM)0,\r
+                 (LPARAM)0);\r
+\r
+    /* Create standart list of time formats */\r
+    for(nCBIndex=0;nCBIndex<MAX_TIME_FMT_SAMPLES;nCBIndex++)\r
+    {\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     nCBIndex,\r
+                     (LPARAM)wszTimeFmtSamples[nCBIndex]);\r
+    }\r
+\r
+    /* Set current item to value from registry */\r
+    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
+                           CB_SELECTSTRING,\r
+                           -1,\r
+                           (LPARAM)(LPCSTR)wszTimeFmt);\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_TIMEFMT_COMBO),\r
+                     CB_ADDSTRING,\r
+                     MAX_TIME_FMT_SAMPLES+1,\r
+                     (LPARAM)wszTimeFmt);\r
+        SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
+                     CB_SELECTSTRING,\r
+                     -1,\r
+                     (LPARAM)(LPCSTR)wszTimeFmt);\r
+    }\r
+}\r
+\r
+/* Set time format to registry */\r
+BOOL\r
+SetTimeFormat(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimeFmt[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszTimeSep[MAX_SAMPLES_STR_SIZE];\r
+    WCHAR wszFindedTimeSep[MAX_SAMPLES_STR_SIZE];\r
+\r
+    WCHAR* pwszResultStr;\r
+    BOOL OpenApostFlg = FALSE;\r
+    int nFmtStrSize;\r
+    int nTimeCompCount;\r
+\r
+    /* Get setted format */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFMT_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszTimeFmt);\r
+\r
+    /* Get setted separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszTimeSep);\r
+\r
+    /* Get setted format-string size */\r
+    nFmtStrSize = wcslen(wszTimeFmt);\r
+\r
+    /* Check date components */\r
+    for(nTimeCompCount=0;nTimeCompCount<nFmtStrSize;nTimeCompCount++)\r
+    {\r
+        if(wszTimeFmt[nTimeCompCount]==L'\'')\r
+        {\r
+            OpenApostFlg=!OpenApostFlg;\r
+        }\r
+        if(iswalnum(wszTimeFmt[nTimeCompCount]) &&\r
+           !isTimeComp(wszTimeFmt[nTimeCompCount]) &&\r
+           !OpenApostFlg)\r
+        {\r
+            MessageBoxW(NULL,\r
+                        L"Entered time format contain incorrect symbol",\r
+                        L"Error", MB_OK | MB_ICONERROR);\r
+            return FALSE;\r
+        }\r
+        \r
+    }\r
+\r
+    if(OpenApostFlg)\r
+    {\r
+        MessageBoxW(NULL,\r
+                    L"Entered time format contain incorrect symbol",\r
+                    L"Error", MB_OK | MB_ICONERROR);\r
+        return FALSE;\r
+    }\r
+\r
+    /* substring replacement of separator */\r
+    wcscpy(wszFindedTimeSep,FindTimeSep(wszTimeFmt));\r
+    pwszResultStr = ReplaceSubStr(wszTimeFmt,wszTimeSep,wszFindedTimeSep);\r
+    wcscpy(wszTimeFmt,pwszResultStr);\r
+    free(pwszResultStr);\r
+\r
+    /* Save time format */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, wszTimeFmt);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Setted up time separator to registry */\r
+BOOL\r
+SetTimeSep(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimeSep[MAX_SAMPLES_STR_SIZE];\r
+    int nSepStrSize;\r
+    int nSepCount;\r
+\r
+    /* Get setted separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEP_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszTimeSep);\r
+\r
+    /* Get setted separator string size */\r
+    nSepStrSize = wcslen(wszTimeSep);\r
+\r
+    /* Check time components */\r
+    for(nSepCount=0;nSepCount<nSepStrSize;nSepCount++)\r
+    {\r
+        if(iswalnum(wszTimeSep[nSepCount]) || (wszTimeSep[nSepCount]=='\''))\r
+        {\r
+            MessageBoxW(NULL,\r
+                        L"Entered time separator contain incorrect symbol",\r
+                        L"Error", MB_OK | MB_ICONERROR);\r
+            return FALSE;\r
+        }\r
+        \r
+    }\r
+\r
+    /* Save time separator */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STIME, wszTimeSep);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Setted up time AM to registry */\r
+BOOL\r
+SetTimeAM(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimeAM[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get setted separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAM_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszTimeAM);\r
+\r
+    /* Save time AM */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S1159, wszTimeAM);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Setted up time PM to registry */\r
+BOOL\r
+SetTimePM(HWND hwndDlg)\r
+{\r
+    WCHAR wszTimePM[MAX_SAMPLES_STR_SIZE];\r
+\r
+    /* Get setted separator */\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPM_COMBO),\r
+                 WM_GETTEXT,\r
+                 (WPARAM)MAX_SAMPLES_STR_SIZE,\r
+                 (LPARAM)(LPCSTR)wszTimePM);\r
+\r
+    /* Save time PM */\r
+    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S2359, wszTimePM);\r
+\r
+    return TRUE;\r
+}\r
+\r
+/* Update all time locale samples */\r
+static\r
+VOID\r
+UpdateTimeLocaleSamples(HWND hwndDlg,\r
+                        LCID lcidLocale)\r
+{\r
+    WCHAR OutBuffer[MAX_FMT_SIZE];\r
+\r
+    /* Get time format sample */\r
+    GetTimeFormatW(lcidLocale,\r
+                   NO_FLAG,\r
+                   NULL,\r
+                   NULL,\r
+                   OutBuffer,\r
+                   MAX_FMT_SIZE);\r
+    SendMessageW(GetDlgItem(hwndDlg, IDC_TIME_EDIT),\r
+                 WM_SETTEXT,\r
+                 0,\r
+                 (LPARAM)OutBuffer);\r
+\r
+    /* TODO: Add unknown control box processing */\r
+}\r
+\r
+/* Date options setup page dialog callback */\r
+INT_PTR\r
+CALLBACK\r
+TimeOptsSetProc(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
+            InitTimeFormatCB(hwndDlg);\r
+            InitTimeSeparatorCB(hwndDlg);\r
+            InitAM(hwndDlg);\r
+            InitPM(hwndDlg);\r
+            UpdateTimeLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+        }\r
+        break;\r
+\r
+        case WM_COMMAND:\r
+        {\r
+            switch (LOWORD(wParam))\r
+            {\r
+                case IDC_TIMEFMT_COMBO:\r
+                case IDC_TIMESEP_COMBO:\r
+                case IDC_TIMEAM_COMBO:\r
+                case IDC_TIMEPM_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(!SetTimeFormat(hwndDlg)) break;\r
+                if(!SetTimeSep(hwndDlg)) break;\r
+                if(!SetTimeAM(hwndDlg)) break;\r
+                if(!SetTimePM(hwndDlg)) break;\r
+\r
+                InitTimeFormatCB(hwndDlg);\r
+                \r
+\r
+                /* FIXME: */\r
+                _sleep(15);\r
+                UpdateTimeLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);\r
+            }\r
+        }\r
+        break;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+\r
+/* EOF */\r