Dmitry Chapyshev <lentind@yandex.ru>:

- Improve intl.cpl, include almost all code from intl_new branch (it's pending for deletion now)
 - ReactOS's intl.cpl now works and behaves similar to Windows XP's intl.cpl, only the last tab is unfinished
 - Tested in Windows and ReactOS (in ROS it obviously has reduced functionality, since some of needed registry entries are absent)
 - As a result, all other languages (other than en-us) need to be re-translated.

svn path=/trunk/; revision=28786
This commit is contained in:
Aleksey Bragin 2007-09-02 20:42:08 +00:00
parent 0eb52138ba
commit 3a3645aa1e
15 changed files with 2419 additions and 114 deletions

View file

@ -0,0 +1,23 @@
#include <windows.h>
#include <commctrl.h>
#include <cpl.h>
#include "intl.h"
#include "resource.h"
/* Property page dialog callback */
INT_PTR CALLBACK
AdvancedPageProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
break;
}
return FALSE;
}
/* EOF */

View file

@ -32,6 +32,10 @@
#include "intl.h"
#include "resource.h"
#define POSITIVE_EXAMPLE L"123456789.00"
#define NEGATIVE_EXAMPLE L"-123456789.00"
#define MAX_FIELD_DIG_SAMPLES 3
typedef struct _GLOBAL_DATA
{
@ -50,7 +54,7 @@ typedef struct _GLOBAL_DATA
static VOID
GetInitialCurrencyValues(PGLOBAL_DATA pGlobalData)
{
TCHAR szBuffer[256];
TCHAR szBuffer[MAX_FMT_SIZE];
int ret;
/* Get currency symbol */
@ -61,7 +65,7 @@ GetInitialCurrencyValues(PGLOBAL_DATA pGlobalData)
/* Get positive format */
ret = GetLocaleInfo(LOCALE_USER_DEFAULT,
LOCALE_ICURRENCY,
szBuffer, 256);
szBuffer, MAX_FMT_SIZE);
if (ret != 0)
{
pGlobalData->PositiveOrder = _ttoi(szBuffer);
@ -70,7 +74,7 @@ GetInitialCurrencyValues(PGLOBAL_DATA pGlobalData)
/* Get negative format */
ret = GetLocaleInfo(LOCALE_USER_DEFAULT,
LOCALE_INEGCURR,
szBuffer, 256);
szBuffer, MAX_FMT_SIZE);
if (ret != 0)
{
pGlobalData->NegativeOrder = _ttoi(szBuffer);
@ -79,7 +83,7 @@ GetInitialCurrencyValues(PGLOBAL_DATA pGlobalData)
/* Get number of fractional digits */
ret = GetLocaleInfo(LOCALE_USER_DEFAULT,
LOCALE_ICURRDIGITS,
szBuffer, 256);
szBuffer, MAX_FMT_SIZE);
if (ret != 0)
{
pGlobalData->NumDigits = _ttoi(szBuffer);
@ -106,7 +110,7 @@ GetInitialCurrencyValues(PGLOBAL_DATA pGlobalData)
static VOID
UpdateExamples(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
TCHAR szBuffer[256];
TCHAR szBuffer[MAX_FMT_SIZE];
CURRENCYFMT cyFmt;
cyFmt.NumDigits = pGlobalData->NumDigits;
@ -117,43 +121,39 @@ UpdateExamples(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
cyFmt.PositiveOrder = pGlobalData->PositiveOrder;
cyFmt.NegativeOrder = pGlobalData->NegativeOrder;
cyFmt.lpCurrencySymbol = pGlobalData->szCurrencySymbol;
/* positive example */
GetCurrencyFormat(LOCALE_USER_DEFAULT, 0,
_T("123456789.00"),
&cyFmt, szBuffer, 256);
GetCurrencyFormatW(LOCALE_USER_DEFAULT, 0,
POSITIVE_EXAMPLE,
&cyFmt, szBuffer, MAX_FMT_SIZE);
SetDlgItemText(hwndDlg,
IDC_CURRENCYPOSSAMPLE,
szBuffer);
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYPOSSAMPLE), WM_SETTEXT, 0, (LPARAM)szBuffer);
/* negative example */
GetCurrencyFormat(LOCALE_USER_DEFAULT, 0,
_T("-123456789.00"),
&cyFmt, szBuffer, 256);
SetDlgItemText(hwndDlg,
IDC_CURRENCYNEGSAMPLE,
szBuffer);
GetCurrencyFormatW(LOCALE_USER_DEFAULT, 0,
NEGATIVE_EXAMPLE,
&cyFmt, szBuffer, MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYNEGSAMPLE), WM_SETTEXT, 0, (LPARAM)szBuffer);
}
static VOID
OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
TCHAR szBuffer[256];
TCHAR szBuffer[MAX_FMT_SIZE];
CURRENCYFMT cyFmt;
int i;
GetInitialCurrencyValues(pGlobalData);
/* Set currency symbol */
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
CB_ADDSTRING,
0,
(LPARAM)pGlobalData->szCurrencySymbol);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
CB_SETCURSEL,
0, /* index */
0);
@ -173,15 +173,15 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
cyFmt.PositiveOrder = i;
GetCurrencyFormat(LOCALE_USER_DEFAULT, 0,
_T("1.1"),
&cyFmt, szBuffer, 256);
&cyFmt, szBuffer, MAX_FMT_SIZE);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
CB_INSERTSTRING,
-1,
(LPARAM)szBuffer);
}
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
CB_SETCURSEL,
pGlobalData->PositiveOrder,
0);
@ -193,26 +193,26 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
cyFmt.NegativeOrder = i;
GetCurrencyFormat(LOCALE_USER_DEFAULT, 0,
_T("-1.1"),
&cyFmt, szBuffer, 256);
&cyFmt, szBuffer, MAX_FMT_SIZE);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
CB_INSERTSTRING,
-1,
(LPARAM)szBuffer);
}
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
CB_SETCURSEL,
pGlobalData->NegativeOrder, /* index */
0);
/* decimal separator */
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
CB_ADDSTRING,
0,
(LPARAM)pGlobalData->szDecimalSep);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
CB_SETCURSEL,
0, /* index */
0);
@ -223,25 +223,25 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
{
szBuffer[0] = _T('0') + i;
szBuffer[1] = 0;
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
CB_ADDSTRING,
0,
(LPARAM)szBuffer);
}
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
CB_SETCURSEL,
pGlobalData->NumDigits, /* index */
0);
/* digit group separator */
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
CB_ADDSTRING,
0,
(LPARAM)pGlobalData->szThousandSep);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
CB_SETCURSEL,
0, /* index */
0);
@ -256,8 +256,8 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
cyFmt.Grouping = 0;
GetCurrencyFormat(LOCALE_USER_DEFAULT, 0,
_T("123456789"),
&cyFmt, szBuffer, 256);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
&cyFmt, szBuffer, MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
CB_INSERTSTRING,
-1,
(LPARAM)szBuffer);
@ -265,8 +265,8 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
cyFmt.Grouping = 3;
GetCurrencyFormat(LOCALE_USER_DEFAULT, 0,
_T("123456789"),
&cyFmt, szBuffer, 256);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
&cyFmt, szBuffer, MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
CB_INSERTSTRING,
-1,
(LPARAM)szBuffer);
@ -274,8 +274,8 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
cyFmt.Grouping = 32;
GetCurrencyFormat(LOCALE_USER_DEFAULT, 0,
_T("123456789"),
&cyFmt, szBuffer, 256);
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
&cyFmt, szBuffer, MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
CB_INSERTSTRING,
-1,
(LPARAM)szBuffer);
@ -290,7 +290,7 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
i = 1;
}
SendMessage(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
CB_SETCURSEL,
i, /* index */
0);
@ -299,6 +299,153 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
UpdateExamples(hwndDlg, pGlobalData);
}
/* Set number of digidts in field */
BOOL
SetCurrencyDigNum(HWND hwndDlg)
{
WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"0;0",
L"3;0",
L"3;2;0"
};
int nCurrSel;
/* Get setted number of digidts in field */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPNUM),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* Save number of digidts in field */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONGROUPING, wszFieldDigNumSamples[nCurrSel]);
return TRUE;
}
/* Set currency field separator */
BOOL
SetCurrencyFieldSep(HWND hwndDlg)
{
WCHAR wszCurrencyFieldSep[MAX_SAMPLES_STR_SIZE];
/* Get setted currency field separator */
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYGRPSEP),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszCurrencyFieldSep);
/* Save currency field separator */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHOUSANDSEP, wszCurrencyFieldSep);
return TRUE;
}
/* Set number of fractional symbols */
BOOL
SetCurrencyFracSymNum(HWND hwndDlg)
{
WCHAR wszCurrencyFracSymNum[MAX_SAMPLES_STR_SIZE];
INT nCurrSel;
/* Get setted number of fractional symbols */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYDECNUM),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* convert to wide char */
_itow(nCurrSel,wszCurrencyFracSymNum,DECIMAL_RADIX);
/* Save number of fractional symbols */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ICURRDIGITS, wszCurrencyFracSymNum);
return TRUE;
}
/* Set currency separator */
BOOL
SetCurrencySep(HWND hwndDlg)
{
WCHAR wszCurrencySep[MAX_SAMPLES_STR_SIZE];
/* Get setted currency decimal separator */
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYDECSEP),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszCurrencySep);
/* TODO: Add check for correctly input */
/* Save currency separator */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, wszCurrencySep);
return TRUE;
}
/* Set negative currency sum format */
BOOL
SetNegCurrencySumFmt(HWND hwndDlg)
{
WCHAR wszNegCurrencySumFmt[MAX_SAMPLES_STR_SIZE];
INT nCurrSel;
/* Get setted currency unit */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYNEGVALUE),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* convert to wide char */
_itow(nCurrSel,wszNegCurrencySumFmt,DECIMAL_RADIX);
/* Save currency sum format */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_INEGCURR, wszNegCurrencySumFmt);
return TRUE;
}
/* Set positive currency sum format */
BOOL
SetPosCurrencySumFmt(HWND hwndDlg)
{
WCHAR wszPosCurrencySumFmt[MAX_SAMPLES_STR_SIZE];
INT nCurrSel;
/* Get setted currency unit */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYPOSVALUE),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* convert to wide char */
_itow(nCurrSel,wszPosCurrencySumFmt,DECIMAL_RADIX);
/* Save currency sum format */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ICURRENCY, wszPosCurrencySumFmt);
return TRUE;
}
/* Set currency unit */
BOOL
SetCurrencyUnit(HWND hwndDlg)
{
WCHAR wszCurrencyUnit[MAX_SAMPLES_STR_SIZE];
/* Get setted currency unit */
SendMessageW(GetDlgItem(hwndDlg, IDC_CURRENCYSYMBOL),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszCurrencyUnit);
/* Save currency unit */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY, wszCurrencyUnit);
return TRUE;
}
/* Property page dialog callback */
INT_PTR CALLBACK
@ -314,12 +461,48 @@ CurrencyPageProc(HWND hwndDlg,
switch (uMsg)
{
case WM_INITDIALOG:
{
pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBAL_DATA));
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
OnInitDialog(hwndDlg, pGlobalData);
break;
}
break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_CURRENCYSYMBOL:
case IDC_CURRENCYPOSVALUE:
case IDC_CURRENCYNEGVALUE:
case IDC_CURRENCYDECSEP:
case IDC_CURRENCYDECNUM:
case IDC_CURRENCYGRPSEP:
case IDC_CURRENCYGRPNUM:
if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
{
/* Set "Apply" button enabled */
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
}
}
break;
case WM_NOTIFY:
{
LPNMHDR lpnm = (LPNMHDR)lParam;
/* If push apply button */
if (lpnm->code == (UINT)PSN_APPLY)
{
if(!SetCurrencyDigNum(hwndDlg)) break;
if(!SetCurrencyUnit(hwndDlg)) break;
if(!SetPosCurrencySumFmt(hwndDlg)) break;
if(!SetNegCurrencySumFmt(hwndDlg)) break;
if(!SetCurrencySep(hwndDlg)) break;
if(!SetCurrencyFracSymNum(hwndDlg)) break;
if(!SetCurrencyFieldSep(hwndDlg)) break;
UpdateExamples(hwndDlg, pGlobalData);
}
}
break;
case WM_DESTROY:
HeapFree(GetProcessHeap(), 0, pGlobalData);
break;

View file

@ -24,6 +24,8 @@
* PROGRAMMER: Eric Kohl
*/
#define WINVER 0x0500
#include <windows.h>
#include <commctrl.h>
#include <cpl.h>
@ -31,6 +33,510 @@
#include "intl.h"
#include "resource.h"
/* GLOBALS ******************************************************************/
const INT YEAR_STR_MAX_SIZE=4;
const INT EOLN_SIZE=sizeof(WCHAR); /* size of EOLN char */
#define MAX_SHORT_FMT_SAMPLES 5
#define MAX_LONG_FMT_SAMPLES 2
#define MAX_SHRT_DATE_SEPARATORS 3
#define STD_DATE_SEP L"."
#define YEAR_DIFF (99)
#define MAX_YEAR (9999)
/* FUNCTIONS ****************************************************************/
/* if char is 'y' or 'M' or 'd' return TRUE, else FALSE */
BOOL
isDateCompAl(WCHAR walpha)
{
if((walpha == L'y') || (walpha == L'M') || (walpha == L'd') || (walpha == L' ')) return TRUE;
else return FALSE;
}
/* Find first date separator in string */
WCHAR*
FindDateSep(const WCHAR *wszSourceStr)
{
int nDateCompCount=0;
int nDateSepCount=0;
WCHAR* wszFindedSep;
wszFindedSep=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));
wcscpy(wszFindedSep,STD_DATE_SEP);
while(nDateCompCount<wcslen(wszSourceStr))
{
if(!isDateCompAl(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))
{
while(!isDateCompAl(wszSourceStr[nDateCompCount]) && (wszSourceStr[nDateCompCount]!=L'\''))
{
wszFindedSep[nDateSepCount++]=wszSourceStr[nDateCompCount];
nDateCompCount++;
}
wszFindedSep[nDateSepCount]='\0';
return wszFindedSep;
}
nDateCompCount++;
}
return wszFindedSep;
}
/* Replace given template in source string with string to replace and return recieved string */
/* Setted up short date separator to registry */
BOOL
SetShortDateSep(HWND hwndDlg)
{
WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];
int nSepStrSize;
int nSepCount;
/* Get setted separator */
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszShortDateSep);
/* Get setted separator string size */
nSepStrSize = wcslen(wszShortDateSep);
/* Check date components */
for(nSepCount=0;nSepCount<nSepStrSize;nSepCount++)
{
if(iswalnum(wszShortDateSep[nSepCount]) || (wszShortDateSep[nSepCount]=='\''))
{
MessageBoxW(NULL,
L"Entered short date separator contain incorrect symbol",
L"Error", MB_OK | MB_ICONERROR);
return FALSE;
}
}
/* Save date separator */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDATE, wszShortDateSep);
return TRUE;
}
/* Setted up short date format to registry */
BOOL
SetShortDateFormat(HWND hwndDlg)
{
WCHAR wszShortDateFmt[MAX_SAMPLES_STR_SIZE];
WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];
WCHAR wszFindedDateSep[MAX_SAMPLES_STR_SIZE];
WCHAR* pwszResultStr;
BOOL OpenApostFlg = FALSE;
int nFmtStrSize;
int nDateCompCount;
/* Get setted format */
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszShortDateFmt);
/* Get setted separator */
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszShortDateSep);
/* Get setted format-string size */
nFmtStrSize = wcslen(wszShortDateFmt);
/* Check date components */
for(nDateCompCount=0;nDateCompCount<nFmtStrSize;nDateCompCount++)
{
if(wszShortDateFmt[nDateCompCount]==L'\'')
{
OpenApostFlg=!OpenApostFlg;
}
if(iswalnum(wszShortDateFmt[nDateCompCount]) &&
!isDateCompAl(wszShortDateFmt[nDateCompCount]) &&
!OpenApostFlg)
{
MessageBoxW(NULL,
L"Entered short date format contain incorrect symbol",
L"Error", MB_OK | MB_ICONERROR);
return FALSE;
}
}
if(OpenApostFlg)
{
MessageBoxW(NULL,
L"Entered short date format contain incorrect symbol",
L"Error", MB_OK | MB_ICONERROR);
return FALSE;
}
/* substring replacement of separator */
wcscpy(wszFindedDateSep,FindDateSep(wszShortDateFmt));
pwszResultStr = ReplaceSubStr(wszShortDateFmt,wszShortDateSep,wszFindedDateSep);
wcscpy(wszShortDateFmt,pwszResultStr);
free(pwszResultStr);
/* Save short date format */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, wszShortDateFmt);
return TRUE;
}
/* Setted up long date format to registry */
BOOL
SetLongDateFormat(HWND hwndDlg)
{
WCHAR wszLongDateFmt[MAX_SAMPLES_STR_SIZE];
BOOL OpenApostFlg = FALSE;
int nFmtStrSize;
int nDateCompCount;
/* Get setted format */
SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszLongDateFmt);
/* Get setted format string size */
nFmtStrSize = wcslen(wszLongDateFmt);
/* Check date components */
for(nDateCompCount=0;nDateCompCount<nFmtStrSize;nDateCompCount++)
{
if(wszLongDateFmt[nDateCompCount]==L'\'')
{
OpenApostFlg=!OpenApostFlg;
}
if(iswalnum(wszLongDateFmt[nDateCompCount]) &&
!isDateCompAl(wszLongDateFmt[nDateCompCount]) &&
!OpenApostFlg)
{
MessageBoxW(NULL,
L"Entered long date format contain incorrect symbol",
L"Error", MB_OK | MB_ICONERROR);
return FALSE;
}
}
if(OpenApostFlg)
{
MessageBoxW(NULL,
L"Entered long date format contain incorrect symbol",
L"Error", MB_OK | MB_ICONERROR);
return FALSE;
}
/* Save short date format */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, wszLongDateFmt);
return TRUE;
}
/* Init short date separator control box */
VOID
InitShortDateSepSamples(HWND hwndDlg)
{
WCHAR ShortDateSepSamples[MAX_SHRT_DATE_SEPARATORS][MAX_SAMPLES_STR_SIZE]=
{
L".",
L"/",
L"-"
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszShortDateSep[MAX_SAMPLES_STR_SIZE];
/* Get current short date separator */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SDATE,
wszShortDateSep,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of separators */
for(nCBIndex=0;nCBIndex<MAX_SHRT_DATE_SEPARATORS;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
CB_ADDSTRING,
nCBIndex,
(LPARAM)ShortDateSepSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszShortDateSep);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
CB_ADDSTRING,
MAX_SHRT_DATE_SEPARATORS+1,
(LPARAM)wszShortDateSep);
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszShortDateSep);
}
}
/* Init short date control box */
VOID
InitShortDateCB(HWND hwndDlg)
{
WCHAR ShortDateFmtSamples[MAX_SHORT_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"dd.MM.yyyy",
L"dd.MM.yy",
L"d.M.yy",
L"dd/MM/yy",
L"yyyy-MM-dd"
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszShortDateFmt[MAX_SAMPLES_STR_SIZE];
/* Get current short date format */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SSHORTDATE,
wszShortDateFmt,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of date formats */
for(nCBIndex=0;nCBIndex<MAX_SHORT_FMT_SAMPLES;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
CB_ADDSTRING,
nCBIndex,
(LPARAM)ShortDateFmtSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszShortDateFmt);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
CB_ADDSTRING,
MAX_SHORT_FMT_SAMPLES+1,
(LPARAM)wszShortDateFmt);
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszShortDateFmt);
}
}
/* Init long date control box */
VOID
InitLongDateCB(HWND hwndDlg)
{
/* Where this data stored? */
WCHAR LongDateFmtSamples[MAX_LONG_FMT_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"d MMMM yyyy 'y.'",
L"dd MMMM yyyy 'y.'"
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszLongDateFmt[MAX_SAMPLES_STR_SIZE];
/* Get current long date format */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SLONGDATE,
wszLongDateFmt,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of date formats */
for(nCBIndex=0;nCBIndex<MAX_LONG_FMT_SAMPLES;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
CB_ADDSTRING,
nCBIndex,
(LPARAM)LongDateFmtSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszLongDateFmt);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
CB_ADDSTRING,
MAX_LONG_FMT_SAMPLES+1,
(LPARAM)wszLongDateFmt);
SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszLongDateFmt);
}
}
/* Set up max date value to registry */
VOID
SetMaxDate(HWND hwndDlg)
{
const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);
WCHAR wszMaxDateVal[YEAR_STR_MAX_SIZE];
INT nSpinVal;
/* Get spin value */
nSpinVal=LOWORD(SendMessage(hWndYearSpin,
UDM_GETPOS,
0,
0));
/* convert to wide char */
_itow(nSpinVal,wszMaxDateVal,DECIMAL_RADIX);
/* Save max date value */
SetCalendarInfoW(LOCALE_USER_DEFAULT,
CAL_GREGORIAN,
48 , /* CAL_ITWODIGITYEARMAX */
(LPCWSTR)&wszMaxDateVal);
}
/* Get max date value from registry set */
INT
GetMaxDate()
{
int nMaxDateVal;
GetCalendarInfoW(LOCALE_USER_DEFAULT,
CAL_GREGORIAN,
CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER,
NULL,
0, /* ret type - number */
(LPDWORD)&nMaxDateVal);
return nMaxDateVal;
}
/* Set's MIN data edit control value to MAX-99 */
static
VOID
SetMinData(HWND hwndDlg)
{
WCHAR OutBuffer[YEAR_STR_MAX_SIZE];
const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);
/* Get spin value */
INT nSpinVal=LOWORD(SendMessage(hWndYearSpin,
UDM_GETPOS,
0,
0));
/* Set min year value */
wsprintf(OutBuffer, L"%d", (DWORD)nSpinVal-YEAR_DIFF);
SendMessageW(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),
WM_SETTEXT,
0,
(LPARAM)OutBuffer);
}
/* Init spin control */
static
VOID
InitMinMaxDateSpin(HWND hwndDlg)
{
WCHAR OutBuffer[YEAR_STR_MAX_SIZE];
const HWND hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);
/* Init max date value */
wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate());
SendMessageW(GetDlgItem(hwndDlg, IDC_SECONDYEAR_EDIT),
WM_SETTEXT,
0,
(LPARAM)OutBuffer);
/* Init min date value */
wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate()-YEAR_DIFF);
SendMessageW(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),
WM_SETTEXT,
0,
(LPARAM)OutBuffer);
/* Init updown control */
/* Set bounds */
SendMessageW(hWndYearSpin,
UDM_SETRANGE,
0,
MAKELONG(MAX_YEAR,YEAR_DIFF));
/* Set current value */
SendMessageW(hWndYearSpin,
UDM_SETPOS,
0,
MAKELONG(GetMaxDate(),0));
}
/* Update all date locale samples */
static
VOID
UpdateDateLocaleSamples(HWND hwndDlg,
LCID lcidLocale)
{
WCHAR OutBuffer[MAX_FMT_SIZE];
/* Get short date format sample */
GetDateFormatW(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer,
MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESAMPLE_EDIT), WM_SETTEXT,
0, (LPARAM)OutBuffer);
/* Get long date sample */
GetDateFormatW(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer,
MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_LONGDATESAMPLE_EDIT),
WM_SETTEXT, 0, (LPARAM)OutBuffer);
}
/* Property page dialog callback */
INT_PTR CALLBACK
@ -42,7 +548,66 @@ DatePageProc(HWND hwndDlg,
switch(uMsg)
{
case WM_INITDIALOG:
break;
{
InitMinMaxDateSpin(hwndDlg);
UpdateDateLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);
InitShortDateCB(hwndDlg);
InitLongDateCB(hwndDlg);
InitShortDateSepSamples(hwndDlg);
/* TODO: Add other calendar types */
}
break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_SECONDYEAR_EDIT:
{
if(HIWORD(wParam)==EN_CHANGE)
{
SetMinData(hwndDlg);
}
}
case IDC_SCR_MAX_YEAR:
{
/* Set "Apply" button enabled */
/* FIXME */
//PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
break;
case IDC_CALTYPE_COMBO:
case IDC_HIJCHRON_COMBO:
case IDC_SHRTDATEFMT_COMBO:
case IDC_SHRTDATESEP_COMBO:
case IDC_LONGDATEFMT_COMBO:
{
if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
{
/* Set "Apply" button enabled */
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
}
break;
}
}
break;
case WM_NOTIFY:
{
LPNMHDR lpnm = (LPNMHDR)lParam;
/* If push apply button */
if (lpnm->code == (UINT)PSN_APPLY)
{
SetMaxDate(hwndDlg);
if(!SetShortDateSep(hwndDlg)) break;
if(!SetShortDateFormat(hwndDlg)) break;
if(!SetLongDateFormat(hwndDlg)) break;
InitShortDateCB(hwndDlg);
/* FIXME: */
//Sleep(15);
UpdateDateLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT);
}
}
break;
}
return FALSE;
}

View file

@ -27,6 +27,8 @@
*/
#define WINVER 0x0501
#define SAMPLE_NUMBER L"123456789"
#define NO_FLAG 0
#include <windows.h>
#include <commctrl.h>
@ -38,6 +40,7 @@
#include "resource.h"
HWND hList;
HWND hLocaleList, hGeoList;
BOOL CALLBACK LocalesEnumProc(
LPTSTR lpLocale // locale id
@ -65,6 +68,44 @@ BOOL CALLBACK LocalesEnumProc(
return TRUE;
}
/* Update all locale samples */
static
VOID
UpdateLocaleSample(HWND hwndDlg, LCID lcidLocale)
{
WCHAR OutBuffer[MAX_FMT_SIZE];
/* Get number format sample */
GetNumberFormatW(lcidLocale, NO_FLAG, SAMPLE_NUMBER, NULL, OutBuffer,
MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMSAMPLE_EDIT),
WM_SETTEXT, 0, (LPARAM)OutBuffer);
/* Get monetary format sample */
GetCurrencyFormatW(lcidLocale, LOCALE_USE_CP_ACP, SAMPLE_NUMBER, NULL,
OutBuffer, MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_MONEYSAMPLE_EDIT),
WM_SETTEXT, 0, (LPARAM)OutBuffer);
/* Get time format sample */
GetTimeFormatW(lcidLocale, NO_FLAG, NULL, NULL, OutBuffer, MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESAMPLE_EDIT),
WM_SETTEXT,
0,
(LPARAM)OutBuffer);
/* Get short date format sample */
GetDateFormatW(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer,
MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_SHORTTIMESAMPLE_EDIT), WM_SETTEXT,
0, (LPARAM)OutBuffer);
/* Get long date sample */
GetDateFormatW(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer,
MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_FULLTIMESAMPLE_EDIT),
WM_SETTEXT, 0, (LPARAM)OutBuffer);
}
static VOID
CreateLanguagesList(HWND hwnd)
@ -173,6 +214,55 @@ void SetNewLocale(LCID lcid)
RegCloseKey(langKey);
}
/* Location enumerate procedure */
BOOL
CALLBACK
LocationsEnumProc(GEOID gId)
{
TCHAR loc[MAX_STR_SIZE];
int index;
GetGeoInfo(gId, GEO_FRIENDLYNAME, loc, MAX_FMT_SIZE, LANG_SYSTEM_DEFAULT);
index = (int) SendMessageW(hGeoList,
CB_ADDSTRING,
0,
(LPARAM)loc);
SendMessageW(hGeoList,
CB_SETITEMDATA,
index,
(LPARAM)gId);
return TRUE;
}
/* Enumerate all system locations identifiers */
static
VOID
CreateLocationsList(HWND hWnd)
{
GEOID userGeoID;
TCHAR loc[MAX_STR_SIZE];
hGeoList = hWnd;
EnumSystemGeoID(GEOCLASS_NATION, 0, LocationsEnumProc);
/* Select current location */
userGeoID = GetUserGeoID(GEOCLASS_NATION);
GetGeoInfo(userGeoID,
GEO_FRIENDLYNAME,
loc,
MAX_FMT_SIZE,
LANG_SYSTEM_DEFAULT);
SendMessageW(hGeoList,
CB_SELECTSTRING,
(WPARAM) -1,
(LPARAM)loc);
}
DWORD
VerifyUnattendLCID(HWND hwndDlg)
{
@ -213,6 +303,8 @@ GeneralPageProc(HWND hwndDlg,
{
case WM_INITDIALOG:
CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST));
UpdateLocaleSample(hwndDlg, LOCALE_USER_DEFAULT);
CreateLocationsList(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO));
if (IsUnattendedSetupEnabled)
{
if (VerifyUnattendLCID(hwndDlg))
@ -232,6 +324,9 @@ GeneralPageProc(HWND hwndDlg,
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
break;
case IDC_SETUP_BUTTON:
SetupApplet(hwndDlg, uMsg, wParam, lParam);
break;
}
break;

View file

@ -133,7 +133,7 @@ ParseSetupInf()
static LONG APIENTRY
Applet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
{
PROPSHEETPAGE psp[6];
PROPSHEETPAGE psp[3];
PROPSHEETHEADER psh;
TCHAR Caption[256];
@ -156,11 +156,8 @@ Applet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
psh.ppsp = psp;
InitPropSheetPage(&psp[0], IDD_GENERALPAGE, GeneralPageProc);
InitPropSheetPage(&psp[1], IDD_NUMBERSPAGE, NumbersPageProc);
InitPropSheetPage(&psp[2], IDD_CURRENCYPAGE, CurrencyPageProc);
InitPropSheetPage(&psp[3], IDD_TIMEPAGE, TimePageProc);
InitPropSheetPage(&psp[4], IDD_DATEPAGE, DatePageProc);
InitPropSheetPage(&psp[5], IDD_LOCALEPAGE, InpLocalePageProc);
InitPropSheetPage(&psp[1], IDD_LANGUAGESPAGE, LanguagesPageProc);
InitPropSheetPage(&psp[2], IDD_ADVANCEDPAGE, AdvancedPageProc);
return (LONG)(PropertySheet(&psh) != -1);
}

View file

@ -1,6 +1,10 @@
#ifndef __CPL_INTL_H
#define __CPL_INTL_H
#define MAX_FMT_SIZE 30
#define MAX_STR_SIZE 128
#define MAX_SAMPLES_STR_SIZE 70
#define DECIMAL_RADIX 10
typedef struct _APPLET
{
@ -14,6 +18,24 @@ extern HINSTANCE hApplet;
extern DWORD IsUnattendedSetupEnabled;
extern DWORD UnattendLCID;
/* intl.c */
VOID
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc);
/* languages.c */
INT_PTR CALLBACK
LanguagesPageProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
/* advanced.c */
INT_PTR CALLBACK
AdvancedPageProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
/* currency.c */
INT_PTR CALLBACK
CurrencyPageProc(HWND hwndDlg,
@ -59,6 +81,17 @@ TimePageProc(HWND hwndDlg,
void SetNewLocale(LCID lcid);
/* misc.c */
WCHAR*
InsSpacesFmt(const WCHAR *wszSourceStr, const WCHAR *wszFmtStr);
WCHAR*
ReplaceSubStr(const WCHAR *wszSourceStr, const WCHAR *wszStrToReplace, const WCHAR *wszTempl);
LONG
APIENTRY
SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
#endif /* __CPL_INTL_H */
/* EOF */

View file

@ -13,6 +13,7 @@
<library>advapi32</library>
<library>setupapi</library>
<library>msvcrt</library>
<library>shell32</library>
<file>currency.c</file>
<file>date.c</file>
<file>generalp.c</file>
@ -20,5 +21,8 @@
<file>inplocale.c</file>
<file>numbers.c</file>
<file>time.c</file>
<file>misc.c</file>
<file>languages.c</file>
<file>advanced.c</file>
<file>intl.rc</file>
</module>

View file

@ -11,7 +11,6 @@
IDC_CPLICON ICON "resources/applet.ico"
IDC_FLAGS ICON "resources/flags.ico"
@ -21,17 +20,17 @@ IDC_FLAGS ICON "resources/flags.ico"
* a neutral version. This is to get localized bitmaps for example.
*/
#include "lang/cs-CZ.rc"
#include "lang/de-DE.rc"
#include "lang/el-GR.rc"
//#include "lang/cs-CZ.rc"
//#include "lang/de-DE.rc"
//#include "lang/el-GR.rc"
#include "lang/en-US.rc"
#include "lang/es-ES.rc"
#include "lang/fr-FR.rc"
#include "lang/hu-HU.rc"
#include "lang/id-ID.rc"
#include "lang/it-IT.rc"
#include "lang/ja-JP.rc"
#include "lang/nl-NL.rc"
#include "lang/ru-RU.rc"
#include "lang/sv-SE.rc"
#include "lang/uk-UA.rc"
//#include "lang/es-ES.rc"
//#include "lang/fr-FR.rc"
//#include "lang/hu-HU.rc"
//#include "lang/id-ID.rc"
//#include "lang/it-IT.rc"
//#include "lang/ja-JP.rc"
//#include "lang/nl-NL.rc"
//#include "lang/ru-RU.rc"
//#include "lang/sv-SE.rc"
//#include "lang/uk-UA.rc"

View file

@ -2,35 +2,101 @@
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_GENERALPAGE DIALOGEX 0, 0, 246, 188
IDD_GENERALPAGE DIALOGEX 0, 0, 246, 230
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "General"
CAPTION "Regional Options"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Primary language", -1, 8, 11, 228, 74
ICON IDC_FLAGS, IDC_ICON1, 12, 26, 21, 20, SS_ICON
LTEXT "Select the primary language and region you want to use:", -1, 38, 25, 193, 22
COMBOBOX IDC_LANGUAGELIST, 39, 49, 191, 83, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
GROUPBOX "Standarts and formats", -1, 5, 5, 234, 162
LTEXT "This option affects how some programs format numbers, currencies, dates, and time.", -1, 14, 17, 220, 25
LTEXT "Select an item to match its proferences, or click Customize to choose your own formats:", -1, 14, 37, 220, 22
COMBOBOX IDC_LANGUAGELIST, 14, 56, 160, 83, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
PUSHBUTTON "Customi&ze...", IDC_SETUP_BUTTON, 178, 56, 52, 13
LTEXT "Samples", -1, 14, 73, 70, 10
LTEXT "Number:", -1, 16, 86, 48, 10
LTEXT "Monetary:", -1, 16, 101, 48, 10
LTEXT "Time:", -1, 16, 116, 48, 10
LTEXT "Short date:", -1, 16, 131, 48, 10
LTEXT "Long date:", -1, 16, 146, 48, 10
EDITTEXT IDC_NUMSAMPLE_EDIT, 89, 86, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
EDITTEXT IDC_MONEYSAMPLE_EDIT, 89, 101, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
EDITTEXT IDC_TIMESAMPLE_EDIT, 89, 116, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
EDITTEXT IDC_SHORTTIMESAMPLE_EDIT, 89, 131, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
EDITTEXT IDC_FULLTIMESAMPLE_EDIT, 89, 146, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
GROUPBOX "Geographic location", -1, 5, 172, 234, 55
LTEXT "Set up your location that services could supply you with the local information, for example, news and reports of weather", -1, 14, 184, 210, 24
COMBOBOX IDC_LOCATION_COMBO, 14, 207, 217, 40, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL |
WS_VSCROLL | WS_TABSTOP | CBS_SORT
END
IDD_LANGUAGESPAGE DIALOGEX 0, 0, 246, 230
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, 5, 234, 52
LTEXT "To view or change language or text input methods press ""Details...""", -1, 12, 15, 220, 18
PUSHBUTTON "De&tails...", IDC_DETAIL_BUTTON, 177, 34, 54, 14
GROUPBOX "Additional language support", IDC_GROUPBOX, 5, 62, 234, 82
LTEXT "Most languages are installed by default. To install additional languages, select the appropriate check box below.", -1, 12, 72, 220, 18
CHECKBOX "I&nstall files for complex script and right-to-left languages", IDC_INST_FILES_FOR_RTOL_LANG, 12, 92, 215, 22
CHECKBOX "In&stall files for East Asian languages", IDC_INST_FILES_FOR_ASIAN, 12, 114, 180, 22
END
IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 188
IDD_ADVANCEDPAGE DIALOGEX 0, 0, 246, 230
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Advanced"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Language for non-Unicode programs", IDC_GROUPBOX, 5, 5, 234, 90
COMBOBOX IDC_LANGUAGE_COMBO, 14, 75, 217, 60, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SORT
LTEXT "This system setting enables non-Unicode programs to display menus and dialogs in their native language. It does not affect Unicode programs, but it does apply to all users of this computer.", -1, 14, 18, 223, 33
LTEXT "Select a language to match the language version of the non-Unicode programs you want to use:", -1, 14, 55, 223, 18
GROUPBOX "Code page conversion tables", -1, 5, 101, 234, 88
LISTBOX IDC_CONV_TABLES, 14, 114, 217, 77, LBS_STANDARD
GROUPBOX "Default user account settings", -1, 5, 193, 234, 30
CHECKBOX "Apply all settings to the current user account and to the default", IDC_APPLY_CUR_USER_DEF_PROFILE, 12, 200, 220, 22
END
IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 234
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Numbers"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Property Page 2",-1,73,74,90,8
GROUPBOX "Appearance sample", -1, 7, 7, 230, 53, WS_CHILD | WS_VISIBLE
LTEXT "Positive:", -1, 13, 21, 31, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
EDITTEXT IDC_NUMBERSPOSSAMPLE, 43, 19, 72, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
LTEXT "Negative:", -1, 120, 21, 31, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
EDITTEXT IDC_NUMBERSNEGSAMPLE, 154, 19, 72, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
LTEXT "&Decimal symbol:", -1, 8, 67, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERDSYMBOL, 137, 65, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "No. of digits a&fter decimal:", -1, 8, 83, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSNDIGDEC, 137, 81, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "Digit &grouping symbol:", -1, 8, 100, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSDIGITGRSYM, 137, 97, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "Di&git grouping:", -1, 8, 117, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSDGROUPING, 137, 113, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "N&egative sign symbol:", -1, 8, 134, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSNSIGNSYM, 137, 129, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "Negative number &format:", -1, 8, 149, 100, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSNNUMFORMAT, 137, 145, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "Display leading &zeros:", -1, 8, 166, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSDISPLEADZER, 137, 161, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "&List separator:", -1, 8, 181, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSLSEP, 137, 177, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "&Measurement system:", -1, 8, 197, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_NUMBERSMEASSYS, 137, 193, 100, 83, CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
END
IDD_CURRENCYPAGE DIALOGEX 0, 0, 246, 188
IDD_CURRENCYPAGE DIALOGEX 0, 0, 246, 234
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Currency"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Appearance sample", -1, 7, 7, 228, 33, WS_CHILD | WS_VISIBLE
GROUPBOX "Appearance sample", -1, 7, 7, 230, 33, WS_CHILD | WS_VISIBLE
LTEXT "Positive:", -1, 13, 21, 31, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
EDITTEXT IDC_CURRENCYPOSSAMPLE, 42, 19, 72, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
EDITTEXT IDC_CURRENCYPOSSAMPLE, 43, 19, 72, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
LTEXT "Negative:", -1, 120, 21, 31, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
EDITTEXT IDC_CURRENCYNEGSAMPLE, 154, 19, 72, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
LTEXT "&Currency symbol:", -1, 20, 51, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
@ -50,49 +116,71 @@ BEGIN
END
IDD_TIMEPAGE DIALOGEX 0, 0, 246, 188
IDD_TIMEPAGE DIALOGEX 0, 0, 246, 234
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Time"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Appearance sample", -1, 7, 7, 228, 33, WS_CHILD | WS_VISIBLE
GROUPBOX "Appearance sample", -1, 7, 7, 230, 33, WS_CHILD | WS_VISIBLE
LTEXT "Time sample:", -1, 13, 21, 54, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
EDITTEXT IDC_TIMESAMPLE, 68, 19, 84, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
LTEXT "&Time format:", -1, 13, 52, 54, 10, WS_CHILD |WS_VISIBLE | WS_GROUP
COMBOBOX IDC_TIMEFORMAT, 68, 50, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
COMBOBOX IDC_TIMEFORMAT, 88, 50, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
LTEXT "Time &separator:", -1, 13, 70, 54, 10, WS_VISIBLE | WS_GROUP
COMBOBOX IDC_TIMESEPARATOR, 68, 68, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
COMBOBOX IDC_TIMESEPARATOR, 88, 68, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
LTEXT "A&M symbol:", -1, 13, 88, 54, 10, WS_VISIBLE | WS_GROUP
COMBOBOX IDC_TIMEAMSYMBOL, 68, 86, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
COMBOBOX IDC_TIMEAMSYMBOL, 88, 86, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
LTEXT "&PM symbol:", -1, 13, 106, 54, 10, WS_VISIBLE | WS_GROUP
COMBOBOX IDC_TIMEPMSYMBOL, 68, 104, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
GROUPBOX "", -1, 7, 124, 228, 60, WS_VISIBLE
COMBOBOX IDC_TIMEPMSYMBOL, 88, 104, 84, 100, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP
GROUPBOX "", -1, 7, 140, 230, 80, WS_VISIBLE
LTEXT "Time format notation\n\n\
h = hour m = minute s = second t = am or pm\n\n\
h = 12 hour H = 24 hour\n\
hh, mm, ss = leading zero h, m, s = no leading zero",
-1, 13, 133, 214, 47, WS_CHILD |WS_VISIBLE | WS_GROUP
-1, 13, 150, 214, 50, WS_CHILD |WS_VISIBLE | WS_GROUP
END
IDD_DATEPAGE DIALOGEX 0, 0, 246, 188
IDD_DATEPAGE DIALOGEX 0, 0, 246, 234
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Date"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Property Page 5",-1,73,74,90,8
GROUPBOX "Calendar", IDC_GROUPBOX, 7, 7, 230, 74
LTEXT "If year typed as two digits, then show it as year between:", -1, 13, 18, 215, 8
EDITTEXT IDC_FIRSTYEAR_EDIT, 13, 30, 36, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
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, 153, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL |
WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
LTEXT "Muslim Calendar:", -1, 13, 65, 60, 12
COMBOBOX IDC_HIJCHRON_COMBO, 77, 64, 153, 100, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL |
WS_VSCROLL | WS_TABSTOP | CBS_SORT | WS_DISABLED
GROUPBOX "Short date format", IDC_GROUPBOX, 7, 83, 230, 81
LTEXT "Sample:", -1, 13, 95, 63, 10
EDITTEXT IDC_SHRTDATESAMPLE_EDIT, 77, 93, 153, 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, 153, 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, 153, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
LTEXT "Date components separator:", -1, 13, 148, 113, 10
COMBOBOX IDC_SHRTDATESEP_COMBO, 180, 146, 51, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
GROUPBOX "Long date format", IDC_GROUPBOX, 7, 167, 230, 64
LTEXT "Sample:", -1, 13, 179, 61, 10
EDITTEXT IDC_LONGDATESAMPLE_EDIT, 77, 177, 153, 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, 153, 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, 153, 100, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE
END
IDD_LOCALEPAGE DIALOGEX 0, 0, 246, 188
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Input Locale"
FONT 8, "MS Shell Dlg"
STRINGTABLE
BEGIN
LTEXT "Input Locale Page",-1,73,74,90,8
IDS_CUSTOMIZE_TITLE "Customize Regional Options"
END
STRINGTABLE
BEGIN
IDS_CPLNAME "Regional Options"

View file

@ -0,0 +1,48 @@
#include <windows.h>
#include <commctrl.h>
#include <cpl.h>
#include "intl.h"
#include "resource.h"
/* Property page dialog callback */
INT_PTR CALLBACK
LanguagesPageProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
SHELLEXECUTEINFOW shInputDll;
switch(uMsg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
/* If "detail" button pressed */
case IDC_DETAIL_BUTTON:
if(HIWORD(wParam)==BN_CLICKED)
{
memset(&shInputDll, 0x0, sizeof(SHELLEXECUTEINFOW));
shInputDll.cbSize = sizeof(shInputDll);
shInputDll.hwnd = hwndDlg;
shInputDll.lpVerb = L"open";
shInputDll.lpFile = L"RunDll32.exe";
shInputDll.lpParameters = L"shell32.dll,Control_RunDLL input.dll";
if(ShellExecuteExW(&shInputDll)==0)
{
MessageBox(NULL, L"Can't start input.dll", L"Error", MB_OK | MB_ICONERROR);
}
}
break;
}
break;
}
return FALSE;
}
/* EOF */

206
reactos/dll/cpl/intl/misc.c Normal file
View file

@ -0,0 +1,206 @@
#include <windows.h>
#include <commctrl.h>
#include <cpl.h>
#include "intl.h"
#include "resource.h"
#define NUM_SHEETS 4
/* Insert the space */
WCHAR*
InsSpacePos(const WCHAR *wszInsStr, const int nPos)
{
WCHAR* pwszDestStr;
pwszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE);
int nDestStrCnt=0;
int nStrCnt;
int nStrSize;
wcscpy(pwszDestStr,wszInsStr);
nStrSize = wcslen(wszInsStr);
for(nStrCnt=0; nStrCnt<nStrSize; nStrCnt++)
{
if(nStrCnt==nStrSize-nPos)
{
pwszDestStr[nDestStrCnt]=' ';
nDestStrCnt++;
}
pwszDestStr[nDestStrCnt]=wszInsStr[nStrCnt];
nDestStrCnt++;
}
pwszDestStr[nDestStrCnt]='\0';
return pwszDestStr;
}
/* Insert the spaces by format string separated by ';' */
WCHAR*
InsSpacesFmt(const WCHAR *wszSourceStr, const WCHAR *wszFmtStr)
{
WCHAR* pwszDestStr;
pwszDestStr=(WCHAR*) malloc(255);
WCHAR* pwszTempStr;
WCHAR wszFmtVal[255];
int nFmtCount=0;
int nValCount=0;
int nLastVal=0;
int nSpaceOffset=0;
BOOL wasNul=FALSE;
wcscpy(pwszDestStr,wszSourceStr);
/* if format is clean return source string */
if(!*wszFmtStr) return pwszDestStr;
/* Search for all format values */
for(nFmtCount=0;nFmtCount<=(int)wcslen(wszFmtStr);nFmtCount++)
{
if(wszFmtStr[nFmtCount]==';' || wszFmtStr[nFmtCount]=='\0')
{
if(_wtoi(wszFmtVal)==0 && !wasNul)
{
wasNul=TRUE;
break;
}
/* If was 0, repeat spaces */
if(wasNul)
{
nSpaceOffset+=nLastVal;
}
else
{
nSpaceOffset+=_wtoi(wszFmtVal);
}
wszFmtVal[nValCount]='\0';
nValCount=0;
/* insert space to finded position plus all pos before */
pwszTempStr=InsSpacePos(pwszDestStr,nSpaceOffset);
wcscpy(pwszDestStr,pwszTempStr);
free(pwszTempStr);
/* num of spaces total increment */
if(!wasNul)
{
nSpaceOffset++;
nLastVal=_wtoi(wszFmtVal);
}
}
else
{
wszFmtVal[nValCount++]=wszFmtStr[nFmtCount];
}
}
/* Create spaces for rest part of string */
if(wasNul && nLastVal!=0)
{
for(nFmtCount=nSpaceOffset+nLastVal;nFmtCount<wcslen(pwszDestStr);nFmtCount+=nLastVal+1)
{
pwszTempStr=InsSpacePos(pwszDestStr,nFmtCount);
wcscpy(pwszDestStr,pwszTempStr);
free(pwszTempStr);
}
}
return pwszDestStr;
}
/* Replace given template in source string with string to replace and return recieved string */
WCHAR*
ReplaceSubStr(const WCHAR *wszSourceStr,
const WCHAR *wszStrToReplace,
const WCHAR *wszTempl)
{
int nCharCnt;
int nSubStrCnt;
int nDestStrCnt;
int nFirstCharCnt;
WCHAR* wszDestStr;
wszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));
nDestStrCnt=0;
nFirstCharCnt=0;
wcscpy(wszDestStr,L"");
while(nFirstCharCnt<(int)wcslen(wszSourceStr))
{
if(wszSourceStr[nFirstCharCnt]==wszTempl[0])
{
nSubStrCnt=0;
for(nCharCnt=nFirstCharCnt;nCharCnt<nFirstCharCnt+(int)wcslen(wszTempl);nCharCnt++)
{
if(wszSourceStr[nCharCnt]==wszTempl[nSubStrCnt])
{
nSubStrCnt++;
}
else
{
break;
}
if((int)wcslen(wszTempl)==nSubStrCnt)
{
wcscat(wszDestStr,wszStrToReplace);
nDestStrCnt=(int)wcslen(wszDestStr);
nFirstCharCnt+=(int)wcslen(wszTempl)-1;
break;
}
}
}
else
{
wszDestStr[nDestStrCnt++]=wszSourceStr[nFirstCharCnt];
wszDestStr[nDestStrCnt]='\0';
}
nFirstCharCnt++;
}
return wszDestStr;
}
/* Create applets */
LONG
APIENTRY
SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)
{
PROPSHEETPAGE PsPage[NUM_SHEETS];
PROPSHEETHEADER psh;
TCHAR Caption[MAX_STR_SIZE];
UNREFERENCED_PARAMETER(lParam);
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(uMsg);
UNREFERENCED_PARAMETER(hwnd);
LoadString(hApplet, IDS_CUSTOMIZE_TITLE, Caption, sizeof(Caption) / sizeof(TCHAR));
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE;
psh.hwndParent = NULL;
psh.hInstance = hApplet;
psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));
psh.pszCaption = Caption;
psh.nPages = sizeof(PsPage) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = PsPage;
InitPropSheetPage(&PsPage[0], IDD_NUMBERSPAGE, NumbersPageProc);
InitPropSheetPage(&PsPage[1], IDD_CURRENCYPAGE, CurrencyPageProc);
InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc);
InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc);
return (LONG)(PropertySheet(&psh) != -1);
}
/* EOF */

View file

@ -31,6 +31,743 @@
#include "intl.h"
#include "resource.h"
#define SAMPLE_NUMBER L"123456789"
#define SAMPLE_NEG_NUMBER L"-123456789"
#define MAX_NUM_SEP_SAMPLES 2
#define MAX_FRAC_NUM_SAMPLES 9
#define MAX_FIELD_SEP_SAMPLES 1
#define MAX_FIELD_DIG_SAMPLES 3
#define MAX_NEG_SIGN_SAMPLES 1
#define MAX_NEG_NUMBERS_SAMPLES 5
#define MAX_LEAD_ZEROES_SAMPLES 2
#define MAX_LIST_SEP_SAMPLES 1
#define MAX_UNITS_SYS_SAMPLES 2
#define EOLN_SIZE sizeof(WCHAR)
/* Init num decimal separator control box */
VOID
InitNumDecimalSepCB(HWND hwndDlg)
{
WCHAR wszNumSepSamples[MAX_NUM_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L",",
L"."
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];
/* Get current decimal separator */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SDECIMAL,
wszNumSep,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERDSYMBOL),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of decimal separators */
for(nCBIndex=0;nCBIndex<MAX_NUM_SEP_SAMPLES;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERDSYMBOL),
CB_ADDSTRING,
nCBIndex,
(LPARAM)wszNumSepSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERDSYMBOL),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszNumSep);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERDSYMBOL),
CB_ADDSTRING,
MAX_NUM_SEP_SAMPLES+1,
(LPARAM)wszNumSep);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERDSYMBOL),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszNumSep);
}
}
/* Init number of fractional symbols control box */
VOID
InitNumOfFracSymbCB(HWND hwndDlg)
{
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszFracNum[MAX_SAMPLES_STR_SIZE];
WCHAR wszFracCount[MAX_SAMPLES_STR_SIZE];
/* Get current number of fractional symbols */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_IDIGITS,
wszFracNum,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNDIGDEC),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of fractional symbols */
for(nCBIndex=0;nCBIndex<MAX_FRAC_NUM_SAMPLES;nCBIndex++)
{
/* convert to wide char */
_itow(nCBIndex,wszFracCount,DECIMAL_RADIX);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNDIGDEC),
CB_ADDSTRING,
nCBIndex,
(LPARAM)wszFracCount);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNDIGDEC),
CB_SETCURSEL,
(WPARAM)_wtoi(wszFracNum),
(LPARAM)0);
}
/* Init field separator control box */
VOID
InitNumFieldSepCB(HWND hwndDlg)
{
WCHAR wszFieldSepSamples[MAX_FIELD_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L" "
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];
/* Get current field separator */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_STHOUSAND,
wszFieldSep,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDIGITGRSYM),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of field separators */
for(nCBIndex=0;nCBIndex<MAX_FIELD_SEP_SAMPLES;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDIGITGRSYM),
CB_ADDSTRING,
nCBIndex,
(LPARAM)wszFieldSepSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDIGITGRSYM),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszFieldSep);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDIGITGRSYM),
CB_ADDSTRING,
MAX_FIELD_SEP_SAMPLES+1,
(LPARAM)wszFieldSep);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDIGITGRSYM),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszFieldSep);
}
}
/* Init number of digidts in field control box */
VOID
InitFieldDigNumCB(HWND hwndDlg)
{
WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"0;0",
L"3;0",
L"3;2;0"
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszFieldDigNum[MAX_SAMPLES_STR_SIZE];
WCHAR* pwszFieldDigNumSmpl;
/* Get current field digits num */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SGROUPING,
wszFieldDigNum,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDGROUPING),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of field digits num */
for(nCBIndex=0;nCBIndex<MAX_FIELD_DIG_SAMPLES;nCBIndex++)
{
pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNumSamples[nCBIndex]);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDGROUPING),
CB_ADDSTRING,
nCBIndex,
(LPARAM)pwszFieldDigNumSmpl);
free(pwszFieldDigNumSmpl);
}
pwszFieldDigNumSmpl=InsSpacesFmt(SAMPLE_NUMBER,wszFieldDigNum);
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDGROUPING),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)pwszFieldDigNumSmpl);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDGROUPING),
CB_ADDSTRING,
MAX_FIELD_DIG_SAMPLES+1,
(LPARAM)pwszFieldDigNumSmpl);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDGROUPING),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)pwszFieldDigNumSmpl);
}
free(pwszFieldDigNumSmpl);
}
/* Init negative sign control box */
VOID
InitNegSignCB(HWND hwndDlg)
{
WCHAR wszNegSignSamples[MAX_NEG_SIGN_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"-"
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];
/* Get current negative sign */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SNEGATIVESIGN,
wszNegSign,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNSIGNSYM),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of signs */
for(nCBIndex=0;nCBIndex<MAX_NEG_SIGN_SAMPLES;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNSIGNSYM),
CB_ADDSTRING,
nCBIndex,
(LPARAM)wszNegSignSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNSIGNSYM),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszNegSign);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNSIGNSYM),
CB_ADDSTRING,
MAX_NUM_SEP_SAMPLES+1,
(LPARAM)wszNegSign);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNSIGNSYM),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszNegSign);
}
}
/* Init negative numbers format control box */
VOID
InitNegNumFmtCB(HWND hwndDlg)
{
WCHAR wszNegNumFmtSamples[MAX_NEG_NUMBERS_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"(1,1)",
L"-1,1",
L"- 1,1",
L"1,1-",
L"1,1 -"
};
int nCBIndex;
int nRetCode;
WCHAR wszNegNumFmt[MAX_SAMPLES_STR_SIZE];
WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];
WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];
WCHAR wszNewSample[MAX_SAMPLES_STR_SIZE];
WCHAR* pwszResultStr;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
/* Get current negative numbers format */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_INEGNUMBER,
wszNegNumFmt,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNNUMFORMAT),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Get current decimal separator */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SDECIMAL,
wszNumSep,
dwValueSize);
/* Get current negative sign */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SNEGATIVESIGN,
wszNegSign,
dwValueSize);
/* Create standart list of negative numbers formats */
for(nCBIndex=0;nCBIndex<MAX_NEG_NUMBERS_SAMPLES;nCBIndex++)
{
/* Replace standart separator to setted */
pwszResultStr = ReplaceSubStr(wszNegNumFmtSamples[nCBIndex],
wszNumSep,
L",");
wcscpy(wszNewSample,pwszResultStr);
free(pwszResultStr);
/* Replace standart negative sign to setted */
pwszResultStr = ReplaceSubStr(wszNewSample,
wszNegSign,
L"-");
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNNUMFORMAT),
CB_ADDSTRING,
nCBIndex,
(LPARAM)pwszResultStr);
free(pwszResultStr);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNNUMFORMAT),
CB_SETCURSEL,
(WPARAM)_wtoi(wszNegNumFmt),
(LPARAM)0);
}
/* Init leading zeroes control box */
VOID
InitLeadingZeroesCB(HWND hwndDlg)
{
WCHAR wszLeadNumFmtSamples[MAX_LEAD_ZEROES_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L",7",
L"0,7"
};
int nCBIndex;
int nRetCode;
WCHAR wszLeadNumFmt[MAX_SAMPLES_STR_SIZE];
WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];
WCHAR* pwszResultStr;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
/* Get current leading zeroes format */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_ILZERO,
wszLeadNumFmt,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDISPLEADZER),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Get current decimal separator */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SDECIMAL,
wszNumSep,
dwValueSize);
/* Create list of standart leading zeroes formats */
for(nCBIndex=0;nCBIndex<MAX_LEAD_ZEROES_SAMPLES;nCBIndex++)
{
pwszResultStr = ReplaceSubStr(wszLeadNumFmtSamples[nCBIndex],
wszNumSep,
L",");
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDISPLEADZER),
CB_ADDSTRING,
nCBIndex,
(LPARAM)pwszResultStr);
free(pwszResultStr);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDISPLEADZER),
CB_SETCURSEL,
(WPARAM)_wtoi(wszLeadNumFmt),
(LPARAM)0);
}
VOID
InitListSepCB(HWND hwndDlg)
{
WCHAR wszListSepSamples[MAX_LIST_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L";"
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszListSep[MAX_SAMPLES_STR_SIZE];
/* Get current list separator */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_SLIST,
wszListSep,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSLSEP),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create standart list of signs */
for(nCBIndex=0;nCBIndex<MAX_LIST_SEP_SAMPLES;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSLSEP),
CB_ADDSTRING,
nCBIndex,
(LPARAM)wszListSepSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSLSEP),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszListSep);
/* if is not success, add new value to list and select them */
if(nRetCode == CB_ERR)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSLSEP),
CB_ADDSTRING,
MAX_LIST_SEP_SAMPLES+1,
(LPARAM)wszListSep);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSLSEP),
CB_SELECTSTRING,
-1,
(LPARAM)(LPCSTR)wszListSep);
}
}
/* Init system of units control box */
VOID
InitUnitsSysCB(HWND hwndDlg)
{
WCHAR wszUnitsSysSamples[MAX_UNITS_SYS_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"Metrics",
L"Americans"
};
int nCBIndex;
int nRetCode;
DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
WCHAR wszUnitsSys[MAX_SAMPLES_STR_SIZE];
/* Get current system of units */
GetLocaleInfoW(LOCALE_USER_DEFAULT,
LOCALE_IMEASURE,
wszUnitsSys,
dwValueSize);
/* Clear all box content */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSMEASSYS),
CB_RESETCONTENT,
(WPARAM)0,
(LPARAM)0);
/* Create list of standart system of units */
for(nCBIndex=0;nCBIndex<MAX_UNITS_SYS_SAMPLES;nCBIndex++)
{
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSMEASSYS),
CB_ADDSTRING,
nCBIndex,
(LPARAM)wszUnitsSysSamples[nCBIndex]);
}
/* Set current item to value from registry */
nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSMEASSYS),
CB_SETCURSEL,
(WPARAM)_wtoi(wszUnitsSys),
(LPARAM)0);
}
/* Update all numbers locale samples */
static
VOID
UpdateNumSamples(HWND hwndDlg,
LCID lcidLocale)
{
WCHAR OutBuffer[MAX_FMT_SIZE];
/* Get positive number format sample */
GetNumberFormatW(lcidLocale,
0,
SAMPLE_NUMBER,
NULL,
OutBuffer,
MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSPOSSAMPLE),
WM_SETTEXT,
0,
(LPARAM)OutBuffer);
/* Get positive number format sample */
GetNumberFormatW(lcidLocale,
0,
SAMPLE_NEG_NUMBER,
NULL,
OutBuffer,
MAX_FMT_SIZE);
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNEGSAMPLE),
WM_SETTEXT,
0,
(LPARAM)OutBuffer);
}
/* Set num decimal separator */
BOOL
SetNumDecimalSep(HWND hwndDlg)
{
WCHAR wszDecimalSep[MAX_SAMPLES_STR_SIZE];
/* Get setted decimal separator */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERDSYMBOL),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszDecimalSep);
/* Save decimal separator */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, wszDecimalSep);
return TRUE;
}
/* Set number of fractional symbols */
BOOL
SetFracSymNum(HWND hwndDlg)
{
WCHAR wszFracSymNum[MAX_SAMPLES_STR_SIZE];
INT nCurrSel;
/* Get setted number of fractional symbols */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNDIGDEC),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* convert to wide char */
_itow(nCurrSel,wszFracSymNum,DECIMAL_RADIX);
/* Save number of fractional symbols */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, wszFracSymNum);
return TRUE;
}
/* Set field separator */
BOOL
SetNumFieldSep(HWND hwndDlg)
{
WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];
/* Get setted field separator */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDGROUPING),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszFieldSep);
/* Save field separator */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, wszFieldSep);
return TRUE;
}
/* Set number of digidts in field */
BOOL
SetFieldDigNum(HWND hwndDlg)
{
WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=
{
L"0;0",
L"3;0",
L"3;2;0"
};
int nCurrSel;
/* Get setted number of digidts in field */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNSIGNSYM),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* Save number of digidts in field */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, wszFieldDigNumSamples[nCurrSel]);
return TRUE;
}
/* Set negative sign */
BOOL
SetNumNegSign(HWND hwndDlg)
{
WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];
/* Get setted negative sign */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNSIGNSYM),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszNegSign);
/* Save negative sign */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SNEGATIVESIGN, wszNegSign);
return TRUE;
}
/* Set negative sum format */
BOOL
SetNegSumFmt(HWND hwndDlg)
{
WCHAR wszNegSumFmt[MAX_SAMPLES_STR_SIZE];
INT nCurrSel;
/* Get setted negative sum format */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSNNUMFORMAT),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* convert to wide char */
_itow(nCurrSel,wszNegSumFmt,DECIMAL_RADIX);
/* Save negative sum format */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, wszNegSumFmt);
return TRUE;
}
/* Set leading zero */
BOOL
SetNumLeadZero(HWND hwndDlg)
{
WCHAR wszLeadZero[MAX_SAMPLES_STR_SIZE];
INT nCurrSel;
/* Get setted leading zero format */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSDISPLEADZER),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* convert to wide char */
_itow(nCurrSel,wszLeadZero,DECIMAL_RADIX);
/* Save leading zero format */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILZERO, wszLeadZero);
return TRUE;
}
/* Set elements list separator */
BOOL
SetNumListSep(HWND hwndDlg)
{
WCHAR wszListSep[MAX_SAMPLES_STR_SIZE];
/* Get setted list separator */
SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSLSEP),
WM_GETTEXT,
(WPARAM)MAX_SAMPLES_STR_SIZE,
(LPARAM)(LPCSTR)wszListSep);
/* Save list separator */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SLIST, wszListSep);
return TRUE;
}
/* Set units system */
BOOL
SetNumUnitsSys(HWND hwndDlg)
{
WCHAR wszUnitsSys[MAX_SAMPLES_STR_SIZE];
INT nCurrSel;
/* Get setted units system */
nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMBERSMEASSYS),
CB_GETCURSEL,
(WPARAM)0,
(LPARAM)0);
/* convert to wide char */
_itow(nCurrSel,wszUnitsSys,DECIMAL_RADIX);
/* Save units system */
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IMEASURE, wszUnitsSys);
return TRUE;
}
/* Property page dialog callback */
INT_PTR CALLBACK
@ -42,7 +779,60 @@ NumbersPageProc(HWND hwndDlg,
switch(uMsg)
{
case WM_INITDIALOG:
break;
{
InitNumDecimalSepCB(hwndDlg);
InitNumOfFracSymbCB(hwndDlg);
InitNumFieldSepCB(hwndDlg);
InitFieldDigNumCB(hwndDlg);
InitNegSignCB(hwndDlg);
InitNegNumFmtCB(hwndDlg);
InitLeadingZeroesCB(hwndDlg);
InitListSepCB(hwndDlg);
InitUnitsSysCB(hwndDlg);
UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);
}
break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_NUMBERDSYMBOL:
case IDC_NUMBERSNDIGDEC:
case IDC_NUMBERSDIGITGRSYM:
case IDC_NUMBERSDGROUPING:
case IDC_NUMBERSNSIGNSYM:
case IDC_NUMBERSNNUMFORMAT:
case IDC_NUMBERSDISPLEADZER:
case IDC_NUMBERSLSEP:
case IDC_NUMBERSMEASSYS:
if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
{
/* Set "Apply" button enabled */
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
}
}
}
break;
case WM_NOTIFY:
{
LPNMHDR lpnm = (LPNMHDR)lParam;
/* If push apply button */
if (lpnm->code == (UINT)PSN_APPLY)
{
if(!SetNumDecimalSep(hwndDlg)) break;
if(!SetFracSymNum(hwndDlg)) break;
if(!SetNumFieldSep(hwndDlg)) break;
if(!SetFieldDigNum(hwndDlg)) break;
if(!SetNumNegSign(hwndDlg)) break;
if(!SetNegSumFmt(hwndDlg)) break;
if(!SetNumLeadZero(hwndDlg)) break;
if(!SetNumListSep(hwndDlg)) break;
if(!SetNumUnitsSys(hwndDlg)) break;
UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);
}
}
break;
}
return FALSE;
}

View file

@ -4,15 +4,21 @@
#define IDC_CPLICON 200
#define IDC_FLAGS 2
#define IDC_ICON1 3
#define IDD_GENERALPAGE 100
#define IDD_NUMBERSPAGE 101
#define IDC_NUMSAMPLE_EDIT 300
#define IDC_MONEYSAMPLE_EDIT 301
#define IDC_TIMESAMPLE_EDIT 302
#define IDC_SHORTTIMESAMPLE_EDIT 303
#define IDC_FULLTIMESAMPLE_EDIT 304
#define IDC_SETUP_BUTTON 305
#define IDD_CURRENCYPAGE 140
#define IDC_CURRENCYPOSSAMPLE 141
#define IDC_CURRENCYNEGSAMPLE 142
#define IDC_CURRENCYSYMBOL 143
#define IDC_CURRENCYSYMBOL 143
#define IDC_CURRENCYPOSVALUE 144
#define IDC_CURRENCYNEGVALUE 145
#define IDC_CURRENCYDECSEP 146
@ -20,6 +26,18 @@
#define IDC_CURRENCYGRPSEP 149
#define IDC_CURRENCYGRPNUM 150
#define IDC_NUMBERSPOSSAMPLE 250
#define IDC_NUMBERSNEGSAMPLE 251
#define IDC_NUMBERDSYMBOL 252
#define IDC_NUMBERSNDIGDEC 253
#define IDC_NUMBERSDIGITGRSYM 254
#define IDC_NUMBERSDGROUPING 255
#define IDC_NUMBERSNSIGNSYM 256
#define IDC_NUMBERSNNUMFORMAT 257
#define IDC_NUMBERSDISPLEADZER 258
#define IDC_NUMBERSLSEP 259
#define IDC_NUMBERSMEASSYS 260
#define IDD_TIMEPAGE 103
#define IDC_TIMESAMPLE 107
#define IDC_TIMEFORMAT 108
@ -28,11 +46,34 @@
#define IDC_TIMEPMSYMBOL 111
#define IDD_DATEPAGE 104
#define IDD_LOCALEPAGE 105
#define IDC_LANGUAGELIST 106
#define IDD_LANGUAGESPAGE 112
#define IDD_ADVANCEDPAGE 113
#define IDC_LOCATION_COMBO 114
#define IDC_DETAIL_BUTTON 115
#define IDC_LANGUAGE_COMBO 116
#define IDS_CPLNAME 1000
#define IDC_GROUPBOX 350
#define IDC_FIRSTYEAR_EDIT 351
#define IDC_SECONDYEAR_EDIT 352
#define IDC_SCR_MAX_YEAR 353
#define IDC_CALTYPE_COMBO 354
#define IDC_HIJCHRON_COMBO 355
#define IDC_SHRTDATESAMPLE_EDIT 356
#define IDC_SHRTDATERTOL_EDIT 357
#define IDC_SHRTDATEFMT_COMBO 358
#define IDC_SHRTDATESEP_COMBO 359
#define IDC_LONGDATESAMPLE_EDIT 361
#define IDC_LONGDATERTOL_EDIT 362
#define IDC_LONGDATEFMT_COMBO 363
#define IDC_INST_FILES_FOR_RTOL_LANG 364
#define IDC_INST_FILES_FOR_ASIAN 365
#define IDC_APPLY_CUR_USER_DEF_PROFILE 366
#define IDC_CONV_TABLES 367
#define IDS_CPLNAME 1000
#define IDS_CPLDESCRIPTION 1001
#define IDS_CUSTOMIZE_TITLE 1002
#endif /* __CPL_RESOURCE_H */

View file

@ -0,0 +1,233 @@
/*
* PROJECT: ReactOS International Control Panel
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dll/cpl/intl/setupreg.c
* PURPOSE: ReactOS International Control Panel
* PROGRAMMERS: Alexey Zavyalov (gen_x@mail.ru)
*/
/* INCLUDES *****************************************************************/
#include <windows.h>
#include <commctrl.h>
#include <cpl.h>
#include "intl.h"
#include "resource.h"
/* GLOBALS ******************************************************************/
#define NUM_SHEETS 4
/* FUNCTIONS ****************************************************************/
/* Insert the space */
WCHAR*
InsSpacePos(const WCHAR *wszInsStr, const int nPos)
{
WCHAR* pwszDestStr;
pwszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE);
int nDestStrCnt=0;
int nStrCnt;
int nStrSize;
wcscpy(pwszDestStr,wszInsStr);
nStrSize = wcslen(wszInsStr);
for(nStrCnt=0; nStrCnt<nStrSize; nStrCnt++)
{
if(nStrCnt==nStrSize-nPos)
{
pwszDestStr[nDestStrCnt]=' ';
nDestStrCnt++;
}
pwszDestStr[nDestStrCnt]=wszInsStr[nStrCnt];
nDestStrCnt++;
}
pwszDestStr[nDestStrCnt]='\0';
return pwszDestStr;
}
/* Insert the spaces by format string separated by ';' */
WCHAR*
InsSpacesFmt(const WCHAR *wszSourceStr, const WCHAR *wszFmtStr)
{
WCHAR* pwszDestStr;
pwszDestStr=(WCHAR*) malloc(255);
WCHAR* pwszTempStr;
WCHAR wszFmtVal[255];
int nFmtCount=0;
int nValCount=0;
int nLastVal=0;
int nSpaceOffset=0;
BOOL wasNul=FALSE;
wcscpy(pwszDestStr,wszSourceStr);
/* if format is clean return source string */
if(!*wszFmtStr) return pwszDestStr;
/* Search for all format values */
for(nFmtCount=0;nFmtCount<=(int)wcslen(wszFmtStr);nFmtCount++)
{
if(wszFmtStr[nFmtCount]==';' || wszFmtStr[nFmtCount]=='\0')
{
if(_wtoi(wszFmtVal)==0 && !wasNul)
{
wasNul=TRUE;
break;
}
/* If was 0, repeat spaces */
if(wasNul)
{
nSpaceOffset+=nLastVal;
}
else
{
nSpaceOffset+=_wtoi(wszFmtVal);
}
wszFmtVal[nValCount]='\0';
nValCount=0;
/* insert space to finded position plus all pos before */
pwszTempStr=InsSpacePos(pwszDestStr,nSpaceOffset);
wcscpy(pwszDestStr,pwszTempStr);
free(pwszTempStr);
/* num of spaces total increment */
if(!wasNul)
{
nSpaceOffset++;
nLastVal=_wtoi(wszFmtVal);
}
}
else
{
wszFmtVal[nValCount++]=wszFmtStr[nFmtCount];
}
}
/* Create spaces for rest part of string */
if(wasNul && nLastVal!=0)
{
for(nFmtCount=nSpaceOffset+nLastVal;nFmtCount<wcslen(pwszDestStr);nFmtCount+=nLastVal+1)
{
pwszTempStr=InsSpacePos(pwszDestStr,nFmtCount);
wcscpy(pwszDestStr,pwszTempStr);
free(pwszTempStr);
}
}
return pwszDestStr;
}
/* Replace given template in source string with string to replace and return recieved string */
WCHAR*
ReplaceSubStr(const WCHAR *wszSourceStr,
const WCHAR *wszStrToReplace,
const WCHAR *wszTempl)
{
int nCharCnt;
int nSubStrCnt;
int nDestStrCnt;
int nFirstCharCnt;
WCHAR* wszDestStr;
wszDestStr=(WCHAR*) malloc(MAX_SAMPLES_STR_SIZE*sizeof(WCHAR));
nDestStrCnt=0;
nFirstCharCnt=0;
wcscpy(wszDestStr,L"");
while(nFirstCharCnt<(int)wcslen(wszSourceStr))
{
if(wszSourceStr[nFirstCharCnt]==wszTempl[0])
{
nSubStrCnt=0;
for(nCharCnt=nFirstCharCnt;nCharCnt<nFirstCharCnt+(int)wcslen(wszTempl);nCharCnt++)
{
if(wszSourceStr[nCharCnt]==wszTempl[nSubStrCnt])
{
nSubStrCnt++;
}
else
{
break;
}
if((int)wcslen(wszTempl)==nSubStrCnt)
{
wcscat(wszDestStr,wszStrToReplace);
nDestStrCnt=(int)wcslen(wszDestStr);
nFirstCharCnt+=(int)wcslen(wszTempl)-1;
break;
}
}
}
else
{
wszDestStr[nDestStrCnt++]=wszSourceStr[nFirstCharCnt];
wszDestStr[nDestStrCnt]='\0';
}
nFirstCharCnt++;
}
return wszDestStr;
}
static
VOID
InitPropSheetPage(PROPSHEETPAGE *PsPage, WORD IdDlg, DLGPROC DlgProc)
{
ZeroMemory(PsPage, sizeof(PROPSHEETPAGE));
PsPage->dwSize = sizeof(PROPSHEETPAGE);
PsPage->dwFlags = PSP_DEFAULT;
PsPage->hInstance = hApplet;
PsPage->pszTemplate = MAKEINTRESOURCE(IdDlg);
PsPage->pfnDlgProc = DlgProc;
}
/* Create applets */
LONG
APIENTRY
SetupApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)
{
PROPSHEETPAGE PsPage[NUM_SHEETS];
PROPSHEETHEADER psh;
TCHAR Caption[MAX_STR_SIZE];
UNREFERENCED_PARAMETER(lParam);
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(uMsg);
UNREFERENCED_PARAMETER(hwnd);
LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE;
psh.hwndParent = NULL;
psh.hInstance = hApplet;
psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));
psh.pszCaption = Caption;
psh.nPages = sizeof(PsPage) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = PsPage;
InitPropSheetPage(&PsPage[0], IDD_NUMSOPTSSETUP, NumsOptsSetProc);
InitPropSheetPage(&PsPage[1], IDD_CURRENCYOPTSSETUP, CurrencyOptsSetProc);
InitPropSheetPage(&PsPage[2], IDD_TIMEOPTSSETUP, TimeOptsSetProc);
InitPropSheetPage(&PsPage[3], IDD_DATEOPTSSETUP, DateOptsSetProc);
return (LONG)(PropertySheet(&psh) != -1);
}
/* EOF */

View file

@ -67,7 +67,7 @@ TimePageProc(HWND hwndDlg,
UpdateTimeSample(GetDlgItem(hwndDlg, IDC_TIMESAMPLE));
/* Get the time format (max. 80 characters) */
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
CB_LIMITTEXT, 80, 0);
/* FIXME: add available time formats to the list */
@ -77,26 +77,26 @@ TimePageProc(HWND hwndDlg,
CB_ADDSTRING,
0,
(LPARAM)Buffer);
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
CB_SETCURSEL,
0, /* index */
0);
/* Get the time separator (max. 4 characters) */
SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
CB_LIMITTEXT, 4, 0);
GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STIME, Buffer, 80);
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
CB_ADDSTRING,
0,
(LPARAM)Buffer);
SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
CB_SETCURSEL,
0, /* index */
0);
/* Get the AM symbol (max. 9 characters) */
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
CB_LIMITTEXT, 9, 0);
nLen = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S1159, Buffer, 80);
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
@ -110,13 +110,13 @@ TimePageProc(HWND hwndDlg,
0,
(LPARAM)L"");
}
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
CB_SETCURSEL,
0, /* index */
0);
/* Get the PM symbol (max. 9 characters) */
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
CB_LIMITTEXT, 9, 0);
nLen = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S2359, Buffer, 80);
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
@ -130,7 +130,7 @@ TimePageProc(HWND hwndDlg,
0,
(LPARAM)L"");
}
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
CB_SETCURSEL,
0, /* index */
0);
@ -163,25 +163,25 @@ TimePageProc(HWND hwndDlg,
int nIndex;
/* Set time format */
nIndex = SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
nIndex = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
CB_GETCURSEL, 0, 0);
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEFORMAT),
CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer);
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, Buffer);
/* Set time separator */
nIndex = SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
nIndex = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
CB_GETCURSEL, 0, 0);
SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR),
CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer);
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STIME, Buffer);
/* Set the AM symbol */
nIndex = SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
nIndex = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
CB_GETCURSEL, 0, 0);
if (nIndex != CB_ERR)
{
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL),
CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer);
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S1159, Buffer);
}
@ -191,11 +191,11 @@ TimePageProc(HWND hwndDlg,
}
/* Set the PM symbol */
nIndex = SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
nIndex = SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
CB_GETCURSEL, 0, 0);
if (nIndex != CB_ERR)
{
SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL),
CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer);
SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_S2359, Buffer);
}