See issue #1988 for more details.
svn path=/trunk/; revision=25603
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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
/*
* 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)
*/
/* 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)
/* GLOBALS ******************************************************************/
#define NUM_APPLETS (1)
-#define NUM_SHEETS 2
+#define NUM_SHEETS 3
LONG APIENTRY Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
InitPropSheetPage(&PsPage[0], IDD_REGOPTSPAGE, RegOptsProc);
InitPropSheetPage(&PsPage[1], IDD_EXTRAOPTSPAGE, ExtraOptsProc);
+ InitPropSheetPage(&PsPage[2], IDD_LANGSOPTSPAGE, LangsOptsProc);
return (LONG)(PropertySheet(&psh) != -1);
}
/* 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
{
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 */
<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>
+ <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>
--- /dev/null
+/*\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
/*
* 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)
case WM_COMMAND:
switch (LOWORD(wParam))
{
+ /* If setup button pressed */
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 changed location */
case IDC_LOCATION_COMBO:
if (HIWORD(wParam) == CBN_SELCHANGE ||
HIWORD(wParam) == CBN_EDITCHANGE)
{
+ /* Set "Apply" button enabled */
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
break;
--- /dev/null
+/*\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
#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 */
--- /dev/null
+/*\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
--- /dev/null
+/*\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